From 85cfd628e0e6c19899ade3d3a90aa864cccb841a Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 17 Dec 2025 12:08:04 +1100 Subject: [PATCH 01/88] feat(auth-nextjs): add auth-nextjs package --- .husky/pre-commit | 2 +- packages/auth-nextjs/.eslintrc.cjs | 20 + packages/auth-nextjs/README.md | 189 ++++++ packages/auth-nextjs/package.json | 91 +++ packages/auth-nextjs/src/client/callback.tsx | 121 ++++ packages/auth-nextjs/src/client/index.ts | 16 + packages/auth-nextjs/src/client/provider.tsx | 352 ++++++++++ packages/auth-nextjs/src/config.ts | 140 ++++ packages/auth-nextjs/src/index.ts | 73 +++ packages/auth-nextjs/src/refresh.ts | 73 +++ packages/auth-nextjs/src/server/index.ts | 10 + .../auth-nextjs/src/server/with-page-auth.ts | 172 +++++ packages/auth-nextjs/src/types.ts | 181 ++++++ packages/auth-nextjs/tsconfig.eslint.json | 5 + packages/auth-nextjs/tsconfig.json | 20 + packages/auth-nextjs/tsup.config.ts | 17 + .../passport/sdk-sample-app/next.config.js | 4 +- packages/passport/sdk-sample-app/package.json | 4 +- .../src/components/AuthNextJS.tsx | 100 +++ .../src/context/ImmutableProvider.tsx | 9 +- .../sdk-sample-app/src/lib/auth-nextjs.ts | 30 + .../sdk-sample-app/src/pages/_app.tsx | 26 +- .../src/pages/api/auth/[...nextauth].ts | 7 + .../sdk-sample-app/src/pages/callback.tsx | 45 ++ .../sdk-sample-app/src/pages/index.tsx | 4 + pnpm-lock.yaml | 613 +++++++++++------- pnpm-workspace.yaml | 3 +- 27 files changed, 2085 insertions(+), 242 deletions(-) create mode 100644 packages/auth-nextjs/.eslintrc.cjs create mode 100644 packages/auth-nextjs/README.md create mode 100644 packages/auth-nextjs/package.json create mode 100644 packages/auth-nextjs/src/client/callback.tsx create mode 100644 packages/auth-nextjs/src/client/index.ts create mode 100644 packages/auth-nextjs/src/client/provider.tsx create mode 100644 packages/auth-nextjs/src/config.ts create mode 100644 packages/auth-nextjs/src/index.ts create mode 100644 packages/auth-nextjs/src/refresh.ts create mode 100644 packages/auth-nextjs/src/server/index.ts create mode 100644 packages/auth-nextjs/src/server/with-page-auth.ts create mode 100644 packages/auth-nextjs/src/types.ts create mode 100644 packages/auth-nextjs/tsconfig.eslint.json create mode 100644 packages/auth-nextjs/tsconfig.json create mode 100644 packages/auth-nextjs/tsup.config.ts create mode 100644 packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx create mode 100644 packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts create mode 100644 packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].ts create mode 100644 packages/passport/sdk-sample-app/src/pages/callback.tsx diff --git a/.husky/pre-commit b/.husky/pre-commit index 5ec4a3505f..ef4e0058d0 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -2,6 +2,6 @@ . "$(dirname -- "$0")/_/husky.sh" # prevent heap limit allocation errors - increased to 8GB -export NODE_OPTIONS="--max-old-space-size=8192" +export NODE_OPTIONS="--max-old-space-size=10240" pnpm lint-staged diff --git a/packages/auth-nextjs/.eslintrc.cjs b/packages/auth-nextjs/.eslintrc.cjs new file mode 100644 index 0000000000..b136aaddaf --- /dev/null +++ b/packages/auth-nextjs/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + extends: ['../../.eslintrc'], + parserOptions: { + project: './tsconfig.eslint.json', + tsconfigRootDir: __dirname, + }, + rules: { + // Disable all import plugin rules due to stack overflow with auth package structure + 'import/order': 'off', + 'import/no-unresolved': 'off', + 'import/named': 'off', + 'import/default': 'off', + 'import/namespace': 'off', + 'import/no-cycle': 'off', + 'import/no-named-as-default': 'off', + 'import/no-named-as-default-member': 'off', + // Allow optional props without defaultProps in functional components (use destructuring defaults) + 'react/require-default-props': 'off', + }, +}; \ No newline at end of file diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md new file mode 100644 index 0000000000..9d4bf60c17 --- /dev/null +++ b/packages/auth-nextjs/README.md @@ -0,0 +1,189 @@ +# @imtbl/auth-nextjs + +Next.js authentication integration for Immutable SDK using NextAuth.js. + +This package bridges `@imtbl/auth` popup-based authentication with NextAuth.js session management, providing: + +- Server-side session storage in encrypted JWT cookies +- Automatic token refresh on both server and client +- Full SSR support with `getServerSession` +- React hooks for easy client-side authentication + +## Installation + +```bash +pnpm add @imtbl/auth-nextjs next-auth +``` + +## Quick Start + +### 1. Set Up Auth API Route + +```typescript +// pages/api/auth/[...nextauth].ts +import { ImmutableAuth } from "@imtbl/auth-nextjs"; + +export default ImmutableAuth({ + clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, +}); +``` + +### 2. Create Callback Page + +```typescript +// pages/callback.tsx +import { CallbackPage } from "@imtbl/auth-nextjs/client"; + +const config = { + clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, +}; + +export default function Callback() { + return ; +} +``` + +### 3. Add Provider to App + +```typescript +// pages/_app.tsx +import { ImmutableAuthProvider } from "@imtbl/auth-nextjs/client"; + +const config = { + clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, +}; + +export default function App({ Component, pageProps }: AppProps) { + return ( + + + + ); +} +``` + +### 4. Use in Components + +```typescript +import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; + +function LoginButton() { + const { user, isLoading, signIn, signOut } = useImmutableAuth(); + + if (isLoading) return
Loading...
; + + if (user) { + return ( +
+ Welcome, {user.email} + +
+ ); + } + + return ; +} +``` + +### 5. Access Session Server-Side (SSR) + +```typescript +// pages/profile.tsx +import { getImmutableSession } from "@imtbl/auth-nextjs/server"; +import type { GetServerSideProps } from "next"; + +const config = { + clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, +}; + +export default function ProfilePage({ user }) { + if (!user) return

Not logged in

; + return

Welcome, {user.email}

; +} + +export const getServerSideProps: GetServerSideProps = async (ctx) => { + const session = await getImmutableSession(ctx.req, ctx.res, config); + return { props: { user: session?.user ?? null } }; +}; +``` + +### 6. Protect Pages (Optional) + +```typescript +// pages/dashboard.tsx +import { withPageAuthRequired } from "@imtbl/auth-nextjs/server"; + +const config = { + clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, +}; + +function DashboardPage() { + return

Dashboard (protected)

; +} + +export default DashboardPage; + +// Redirects to /login if not authenticated +export const getServerSideProps = withPageAuthRequired(config); +``` + +## Environment Variables + +```bash +# .env.local +NEXT_PUBLIC_IMMUTABLE_CLIENT_ID=your-client-id +NEXT_PUBLIC_BASE_URL=http://localhost:3000 + +# Required by NextAuth for cookie encryption +NEXTAUTH_SECRET=generate-with-openssl-rand-base64-32 +NEXTAUTH_URL=http://localhost:3000 +``` + +Generate a secret: + +```bash +openssl rand -base64 32 +``` + +## API Reference + +### Main Exports (`@imtbl/auth-nextjs`) + +| Export | Description | +| ----------------------------------- | ------------------------------------------- | +| `ImmutableAuth(config, overrides?)` | Creates NextAuth handler (use in API route) | +| `ImmutableAuthConfig` | Configuration type | +| `ImmutableAuthOverrides` | NextAuth options override type | + +### Client Exports (`@imtbl/auth-nextjs/client`) + +| Export | Description | +| ----------------------- | ------------------------------------------------------------------------ | +| `ImmutableAuthProvider` | React context provider | +| `useImmutableAuth()` | Hook returning `{ user, session, signIn, signOut, getAccessToken, ... }` | +| `useAccessToken()` | Hook returning `getAccessToken` function | +| `CallbackPage` | Pre-built callback page component for OAuth redirects | + +### Server Exports (`@imtbl/auth-nextjs/server`) + +| Export | Description | +| ---------------------------------------- | ------------------------ | +| `getImmutableSession(req, res, config)` | Get session server-side | +| `withPageAuthRequired(config, options?)` | HOC for protecting pages | + +## How It Works + +1. **Login**: User clicks login → `@imtbl/auth` opens popup → tokens returned +2. **Session Creation**: Tokens passed to NextAuth's credentials provider → stored in encrypted JWT cookie +3. **Token Refresh**: NextAuth JWT callback automatically refreshes expired tokens using refresh_token +4. **SSR**: `getServerSession()` reads and decrypts cookie, providing full session with tokens +5. **Auto-hydration**: If localStorage is cleared but session cookie exists, the Auth instance is automatically hydrated from session tokens + +## License + +Apache-2.0 diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json new file mode 100644 index 0000000000..3976bb1e25 --- /dev/null +++ b/packages/auth-nextjs/package.json @@ -0,0 +1,91 @@ +{ + "name": "@imtbl/auth-nextjs", + "version": "0.0.0", + "description": "Next.js authentication integration for Immutable SDK using NextAuth", + "author": "Immutable", + "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", + "homepage": "https://github.com/immutable/ts-immutable-sdk#readme", + "license": "Apache-2.0", + "main": "dist/node/index.cjs", + "module": "dist/node/index.js", + "types": "./dist/types/index.d.ts", + "exports": { + ".": { + "development": { + "types": "./src/index.ts", + "require": "./dist/node/index.cjs", + "default": "./dist/node/index.js" + }, + "default": { + "types": "./dist/types/index.d.ts", + "require": "./dist/node/index.cjs", + "default": "./dist/node/index.js" + } + }, + "./client": { + "development": { + "types": "./src/client/index.ts", + "require": "./dist/node/client/index.cjs", + "default": "./dist/node/client/index.js" + }, + "default": { + "types": "./dist/types/client/index.d.ts", + "require": "./dist/node/client/index.cjs", + "default": "./dist/node/client/index.js" + } + }, + "./server": { + "development": { + "types": "./src/server/index.ts", + "require": "./dist/node/server/index.cjs", + "default": "./dist/node/server/index.js" + }, + "default": { + "types": "./dist/types/server/index.d.ts", + "require": "./dist/node/server/index.cjs", + "default": "./dist/node/server/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm transpile && pnpm typegen", + "transpile": "tsup --config tsup.config.ts", + "typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types", + "lint": "eslint ./src --ext .ts,.tsx --max-warnings=0", + "lint:fix": "eslint ./src --ext .ts,.tsx --max-warnings=0 --fix", + "typecheck": "tsc --customConditions default --noEmit --jsx preserve", + "test": "jest" + }, + "dependencies": { + "@imtbl/auth": "workspace:*" + }, + "peerDependencies": { + "next": "14.2.25", + "next-auth": "^4.24.0", + "react": "^18.2.0" + }, + "devDependencies": { + "@swc/core": "^1.3.36", + "@swc/jest": "^0.2.37", + "@types/jest": "^29.5.12", + "@types/node": "^18.14.2", + "@types/react": "^18.3.5", + "jest": "^29.4.3", + "jest-environment-jsdom": "^29.4.3", + "next": "14.2.25", + "next-auth": "^4.24.0", + "react": "^18.2.0", + "ts-node": "^10.9.1", + "tsup": "^8.3.0", + "typescript": "^5.6.2" + }, + "publishConfig": { + "access": "public" + }, + "repository": "immutable/ts-immutable-sdk.git", + "type": "module" +} + diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx new file mode 100644 index 0000000000..a6942ca3a1 --- /dev/null +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -0,0 +1,121 @@ +'use client'; + +import React, { useEffect, useState } from 'react'; +import { useRouter } from 'next/router'; +import { Auth } from '@imtbl/auth'; +import type { ImmutableAuthConfig } from '../types'; + +export interface CallbackPageProps { + /** + * Immutable auth configuration + */ + config: ImmutableAuthConfig; + /** + * URL to redirect to after successful authentication (when not in popup) + */ + redirectTo?: string; + /** + * Custom loading component + */ + loadingComponent?: React.ReactElement | null; + /** + * Custom error component + */ + errorComponent?: (error: string) => React.ReactElement | null; +} + +const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; + +/** + * Callback page component for handling OAuth redirects. + * + * Use this in your callback page to process authentication responses. + * + * @example + * ```tsx + * // pages/callback.tsx + * import { CallbackPage } from "@imtbl/auth-nextjs/client"; + * import { immutableConfig } from "@/lib/auth-nextjs"; + * + * export default function Callback() { + * return ; + * } + * ``` + */ +export function CallbackPage({ + config, + redirectTo = '/', + loadingComponent = null, + errorComponent = null, +}: CallbackPageProps) { + const router = useRouter(); + const [error, setError] = useState(null); + + useEffect(() => { + const handleCallback = async () => { + try { + // Create Auth instance to handle the callback + const auth = new Auth({ + clientId: config.clientId, + redirectUri: config.redirectUri, + logoutRedirectUri: config.logoutRedirectUri, + audience: config.audience || 'platform_api', + scope: config.scope || 'openid profile email offline_access transact', + authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, + }); + + // Process the callback - this extracts tokens from the URL + await auth.loginCallback(); + + // Check if we're in a popup window + if (window.opener) { + // Close the popup - the parent window will receive the tokens + window.close(); + } else { + // Not in a popup - redirect to specified page + router.replace(redirectTo); + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Authentication failed'); + } + }; + + // Only run when we have the code parameter + if (router.isReady && router.query.code) { + handleCallback(); + } + }, [router.isReady, router.query.code, router, config, redirectTo]); + + if (error) { + if (errorComponent) { + return errorComponent(error); + } + + return ( +
+

Authentication Error

+

{error}

+ +
+ ); + } + + if (loadingComponent) { + return loadingComponent; + } + + return ( +
+

Completing authentication...

+
+ ); +} diff --git a/packages/auth-nextjs/src/client/index.ts b/packages/auth-nextjs/src/client/index.ts new file mode 100644 index 0000000000..70d08b59bd --- /dev/null +++ b/packages/auth-nextjs/src/client/index.ts @@ -0,0 +1,16 @@ +// Client-side exports +export { + ImmutableAuthProvider, + useImmutableAuth, + useAccessToken, +} from './provider'; + +export { CallbackPage, type CallbackPageProps } from './callback'; + +// Re-export useful types +export type { + ImmutableAuthProviderProps, + UseImmutableAuthReturn, + ImmutableAuthConfig, + ImmutableUser, +} from '../types'; diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx new file mode 100644 index 0000000000..38b31ba6eb --- /dev/null +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -0,0 +1,352 @@ +'use client'; + +import React, { + createContext, + useContext, + useEffect, + useRef, + useState, + useCallback, + useMemo, +} from 'react'; +import { + SessionProvider, useSession, signIn, signOut, +} from 'next-auth/react'; +import type { Session } from 'next-auth'; +import { Auth, type User, type DeviceTokenResponse } from '@imtbl/auth'; +import type { + ImmutableAuthConfig, + ImmutableAuthProviderProps, + UseImmutableAuthReturn, + ImmutableUser, + ImmutableTokenData, +} from '../types'; + +const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; + +/** + * Internal context for Immutable auth state + */ +interface ImmutableAuthContextValue { + auth: Auth | null; + config: ImmutableAuthConfig; +} + +const ImmutableAuthContext = createContext(null); + +/** + * Internal provider that manages Auth instance + */ +function ImmutableAuthInner({ + children, + config, +}: { + children: React.ReactNode; + config: ImmutableAuthConfig; +}) { + const authRef = useRef(null); + const prevConfigRef = useRef(null); + const [isAuthReady, setIsAuthReady] = useState(false); + const { data: session, update: updateSession } = useSession(); + + // Initialize/reinitialize Auth instance when config changes (e.g., environment switch) + useEffect(() => { + if (typeof window === 'undefined') return; + + // Create a config key to detect changes (clientId + authDomain uniquely identify the environment) + const configKey = `${config.clientId}:${config.authenticationDomain || DEFAULT_AUTH_DOMAIN}`; + + // If config changed, recreate Auth instance + if (prevConfigRef.current !== null && prevConfigRef.current !== configKey) { + authRef.current = null; + setIsAuthReady(false); + } + prevConfigRef.current = configKey; + + if (!authRef.current) { + authRef.current = new Auth({ + clientId: config.clientId, + redirectUri: config.redirectUri, + logoutRedirectUri: config.logoutRedirectUri, + audience: config.audience || 'platform_api', + scope: config.scope || 'openid profile email offline_access transact', + authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, + }); + setIsAuthReady(true); + } + }, [config]); + + // Hydrate Auth instance from NextAuth session if localStorage is cleared + // This handles the case where a valid session exists but Auth has no local state + useEffect(() => { + const auth = authRef.current; + if (!auth || !isAuthReady) return; + if (!session?.accessToken || !session?.idToken) return; + + const hydrateAuth = async () => { + try { + // Re-check tokens inside async function for TypeScript narrowing + const { + accessToken, idToken, refreshToken, accessTokenExpires, + } = session; + if (!accessToken || !idToken) return; + + // Check if Auth already has user data + const existingUser = await auth.getUser(); + if (existingUser) return; // Already hydrated + + // Calculate expires_in from accessTokenExpires + const expiresIn = accessTokenExpires + ? Math.max(0, Math.floor((accessTokenExpires - Date.now()) / 1000)) + : 3600; // Default 1 hour + + // Hydrate Auth with tokens from NextAuth session + const tokenResponse: DeviceTokenResponse = { + access_token: accessToken, + refresh_token: refreshToken, + id_token: idToken, + token_type: 'Bearer', + expires_in: expiresIn, + }; + + await auth.storeTokens(tokenResponse); + // eslint-disable-next-line no-console + console.log('[auth-nextjs] Hydrated Auth instance from session'); + } catch (error) { + // eslint-disable-next-line no-console + console.warn('[auth-nextjs] Failed to hydrate Auth instance:', error); + } + }; + + hydrateAuth(); + }, [isAuthReady, session]); + + // Listen for Auth events to sync tokens back to NextAuth + useEffect(() => { + const auth = authRef.current; + if (!auth || !isAuthReady) return undefined; + + const handleLoggedIn = async (authUser: User) => { + // When Auth refreshes tokens, sync to NextAuth session + if (session?.accessToken && authUser.accessToken !== session.accessToken) { + await updateSession({ + accessToken: authUser.accessToken, + refreshToken: authUser.refreshToken, + idToken: authUser.idToken, + accessTokenExpires: Date.now() + 3600 * 1000, // 1 hour + zkEvm: authUser.zkEvm, + }); + } + }; + + auth.eventEmitter.on('loggedIn', handleLoggedIn); + + return () => { + auth.eventEmitter.removeListener('loggedIn', handleLoggedIn); + }; + }, [isAuthReady, session, updateSession]); + + const contextValue = useMemo( + () => ({ auth: authRef.current, config }), + [isAuthReady, config], + ); + + return ( + + {children} + + ); +} + +/** + * Provider component for Immutable authentication with NextAuth + * + * Wraps your app to provide authentication state via useImmutableAuth hook. + * + * @example + * ```tsx + * // pages/_app.tsx + * import { ImmutableAuthProvider } from "@imtbl/auth-nextjs/client"; + * + * const config = { + * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + * }; + * + * export default function App({ Component, pageProps }: AppProps) { + * return ( + * + * + * + * ); + * } + * ``` + */ +export function ImmutableAuthProvider({ + children, + config, + session, +}: ImmutableAuthProviderProps) { + return ( + + {children} + + ); +} + +/** + * Hook to access Immutable authentication state and methods + * + * Must be used within an ImmutableAuthProvider. + * + * @example + * ```tsx + * function MyComponent() { + * const { user, isLoading, signIn, signOut } = useImmutableAuth(); + * + * if (isLoading) return
Loading...
; + * + * if (user) { + * return ( + *
+ *

Welcome, {user.email}

+ * + *
+ * ); + * } + * + * return ; + * } + * ``` + */ +export function useImmutableAuth(): UseImmutableAuthReturn { + const context = useContext(ImmutableAuthContext); + const { data: sessionData, status } = useSession(); + + if (!context) { + throw new Error('useImmutableAuth must be used within ImmutableAuthProvider'); + } + + // Cast session to our augmented Session type + const session = sessionData as Session | null; + + const { auth } = context; + const isLoading = status === 'loading'; + const isAuthenticated = status === 'authenticated' && !!session; + + // Extract user from session + const user: ImmutableUser | null = session?.user + ? { + sub: session.user.sub, + email: session.user.email, + nickname: session.user.nickname, + } + : null; + + // Sign in with Immutable popup + const handleSignIn = useCallback(async () => { + if (!auth) { + throw new Error('Auth not initialized'); + } + + // Open popup login + const authUser = await auth.login(); + if (!authUser) { + throw new Error('Login failed'); + } + + // Build token data for NextAuth + const tokenData: ImmutableTokenData = { + accessToken: authUser.accessToken, + refreshToken: authUser.refreshToken, + idToken: authUser.idToken, + accessTokenExpires: Date.now() + 3600 * 1000, // 1 hour + profile: { + sub: authUser.profile.sub, + email: authUser.profile.email, + nickname: authUser.profile.nickname, + }, + zkEvm: authUser.zkEvm, + }; + + // Sign in to NextAuth with the tokens + await signIn('immutable', { + tokens: JSON.stringify(tokenData), + redirect: false, + }); + }, [auth]); + + // Sign out from both NextAuth and Immutable + const handleSignOut = useCallback(async () => { + // Sign out from NextAuth first (clears session cookie) + await signOut({ redirect: false }); + + // Clear local Auth state without doing a full OIDC logout redirect + // We use getLogoutUrl() which clears local storage but returns URL instead of redirecting + if (auth) { + try { + // This removes the user from local storage without redirecting + await auth.getLogoutUrl(); + } catch (error) { + // Ignore errors (user may already be logged out) + // eslint-disable-next-line no-console + console.warn('[auth-nextjs] Logout cleanup error:', error); + } + } + }, [auth]); + + // Get access token (refreshes if needed) + const getAccessToken = useCallback(async (): Promise => { + // First try to get from Auth instance (most up-to-date) + if (auth) { + try { + const token = await auth.getAccessToken(); + if (token) { + return token; + } + } catch { + // Fall through to session + } + } + + // Fall back to session token + if (session?.accessToken) { + return session.accessToken; + } + + throw new Error('No access token available'); + }, [auth, session]); + + return { + user, + session, + isLoading, + isAuthenticated, + signIn: handleSignIn, + signOut: handleSignOut, + getAccessToken, + auth, + }; +} + +/** + * Hook to get a function that returns a valid access token + * + * @example + * ```tsx + * function ApiComponent() { + * const getAccessToken = useAccessToken(); + * + * const fetchData = async () => { + * const token = await getAccessToken(); + * const response = await fetch("/api/data", { + * headers: { Authorization: `Bearer ${token}` }, + * }); + * }; + * } + * ``` + */ +export function useAccessToken(): () => Promise { + const { getAccessToken } = useImmutableAuth(); + return getAccessToken; +} diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts new file mode 100644 index 0000000000..9d480a04e1 --- /dev/null +++ b/packages/auth-nextjs/src/config.ts @@ -0,0 +1,140 @@ +import type { NextAuthOptions } from 'next-auth'; +import Credentials from 'next-auth/providers/credentials'; +import type { ImmutableAuthConfig, ImmutableTokenData } from './types'; +import { refreshAccessToken, isTokenExpired } from './refresh'; + +// Handle ESM/CJS interop - CredentialsProvider may be default export or the module itself +const CredentialsProvider = (Credentials as unknown as { default?: typeof Credentials }).default || Credentials; + +/** + * Create NextAuth options configured for Immutable authentication + * + * @example + * ```typescript + * // lib/auth.ts + * import { createAuthOptions } from "@imtbl/auth-nextjs"; + * + * export const authOptions = createAuthOptions({ + * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + * }); + * + * // pages/api/auth/[...nextauth].ts + * import NextAuth from "next-auth"; + * import { authOptions } from "@/lib/auth"; + * + * export default NextAuth(authOptions); + * ``` + */ +export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions { + return { + providers: [ + CredentialsProvider({ + id: 'immutable', + name: 'Immutable', + credentials: { + tokens: { label: 'Tokens', type: 'text' }, + }, + async authorize(credentials) { + if (!credentials?.tokens) { + return null; + } + + try { + const tokenData: ImmutableTokenData = JSON.parse(credentials.tokens); + + // Return user object with all token data + return { + id: tokenData.profile.sub, + sub: tokenData.profile.sub, + email: tokenData.profile.email, + nickname: tokenData.profile.nickname, + accessToken: tokenData.accessToken, + refreshToken: tokenData.refreshToken, + idToken: tokenData.idToken, + accessTokenExpires: tokenData.accessTokenExpires, + zkEvm: tokenData.zkEvm, + }; + } catch (error) { + // eslint-disable-next-line no-console + console.error('[auth-nextjs] Failed to parse token data:', error); + return null; + } + }, + }), + ], + + callbacks: { + async jwt({ + token, user, trigger, session: sessionUpdate, + }) { + // Initial sign in - store all token data + if (user) { + return { + ...token, + sub: user.sub, + email: user.email, + nickname: user.nickname, + accessToken: user.accessToken, + refreshToken: user.refreshToken, + idToken: user.idToken, + accessTokenExpires: user.accessTokenExpires, + zkEvm: user.zkEvm, + }; + } + + // Handle session update (for client-side token sync) + if (trigger === 'update' && sessionUpdate) { + return { + ...token, + ...(sessionUpdate.accessToken && { accessToken: sessionUpdate.accessToken }), + ...(sessionUpdate.refreshToken && { refreshToken: sessionUpdate.refreshToken }), + ...(sessionUpdate.idToken && { idToken: sessionUpdate.idToken }), + ...(sessionUpdate.accessTokenExpires && { accessTokenExpires: sessionUpdate.accessTokenExpires }), + ...(sessionUpdate.zkEvm && { zkEvm: sessionUpdate.zkEvm }), + }; + } + + // Return token if not expired + if (!isTokenExpired(token.accessTokenExpires)) { + return token; + } + + // Token expired - refresh it + return refreshAccessToken(token, config); + }, + + async session({ session, token }) { + // Expose token data to the session + return { + ...session, + user: { + sub: token.sub, + email: token.email, + nickname: token.nickname, + }, + accessToken: token.accessToken, + refreshToken: token.refreshToken, + idToken: token.idToken, + accessTokenExpires: token.accessTokenExpires, + zkEvm: token.zkEvm, + ...(token.error && { error: token.error }), + }; + }, + }, + + pages: { + signIn: '/login', + error: '/login', + }, + + session: { + strategy: 'jwt', + // Session max age in seconds (30 days default) + maxAge: 30 * 24 * 60 * 60, + }, + + // Use NEXTAUTH_SECRET from environment + secret: process.env.NEXTAUTH_SECRET, + }; +} diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts new file mode 100644 index 0000000000..2cbe978630 --- /dev/null +++ b/packages/auth-nextjs/src/index.ts @@ -0,0 +1,73 @@ +// Main entry point for @imtbl/auth-nextjs + +import NextAuth, { type NextAuthOptions } from 'next-auth'; +import { createAuthOptions } from './config'; +import type { ImmutableAuthConfig } from './types'; + +/** + * NextAuth options that can be overridden. + * Excludes 'providers' as that's managed internally. + */ +export type ImmutableAuthOverrides = Omit; + +/** + * Create a NextAuth handler with Immutable authentication + * + * @param config - Immutable auth configuration + * @param overrides - Optional NextAuth options to override defaults + * + * @example Basic usage + * ```typescript + * // pages/api/auth/[...nextauth].ts + * import { ImmutableAuth } from "@imtbl/auth-nextjs"; + * + * export default ImmutableAuth({ + * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + * }); + * ``` + * + * @example With NextAuth overrides + * ```typescript + * export default ImmutableAuth( + * { clientId: "...", redirectUri: "..." }, + * { + * pages: { signIn: "/custom-login", error: "/auth-error" }, + * debug: true, + * } + * ); + * ``` + */ +export function ImmutableAuth( + config: ImmutableAuthConfig, + overrides?: ImmutableAuthOverrides, +) { + const authOptions = createAuthOptions(config); + + // Merge overrides with generated options + const mergedOptions: NextAuthOptions = overrides + ? { + ...authOptions, + ...overrides, + // Deep merge callbacks if both exist + callbacks: { + ...authOptions.callbacks, + ...overrides.callbacks, + }, + } + : authOptions; + + return NextAuth(mergedOptions); +} + +// Types +export type { + ImmutableAuthConfig, + ImmutableTokenData, + ImmutableUser, + ZkEvmInfo, + WithPageAuthRequiredOptions, +} from './types'; + +// Token refresh utilities (for advanced use) +export { refreshAccessToken, isTokenExpired } from './refresh'; diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts new file mode 100644 index 0000000000..d247657ebd --- /dev/null +++ b/packages/auth-nextjs/src/refresh.ts @@ -0,0 +1,73 @@ +import type { JWT } from 'next-auth/jwt'; +import type { ImmutableAuthConfig } from './types'; + +const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; + +/** + * Refresh the access token using the refresh token + * Called by NextAuth JWT callback when token is expired + */ +export async function refreshAccessToken( + token: JWT, + config: ImmutableAuthConfig, +): Promise { + const authDomain = config.authenticationDomain || DEFAULT_AUTH_DOMAIN; + + if (!token.refreshToken) { + return { + ...token, + error: 'NoRefreshToken', + }; + } + + try { + const response = await fetch(`${authDomain}/oauth/token`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'refresh_token', + client_id: config.clientId, + refresh_token: token.refreshToken, + }), + }); + + const data = await response.json(); + + if (!response.ok) { + throw new Error(data.error_description || data.error || 'Token refresh failed'); + } + + // Calculate expiry (access_token typically expires in 1 hour) + const expiresIn = data.expires_in || 3600; + const accessTokenExpires = Date.now() + expiresIn * 1000; + + return { + ...token, + accessToken: data.access_token, + refreshToken: data.refresh_token ?? token.refreshToken, + idToken: data.id_token ?? token.idToken, + accessTokenExpires, + error: undefined, + }; + } catch (error) { + // eslint-disable-next-line no-console + console.error('[auth-nextjs] Failed to refresh token:', error); + return { + ...token, + error: 'RefreshTokenError', + }; + } +} + +/** + * Check if the access token is expired or about to expire + * Returns true if token expires within the buffer time (default 60 seconds) + */ +export function isTokenExpired( + accessTokenExpires: number, + bufferSeconds: number = 60, +): boolean { + return Date.now() >= accessTokenExpires - bufferSeconds * 1000; +} diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-nextjs/src/server/index.ts new file mode 100644 index 0000000000..00fb0c2a9d --- /dev/null +++ b/packages/auth-nextjs/src/server/index.ts @@ -0,0 +1,10 @@ +// Server-side exports +export { + withPageAuthRequired, + getImmutableSession, + type WithPageAuthRequiredFullOptions, + type WithPageAuthRequiredProps, +} from './with-page-auth'; + +// Re-export useful types +export type { WithPageAuthRequiredOptions } from '../types'; diff --git a/packages/auth-nextjs/src/server/with-page-auth.ts b/packages/auth-nextjs/src/server/with-page-auth.ts new file mode 100644 index 0000000000..f7ded3aa5a --- /dev/null +++ b/packages/auth-nextjs/src/server/with-page-auth.ts @@ -0,0 +1,172 @@ +import type { + GetServerSideProps, + GetServerSidePropsContext, + GetServerSidePropsResult, +} from 'next'; +import type { IncomingMessage, ServerResponse } from 'http'; +import { getServerSession as nextAuthGetServerSession, type Session } from 'next-auth'; +import type { ImmutableAuthConfig, WithPageAuthRequiredOptions } from '../types'; +import { createAuthOptions } from '../config'; + +/** + * Extended options for withPageAuthRequired + */ +export interface WithPageAuthRequiredFullOptions< + P extends Record = Record, +> extends WithPageAuthRequiredOptions { + /** + * Custom getServerSideProps that runs after auth check. + * Session is guaranteed to exist when this runs. + */ + getServerSideProps?: ( + ctx: GetServerSidePropsContext, + session: Session + ) => Promise>; +} + +/** + * Props added by withPageAuthRequired + */ +export interface WithPageAuthRequiredProps { + session: Session; +} + +/** + * Get the Immutable session on the server side. + * + * @example + * ```typescript + * // pages/api/user.ts + * import { getImmutableSession } from "@imtbl/auth-nextjs/server"; + * + * const config = { clientId: "...", redirectUri: "..." }; + * + * export default async function handler(req, res) { + * const session = await getImmutableSession(req, res, config); + * if (!session) { + * return res.status(401).json({ error: "Not authenticated" }); + * } + * res.json({ user: session.user }); + * } + * ``` + * + * @example In getServerSideProps + * ```typescript + * export const getServerSideProps = async (ctx) => { + * const session = await getImmutableSession(ctx.req, ctx.res, config); + * return { props: { user: session?.user ?? null } }; + * }; + * ``` + */ +export async function getImmutableSession( + req: IncomingMessage & { cookies: Partial> }, + res: ServerResponse, + config: ImmutableAuthConfig, +): Promise { + const authOptions = createAuthOptions(config); + return nextAuthGetServerSession(req, res, authOptions); +} + +/** + * Higher-order function that protects a page with authentication. + * + * When a signed-out user visits the page: + * 1. Server checks session via getServerSession() → returns null + * 2. Returns HTTP redirect to login page with returnTo parameter + * 3. After login, user is redirected back to original page + * + * @example Basic usage: + * ```typescript + * // pages/dashboard.tsx + * import { withPageAuthRequired } from "@imtbl/auth-nextjs/server"; + * + * const config = { clientId: "...", redirectUri: "..." }; + * + * function DashboardPage() { + * // Page only renders if user is authenticated + * return

Dashboard

; + * } + * + * export default DashboardPage; + * export const getServerSideProps = withPageAuthRequired(config); + * ``` + * + * @example With additional data fetching: + * ```typescript + * export const getServerSideProps = withPageAuthRequired(config, { + * async getServerSideProps(ctx, session) { + * // session is guaranteed to exist here + * const data = await fetchData(session.accessToken); + * return { props: { data } }; + * }, + * }); + * ``` + * + * @example With custom options: + * ```typescript + * export const getServerSideProps = withPageAuthRequired(config, { + * loginUrl: "/auth/signin", + * returnTo: "/dashboard", + * }); + * ``` + */ +export function withPageAuthRequired< + P extends Record = Record, +>( + config: ImmutableAuthConfig, + options: WithPageAuthRequiredFullOptions

= {}, +): GetServerSideProps { + const { + loginUrl = '/login', + returnTo, + getServerSideProps: customGetServerSideProps, + } = options; + + const authOptions = createAuthOptions(config); + + return async (ctx: GetServerSidePropsContext) => { + const session = await nextAuthGetServerSession(ctx.req, ctx.res, authOptions); + + if (!session) { + // Build redirect URL + let destination = loginUrl; + + if (returnTo !== false) { + const returnPath = returnTo || ctx.resolvedUrl; + destination = `${loginUrl}?returnTo=${encodeURIComponent(returnPath)}`; + } + + return { + redirect: { + destination, + permanent: false, + }, + }; + } + + // Run custom getServerSideProps if provided + if (customGetServerSideProps) { + const result = await customGetServerSideProps(ctx, session); + + // Handle redirect or notFound + if ('redirect' in result || 'notFound' in result) { + return result; + } + + // Merge props with session + return { + props: { + ...result.props, + session, + } as WithPageAuthRequiredProps & P, + }; + } + + // Default: just return session + return { + props: { + session, + } as WithPageAuthRequiredProps & P, + }; + }; +} diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-nextjs/src/types.ts new file mode 100644 index 0000000000..7466ed9579 --- /dev/null +++ b/packages/auth-nextjs/src/types.ts @@ -0,0 +1,181 @@ +import type { DefaultSession, DefaultUser, Session } from 'next-auth'; +import type { DefaultJWT } from 'next-auth/jwt'; + +/** + * Configuration for ImmutableAuthProvider and createAuthOptions + */ +export interface ImmutableAuthConfig { + /** + * Immutable OAuth client ID + */ + clientId: string; + + /** + * OAuth callback redirect URI + */ + redirectUri: string; + + /** + * Where to redirect after logout + */ + logoutRedirectUri?: string; + + /** + * OAuth audience (default: "platform_api") + */ + audience?: string; + + /** + * OAuth scopes (default: "openid profile email offline_access transact") + */ + scope?: string; + + /** + * Authentication domain (default: "https://auth.immutable.com") + */ + authenticationDomain?: string; +} + +/** + * zkEVM wallet information + */ +export interface ZkEvmInfo { + ethAddress: string; + userAdminAddress: string; +} + +/** + * User profile from Immutable + */ +export interface ImmutableUser { + sub: string; + email?: string; + nickname?: string; +} + +/** + * NextAuth module augmentation to add Immutable-specific fields + */ +declare module 'next-auth' { + // eslint-disable-next-line @typescript-eslint/no-shadow + interface Session extends DefaultSession { + user: ImmutableUser; + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + zkEvm?: ZkEvmInfo; + error?: string; + } + + interface User extends DefaultUser { + sub: string; + email?: string; + nickname?: string; + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + zkEvm?: ZkEvmInfo; + } +} + +declare module 'next-auth/jwt' { + interface JWT extends DefaultJWT { + sub: string; + email?: string; + nickname?: string; + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + zkEvm?: ZkEvmInfo; + error?: string; + } +} + +/** + * Token data passed from client to NextAuth credentials provider + */ +export interface ImmutableTokenData { + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + profile: { + sub: string; + email?: string; + nickname?: string; + }; + zkEvm?: ZkEvmInfo; +} + +/** + * Props for ImmutableAuthProvider + */ +export interface ImmutableAuthProviderProps { + children: React.ReactNode; + /** + * Immutable auth configuration + */ + config: ImmutableAuthConfig; + /** + * Initial session from server (for SSR hydration) + * Can be Session from getServerSession or any compatible session object + */ + session?: Session | DefaultSession | null; +} + +/** + * Return type of useImmutableAuth hook + */ +export interface UseImmutableAuthReturn { + /** + * Current user profile (null if not authenticated) + */ + user: ImmutableUser | null; + /** + * Full NextAuth session with tokens + */ + session: Session | null; + /** + * Whether authentication state is loading + */ + isLoading: boolean; + /** + * Whether user is authenticated + */ + isAuthenticated: boolean; + /** + * Sign in with Immutable (opens popup) + */ + signIn: () => Promise; + /** + * Sign out from both NextAuth and Immutable + */ + signOut: () => Promise; + /** + * Get a valid access token (refreshes if needed) + */ + getAccessToken: () => Promise; + /** + * The underlying Auth instance (for advanced use) + */ + auth: import('@imtbl/auth').Auth | null; +} + +/** + * Options for withPageAuthRequired + */ +export interface WithPageAuthRequiredOptions { + /** + * URL to redirect to when not authenticated + * @default "/login" + */ + loginUrl?: string; + /** + * URL to redirect to after login + * @default current page + */ + returnTo?: string | false; +} diff --git a/packages/auth-nextjs/tsconfig.eslint.json b/packages/auth-nextjs/tsconfig.eslint.json new file mode 100644 index 0000000000..1eeb7d351c --- /dev/null +++ b/packages/auth-nextjs/tsconfig.eslint.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "exclude": [], + "include": ["src"] +} diff --git a/packages/auth-nextjs/tsconfig.json b/packages/auth-nextjs/tsconfig.json new file mode 100644 index 0000000000..af497ae60e --- /dev/null +++ b/packages/auth-nextjs/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDirs": ["src"], + "customConditions": ["development"], + "types": ["node"], + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": [ + "node_modules", + "dist", + "src/**/*.test.ts", + "src/**/*.test.tsx", + "src/**/*.spec.ts", + "src/**/*.spec.tsx" + ] +} + diff --git a/packages/auth-nextjs/tsup.config.ts b/packages/auth-nextjs/tsup.config.ts new file mode 100644 index 0000000000..7b0bdbd58f --- /dev/null +++ b/packages/auth-nextjs/tsup.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: { + index: "src/index.ts", + "client/index": "src/client/index.ts", + "server/index": "src/server/index.ts", + }, + outDir: "dist/node", + format: ["esm", "cjs"], + target: "es2022", + platform: "node", + dts: false, + clean: true, + external: ["react", "next", "next-auth", "next/navigation", "next/headers"], +}); + diff --git a/packages/passport/sdk-sample-app/next.config.js b/packages/passport/sdk-sample-app/next.config.js index 6f4b2c2c11..f1dc3a0669 100644 --- a/packages/passport/sdk-sample-app/next.config.js +++ b/packages/passport/sdk-sample-app/next.config.js @@ -15,7 +15,9 @@ const nextConfig = { typescript: { tsconfigPath: './tsconfig.build.json', }, - output: 'export', + // Static export disables API routes. + // Set ENABLE_API_ROUTES=true to enable API routes (required for auth-nextjs) + ...(process.env.ENABLE_API_ROUTES !== 'true' && { output: 'export' }), reactStrictMode: true, }; diff --git a/packages/passport/sdk-sample-app/package.json b/packages/passport/sdk-sample-app/package.json index 498291463e..0f983d958d 100644 --- a/packages/passport/sdk-sample-app/package.json +++ b/packages/passport/sdk-sample-app/package.json @@ -4,6 +4,7 @@ "dependencies": { "@biom3/design-tokens": "^0.4.5", "@biom3/react": "^0.29.4", + "@imtbl/auth-nextjs": "workspace:*", "@imtbl/blockchain-data": "workspace:*", "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", @@ -20,6 +21,7 @@ "ethers": "^6.13.4", "motion": "^11.17.0", "next": "14.2.25", + "next-auth": "^4.24.0", "react": "^18.2.0", "react-bootstrap": "^2.7.2", "react-dom": "^18.2.0" @@ -41,7 +43,7 @@ "scripts": { "build": "next build", "dev": "next dev", - "dev-with-sdk": "concurrently 'pnpm dev' 'pnpm run -w dev'", + "dev-with-sdk": "concurrently 'ENABLE_API_ROUTES=true pnpm dev' 'pnpm run -w dev'", "lint": "eslint 'src/**/*.{ts,tsx}' --max-warnings=0", "start": "next start" } diff --git a/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx b/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx new file mode 100644 index 0000000000..c7d76c02fc --- /dev/null +++ b/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx @@ -0,0 +1,100 @@ +import { useCallback } from "react"; +import { Stack } from "react-bootstrap"; +import { Body } from "@biom3/react"; +import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; +import CardStack from "@/components/CardStack"; +import WorkflowButton from "@/components/WorkflowButton"; +import { useStatusProvider } from "@/context/StatusProvider"; +import { useImmutableProvider } from "@/context/ImmutableProvider"; +import { usePassportProvider } from "@/context/PassportProvider"; + +/** + * Example component demonstrating @imtbl/auth-nextjs usage + * Uses useImmutableAuth hook from the provider (which handles hydration automatically) + */ +export default function AuthNextJS() { + const { addMessage } = useStatusProvider(); + const { environment } = useImmutableProvider(); + const { logout: passportLogout } = usePassportProvider(); + const { + user, + session, + isLoading, + isAuthenticated, + signIn, + signOut, + } = useImmutableAuth(); + + const handleSignIn = useCallback(async () => { + try { + await signIn(); + addMessage("Auth NextJS", `Login successful (${environment})`); + } catch (error) { + addMessage("Auth NextJS", error); + } + }, [signIn, environment, addMessage]); + + const handleSignOut = useCallback(async () => { + try { + await signOut(); + // Also logout from Passport + await passportLogout(); + addMessage("Auth NextJS", "Logout successful"); + } catch (error) { + addMessage("Auth NextJS", error); + } + }, [signOut, passportLogout, addMessage]); + + const handleGetUserInfo = useCallback(() => { + if (user) { + addMessage("Auth NextJS - User Info", { + sub: user.sub, + email: user.email, + nickname: user.nickname, + }); + } else { + addMessage("Auth NextJS", "Not authenticated"); + } + }, [user, addMessage]); + + const handleGetSessionInfo = useCallback(() => { + if (session) { + addMessage("Auth NextJS - Session Info", { + environment, + hasAccessToken: !!session.accessToken, + hasRefreshToken: !!session.refreshToken, + tokenExpires: session.accessTokenExpires + ? new Date(session.accessTokenExpires).toLocaleString() + : "N/A", + zkEvm: session.zkEvm || null, + }); + } else { + addMessage("Auth NextJS", "No session"); + } + }, [session, environment, addMessage]); + + return ( + + + + Login (NextAuth) + + + Logout (NextAuth) + + + Get User Info + + + Get Session Info + + + {isAuthenticated && ( + + Logged in as: {user?.email || user?.sub} ({environment}) + + )} + + ); +} + diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 6e4a3099d4..4951c53002 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -10,6 +10,7 @@ import { import { Orderbook, OrderbookOverrides } from '@imtbl/orderbook'; import { Passport, PassportModuleConfiguration } from '@imtbl/passport'; import { Environment, ImmutableConfiguration, ModuleConfiguration } from '@imtbl/config'; +import { ImmutableAuthProvider } from '@imtbl/auth-nextjs/client'; import { AUDIENCE, POPUP_REDIRECT_URI, @@ -23,6 +24,7 @@ import { EnvironmentNames } from '@/types'; import useLocalStorage from '@/hooks/useLocalStorage'; import { ImxApiClients, createConfig } from '@imtbl/generated-clients'; import { BlockchainData, BlockchainDataModuleConfiguration } from '@imtbl/blockchain-data'; +import { getAuthConfig } from '@/lib/auth-nextjs'; const getSdkConfig = (environment: EnvironmentNames): ImxModuleConfiguration => { switch (environment) { @@ -240,9 +242,14 @@ export function ImmutableProvider({ setEnvironment, }), [sdkClient, orderbookClient, passportClient, blockchainData, environment, setEnvironment]); + // Get auth-nextjs config based on current environment + const authConfig = useMemo(() => getAuthConfig(environment), [environment]); + return ( - {children} + + {children} + ); } diff --git a/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts b/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts new file mode 100644 index 0000000000..33265f5db6 --- /dev/null +++ b/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts @@ -0,0 +1,30 @@ +import type { ImmutableAuthConfig } from "@imtbl/auth-nextjs"; +import { EnvironmentNames } from "@/types"; + +// Client IDs for each environment (same as ImmutableProvider) +const CLIENT_IDS: Record = { + [EnvironmentNames.PRODUCTION]: "PtQRK4iRJ8GkXjiz6xfImMAYhPhW0cYk", + [EnvironmentNames.SANDBOX]: "mjtCL8mt06BtbxSkp2vbrYStKWnXVZfo", + [EnvironmentNames.DEV]: "pCtSnHovRnPiQuBcFkXAnbCNqNVcDM3m", +}; + +// Auth domains for each environment +const AUTH_DOMAINS: Record = { + [EnvironmentNames.PRODUCTION]: "https://auth.immutable.com", + [EnvironmentNames.SANDBOX]: "https://auth.immutable.com", + [EnvironmentNames.DEV]: "https://auth.dev.immutable.com", +}; + +// Get auth-nextjs config for a specific environment +export function getAuthConfig(environment: EnvironmentNames): ImmutableAuthConfig { + const baseUrl = typeof window !== "undefined" ? window.location.origin : "http://localhost:3000"; + + return { + clientId: CLIENT_IDS[environment], + redirectUri: `${baseUrl}/callback`, + audience: "platform_api", + scope: "openid profile email offline_access transact", + authenticationDomain: AUTH_DOMAINS[environment], + }; +} + diff --git a/packages/passport/sdk-sample-app/src/pages/_app.tsx b/packages/passport/sdk-sample-app/src/pages/_app.tsx index 8ae1164431..a8d8e5898a 100644 --- a/packages/passport/sdk-sample-app/src/pages/_app.tsx +++ b/packages/passport/sdk-sample-app/src/pages/_app.tsx @@ -3,21 +3,27 @@ import '@/styles/globals.css'; import React from 'react'; import type { AppProps } from 'next/app'; import { BiomeCombinedProviders } from '@biom3/react'; +import { SessionProvider } from 'next-auth/react'; import { ImmutableProvider } from '@/context/ImmutableProvider'; import { StatusProvider } from '@/context/StatusProvider'; import { PassportProvider } from '@/context/PassportProvider'; export default function App({ Component, pageProps }: AppProps) { return ( - - - - - {/* @ts-ignore */} - - - - - + + + + + + {/* @ts-ignore */} + + + + + + ); } + + + diff --git a/packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].ts b/packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].ts new file mode 100644 index 0000000000..b7f0a61af7 --- /dev/null +++ b/packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].ts @@ -0,0 +1,7 @@ +import { ImmutableAuth } from "@imtbl/auth-nextjs"; +import { getAuthConfig } from "@/lib/auth-nextjs"; +import { EnvironmentNames } from "@/types"; + +// Use sandbox config for the API route (server-side default) +export default ImmutableAuth(getAuthConfig(EnvironmentNames.SANDBOX)); + diff --git a/packages/passport/sdk-sample-app/src/pages/callback.tsx b/packages/passport/sdk-sample-app/src/pages/callback.tsx new file mode 100644 index 0000000000..2cfd7be779 --- /dev/null +++ b/packages/passport/sdk-sample-app/src/pages/callback.tsx @@ -0,0 +1,45 @@ +import { useEffect, useState } from "react"; +import { CallbackPage } from "@imtbl/auth-nextjs/client"; +import { getAuthConfig } from "@/lib/auth-nextjs"; +import { EnvironmentNames } from "@/types"; +import type { ImmutableAuthConfig } from "@imtbl/auth-nextjs"; +import { Container, Spinner } from "react-bootstrap"; + +/** + * OAuth callback page - reads environment from localStorage to use correct config + */ +export default function Callback() { + const [config, setConfig] = useState(null); + + useEffect(() => { + // Read environment from localStorage (same key as ImmutableProvider uses) + const storedEnv = localStorage.getItem("IMX_PASSPORT_SAMPLE_ENVIRONMENT"); + const environment = storedEnv + ? (JSON.parse(storedEnv) as EnvironmentNames) + : EnvironmentNames.SANDBOX; + + setConfig(getAuthConfig(environment)); + }, []); + + if (!config) { + return ( + + +

Loading...

+ + ); + } + + return ( + + +

Completing authentication...

+ + } + /> + ); +} + diff --git a/packages/passport/sdk-sample-app/src/pages/index.tsx b/packages/passport/sdk-sample-app/src/pages/index.tsx index ac20f5886f..90493574d4 100644 --- a/packages/passport/sdk-sample-app/src/pages/index.tsx +++ b/packages/passport/sdk-sample-app/src/pages/index.tsx @@ -10,6 +10,7 @@ import { useStatusProvider } from '@/context/StatusProvider'; import { BASE_PATH } from '@/config'; import PassportMethods from '@/components/PassportMethods'; import ZkEvmWorkflow from '@/components/zkevm/ZkEvmWorkflow'; +import AuthNextJS from '@/components/AuthNextJS'; export default function Home() { const { isLoading } = useStatusProvider(); @@ -28,6 +29,9 @@ export default function Home() { + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50f6441917..d3a464f003 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,7 +68,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-react-refresh: specifier: latest - version: 0.4.24(eslint@8.57.0) + version: 0.4.25(eslint@8.57.0) http-server: specifier: ^14.1.1 version: 14.1.1 @@ -135,7 +135,7 @@ importers: version: 0.25.21(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(framer-motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@imtbl/sdk': specifier: latest - version: 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -344,7 +344,7 @@ importers: dependencies: '@imtbl/contracts': specifier: latest - version: 2.2.17(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 2.2.18(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) '@imtbl/sdk': specifier: workspace:* version: link:../../sdk @@ -771,7 +771,7 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -829,7 +829,7 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -1043,6 +1043,52 @@ importers: specifier: ^5.6.2 version: 5.6.2 + packages/auth-nextjs: + dependencies: + '@imtbl/auth': + specifier: workspace:* + version: link:../auth + devDependencies: + '@swc/core': + specifier: ^1.3.36 + version: 1.15.3(@swc/helpers@0.5.13) + '@swc/jest': + specifier: ^0.2.37 + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13)) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.14 + '@types/node': + specifier: ^18.14.2 + version: 18.15.13 + '@types/react': + specifier: ^18.3.5 + version: 18.3.12 + jest: + specifier: ^29.4.3 + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-environment-jsdom: + specifier: ^29.4.3 + version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + next: + specifier: 14.2.25 + version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: ^4.24.0 + version: 4.24.13(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 + ts-node: + specifier: ^10.9.1 + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + tsup: + specifier: ^8.3.0 + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + typescript: + specifier: ^5.6.2 + version: 5.6.2 + packages/blockchain-data/sdk: dependencies: '@imtbl/config': @@ -2209,6 +2255,9 @@ importers: '@biom3/react': specifier: ^0.29.4 version: 0.29.11(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@imtbl/auth-nextjs': + specifier: workspace:* + version: link:../../auth-nextjs '@imtbl/blockchain-data': specifier: workspace:* version: link:../../blockchain-data/sdk @@ -2257,6 +2306,9 @@ importers: next: specifier: 14.2.25 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: ^4.24.0 + version: 4.24.13(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -2746,19 +2798,6 @@ importers: packages: - '@0xsequence/abi@2.3.38': - resolution: {integrity: sha512-KdR0JkjA9qnkZg5G/gFJT6xg5Ngzargf9blDGjniVqLhK3i/PuVMKV23CVmNi8Yg4QKB1DcwwB4hXKx6rXmJgQ==} - - '@0xsequence/core@2.3.38': - resolution: {integrity: sha512-H87zfeIX9YjlsDgxj2xJ2sIPU4bonRN5iHnOerWeVpHAfsUgVT6CwRSEvd2Ek3Yw1sI+s7kG9b4XxmJuh6Dp6Q==} - peerDependencies: - ethers: '>=6' - - '@0xsequence/utils@2.3.38': - resolution: {integrity: sha512-XCe17omFbLjQnDW7HNhNzTqcpeeiXeSCc5ttFjOYex+GO8v9imPt3qbcn4N2v4dlylfkSfpdh4DcnKlcAPAtFw==} - peerDependencies: - ethers: '>=6' - '@0xsquid/sdk@2.8.25': resolution: {integrity: sha512-fSMKVdKIX8G3qFpoTf3WfcyjhGdc9hE0uSu1bs1gsh4+iG19ILguDdrY8g87dUknt9PCKBb6TIt1QeYEgbXjdA==} @@ -4431,71 +4470,77 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} - '@imtbl/blockchain-data@2.11.0': - resolution: {integrity: sha512-UmgjEWN3pad+lZCVTx+BV5rFx9VMVM7WDSiVyYMqES3C+WgJeel/7dJKNjGpW9kq0BwPy6tSVRMKb+kokGL/dw==} + '@imtbl/auth@2.12.3': + resolution: {integrity: sha512-zUPwoYoiqyIyq4XKaJkvMMrKDhnPw0ND3AJUNN/ZZ2NMIKrDYpaIvCD2JmisO6HXiXrlb9HcocI+Bc+bfPnYhQ==} - '@imtbl/bridge-sdk@2.11.0': - resolution: {integrity: sha512-xZ6KoAlRY8Im7alyfKcqqcvIGxR+BiJ0S9tV4q6BXNSq0VKRoLt+4asJdzwQvfpFag1j2gZFP2jIz7zytShRVA==} + '@imtbl/blockchain-data@2.12.3': + resolution: {integrity: sha512-IwhH2oQe6eOb+WCOmrN5axuUH5cW13dzqaRudNwtZK8fG2qgSnbhEarozLUvkqTgnA4YWZ/q1GMfpDNV8gqxww==} + + '@imtbl/bridge-sdk@2.12.3': + resolution: {integrity: sha512-q8kZC0a14IhKRGkYd8a2H9YEMThS3irkHq1c/o3zOnzGLfk+wMGUaUzEzDYWgWWFzoskZfUMo9SUI5MX3MzLCA==} engines: {node: '>=20.11.0'} - '@imtbl/checkout-sdk@2.11.0': - resolution: {integrity: sha512-qOVzOW2fdys9sl2zMKYtrfvyzVvp+Q3R1uVUeN2NQ+yscDp4mvpVgWEr1s4FhYZ75gYG/+18mrKnvxLik+t2xA==} + '@imtbl/checkout-sdk@2.12.3': + resolution: {integrity: sha512-zjiL7bBkTcTX140XFuzVd5is4tGR3EW8f4v5ltCcIJYtp5QGK3ZBAK+O28kiLHzBug6ZB/dE1aIn2AsVp7zNog==} - '@imtbl/config@2.11.0': - resolution: {integrity: sha512-huORWo89gUYCXQPvKKl/cB440MrFhW2pU7nOELxHat/8hm3JirazemMmF5wyuaLJ+F0HjeWakqlOOnfM51ajiQ==} + '@imtbl/config@2.12.3': + resolution: {integrity: sha512-3bTdJrprnNFAuhB6vOsv2/1/wCoh+qzHc+j9NiSMLsE0RVr+8ZkLWHnvcEAxdlmTIS8FhA8i/C/k8VX8eGRWDg==} engines: {node: '>=20.11.0'} - '@imtbl/contracts@2.2.17': - resolution: {integrity: sha512-JakmzqU019vo4T52nPQIgXmGM5tlzPO5QRiMKU9xJQVMKPaICTc3UPIFEBfHr/Jq4cj720Dj8YaJ3SgowwO+bg==} + '@imtbl/contracts@2.2.18': + resolution: {integrity: sha512-wxjfE32t9jzEs4PswKwZDMlBO6wqCfSpVxseyFADFVG+Y2oFBrf1lK4eA0e81BbrXTGAbR+snSnSjPS305JoIQ==} '@imtbl/contracts@2.2.6': resolution: {integrity: sha512-2cfE3Tojfp4GnxwVKSwoZY1CWd+/drCIbCKawyH9Nh2zASXd7VC71lo27aD5RnCweXHkZVhPzjqwQf/xrtnmIQ==} - '@imtbl/dex-sdk@2.11.0': - resolution: {integrity: sha512-FSXplji/Thqd4DNgFad3T/AKszt0Ua5D+/hGjUzj+OaWIabTH9maeXtZThkJAV38Mm22mYz0xNgNCsszuhseNw==} + '@imtbl/dex-sdk@2.12.3': + resolution: {integrity: sha512-oFKqNAPNCfs4g9Yb3fmPSLVgvUevF9Mf7NmL2ubWcHM2EDu01cAVuUcuwklDxtbyHoD1aRzgFcWpoQQ9uml5rQ==} engines: {node: '>=20.11.0'} - '@imtbl/generated-clients@2.11.0': - resolution: {integrity: sha512-tYzqEnH2XIE5GYf1iMMJGPhdp9cQctLymy3Gav9aRCHQzXnLwSLQGEk0/M0JJ/3QTMoocawY6rV/Cs+vSTMsCw==} + '@imtbl/generated-clients@2.12.3': + resolution: {integrity: sha512-4YaMQYbCEX7XyYB7EOq9+qENFOz83JUF74D5yU9rInQYmdYAqoxRCF0W8tD5XSz7biLz+OMKjhP2a02J8/2xDw==} engines: {node: '>=20.11.0'} '@imtbl/image-resizer-utils@0.0.3': resolution: {integrity: sha512-/EOJKMJF4gD/Dv0qNhpUTpp2AgWeQ7XgYK9Xjl+xP2WWgaarNv1SHe1aeqSb8aZT5W7wSXdUGzn6TIxNsuCWGw==} - '@imtbl/metrics@2.11.0': - resolution: {integrity: sha512-e7ZFsYScv0P5Wy50PvC0L5GlGxnDLec5DvyHHd93RJGzkDs3spYkkGCXjoybbb6agTgtoL1IyKawcGe5K8HNLQ==} + '@imtbl/metrics@2.12.3': + resolution: {integrity: sha512-omHwaRfHMuBTkn8D9kDokF1xkWzgcA5VMzQcAtlKUvZAaKXgKJ6v6oA0d0idlPjSNJxnR6qz8k5gZQpI1jS4Mw==} engines: {node: '>=20.11.0'} - '@imtbl/minting-backend@2.11.0': - resolution: {integrity: sha512-SouAioAynwpXjgzBOOT1SfK+T6JpNaUw+ouIuNdpnR+fOE7DOsL9N+WxbmhFP6BLPrEOgE34ZtI+QNBX614iPA==} + '@imtbl/minting-backend@2.12.3': + resolution: {integrity: sha512-6RdzYxtJ/FQI6nb/Osany/8XZG3EkPv0nF8gH78lstp35FDsojMr0ynMd+lQBKfXK8N+1SCHdaDFuUOqiK70Ig==} - '@imtbl/orderbook@2.11.0': - resolution: {integrity: sha512-Mq1NXB/hs+In4hOrdGJmBM44rtSrYDejM4ixRaMbzRrSxehKpmsMI6W4fmv/3ZyJx2m8bvhAvZrS//jLL61UtQ==} + '@imtbl/orderbook@2.12.3': + resolution: {integrity: sha512-xc533eYWzbavagw1dr47TA0P0YTNHE/fSvGTKAWP+L3i8UZk7ptb67NsldeqQ5bOB5A4MByxGO9jUZ3DT/eKrg==} - '@imtbl/passport@2.11.0': - resolution: {integrity: sha512-hcBJmgoN2yjrczbRc+sZ6oCyqFmyBsIZRjR7QywhZIRwunGsGpzjO+kwmWzUOHCNl7zEShmEsfFOtpxlRBOckA==} + '@imtbl/passport@2.12.3': + resolution: {integrity: sha512-9f0IUalTd7csGZyFwE/Rxmt0pjnsSs6CktnuGhEVG+pVv86OMWJhrXSH00P1l+veHkLrO/TCJ+92LzcKxxUFJQ==} engines: {node: '>=20.11.0'} '@imtbl/react-analytics@0.3.4-alpha': resolution: {integrity: sha512-4VWvfm8RZtpLub7+x2D2wNQ507nIVBCSAPA7B5lxdb0cKrHEujM6Y/HScMImHZHvgjUFQT1jiD9b2BL/DS43Pg==} - '@imtbl/sdk@2.11.0': - resolution: {integrity: sha512-JyRj1bgVbQY7LzgROEvJba0a6DQRKgOP+Fou2lOjWJrxMdz7rYmEohhHS3eWaMnDvi+zRg8Ffbwy1bxlp9RLVQ==} + '@imtbl/sdk@2.12.3': + resolution: {integrity: sha512-ou3jCehJjVDqEob0HOhLrwnLhL/FwdmjBO6F37wBLgXXj1ThOraXpofV29f2qrlHPL1EjWEYED+j+gKL2m00sg==} engines: {node: '>=20.0.0'} - '@imtbl/toolkit@2.11.0': - resolution: {integrity: sha512-yL+V8wqHiAcQ4Q/TOE5euLMlRh/5rnhER5oFRtZss1lzTsmTqfygB/lg+8yyQ5i0pNNtt9bc/26uyXYl37JlhA==} + '@imtbl/toolkit@2.12.3': + resolution: {integrity: sha512-Orz0I8ajdLd1xhbwAxuj7+9VNjD+yUUaeVy35EJY3Yfm/08v6x/5BahLa0PKLMvSOniGs5QI9notA9lpX9naHQ==} engines: {node: '>=20.11.0'} - '@imtbl/webhook@2.11.0': - resolution: {integrity: sha512-xmeraQ6STLaCceEd4IFPE0htPrTb8oGVXPrk8zTRhuPzMRp/S4zfbOtnqpiLIU/Q+TzH7lrC7C1Fk3KxVe2OBw==} + '@imtbl/wallet@2.12.3': + resolution: {integrity: sha512-mHfqmywGNHXaEYoQjLGD/2ZuJz42/bCem+ocjkOeanbfpRmtLZDFiz+tdkte6MpnHWCz/8QKfg1DLy4KrdqZJg==} + + '@imtbl/webhook@2.12.3': + resolution: {integrity: sha512-k9+x1IZTN6oyNOmbJ+O824PtAb5vmB0sMWLXzGRwK/n8qYXpBbSpsk1NgP7vHJYbmqVydzyiNgn00zM3qmyY5w==} - '@imtbl/x-client@2.11.0': - resolution: {integrity: sha512-jW+W4uG0Z/XqJpNnDMJhlpp+JRMYz0rnsCpZxGKYUG55YwcHjXxMpkPuQSWWrwu7CNOrcFSYETZ2Mb+BKrR7gQ==} + '@imtbl/x-client@2.12.3': + resolution: {integrity: sha512-Ihje4DtgU/wxeDu7Cei0MeaB2aC9ZYVf8KSutMFvimF7Pqhlv/PqHfiYGdWe2B4a58nm2A0c1TOcuC8Ml7DcJg==} engines: {node: '>=20.11.0'} - '@imtbl/x-provider@2.11.0': - resolution: {integrity: sha512-2le+7s1WO2e6/scYQaV/XROucvWmJjvLRHuVCBbpfMaMZgp9HcF4DerHn8/wFcMzyi1AxHpQ8dG+UwzknYKPaA==} + '@imtbl/x-provider@2.12.3': + resolution: {integrity: sha512-/A5Ka8DFPAnkChHfxIyDSxFKAyTmdZhk0RXZpSxe2hs5Dd+3t6OfleJJL5HWaOdOf6F/Gzlqm22l3uWU5lDhpA==} engines: {node: '>=20.11.0'} '@ioredis/commands@1.2.0': @@ -4741,6 +4786,12 @@ packages: '@lezer/lr@1.4.5': resolution: {integrity: sha512-/YTRKP5yPPSo1xImYQk7AZZMAgap0kegzqCSYHjAL9x1AZ0ZQW+IpcEzMKagCsbTsLnVeWkxYrCNeXG8xEPrjg==} + '@limitbreak/creator-token-standards@5.0.0': + resolution: {integrity: sha512-BhrD3SMCq8YrGbJildBbu4BpHia7uby60XpGYVyFnb4xEvFey7bRbnOeVQ2mrTx07y02KvTWS5gESIPj5O4Mtg==} + + '@limitbreak/permit-c@1.0.0': + resolution: {integrity: sha512-7BooxTklXlCPzfdccfKL7Tt2Cm4MntOHR51dHqjKePn7AynMKsUtaKH75ZXHzWRPZSmyixFNzQ7tIJDdPxF2MA==} + '@lit-labs/ssr-dom-shim@1.2.0': resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} @@ -4785,24 +4836,6 @@ packages: resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} engines: {node: '>=8'} - '@magic-ext/oidc@12.0.5': - resolution: {integrity: sha512-EAmmRRZn/c5jmxHZ1H3IHtEqUKHYrsRtH9O+WuMFOZMv0llef/9MBa4DiRZkpnB0EPKb2hwsY7us8qk/LaFRNA==} - deprecated: 'Deprecation Notice: The OIDC extension will be deprecated soon. Please migrate to API Wallet, which offers improved performance and faster response times. Learn more: https://docs.magic.link/api-wallets/introduction' - - '@magic-sdk/commons@25.4.2': - resolution: {integrity: sha512-R3wJ1NWa+uDH9+Cc6kLjPDCSkelG3VM9pnuHR0zpE52XxiYaL0IplSG8DsjCqt2FeurTgqlUHGUEFrDHIdXEFQ==} - peerDependencies: - '@magic-sdk/provider': '>=18.6.0' - '@magic-sdk/types': '>=15.8.0' - - '@magic-sdk/provider@29.5.0': - resolution: {integrity: sha512-OAd813MLFfJDdRk/puRYqoGpBukGbTAlnR0n7f5AHG1NH9vQd/VSo3g6FunAPgoMfnLtJjFH9PdmD+Sh+f1yWA==} - peerDependencies: - localforage: ^1.7.4 - - '@magic-sdk/types@24.22.0': - resolution: {integrity: sha512-FLa9ChjsHcuRNF+dcXIFK4wPb1hJMjGtW+dz1gY5Oyhv37UB7xmOaIlR6YAe4jAxQvO+Hz2Q2Htk4JGI7WRluA==} - '@metamask/detect-provider@2.0.0': resolution: {integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==} engines: {node: '>=14.0.0'} @@ -5397,6 +5430,9 @@ packages: '@openzeppelin/contracts@3.4.2': resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} + '@openzeppelin/contracts@4.8.3': + resolution: {integrity: sha512-bQHV8R9Me8IaJoJ2vPG4rXcL7seB7YVuskr4f+f5RyOStSZetwzkWtoqDMl5erkBJy0lDRUnIR2WIkPiC0GJlg==} + '@openzeppelin/contracts@4.9.6': resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} @@ -5458,6 +5494,9 @@ packages: cpu: [x64] os: [win32] + '@panva/hkdf@1.2.1': + resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + '@parcel/bundler-default@2.16.3': resolution: {integrity: sha512-zCW2KzMfcEXqpVSU+MbLFMV3mHIzm/7UK1kT8mceuj4UwUScw7Lmjmulc2Ev4hcnwnaAFyaVkyFE5JXA4GKsLQ==} engines: {node: '>= 16.0.0', parcel: ^2.16.3} @@ -8851,9 +8890,6 @@ packages: caniuse-lite@1.0.30001660: resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} - caniuse-lite@1.0.30001703: - resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==} - caniuse-lite@1.0.30001760: resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} @@ -10058,6 +10094,9 @@ packages: engines: {node: '>=4'} hasBin: true + erc721a@4.2.3: + resolution: {integrity: sha512-0deF0hOOK1XI1Vxv3NKDh2E9sgzRlENuOoexjXRJIRfYCsLlqi9ejl2RF6Wcd9HfH0ldqC03wleQ2WDjxoOUvA==} + err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -10342,8 +10381,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-refresh@0.4.24: - resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} + eslint-plugin-react-refresh@0.4.25: + resolution: {integrity: sha512-dRUD2LOdEqI4zXHqbQ442blQAzdSuShAaiSq5Vtyy6LT08YUf0oOjBDo4VPx0dCPgiPWh1WB4dtbLOd0kOlDPQ==} peerDependencies: eslint: '>=8.40' @@ -12406,13 +12445,13 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - js-cookie@3.0.1: resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} engines: {node: '>=12'} @@ -12544,9 +12583,6 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - jwt-decode@3.1.2: - resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - jwt-decode@4.0.0: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} @@ -12888,6 +12924,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -12905,9 +12945,6 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-sdk@29.4.2: - resolution: {integrity: sha512-m5DFM+FUxAwDkmG8cuGKp9aIcJfIrI7TUoL5oL2ywumVAPAfBdJys0Udda7nZMJMN0mtHAhYPhqoOSqDU9HvgA==} - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -13225,9 +13262,6 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true - moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - motion-dom@11.18.1: resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} @@ -13319,9 +13353,24 @@ packages: new-date@1.0.3: resolution: {integrity: sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA==} + next-auth@4.24.13: + resolution: {integrity: sha512-sgObCfcfL7BzIK76SS5TnQtc3yo2Oifp/yIpfv6fMfeBOiBJkDWF3A2y9+yqnmJ4JKc2C+nMjSjmgDeTwgN1rQ==} + peerDependencies: + '@auth/core': 0.34.3 + next: ^12.2.5 || ^13 || ^14 || ^15 || ^16 + nodemailer: ^7.0.7 + react: ^17.0.2 || ^18 || ^19 + react-dom: ^17.0.2 || ^18 || ^19 + peerDependenciesMeta: + '@auth/core': + optional: true + nodemailer: + optional: true + next@14.2.25: resolution: {integrity: sha512-N5M7xMc4wSb4IkPvEV5X2BRRXUmhVHNyaXwEM86+voXthSZz8ZiRyQW4p9mwAoAPIm6OzuVZtn7idgEJeAJN3Q==} engines: {node: '>=18.17.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -13520,6 +13569,9 @@ packages: '@swc/core': optional: true + oauth@0.9.15: + resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} + ob1@0.80.12: resolution: {integrity: sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==} engines: {node: '>=18'} @@ -13538,6 +13590,10 @@ packages: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} + object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -13601,6 +13657,10 @@ packages: resolution: {integrity: sha512-jNdst/U28Iasukx/L5MP6b274Vr7ftQs6qAhPBCvz6Wt5rPCA+Q/tUmCzfCHHWweWw5szeMy2Gfrm1rITwUKrw==} engines: {node: '>=18'} + oidc-token-hash@5.2.0: + resolution: {integrity: sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw==} + engines: {node: ^10.13.0 || >=12.0.0} + on-exit-leak-free@0.2.0: resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} @@ -13651,6 +13711,9 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + openid-client@5.7.1: + resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==} + optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -14527,6 +14590,11 @@ packages: postgres-range@1.1.4: resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + preact-render-to-string@5.2.6: + resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} + peerDependencies: + preact: '>=10' + preact@10.23.1: resolution: {integrity: sha512-O5UdRsNh4vdZaTieWe3XOgSpdMAmkIYBCT3VhQDlKrzyCm8lUYsk0fmVEvoQQifoOjFRTaHZO69ylrzTW2BH+A==} @@ -14566,6 +14634,9 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + prisma@5.20.0: resolution: {integrity: sha512-6obb3ucKgAnsGS9x9gLOe8qa51XxvJ3vLQtmyf52CTey1Qcez3A6W6ROH5HIz5Q5bW+0VpmZb8WBohieMFGpig==} engines: {node: '>=16.13'} @@ -14670,6 +14741,7 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qr-code-styling@1.6.0-rc.1: @@ -15317,16 +15389,31 @@ packages: seaport-core@0.0.1: resolution: {integrity: sha512-fgdSIC0ru8xK+fdDfF4bgTFH8ssr6EwbPejC2g/JsWzxy+FvG7JfaX57yn/eIv6hoscgZL87Rm+kANncgwLH3A==} + seaport-core@1.6.5: + resolution: {integrity: sha512-jpGOpaKpH1B49oOYqAYAAVXN8eGlI/NjE6fYHPYlQaDVx325NS5dpiDDgGLtQZNgQ3EbqrfhfB5KyIbg7owyFg==} + seaport-core@https://codeload.github.com/immutable/seaport-core/tar.gz/0633350ec34f21fcede657ff812f11cf7d19144e: resolution: {tarball: https://codeload.github.com/immutable/seaport-core/tar.gz/0633350ec34f21fcede657ff812f11cf7d19144e} version: 1.5.0 + seaport-core@https://codeload.github.com/immutable/seaport-core/tar.gz/f9b2e50267862570d0df3ed7e3e32d1ff2cd9813: + resolution: {tarball: https://codeload.github.com/immutable/seaport-core/tar.gz/f9b2e50267862570d0df3ed7e3e32d1ff2cd9813} + version: 1.6.6 + seaport-sol@1.6.0: resolution: {integrity: sha512-a1FBK1jIeEQXZ9CmQvtmfG0w7CE8nIad89btGg7qrrrtF4j1S0Ilmzpe2Hderap05Uvf3EWS9P/aghDQCNAwkA==} seaport-types@0.0.1: resolution: {integrity: sha512-m7MLa7sq3YPwojxXiVvoX1PM9iNVtQIn7AdEtBnKTwgxPfGRWUlbs/oMgetpjT/ZYTmv3X5/BghOcstWYvKqRA==} + seaport-types@1.6.3: + resolution: {integrity: sha512-Rm9dTTEUKmXqMgc5TiRtfX/sFOX6SjKkT9l/spTdRknplYh5tmJ0fMJzbE60pCzV1/Izq0cCua6uvWszo6zOAQ==} + + seaport@https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c: + resolution: {tarball: https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c} + version: 1.6.0 + engines: {node: '>=18.15.0'} + seaport@https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9: resolution: {tarball: https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9} version: 1.5.0 @@ -17388,19 +17475,6 @@ packages: snapshots: - '@0xsequence/abi@2.3.38': {} - - '@0xsequence/core@2.3.38(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': - dependencies: - '@0xsequence/abi': 2.3.38 - '@0xsequence/utils': 2.3.38(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - '@0xsequence/utils@2.3.38(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': - dependencies: - ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - js-base64: 3.7.8 - '@0xsquid/sdk@2.8.25(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@cosmjs/cosmwasm-stargate': 0.32.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20293,17 +20367,26 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} - '@imtbl/blockchain-data@2.11.0': + '@imtbl/auth@2.12.3': + dependencies: + '@imtbl/generated-clients': 2.12.3 + '@imtbl/metrics': 2.12.3 + localforage: 1.10.0 + oidc-client-ts: 3.4.1 + transitivePeerDependencies: + - debug + + '@imtbl/blockchain-data@2.12.3': dependencies: - '@imtbl/config': 2.11.0 - '@imtbl/generated-clients': 2.11.0 + '@imtbl/config': 2.12.3 + '@imtbl/generated-clients': 2.12.3 axios: 1.7.7 transitivePeerDependencies: - debug - '@imtbl/bridge-sdk@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/bridge-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.11.0 + '@imtbl/config': 2.12.3 '@jest/globals': 29.7.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20313,21 +20396,21 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/checkout-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/blockchain-data': 2.11.0 - '@imtbl/bridge-sdk': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/config': 2.11.0 - '@imtbl/dex-sdk': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/generated-clients': 2.11.0 - '@imtbl/metrics': 2.11.0 - '@imtbl/orderbook': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/passport': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/blockchain-data': 2.12.3 + '@imtbl/bridge-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/config': 2.12.3 + '@imtbl/dex-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/generated-clients': 2.12.3 + '@imtbl/metrics': 2.12.3 + '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) semver: 7.7.1 - uuid: 8.3.2 + uuid: 9.0.1 transitivePeerDependencies: - bufferutil - debug @@ -20335,29 +20418,27 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/config@2.11.0': + '@imtbl/config@2.12.3': dependencies: - '@imtbl/metrics': 2.11.0 - transitivePeerDependencies: - - debug + '@imtbl/metrics': 2.12.3 - '@imtbl/contracts@2.2.17(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@imtbl/contracts@2.2.18(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 + '@limitbreak/creator-token-standards': 5.0.0 '@openzeppelin/contracts': 4.9.6 '@openzeppelin/contracts-upgradeable': 4.9.6 - '@rari-capital/solmate': 6.4.0 - eslint-plugin-mocha: 10.5.0(eslint@9.16.0(jiti@1.21.0)) - moment: 2.30.1 openzeppelin-contracts-5.0.2: '@openzeppelin/contracts@5.0.2' openzeppelin-contracts-upgradeable-4.9.3: '@openzeppelin/contracts-upgradeable@4.9.6' seaport: https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + seaport-16: seaport@https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + seaport-core-16: seaport-core@https://codeload.github.com/immutable/seaport-core/tar.gz/f9b2e50267862570d0df3ed7e3e32d1ff2cd9813 + seaport-types-16: seaport-types@1.6.3 solidity-bits: 0.4.0 solidity-bytes-utils: 0.8.2 transitivePeerDependencies: - bufferutil - c-kzg - - eslint - supports-color - ts-node - typescript @@ -20384,20 +20465,19 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/dex-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.11.0 + '@imtbl/config': 2.12.3 '@uniswap/sdk-core': 3.2.3 '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - - debug - hardhat - utf-8-validate - '@imtbl/generated-clients@2.11.0': + '@imtbl/generated-clients@2.12.3': dependencies: axios: 1.7.7 transitivePeerDependencies: @@ -20407,22 +20487,19 @@ snapshots: dependencies: buffer: 6.0.3 - '@imtbl/metrics@2.11.0': + '@imtbl/metrics@2.12.3': dependencies: - axios: 1.7.7 global-const: 0.1.2 lru-memorise: 0.3.0 - transitivePeerDependencies: - - debug - '@imtbl/minting-backend@2.11.0': + '@imtbl/minting-backend@2.12.3': dependencies: - '@imtbl/blockchain-data': 2.11.0 - '@imtbl/config': 2.11.0 - '@imtbl/generated-clients': 2.11.0 - '@imtbl/metrics': 2.11.0 - '@imtbl/webhook': 2.11.0 - uuid: 8.3.2 + '@imtbl/blockchain-data': 2.12.3 + '@imtbl/config': 2.12.3 + '@imtbl/generated-clients': 2.12.3 + '@imtbl/metrics': 2.12.3 + '@imtbl/webhook': 2.12.3 + uuid: 9.0.1 optionalDependencies: pg: 8.11.5 prisma: 5.20.0 @@ -20430,10 +20507,10 @@ snapshots: - debug - pg-native - '@imtbl/orderbook@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/orderbook@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.11.0 - '@imtbl/metrics': 2.11.0 + '@imtbl/config': 2.12.3 + '@imtbl/metrics': 2.12.3 '@opensea/seaport-js': 4.0.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20444,27 +20521,19 @@ snapshots: - debug - utf-8-validate - '@imtbl/passport@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': - dependencies: - '@0xsequence/abi': 2.3.38 - '@0xsequence/core': 2.3.38(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@imtbl/config': 2.11.0 - '@imtbl/generated-clients': 2.11.0 - '@imtbl/metrics': 2.11.0 - '@imtbl/toolkit': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-client': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-provider': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@magic-ext/oidc': 12.0.5 - '@magic-sdk/provider': 29.5.0(localforage@1.10.0) - '@metamask/detect-provider': 2.0.0 - axios: 1.7.7 + '@imtbl/passport@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@imtbl/auth': 2.12.3 + '@imtbl/config': 2.12.3 + '@imtbl/generated-clients': 2.12.3 + '@imtbl/metrics': 2.12.3 + '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/wallet': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - events: 3.3.0 - jwt-decode: 3.1.2 localforage: 1.10.0 - magic-sdk: 29.4.2 oidc-client-ts: 3.4.1 - uuid: 8.3.2 transitivePeerDependencies: - bufferutil - debug @@ -20478,17 +20547,19 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/blockchain-data': 2.11.0 - '@imtbl/checkout-sdk': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/config': 2.11.0 - '@imtbl/minting-backend': 2.11.0 - '@imtbl/orderbook': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/passport': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/webhook': 2.11.0 - '@imtbl/x-client': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-provider': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/auth': 2.12.3 + '@imtbl/blockchain-data': 2.12.3 + '@imtbl/checkout-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/config': 2.12.3 + '@imtbl/minting-backend': 2.12.3 + '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/wallet': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/webhook': 2.12.3 + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -20497,35 +20568,45 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/toolkit@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/toolkit@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/x-client': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@magic-ext/oidc': 12.0.5 + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 bn.js: 5.2.1 enc-utils: 3.0.0 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - magic-sdk: 29.4.2 oidc-client-ts: 3.4.1 transitivePeerDependencies: - bufferutil - debug - utf-8-validate - '@imtbl/webhook@2.11.0': + '@imtbl/wallet@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.11.0 - '@imtbl/generated-clients': 2.11.0 + '@imtbl/auth': 2.12.3 + '@imtbl/generated-clients': 2.12.3 + '@imtbl/metrics': 2.12.3 + '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + '@imtbl/webhook@2.12.3': + dependencies: + '@imtbl/config': 2.12.3 + '@imtbl/generated-clients': 2.12.3 sns-validator: 0.3.5 transitivePeerDependencies: - debug - '@imtbl/x-client@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-client@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethereumjs/wallet': 2.0.4 - '@imtbl/config': 2.11.0 - '@imtbl/generated-clients': 2.11.0 + '@imtbl/config': 2.12.3 + '@imtbl/generated-clients': 2.12.3 axios: 1.7.7 bn.js: 5.2.1 elliptic: 6.6.1 @@ -20537,18 +20618,16 @@ snapshots: - debug - utf-8-validate - '@imtbl/x-provider@2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-provider@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/config': 2.11.0 - '@imtbl/generated-clients': 2.11.0 - '@imtbl/toolkit': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-client': 2.11.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@magic-ext/oidc': 12.0.5 + '@imtbl/config': 2.12.3 + '@imtbl/generated-clients': 2.12.3 + '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 enc-utils: 3.0.0 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - magic-sdk: 29.4.2 oidc-client-ts: 3.4.1 transitivePeerDependencies: - bufferutil @@ -21313,6 +21392,16 @@ snapshots: dependencies: '@lezer/common': 1.4.0 + '@limitbreak/creator-token-standards@5.0.0': + dependencies: + '@limitbreak/permit-c': 1.0.0 + '@openzeppelin/contracts': 4.8.3 + erc721a: 4.2.3 + + '@limitbreak/permit-c@1.0.0': + dependencies: + '@openzeppelin/contracts': 4.8.3 + '@lit-labs/ssr-dom-shim@1.2.0': {} '@lit/reactive-element@1.6.3': @@ -21343,21 +21432,6 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - '@magic-ext/oidc@12.0.5': {} - - '@magic-sdk/commons@25.4.2(@magic-sdk/provider@29.5.0(localforage@1.10.0))(@magic-sdk/types@24.22.0)': - dependencies: - '@magic-sdk/provider': 29.5.0(localforage@1.10.0) - '@magic-sdk/types': 24.22.0 - - '@magic-sdk/provider@29.5.0(localforage@1.10.0)': - dependencies: - '@magic-sdk/types': 24.22.0 - eventemitter3: 4.0.7 - localforage: 1.10.0 - - '@magic-sdk/types@24.22.0': {} - '@metamask/detect-provider@2.0.0': {} '@metamask/eth-json-rpc-provider@1.0.1': @@ -21513,8 +21587,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@metamask/superstruct': 3.1.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@types/debug': 4.1.8 debug: 4.3.7(supports-color@8.1.1) pony-cause: 2.1.11 @@ -21527,8 +21601,8 @@ snapshots: dependencies: '@ethereumjs/tx': 4.2.0 '@metamask/superstruct': 3.1.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 '@types/debug': 4.1.8 debug: 4.3.7(supports-color@8.1.1) pony-cause: 2.1.11 @@ -22118,6 +22192,8 @@ snapshots: '@openzeppelin/contracts@3.4.2': {} + '@openzeppelin/contracts@4.8.3': {} + '@openzeppelin/contracts@4.9.6': {} '@openzeppelin/contracts@5.0.2': {} @@ -22157,6 +22233,8 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@1.11.0': optional: true + '@panva/hkdf@1.2.1': {} + '@parcel/bundler-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': dependencies: '@parcel/diagnostic': 2.16.3 @@ -24584,6 +24662,13 @@ snapshots: '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 + '@swc/jest@0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13))': + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/counter': 0.1.3 + jsonc-parser: 3.3.1 + '@swc/jest@0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13))': dependencies: '@jest/create-cache-key-function': 29.7.0 @@ -26796,7 +26881,7 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001703 + caniuse-lite: 1.0.30001760 electron-to-chromium: 1.5.113 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -26950,14 +27035,12 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001703 + caniuse-lite: 1.0.30001760 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-lite@1.0.30001660: {} - caniuse-lite@1.0.30001703: {} - caniuse-lite@1.0.30001760: {} capture-exit@2.0.0: @@ -28289,6 +28372,8 @@ snapshots: envinfo@7.14.0: {} + erc721a@4.2.3: {} + err-code@2.0.3: {} error-ex@1.3.2: @@ -28997,7 +29082,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-refresh@0.4.24(eslint@8.57.0): + eslint-plugin-react-refresh@0.4.25(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -32932,9 +33017,9 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - joycon@3.1.1: {} + jose@4.15.9: {} - js-base64@3.7.8: {} + joycon@3.1.1: {} js-cookie@3.0.1: {} @@ -33113,8 +33198,6 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - jwt-decode@3.1.2: {} - jwt-decode@4.0.0: {} jwt-encode@1.0.1: @@ -33471,6 +33554,10 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru-cache@7.18.3: {} lru-memorise@0.3.0: @@ -33483,13 +33570,6 @@ snapshots: lz-string@1.5.0: {} - magic-sdk@29.4.2: - dependencies: - '@magic-sdk/commons': 25.4.2(@magic-sdk/provider@29.5.0(localforage@1.10.0))(@magic-sdk/types@24.22.0) - '@magic-sdk/provider': 29.5.0(localforage@1.10.0) - '@magic-sdk/types': 24.22.0 - localforage: 1.10.0 - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -33952,8 +34032,6 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - moment@2.30.1: {} - motion-dom@11.18.1: dependencies: motion-utils: 11.18.1 @@ -34075,17 +34153,47 @@ snapshots: dependencies: '@segment/isodate': 1.0.3 - next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-auth@4.24.13(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.0 + '@panva/hkdf': 1.2.1 + cookie: 0.7.2 + jose: 4.15.9 + next: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + oauth: 0.9.15 + openid-client: 5.7.1 + preact: 10.23.1 + preact-render-to-string: 5.2.6(preact@10.23.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + uuid: 8.3.2 + + next-auth@4.24.13(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.0 + '@panva/hkdf': 1.2.1 + cookie: 0.7.2 + jose: 4.15.9 + next: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + oauth: 0.9.15 + openid-client: 5.7.1 + preact: 10.23.1 + preact-render-to-string: 5.2.6(preact@10.23.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + uuid: 8.3.2 + + next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.25 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001703 + caniuse-lite: 1.0.30001760 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.26.10)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.25 '@next/swc-darwin-x64': 14.2.25 @@ -34106,7 +34214,7 @@ snapshots: '@next/env': 14.2.25 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001703 + caniuse-lite: 1.0.30001760 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -34380,6 +34488,8 @@ snapshots: transitivePeerDependencies: - debug + oauth@0.9.15: {} + ob1@0.80.12: dependencies: flow-enums-runtime: 0.0.6 @@ -34400,6 +34510,8 @@ snapshots: define-property: 0.2.5 kind-of: 3.2.2 + object-hash@2.2.0: {} + object-hash@3.0.0: {} object-inspect@1.13.1: {} @@ -34475,6 +34587,8 @@ snapshots: dependencies: jwt-decode: 4.0.0 + oidc-token-hash@5.2.0: {} + on-exit-leak-free@0.2.0: {} on-exit-leak-free@2.1.2: {} @@ -34525,6 +34639,13 @@ snapshots: opener@1.5.2: {} + openid-client@5.7.1: + dependencies: + jose: 4.15.9 + lru-cache: 6.0.0 + object-hash: 2.2.0 + oidc-token-hash: 5.2.0 + optionator@0.8.3: dependencies: deep-is: 0.1.4 @@ -35456,6 +35577,11 @@ snapshots: postgres-range@1.1.4: {} + preact-render-to-string@5.2.6(preact@10.23.1): + dependencies: + preact: 10.23.1 + pretty-format: 3.8.0 + preact@10.23.1: {} prelude-ls@1.1.2: {} @@ -35497,6 +35623,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 + pretty-format@3.8.0: {} + prisma@5.20.0: dependencies: '@prisma/engines': 5.20.0 @@ -36656,10 +36784,18 @@ snapshots: dependencies: seaport-types: 0.0.1 + seaport-core@1.6.5: + dependencies: + seaport-types: 1.6.3 + seaport-core@https://codeload.github.com/immutable/seaport-core/tar.gz/0633350ec34f21fcede657ff812f11cf7d19144e: dependencies: seaport-types: 0.0.1 + seaport-core@https://codeload.github.com/immutable/seaport-core/tar.gz/f9b2e50267862570d0df3ed7e3e32d1ff2cd9813: + dependencies: + seaport-types: 1.6.3 + seaport-sol@1.6.0: dependencies: seaport-core: 0.0.1 @@ -36667,6 +36803,28 @@ snapshots: seaport-types@0.0.1: {} + seaport-types@1.6.3: {} + + seaport@https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): + dependencies: + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@openzeppelin/contracts': 4.9.6 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers-eip712: 0.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + merkletreejs: 0.3.11 + seaport-core: 1.6.5 + seaport-sol: 1.6.0 + seaport-types: 1.6.3 + solady: 0.0.84 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - ts-node + - typescript + - utf-8-validate + seaport@https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) @@ -37418,12 +37576,13 @@ snapshots: dependencies: webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - styled-jsx@5.1.1(@babel/core@7.26.10)(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 optionalDependencies: '@babel/core': 7.26.10 + babel-plugin-macros: 3.1.0 styled-jsx@5.1.1(@babel/core@7.26.9)(react@18.3.1): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 59f7047925..84cdcb072f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - "sdk" - "packages/auth" + - "packages/auth-nextjs" - "packages/wallet" - "packages/config" - "packages/x-client" @@ -33,4 +34,4 @@ packages: - "examples/contracts/**" - "examples/x-to-zkevm-migration-app/**" - # Setup catalog file versions for core packages like typescript/eslint \ No newline at end of file + # Setup catalog file versions for core packages like typescript/eslint From 55f5c1f7c031dccc83b63ecafe7dc66cd9a2abee Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 17 Dec 2025 14:45:49 +1100 Subject: [PATCH 02/88] clean up --- packages/auth-nextjs/README.md | 100 +++++++++++++++--- packages/auth-nextjs/src/client/callback.tsx | 2 +- packages/auth-nextjs/src/client/provider.tsx | 43 ++++---- packages/auth-nextjs/src/index.ts | 7 +- packages/auth-nextjs/tsup.config.ts | 36 +++++-- .../src/components/AuthNextJS.tsx | 9 +- .../src/context/ImmutableProvider.tsx | 6 +- .../sdk-sample-app/src/pages/_app.tsx | 26 +++-- .../sdk-sample-app/src/pages/index.tsx | 4 +- 9 files changed, 168 insertions(+), 65 deletions(-) diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index 9d4bf60c17..d7eaffc9fe 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -132,6 +132,19 @@ export default DashboardPage; export const getServerSideProps = withPageAuthRequired(config); ``` +## Configuration Options + +The `ImmutableAuthConfig` object accepts the following properties: + +| Property | Type | Required | Default | Description | +| ---------------------- | -------- | -------- | ------------------------------------------------ | ------------------------------ | +| `clientId` | `string` | Yes | - | Immutable OAuth client ID | +| `redirectUri` | `string` | Yes | - | OAuth callback redirect URI | +| `logoutRedirectUri` | `string` | No | - | Where to redirect after logout | +| `audience` | `string` | No | `"platform_api"` | OAuth audience | +| `scope` | `string` | No | `"openid profile email offline_access transact"` | OAuth scopes | +| `authenticationDomain` | `string` | No | `"https://auth.immutable.com"` | Authentication domain | + ## Environment Variables ```bash @@ -157,24 +170,87 @@ openssl rand -base64 32 | Export | Description | | ----------------------------------- | ------------------------------------------- | | `ImmutableAuth(config, overrides?)` | Creates NextAuth handler (use in API route) | -| `ImmutableAuthConfig` | Configuration type | -| `ImmutableAuthOverrides` | NextAuth options override type | +| `refreshAccessToken(token)` | Utility to refresh an expired access token | +| `isTokenExpired(token)` | Utility to check if a token is expired | + +**Types:** + +| Type | Description | +| ----------------------------- | ----------------------------------------- | +| `ImmutableAuthConfig` | Configuration options | +| `ImmutableAuthOverrides` | NextAuth options override type | +| `ImmutableUser` | User profile type | +| `ImmutableTokenData` | Token data passed to credentials provider | +| `ZkEvmInfo` | zkEVM wallet information type | +| `WithPageAuthRequiredOptions` | Options for page protection | ### Client Exports (`@imtbl/auth-nextjs/client`) -| Export | Description | -| ----------------------- | ------------------------------------------------------------------------ | -| `ImmutableAuthProvider` | React context provider | -| `useImmutableAuth()` | Hook returning `{ user, session, signIn, signOut, getAccessToken, ... }` | -| `useAccessToken()` | Hook returning `getAccessToken` function | -| `CallbackPage` | Pre-built callback page component for OAuth redirects | +| Export | Description | +| ----------------------- | ------------------------------------------------------- | +| `ImmutableAuthProvider` | React context provider (wraps NextAuth SessionProvider) | +| `useImmutableAuth()` | Hook for authentication state and methods (see below) | +| `useAccessToken()` | Hook returning `getAccessToken` function | +| `CallbackPage` | Pre-built callback page component for OAuth redirects | + +**`useImmutableAuth()` Return Value:** + +| Property | Type | Description | +| ----------------- | ----------------------- | ------------------------------------------------ | +| `user` | `ImmutableUser \| null` | Current user profile (null if not authenticated) | +| `session` | `Session \| null` | Full NextAuth session with tokens | +| `isLoading` | `boolean` | Whether authentication state is loading | +| `isAuthenticated` | `boolean` | Whether user is authenticated | +| `signIn` | `() => Promise` | Sign in with Immutable (opens popup) | +| `signOut` | `() => Promise` | Sign out from both NextAuth and Immutable | +| `getAccessToken` | `() => Promise` | Get a valid access token (refreshes if needed) | +| `auth` | `Auth \| null` | The underlying Auth instance (for advanced use) | + +**Types:** + +| Type | Description | +| ---------------------------- | -------------------------------- | +| `ImmutableAuthProviderProps` | Props for the provider component | +| `UseImmutableAuthReturn` | Return type of useImmutableAuth | +| `CallbackPageProps` | Props for CallbackPage component | +| `ImmutableAuthConfig` | Re-exported configuration type | +| `ImmutableUser` | Re-exported user type | ### Server Exports (`@imtbl/auth-nextjs/server`) -| Export | Description | -| ---------------------------------------- | ------------------------ | -| `getImmutableSession(req, res, config)` | Get session server-side | -| `withPageAuthRequired(config, options?)` | HOC for protecting pages | +| Export | Description | +| ---------------------------------------- | ---------------------------------------- | +| `getImmutableSession(req, res, config)` | Get session server-side | +| `withPageAuthRequired(config, options?)` | HOC for protecting pages with auth check | + +**`withPageAuthRequired` Options:** + +| Option | Type | Default | Description | +| -------------------- | ----------------------- | ------------ | ---------------------------------------------------- | +| `loginUrl` | `string` | `"/login"` | URL to redirect to when not authenticated | +| `returnTo` | `string \| false` | current page | URL to redirect to after login (`false` to disable) | +| `getServerSideProps` | `(ctx, session) => ...` | - | Custom getServerSideProps that runs after auth check | + +**Example with custom getServerSideProps:** + +```typescript +export const getServerSideProps = withPageAuthRequired(config, { + loginUrl: "/auth/signin", + async getServerSideProps(ctx, session) { + // session is guaranteed to exist here + const data = await fetchData(session.accessToken); + return { props: { data } }; + }, +}); +``` + +**Types:** + +| Type | Description | +| --------------------------------- | ----------------------------------------- | +| `WithPageAuthRequiredOptions` | Basic options for page protection | +| `WithPageAuthRequiredFullOptions` | Full options including getServerSideProps | +| `WithPageAuthRequiredProps` | Props added to protected pages (session) | ## How It Works diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index a6942ca3a1..7212966ff6 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -46,7 +46,7 @@ export function CallbackPage({ config, redirectTo = '/', loadingComponent = null, - errorComponent = null, + errorComponent, }: CallbackPageProps) { const router = useRouter(); const [error, setError] = useState(null); diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 38b31ba6eb..cfd5abb90c 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -44,7 +44,8 @@ function ImmutableAuthInner({ children: React.ReactNode; config: ImmutableAuthConfig; }) { - const authRef = useRef(null); + // Use state instead of ref so changes trigger re-renders and update context consumers + const [auth, setAuth] = useState(null); const prevConfigRef = useRef(null); const [isAuthReady, setIsAuthReady] = useState(false); const { data: session, update: updateSession } = useSession(); @@ -56,30 +57,29 @@ function ImmutableAuthInner({ // Create a config key to detect changes (clientId + authDomain uniquely identify the environment) const configKey = `${config.clientId}:${config.authenticationDomain || DEFAULT_AUTH_DOMAIN}`; - // If config changed, recreate Auth instance - if (prevConfigRef.current !== null && prevConfigRef.current !== configKey) { - authRef.current = null; - setIsAuthReady(false); + // Only recreate if config actually changed + if (prevConfigRef.current === configKey) { + return; } prevConfigRef.current = configKey; - if (!authRef.current) { - authRef.current = new Auth({ - clientId: config.clientId, - redirectUri: config.redirectUri, - logoutRedirectUri: config.logoutRedirectUri, - audience: config.audience || 'platform_api', - scope: config.scope || 'openid profile email offline_access transact', - authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, - }); - setIsAuthReady(true); - } + // Create new Auth instance with current config + const newAuth = new Auth({ + clientId: config.clientId, + redirectUri: config.redirectUri, + logoutRedirectUri: config.logoutRedirectUri, + audience: config.audience || 'platform_api', + scope: config.scope || 'openid profile email offline_access transact', + authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, + }); + + setAuth(newAuth); + setIsAuthReady(true); }, [config]); // Hydrate Auth instance from NextAuth session if localStorage is cleared // This handles the case where a valid session exists but Auth has no local state useEffect(() => { - const auth = authRef.current; if (!auth || !isAuthReady) return; if (!session?.accessToken || !session?.idToken) return; @@ -119,11 +119,10 @@ function ImmutableAuthInner({ }; hydrateAuth(); - }, [isAuthReady, session]); + }, [auth, isAuthReady, session]); // Listen for Auth events to sync tokens back to NextAuth useEffect(() => { - const auth = authRef.current; if (!auth || !isAuthReady) return undefined; const handleLoggedIn = async (authUser: User) => { @@ -144,11 +143,11 @@ function ImmutableAuthInner({ return () => { auth.eventEmitter.removeListener('loggedIn', handleLoggedIn); }; - }, [isAuthReady, session, updateSession]); + }, [auth, isAuthReady, session, updateSession]); const contextValue = useMemo( - () => ({ auth: authRef.current, config }), - [isAuthReady, config], + () => ({ auth, config }), + [auth, config], ); return ( diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts index 2cbe978630..9f5682fd37 100644 --- a/packages/auth-nextjs/src/index.ts +++ b/packages/auth-nextjs/src/index.ts @@ -1,9 +1,14 @@ // Main entry point for @imtbl/auth-nextjs -import NextAuth, { type NextAuthOptions } from 'next-auth'; +import NextAuthDefault, { type NextAuthOptions } from 'next-auth'; import { createAuthOptions } from './config'; import type { ImmutableAuthConfig } from './types'; +// Handle ESM/CJS interop - in some bundler configurations, the default export +// may be nested under a 'default' property +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const NextAuth = ((NextAuthDefault as any).default || NextAuthDefault) as typeof NextAuthDefault; + /** * NextAuth options that can be overridden. * Excludes 'providers' as that's managed internally. diff --git a/packages/auth-nextjs/tsup.config.ts b/packages/auth-nextjs/tsup.config.ts index 7b0bdbd58f..d834ce0814 100644 --- a/packages/auth-nextjs/tsup.config.ts +++ b/packages/auth-nextjs/tsup.config.ts @@ -1,17 +1,35 @@ -import { defineConfig } from "tsup"; +import { defineConfig, type Options } from "tsup"; -export default defineConfig({ - entry: { - index: "src/index.ts", - "client/index": "src/client/index.ts", - "server/index": "src/server/index.ts", - }, +// Base configuration shared across all builds +const baseConfig: Options = { outDir: "dist/node", format: ["esm", "cjs"], target: "es2022", platform: "node", dts: false, - clean: true, external: ["react", "next", "next-auth", "next/navigation", "next/headers"], -}); +}; + +export default defineConfig([ + // Server-side entries (no 'use client' directive) + { + ...baseConfig, + entry: { + index: "src/index.ts", + "server/index": "src/server/index.ts", + }, + clean: true, + }, + // Client-side entry (needs 'use client' directive for Next.js) + { + ...baseConfig, + entry: { + "client/index": "src/client/index.ts", + }, + clean: false, // Don't clean since server build runs first + banner: { + js: "'use client';", + }, + }, +]); diff --git a/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx b/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx index c7d76c02fc..f68e4daad2 100644 --- a/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx +++ b/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx @@ -74,13 +74,16 @@ export default function AuthNextJS() { }, [session, environment, addMessage]); return ( - + + + ⚠️ This section is only testable when running the sample app locally with: pnpm run dev-with-sdk + - Login (NextAuth) + Login - Logout (NextAuth) + Logout Get User Info diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 4951c53002..837e0d6528 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -11,6 +11,7 @@ import { Orderbook, OrderbookOverrides } from '@imtbl/orderbook'; import { Passport, PassportModuleConfiguration } from '@imtbl/passport'; import { Environment, ImmutableConfiguration, ModuleConfiguration } from '@imtbl/config'; import { ImmutableAuthProvider } from '@imtbl/auth-nextjs/client'; +import type { Session } from 'next-auth'; import { AUDIENCE, POPUP_REDIRECT_URI, @@ -202,7 +203,8 @@ const ImmutableContext = createContext<{ export function ImmutableProvider({ children, -}: { children: JSX.Element | JSX.Element[] }) { + session, +}: { children: JSX.Element | JSX.Element[]; session?: Session }) { const [environment, setEnvironment] = useLocalStorage( 'IMX_PASSPORT_SAMPLE_ENVIRONMENT', useContext(ImmutableContext).environment, @@ -247,7 +249,7 @@ export function ImmutableProvider({ return ( - + {children} diff --git a/packages/passport/sdk-sample-app/src/pages/_app.tsx b/packages/passport/sdk-sample-app/src/pages/_app.tsx index a8d8e5898a..997e0c3c10 100644 --- a/packages/passport/sdk-sample-app/src/pages/_app.tsx +++ b/packages/passport/sdk-sample-app/src/pages/_app.tsx @@ -3,25 +3,23 @@ import '@/styles/globals.css'; import React from 'react'; import type { AppProps } from 'next/app'; import { BiomeCombinedProviders } from '@biom3/react'; -import { SessionProvider } from 'next-auth/react'; +import type { Session } from 'next-auth'; import { ImmutableProvider } from '@/context/ImmutableProvider'; import { StatusProvider } from '@/context/StatusProvider'; import { PassportProvider } from '@/context/PassportProvider'; -export default function App({ Component, pageProps }: AppProps) { +export default function App({ Component, pageProps }: AppProps<{ session?: Session }>) { return ( - - - - - - {/* @ts-ignore */} - - - - - - + + + + + {/* @ts-ignore */} + + + + + ); } diff --git a/packages/passport/sdk-sample-app/src/pages/index.tsx b/packages/passport/sdk-sample-app/src/pages/index.tsx index 90493574d4..0451d2afbf 100644 --- a/packages/passport/sdk-sample-app/src/pages/index.tsx +++ b/packages/passport/sdk-sample-app/src/pages/index.tsx @@ -7,6 +7,7 @@ import Message from '@/components/Message'; import Environment from '@/components/Environment'; import { usePassportProvider } from '@/context/PassportProvider'; import { useStatusProvider } from '@/context/StatusProvider'; +import { useImmutableAuth } from '@imtbl/auth-nextjs/client'; import { BASE_PATH } from '@/config'; import PassportMethods from '@/components/PassportMethods'; import ZkEvmWorkflow from '@/components/zkevm/ZkEvmWorkflow'; @@ -15,6 +16,7 @@ import AuthNextJS from '@/components/AuthNextJS'; export default function Home() { const { isLoading } = useStatusProvider(); const { imxProvider, zkEvmProvider, defaultWalletProvider } = usePassportProvider(); + const { isAuthenticated: isAuthNextJSAuthenticated } = useImmutableAuth(); return ( <> @@ -27,7 +29,7 @@ export default function Home() {
- + From e9cfdc48a6bedd818ee0195046d90024870c13e0 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 17 Dec 2025 14:50:13 +1100 Subject: [PATCH 03/88] handle error callback --- packages/auth-nextjs/src/client/callback.tsx | 28 +++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index 7212966ff6..f204511767 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -80,11 +80,33 @@ export function CallbackPage({ } }; - // Only run when we have the code parameter - if (router.isReady && router.query.code) { + const handleOAuthError = () => { + // OAuth providers return error and error_description when authentication fails + // (e.g., user cancels, consent denied, invalid request) + const errorCode = router.query.error as string; + const errorDescription = router.query.error_description as string; + + const errorMessage = errorDescription || errorCode || 'Authentication failed'; + setError(errorMessage); + }; + + if (!router.isReady) { + return; + } + + // Handle OAuth error responses (user cancelled, consent denied, etc.) + if (router.query.error) { + handleOAuthError(); + return; + } + + // Handle successful OAuth callback with authorization code + if (router.query.code) { handleCallback(); } - }, [router.isReady, router.query.code, router, config, redirectTo]); + }, [ + router.isReady, router.query.code, router.query.error, router.query.error_description, router, config, redirectTo, + ]); if (error) { if (errorComponent) { From 6f8ed40b27b013f159371f70e3393ef8225e9369 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 17 Dec 2025 15:05:33 +1100 Subject: [PATCH 04/88] conditional api routes --- packages/passport/sdk-sample-app/next.config.js | 12 +++++++++--- .../auth/{[...nextauth].ts => [...nextauth].api.ts} | 0 2 files changed, 9 insertions(+), 3 deletions(-) rename packages/passport/sdk-sample-app/src/pages/api/auth/{[...nextauth].ts => [...nextauth].api.ts} (100%) diff --git a/packages/passport/sdk-sample-app/next.config.js b/packages/passport/sdk-sample-app/next.config.js index f1dc3a0669..6836df8e5c 100644 --- a/packages/passport/sdk-sample-app/next.config.js +++ b/packages/passport/sdk-sample-app/next.config.js @@ -1,5 +1,7 @@ const basePath = process.env.NEXT_PUBLIC_BASE_PATH; +const enableApiRoutes = process.env.ENABLE_API_ROUTES === 'true'; + let pathConfig = {}; if (basePath) { @@ -15,9 +17,13 @@ const nextConfig = { typescript: { tsconfigPath: './tsconfig.build.json', }, - // Static export disables API routes. - // Set ENABLE_API_ROUTES=true to enable API routes (required for auth-nextjs) - ...(process.env.ENABLE_API_ROUTES !== 'true' && { output: 'export' }), + // Only include .api.ts/.api.tsx extensions when API routes are enabled + // This allows static export to work by excluding API route files + pageExtensions: enableApiRoutes + ? ['tsx', 'ts', 'jsx', 'js', 'api.tsx', 'api.ts'] + : ['tsx', 'ts', 'jsx', 'js'], + // Static export when API routes are disabled + ...(!enableApiRoutes && { output: 'export' }), reactStrictMode: true, }; diff --git a/packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].ts b/packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].api.ts similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].ts rename to packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].api.ts From 4b8aea16b52674f8bc54de61c4e4c6d01eaa7140 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 17 Dec 2025 15:14:44 +1100 Subject: [PATCH 05/88] fix hardcoded urls --- packages/auth-nextjs/src/config.ts | 5 ----- packages/auth-nextjs/src/server/with-page-auth.ts | 2 +- packages/auth-nextjs/src/types.ts | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index 9d480a04e1..b7fc214c39 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -123,11 +123,6 @@ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions }, }, - pages: { - signIn: '/login', - error: '/login', - }, - session: { strategy: 'jwt', // Session max age in seconds (30 days default) diff --git a/packages/auth-nextjs/src/server/with-page-auth.ts b/packages/auth-nextjs/src/server/with-page-auth.ts index f7ded3aa5a..a916199180 100644 --- a/packages/auth-nextjs/src/server/with-page-auth.ts +++ b/packages/auth-nextjs/src/server/with-page-auth.ts @@ -117,7 +117,7 @@ export function withPageAuthRequired< options: WithPageAuthRequiredFullOptions

= {}, ): GetServerSideProps { const { - loginUrl = '/login', + loginUrl = '/', returnTo, getServerSideProps: customGetServerSideProps, } = options; diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-nextjs/src/types.ts index 7466ed9579..c1f3ab191c 100644 --- a/packages/auth-nextjs/src/types.ts +++ b/packages/auth-nextjs/src/types.ts @@ -170,7 +170,7 @@ export interface UseImmutableAuthReturn { export interface WithPageAuthRequiredOptions { /** * URL to redirect to when not authenticated - * @default "/login" + * @default "/" */ loginUrl?: string; /** From c8d3639271f4ba0ee095b7e47b8867a9e9347732 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 17 Dec 2025 15:22:38 +1100 Subject: [PATCH 06/88] fix path --- packages/passport/sdk-sample-app/next.config.js | 7 ++++--- packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts | 3 ++- .../sdk-sample-app/src/pages/{_app.tsx => _app.page.tsx} | 0 .../src/pages/{_document.tsx => _document.page.tsx} | 0 .../src/pages/{callback.tsx => callback.page.tsx} | 0 .../sdk-sample-app/src/pages/{index.tsx => index.page.tsx} | 0 .../src/pages/login/{callback.ts => callback.page.ts} | 0 .../{redirect-callback.ts => redirect-callback.page.ts} | 0 .../pages/silent-logout/{callback.ts => callback.page.ts} | 0 9 files changed, 6 insertions(+), 4 deletions(-) rename packages/passport/sdk-sample-app/src/pages/{_app.tsx => _app.page.tsx} (100%) rename packages/passport/sdk-sample-app/src/pages/{_document.tsx => _document.page.tsx} (100%) rename packages/passport/sdk-sample-app/src/pages/{callback.tsx => callback.page.tsx} (100%) rename packages/passport/sdk-sample-app/src/pages/{index.tsx => index.page.tsx} (100%) rename packages/passport/sdk-sample-app/src/pages/login/{callback.ts => callback.page.ts} (100%) rename packages/passport/sdk-sample-app/src/pages/login/{redirect-callback.ts => redirect-callback.page.ts} (100%) rename packages/passport/sdk-sample-app/src/pages/silent-logout/{callback.ts => callback.page.ts} (100%) diff --git a/packages/passport/sdk-sample-app/next.config.js b/packages/passport/sdk-sample-app/next.config.js index 6836df8e5c..7cc08245f6 100644 --- a/packages/passport/sdk-sample-app/next.config.js +++ b/packages/passport/sdk-sample-app/next.config.js @@ -17,11 +17,12 @@ const nextConfig = { typescript: { tsconfigPath: './tsconfig.build.json', }, - // Only include .api.ts/.api.tsx extensions when API routes are enabled + // Use .page.* extensions for regular pages and .api.* for API routes + // When API routes are disabled, only .page.* files are included (excludes .api.* files) // This allows static export to work by excluding API route files pageExtensions: enableApiRoutes - ? ['tsx', 'ts', 'jsx', 'js', 'api.tsx', 'api.ts'] - : ['tsx', 'ts', 'jsx', 'js'], + ? ['page.tsx', 'page.ts', 'page.jsx', 'page.js', 'api.tsx', 'api.ts'] + : ['page.tsx', 'page.ts', 'page.jsx', 'page.js'], // Static export when API routes are disabled ...(!enableApiRoutes && { output: 'export' }), reactStrictMode: true, diff --git a/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts b/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts index 33265f5db6..6acd7b82b5 100644 --- a/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts +++ b/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts @@ -1,5 +1,6 @@ import type { ImmutableAuthConfig } from "@imtbl/auth-nextjs"; import { EnvironmentNames } from "@/types"; +import { BASE_PATH } from "@/config"; // Client IDs for each environment (same as ImmutableProvider) const CLIENT_IDS: Record = { @@ -21,7 +22,7 @@ export function getAuthConfig(environment: EnvironmentNames): ImmutableAuthConfi return { clientId: CLIENT_IDS[environment], - redirectUri: `${baseUrl}/callback`, + redirectUri: `${baseUrl}${BASE_PATH}/callback`, audience: "platform_api", scope: "openid profile email offline_access transact", authenticationDomain: AUTH_DOMAINS[environment], diff --git a/packages/passport/sdk-sample-app/src/pages/_app.tsx b/packages/passport/sdk-sample-app/src/pages/_app.page.tsx similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/_app.tsx rename to packages/passport/sdk-sample-app/src/pages/_app.page.tsx diff --git a/packages/passport/sdk-sample-app/src/pages/_document.tsx b/packages/passport/sdk-sample-app/src/pages/_document.page.tsx similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/_document.tsx rename to packages/passport/sdk-sample-app/src/pages/_document.page.tsx diff --git a/packages/passport/sdk-sample-app/src/pages/callback.tsx b/packages/passport/sdk-sample-app/src/pages/callback.page.tsx similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/callback.tsx rename to packages/passport/sdk-sample-app/src/pages/callback.page.tsx diff --git a/packages/passport/sdk-sample-app/src/pages/index.tsx b/packages/passport/sdk-sample-app/src/pages/index.page.tsx similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/index.tsx rename to packages/passport/sdk-sample-app/src/pages/index.page.tsx diff --git a/packages/passport/sdk-sample-app/src/pages/login/callback.ts b/packages/passport/sdk-sample-app/src/pages/login/callback.page.ts similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/login/callback.ts rename to packages/passport/sdk-sample-app/src/pages/login/callback.page.ts diff --git a/packages/passport/sdk-sample-app/src/pages/login/redirect-callback.ts b/packages/passport/sdk-sample-app/src/pages/login/redirect-callback.page.ts similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/login/redirect-callback.ts rename to packages/passport/sdk-sample-app/src/pages/login/redirect-callback.page.ts diff --git a/packages/passport/sdk-sample-app/src/pages/silent-logout/callback.ts b/packages/passport/sdk-sample-app/src/pages/silent-logout/callback.page.ts similarity index 100% rename from packages/passport/sdk-sample-app/src/pages/silent-logout/callback.ts rename to packages/passport/sdk-sample-app/src/pages/silent-logout/callback.page.ts From 7dcad1b572ede21c1063ca285d89de234de251b7 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 17 Dec 2025 15:28:55 +1100 Subject: [PATCH 07/88] lint --- packages/auth-nextjs/package.json | 2 +- packages/passport/sdk-sample-app/src/pages/index.page.tsx | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 3976bb1e25..8bc0ecd941 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -57,7 +57,7 @@ "lint": "eslint ./src --ext .ts,.tsx --max-warnings=0", "lint:fix": "eslint ./src --ext .ts,.tsx --max-warnings=0 --fix", "typecheck": "tsc --customConditions default --noEmit --jsx preserve", - "test": "jest" + "test": "jest --passWithNoTests" }, "dependencies": { "@imtbl/auth": "workspace:*" diff --git a/packages/passport/sdk-sample-app/src/pages/index.page.tsx b/packages/passport/sdk-sample-app/src/pages/index.page.tsx index 0451d2afbf..3929080ee1 100644 --- a/packages/passport/sdk-sample-app/src/pages/index.page.tsx +++ b/packages/passport/sdk-sample-app/src/pages/index.page.tsx @@ -29,7 +29,9 @@ export default function Home() {

- + From 7d6f3e7dd260d651c5f829cd0220d5a69c7cbb32 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 11:10:40 +1100 Subject: [PATCH 08/88] fix sample app --- packages/auth-nextjs/package.json | 2 +- packages/auth-nextjs/src/client/provider.tsx | 14 +- packages/auth-nextjs/src/config.ts | 92 ++- packages/auth-nextjs/src/types.ts | 27 + .../src/context/ImmutableProvider.tsx | 14 +- .../pages/api/auth/dev/[...nextauth].api.ts | 5 + .../pages/api/auth/prod/[...nextauth].api.ts | 5 + .../auth/{ => sandbox}/[...nextauth].api.ts | 2 - pnpm-lock.yaml | 700 +++++++++++------- 9 files changed, 586 insertions(+), 275 deletions(-) create mode 100644 packages/passport/sdk-sample-app/src/pages/api/auth/dev/[...nextauth].api.ts create mode 100644 packages/passport/sdk-sample-app/src/pages/api/auth/prod/[...nextauth].api.ts rename packages/passport/sdk-sample-app/src/pages/api/auth/{ => sandbox}/[...nextauth].api.ts (77%) diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 8bc0ecd941..9993e7de4b 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -52,6 +52,7 @@ ], "scripts": { "build": "pnpm transpile && pnpm typegen", + "dev": "pnpm transpile && tsup --config tsup.config.ts --watch --no-clean", "transpile": "tsup --config tsup.config.ts", "typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types", "lint": "eslint ./src --ext .ts,.tsx --max-warnings=0", @@ -88,4 +89,3 @@ "repository": "immutable/ts-immutable-sdk.git", "type": "module" } - diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index cfd5abb90c..165564add9 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -30,19 +30,24 @@ const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; interface ImmutableAuthContextValue { auth: Auth | null; config: ImmutableAuthConfig; + basePath: string; } const ImmutableAuthContext = createContext(null); +const DEFAULT_BASE_PATH = '/api/auth'; + /** * Internal provider that manages Auth instance */ function ImmutableAuthInner({ children, config, + basePath, }: { children: React.ReactNode; config: ImmutableAuthConfig; + basePath: string; }) { // Use state instead of ref so changes trigger re-renders and update context consumers const [auth, setAuth] = useState(null); @@ -146,8 +151,8 @@ function ImmutableAuthInner({ }, [auth, isAuthReady, session, updateSession]); const contextValue = useMemo( - () => ({ auth, config }), - [auth, config], + () => ({ auth, config, basePath }), + [auth, config, basePath], ); return ( @@ -185,10 +190,11 @@ export function ImmutableAuthProvider({ children, config, session, + basePath = DEFAULT_BASE_PATH, }: ImmutableAuthProviderProps) { return ( - - {children} + + {children} ); } diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index b7fc214c39..f846438742 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -1,11 +1,48 @@ import type { NextAuthOptions } from 'next-auth'; import Credentials from 'next-auth/providers/credentials'; -import type { ImmutableAuthConfig, ImmutableTokenData } from './types'; +import type { ImmutableAuthConfig, ImmutableTokenData, UserInfoResponse } from './types'; import { refreshAccessToken, isTokenExpired } from './refresh'; // Handle ESM/CJS interop - CredentialsProvider may be default export or the module itself const CredentialsProvider = (Credentials as unknown as { default?: typeof Credentials }).default || Credentials; +const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; + +/** + * Validate tokens by calling the userinfo endpoint. + * This is the standard OAuth 2.0 way to validate access tokens server-side. + * The auth server validates signature, issuer, audience, and expiry. + * + * @param accessToken - The access token to validate + * @param authDomain - The authentication domain + * @returns The user info if valid, null otherwise + */ +async function validateTokens( + accessToken: string, + authDomain: string, +): Promise { + try { + const response = await fetch(`${authDomain}/userinfo`, { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }); + + if (!response.ok) { + // eslint-disable-next-line no-console + console.error('[auth-nextjs] Token validation failed:', response.status, response.statusText); + return null; + } + + return await response.json(); + } catch (error) { + // eslint-disable-next-line no-console + console.error('[auth-nextjs] Token validation error:', error); + return null; + } +} + /** * Create NextAuth options configured for Immutable authentication * @@ -27,6 +64,8 @@ const CredentialsProvider = (Credentials as unknown as { default?: typeof Creden * ``` */ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions { + const authDomain = config.authenticationDomain || DEFAULT_AUTH_DOMAIN; + return { providers: [ CredentialsProvider({ @@ -40,26 +79,49 @@ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions return null; } + let tokenData: ImmutableTokenData; try { - const tokenData: ImmutableTokenData = JSON.parse(credentials.tokens); - - // Return user object with all token data - return { - id: tokenData.profile.sub, - sub: tokenData.profile.sub, - email: tokenData.profile.email, - nickname: tokenData.profile.nickname, - accessToken: tokenData.accessToken, - refreshToken: tokenData.refreshToken, - idToken: tokenData.idToken, - accessTokenExpires: tokenData.accessTokenExpires, - zkEvm: tokenData.zkEvm, - }; + tokenData = JSON.parse(credentials.tokens); } catch (error) { // eslint-disable-next-line no-console console.error('[auth-nextjs] Failed to parse token data:', error); return null; } + + // Validate tokens server-side via userinfo endpoint. + // This is the standard OAuth 2.0 way - the auth server validates the token. + const userInfo = await validateTokens(tokenData.accessToken, authDomain); + if (!userInfo) { + // eslint-disable-next-line no-console + console.error('[auth-nextjs] Token validation failed - rejecting authentication'); + return null; + } + + // Verify the user ID (sub) from userinfo matches the client-provided profile. + // This prevents spoofing a different user ID with a valid token. + if (userInfo.sub !== tokenData.profile.sub) { + // eslint-disable-next-line no-console + console.error( + '[auth-nextjs] User ID mismatch - userinfo sub:', + userInfo.sub, + 'provided sub:', + tokenData.profile.sub, + ); + return null; + } + + // Return user object with validated data + return { + id: userInfo.sub, + sub: userInfo.sub, + email: userInfo.email ?? tokenData.profile.email, + nickname: userInfo.nickname ?? tokenData.profile.nickname, + accessToken: tokenData.accessToken, + refreshToken: tokenData.refreshToken, + idToken: tokenData.idToken, + accessTokenExpires: tokenData.accessTokenExpires, + zkEvm: tokenData.zkEvm, + }; }, }), ], diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-nextjs/src/types.ts index c1f3ab191c..d707e6c267 100644 --- a/packages/auth-nextjs/src/types.ts +++ b/packages/auth-nextjs/src/types.ts @@ -110,6 +110,27 @@ export interface ImmutableTokenData { zkEvm?: ZkEvmInfo; } +/** + * Response from the userinfo endpoint + * Used for server-side token validation + */ +export interface UserInfoResponse { + /** Subject - unique user identifier */ + sub: string; + /** User's email address */ + email?: string; + /** User's nickname/username */ + nickname?: string; + /** User's full name */ + name?: string; + /** User's profile picture URL */ + picture?: string; + /** When the user profile was last updated */ + updated_at?: string; + /** Whether the email has been verified */ + email_verified?: boolean; +} + /** * Props for ImmutableAuthProvider */ @@ -124,6 +145,12 @@ export interface ImmutableAuthProviderProps { * Can be Session from getServerSession or any compatible session object */ session?: Session | DefaultSession | null; + /** + * Custom base path for NextAuth API routes + * Use this when you have multiple auth endpoints (e.g., per environment) + * @default "/api/auth" + */ + basePath?: string; } /** diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 837e0d6528..a29a4bab8c 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -247,9 +247,21 @@ export function ImmutableProvider({ // Get auth-nextjs config based on current environment const authConfig = useMemo(() => getAuthConfig(environment), [environment]); + // Get the NextAuth base path for the current environment + const authBasePath = useMemo(() => { + switch (environment) { + case EnvironmentNames.DEV: + return '/api/auth/dev'; + case EnvironmentNames.PRODUCTION: + return '/api/auth/prod'; + default: + return '/api/auth/sandbox'; + } + }, [environment]); + return ( - + {children} diff --git a/packages/passport/sdk-sample-app/src/pages/api/auth/dev/[...nextauth].api.ts b/packages/passport/sdk-sample-app/src/pages/api/auth/dev/[...nextauth].api.ts new file mode 100644 index 0000000000..d12da56051 --- /dev/null +++ b/packages/passport/sdk-sample-app/src/pages/api/auth/dev/[...nextauth].api.ts @@ -0,0 +1,5 @@ +import { ImmutableAuth } from "@imtbl/auth-nextjs"; +import { getAuthConfig } from "@/lib/auth-nextjs"; +import { EnvironmentNames } from "@/types"; + +export default ImmutableAuth(getAuthConfig(EnvironmentNames.DEV)); diff --git a/packages/passport/sdk-sample-app/src/pages/api/auth/prod/[...nextauth].api.ts b/packages/passport/sdk-sample-app/src/pages/api/auth/prod/[...nextauth].api.ts new file mode 100644 index 0000000000..b455009f1c --- /dev/null +++ b/packages/passport/sdk-sample-app/src/pages/api/auth/prod/[...nextauth].api.ts @@ -0,0 +1,5 @@ +import { ImmutableAuth } from "@imtbl/auth-nextjs"; +import { getAuthConfig } from "@/lib/auth-nextjs"; +import { EnvironmentNames } from "@/types"; + +export default ImmutableAuth(getAuthConfig(EnvironmentNames.PRODUCTION)); diff --git a/packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].api.ts b/packages/passport/sdk-sample-app/src/pages/api/auth/sandbox/[...nextauth].api.ts similarity index 77% rename from packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].api.ts rename to packages/passport/sdk-sample-app/src/pages/api/auth/sandbox/[...nextauth].api.ts index b7f0a61af7..5d120ad9ff 100644 --- a/packages/passport/sdk-sample-app/src/pages/api/auth/[...nextauth].api.ts +++ b/packages/passport/sdk-sample-app/src/pages/api/auth/sandbox/[...nextauth].api.ts @@ -2,6 +2,4 @@ import { ImmutableAuth } from "@imtbl/auth-nextjs"; import { getAuthConfig } from "@/lib/auth-nextjs"; import { EnvironmentNames } from "@/types"; -// Use sandbox config for the API route (server-side default) export default ImmutableAuth(getAuthConfig(EnvironmentNames.SANDBOX)); - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3a464f003..6512dcbf6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,7 +68,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-react-refresh: specifier: latest - version: 0.4.25(eslint@8.57.0) + version: 0.4.26(eslint@8.57.0) http-server: specifier: ^14.1.1 version: 14.1.1 @@ -117,13 +117,13 @@ importers: version: 29.7.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) typescript: specifier: ^5 version: 5.6.2 @@ -135,7 +135,7 @@ importers: version: 0.25.21(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(framer-motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@imtbl/sdk': specifier: latest - version: 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) next: specifier: 14.2.25 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1051,10 +1051,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.15.3(@swc/helpers@0.5.13) + version: 1.15.3 '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.15.3) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1066,7 +1066,7 @@ importers: version: 18.3.12 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1081,10 +1081,10 @@ importers: version: 18.3.1 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3)(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1291,7 +1291,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1457,7 +1457,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1469,7 +1469,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -10381,8 +10381,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-refresh@0.4.25: - resolution: {integrity: sha512-dRUD2LOdEqI4zXHqbQ442blQAzdSuShAaiSq5Vtyy6LT08YUf0oOjBDo4VPx0dCPgiPWh1WB4dtbLOd0kOlDPQ==} + eslint-plugin-react-refresh@0.4.26: + resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} peerDependencies: eslint: '>=8.40' @@ -17598,7 +17598,7 @@ snapshots: '@babel/traverse': 7.27.0 '@babel/types': 7.27.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -19288,7 +19288,7 @@ snapshots: '@babel/parser': 7.27.0 '@babel/template': 7.27.0 '@babel/types': 7.27.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -20396,12 +20396,12 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/checkout-sdk@2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@imtbl/blockchain-data': 2.12.3 '@imtbl/bridge-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/config': 2.12.3 - '@imtbl/dex-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/dex-sdk': 2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20465,12 +20465,12 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/dex-sdk@2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.12.3 '@uniswap/sdk-core': 3.2.3 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -20547,11 +20547,11 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/sdk@2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/blockchain-data': 2.12.3 - '@imtbl/checkout-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/checkout-sdk': 2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@imtbl/config': 2.12.3 '@imtbl/minting-backend': 2.12.3 '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20808,6 +20808,43 @@ snapshots: - ts-node - utf-8-validate + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0(node-notifier@8.0.2) + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.13 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + optionalDependencies: + node-notifier: 8.0.2 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 @@ -20919,6 +20956,43 @@ snapshots: - supports-color - ts-node + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0(node-notifier@8.0.2) + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.13 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + optionalDependencies: + node-notifier: 8.0.2 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 @@ -21225,7 +21299,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/test-sequencer@26.6.3': dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 @@ -21233,11 +21307,7 @@ snapshots: jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - ts-node - - utf-8-validate '@jest/test-sequencer@27.5.1': dependencies: @@ -24610,6 +24680,22 @@ snapshots: '@swc/core-win32-x64-msvc@1.9.3': optional: true + '@swc/core@1.15.3': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.3 + '@swc/core-darwin-x64': 1.15.3 + '@swc/core-linux-arm-gnueabihf': 1.15.3 + '@swc/core-linux-arm64-gnu': 1.15.3 + '@swc/core-linux-arm64-musl': 1.15.3 + '@swc/core-linux-x64-gnu': 1.15.3 + '@swc/core-linux-x64-musl': 1.15.3 + '@swc/core-win32-arm64-msvc': 1.15.3 + '@swc/core-win32-ia32-msvc': 1.15.3 + '@swc/core-win32-x64-msvc': 1.15.3 + '@swc/core@1.15.3(@swc/helpers@0.5.13)': dependencies: '@swc/counter': 0.1.3 @@ -24662,10 +24748,10 @@ snapshots: '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 - '@swc/jest@0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13))': + '@swc/jest@0.2.37(@swc/core@1.15.3)': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3 '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -25175,25 +25261,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - debug: 4.3.7(supports-color@8.1.1) - eslint: 9.16.0(jiti@1.21.0) - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -25355,6 +25422,17 @@ snapshots: tiny-invariant: 1.3.1 toformat: 2.0.0 + '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + dependencies: + '@openzeppelin/contracts': 3.4.2 + '@uniswap/v2-core': 1.0.1 + '@uniswap/v3-core': 1.0.0 + '@uniswap/v3-periphery': 1.4.4 + dotenv: 14.3.2 + hardhat-watcher: 2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - hardhat + '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@openzeppelin/contracts': 3.4.2 @@ -25386,6 +25464,19 @@ snapshots: '@uniswap/v3-core': 1.0.0 base64-sol: 1.0.1 + '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@uniswap/sdk-core': 4.0.6 + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/v3-periphery': 1.4.3 + '@uniswap/v3-staker': 1.0.0 + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + transitivePeerDependencies: + - hardhat + '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 @@ -25940,7 +26031,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -26401,6 +26492,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26610,6 +26715,13 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) + babel-preset-jest@29.6.3(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) + optional: true + babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -27555,6 +27667,21 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 + create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 @@ -27570,6 +27697,21 @@ snapshots: - supports-color - ts-node + create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 @@ -27600,6 +27742,21 @@ snapshots: - supports-color - ts-node + create-jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 @@ -27923,6 +28080,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.3.7(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -28598,7 +28759,7 @@ snapshots: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -28609,13 +28770,13 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@5.0.0(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.0) @@ -28629,8 +28790,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -28648,8 +28809,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28667,8 +28828,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28686,7 +28847,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28703,8 +28864,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28714,45 +28875,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28768,23 +28902,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 9.16.0(jiti@1.21.0) - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28809,7 +28943,7 @@ snapshots: enhanced-resolve: 5.15.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.15.0 @@ -28826,8 +28960,8 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.15.0 @@ -28850,7 +28984,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -28861,16 +28995,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28881,14 +29005,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): - dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - eslint: 8.57.0 - lodash: 4.17.21 - string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28897,15 +29013,42 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 9.16.0(jiti@1.21.0) + eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.15.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -28932,7 +29075,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -28940,9 +29083,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.16.0(jiti@1.21.0) + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -29008,17 +29151,6 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -29082,7 +29214,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react-refresh@0.4.25(eslint@8.57.0): + eslint-plugin-react-refresh@0.4.26(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -30433,6 +30565,11 @@ snapshots: - debug - utf-8-validate + hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): + dependencies: + chokidar: 3.6.0 + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): dependencies: chokidar: 3.6.0 @@ -30803,7 +30940,7 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -30862,7 +30999,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -31317,7 +31454,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -31507,11 +31644,11 @@ snapshots: jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.1.0 jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) @@ -31547,6 +31684,27 @@ snapshots: - supports-color - ts-node + jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + optionalDependencies: + node-notifier: 8.0.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) @@ -31591,11 +31749,11 @@ snapshots: jest-cli@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.1.0 jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) @@ -31655,7 +31813,7 @@ snapshots: jest-config@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 - '@jest/test-sequencer': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/test-sequencer': 26.6.3 '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.26.10) chalk: 4.1.2 @@ -31779,6 +31937,37 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): + dependencies: + '@babel/core': 7.26.10 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.10) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 18.15.13 + ts-node: 10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 @@ -31903,6 +32092,37 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): + dependencies: + '@babel/core': 7.26.10 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.10) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.13 + ts-node: 10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 @@ -32911,7 +33131,7 @@ snapshots: jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/types': 29.6.3 import-local: 3.1.0 jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) @@ -32937,6 +33157,20 @@ snapshots: - supports-color - ts-node + jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + optionalDependencies: + node-notifier: 8.0.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) @@ -32967,7 +33201,7 @@ snapshots: jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) '@jest/types': 29.6.3 import-local: 3.1.0 jest-cli: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) @@ -36129,7 +36363,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -36147,7 +36381,7 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 @@ -36215,92 +36449,6 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): - dependencies: - '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) - babel-preset-react-app: 10.0.1 - bfj: 7.0.2 - browserslist: 4.23.3 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss: 8.4.49 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) - postcss-preset-env: 7.8.3(postcss@8.4.49) - prompts: 2.4.2 - react: 18.3.1 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - react-refresh: 0.11.0 - resolve: 1.22.8 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - optionalDependencies: - fsevents: 2.3.3 - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@parcel/css' - - '@swc/core' - - '@types/babel__core' - - '@types/webpack' - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 @@ -38122,12 +38270,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38142,12 +38290,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38162,12 +38310,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38182,12 +38330,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38196,10 +38344,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.9 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) + babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.23.1 ts-mockito@2.6.1: @@ -38326,6 +38474,26 @@ snapshots: optionalDependencies: '@swc/core': 1.15.3(@swc/helpers@0.5.13) + ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.15.13 + acorn: 8.14.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.15.3 + ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -38430,6 +38598,34 @@ snapshots: - tsx - yaml + tsup@8.3.0(@swc/core@1.15.3)(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): + dependencies: + bundle-require: 5.0.0(esbuild@0.23.1) + cac: 6.7.14 + chokidar: 3.6.0 + consola: 3.2.3 + debug: 4.3.7 + esbuild: 0.23.1 + execa: 5.1.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@1.21.0)(postcss@8.4.49)(yaml@2.5.0) + resolve-from: 5.0.0 + rollup: 4.28.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyglobby: 0.2.10 + tree-kill: 1.2.2 + optionalDependencies: + '@swc/core': 1.15.3 + postcss: 8.4.49 + typescript: 5.6.2 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsup@8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) From 262eb26745a3e83e48d5633a31f1aa35b5a21d2f Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 12:29:38 +1100 Subject: [PATCH 09/88] fix page guard --- packages/auth-nextjs/src/server/with-page-auth.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/auth-nextjs/src/server/with-page-auth.ts b/packages/auth-nextjs/src/server/with-page-auth.ts index a916199180..a3d1d0c58f 100644 --- a/packages/auth-nextjs/src/server/with-page-auth.ts +++ b/packages/auth-nextjs/src/server/with-page-auth.ts @@ -133,7 +133,9 @@ export function withPageAuthRequired< if (returnTo !== false) { const returnPath = returnTo || ctx.resolvedUrl; - destination = `${loginUrl}?returnTo=${encodeURIComponent(returnPath)}`; + // Use '&' if loginUrl already has a query string, otherwise use '?' + const separator = loginUrl.includes('?') ? '&' : '?'; + destination = `${loginUrl}${separator}returnTo=${encodeURIComponent(returnPath)}`; } return { From 39e63af72154d1b99d6bfacfca40268acb7cd571 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 13:51:31 +1100 Subject: [PATCH 10/88] default env --- packages/auth-nextjs/src/client/callback.tsx | 36 ++++++++++++++++--- .../src/pages/callback.page.tsx | 3 +- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index f204511767..d1e6ae93ff 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -2,8 +2,9 @@ import React, { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; +import { signIn } from 'next-auth/react'; import { Auth } from '@imtbl/auth'; -import type { ImmutableAuthConfig } from '../types'; +import type { ImmutableAuthConfig, ImmutableTokenData } from '../types'; export interface CallbackPageProps { /** @@ -64,15 +65,40 @@ export function CallbackPage({ authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, }); - // Process the callback - this extracts tokens from the URL - await auth.loginCallback(); + // Process the callback - this extracts tokens from the URL and returns the user + const authUser = await auth.loginCallback(); // Check if we're in a popup window if (window.opener) { - // Close the popup - the parent window will receive the tokens + // Close the popup - the parent window will receive the tokens via Auth events window.close(); } else { - // Not in a popup - redirect to specified page + // Not in a popup - create NextAuth session before redirecting + // This ensures SSR/session-based auth is authenticated + if (authUser) { + const tokenData: ImmutableTokenData = { + accessToken: authUser.accessToken, + refreshToken: authUser.refreshToken, + idToken: authUser.idToken, + accessTokenExpires: Date.now() + 3600 * 1000, // 1 hour + profile: { + sub: authUser.profile.sub, + email: authUser.profile.email, + nickname: authUser.profile.nickname, + }, + zkEvm: authUser.zkEvm, + }; + + // Sign in to NextAuth with the tokens + // Note: signIn uses the basePath from SessionProvider context, + // so ensure CallbackPage is rendered within ImmutableAuthProvider + await signIn('immutable', { + tokens: JSON.stringify(tokenData), + redirect: false, + }); + } + + // Redirect to specified page router.replace(redirectTo); } } catch (err) { diff --git a/packages/passport/sdk-sample-app/src/pages/callback.page.tsx b/packages/passport/sdk-sample-app/src/pages/callback.page.tsx index 2cfd7be779..e084ec31fc 100644 --- a/packages/passport/sdk-sample-app/src/pages/callback.page.tsx +++ b/packages/passport/sdk-sample-app/src/pages/callback.page.tsx @@ -13,10 +13,11 @@ export default function Callback() { useEffect(() => { // Read environment from localStorage (same key as ImmutableProvider uses) + // Default to DEV to match ImmutableProvider's default context environment const storedEnv = localStorage.getItem("IMX_PASSPORT_SAMPLE_ENVIRONMENT"); const environment = storedEnv ? (JSON.parse(storedEnv) as EnvironmentNames) - : EnvironmentNames.SANDBOX; + : EnvironmentNames.DEV; setConfig(getAuthConfig(environment)); }, []); From bc21f52113a6eb060c211d1b4864061a5cda8b1b Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 14:05:01 +1100 Subject: [PATCH 11/88] align expiry --- packages/auth-nextjs/src/client/callback.tsx | 3 +- packages/auth-nextjs/src/client/provider.tsx | 7 ++-- packages/auth-nextjs/src/refresh.ts | 2 +- packages/auth-nextjs/src/utils/token.ts | 44 ++++++++++++++++++++ 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 packages/auth-nextjs/src/utils/token.ts diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index d1e6ae93ff..cf40c9ab76 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -5,6 +5,7 @@ import { useRouter } from 'next/router'; import { signIn } from 'next-auth/react'; import { Auth } from '@imtbl/auth'; import type { ImmutableAuthConfig, ImmutableTokenData } from '../types'; +import { getTokenExpiry } from '../utils/token'; export interface CallbackPageProps { /** @@ -80,7 +81,7 @@ export function CallbackPage({ accessToken: authUser.accessToken, refreshToken: authUser.refreshToken, idToken: authUser.idToken, - accessTokenExpires: Date.now() + 3600 * 1000, // 1 hour + accessTokenExpires: getTokenExpiry(authUser.accessToken), profile: { sub: authUser.profile.sub, email: authUser.profile.email, diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 165564add9..d651f75b6d 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -21,6 +21,7 @@ import type { ImmutableUser, ImmutableTokenData, } from '../types'; +import { getTokenExpiry } from '../utils/token'; const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; @@ -103,7 +104,7 @@ function ImmutableAuthInner({ // Calculate expires_in from accessTokenExpires const expiresIn = accessTokenExpires ? Math.max(0, Math.floor((accessTokenExpires - Date.now()) / 1000)) - : 3600; // Default 1 hour + : 900; // Default 15 minutes // Hydrate Auth with tokens from NextAuth session const tokenResponse: DeviceTokenResponse = { @@ -137,7 +138,7 @@ function ImmutableAuthInner({ accessToken: authUser.accessToken, refreshToken: authUser.refreshToken, idToken: authUser.idToken, - accessTokenExpires: Date.now() + 3600 * 1000, // 1 hour + accessTokenExpires: getTokenExpiry(authUser.accessToken), zkEvm: authUser.zkEvm, }); } @@ -265,7 +266,7 @@ export function useImmutableAuth(): UseImmutableAuthReturn { accessToken: authUser.accessToken, refreshToken: authUser.refreshToken, idToken: authUser.idToken, - accessTokenExpires: Date.now() + 3600 * 1000, // 1 hour + accessTokenExpires: getTokenExpiry(authUser.accessToken), profile: { sub: authUser.profile.sub, email: authUser.profile.email, diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index d247657ebd..8733dbd89c 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -40,7 +40,7 @@ export async function refreshAccessToken( } // Calculate expiry (access_token typically expires in 1 hour) - const expiresIn = data.expires_in || 3600; + const expiresIn = data.expires_in || 900; const accessTokenExpires = Date.now() + expiresIn * 1000; return { diff --git a/packages/auth-nextjs/src/utils/token.ts b/packages/auth-nextjs/src/utils/token.ts new file mode 100644 index 0000000000..d01bc37479 --- /dev/null +++ b/packages/auth-nextjs/src/utils/token.ts @@ -0,0 +1,44 @@ +import { decodeJwtPayload } from '@imtbl/auth'; + +/** + * JWT payload with expiry claim + */ +interface JwtPayload { + exp?: number; + iat?: number; + [key: string]: unknown; +} + +/** + * Default token expiry in milliseconds (1 hour) + * Used as fallback when exp claim cannot be extracted + */ +const DEFAULT_EXPIRY_MS = 900 * 1000; + +/** + * Extract the expiry timestamp from a JWT access token. + * Returns the expiry as a Unix timestamp in milliseconds. + * + * @param accessToken - JWT access token + * @returns Expiry timestamp in milliseconds, or a default 1-hour expiry if extraction fails + */ +export function getTokenExpiry(accessToken: string | undefined): number { + if (!accessToken) { + return Date.now() + DEFAULT_EXPIRY_MS; + } + + try { + const payload = decodeJwtPayload(accessToken); + + if (payload.exp && typeof payload.exp === 'number') { + // JWT exp is in seconds, convert to milliseconds + return payload.exp * 1000; + } + + // No exp claim, fall back to default + return Date.now() + DEFAULT_EXPIRY_MS; + } catch { + // Failed to decode token, fall back to default + return Date.now() + DEFAULT_EXPIRY_MS; + } +} From 88290994fc3c95d9d3ed0e76939cb14f812f4988 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 14:21:13 +1100 Subject: [PATCH 12/88] error handling --- packages/auth-nextjs/src/client/callback.tsx | 10 +++++++++- packages/auth-nextjs/src/client/provider.tsx | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index cf40c9ab76..34a42aac0e 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -93,10 +93,18 @@ export function CallbackPage({ // Sign in to NextAuth with the tokens // Note: signIn uses the basePath from SessionProvider context, // so ensure CallbackPage is rendered within ImmutableAuthProvider - await signIn('immutable', { + const result = await signIn('immutable', { tokens: JSON.stringify(tokenData), redirect: false, }); + + // signIn with redirect: false returns a result object instead of throwing + if (result?.error) { + throw new Error(`NextAuth sign-in failed: ${result.error}`); + } + if (!result?.ok) { + throw new Error('NextAuth sign-in failed: unknown error'); + } } // Redirect to specified page diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index d651f75b6d..bf2ae545d6 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -276,10 +276,18 @@ export function useImmutableAuth(): UseImmutableAuthReturn { }; // Sign in to NextAuth with the tokens - await signIn('immutable', { + const result = await signIn('immutable', { tokens: JSON.stringify(tokenData), redirect: false, }); + + // signIn with redirect: false returns a result object instead of throwing + if (result?.error) { + throw new Error(`NextAuth sign-in failed: ${result.error}`); + } + if (!result?.ok) { + throw new Error('NextAuth sign-in failed: unknown error'); + } }, [auth]); // Sign out from both NextAuth and Immutable From 0ee89283a1b1d3223a5226e6de5473aa26720af7 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 14:58:49 +1100 Subject: [PATCH 13/88] use constants --- packages/auth-nextjs/src/client/callback.tsx | 14 ++++-- packages/auth-nextjs/src/client/provider.tsx | 22 +++++---- packages/auth-nextjs/src/config.ts | 11 +++-- packages/auth-nextjs/src/constants.ts | 51 ++++++++++++++++++++ packages/auth-nextjs/src/refresh.ts | 11 +++-- packages/auth-nextjs/src/utils/token.ts | 15 ++---- 6 files changed, 92 insertions(+), 32 deletions(-) create mode 100644 packages/auth-nextjs/src/constants.ts diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index 34a42aac0e..e90c4b152e 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -6,6 +6,12 @@ import { signIn } from 'next-auth/react'; import { Auth } from '@imtbl/auth'; import type { ImmutableAuthConfig, ImmutableTokenData } from '../types'; import { getTokenExpiry } from '../utils/token'; +import { + DEFAULT_AUTH_DOMAIN, + DEFAULT_AUDIENCE, + DEFAULT_SCOPE, + IMMUTABLE_PROVIDER_ID, +} from '../constants'; export interface CallbackPageProps { /** @@ -26,8 +32,6 @@ export interface CallbackPageProps { errorComponent?: (error: string) => React.ReactElement | null; } -const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; - /** * Callback page component for handling OAuth redirects. * @@ -61,8 +65,8 @@ export function CallbackPage({ clientId: config.clientId, redirectUri: config.redirectUri, logoutRedirectUri: config.logoutRedirectUri, - audience: config.audience || 'platform_api', - scope: config.scope || 'openid profile email offline_access transact', + audience: config.audience || DEFAULT_AUDIENCE, + scope: config.scope || DEFAULT_SCOPE, authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, }); @@ -93,7 +97,7 @@ export function CallbackPage({ // Sign in to NextAuth with the tokens // Note: signIn uses the basePath from SessionProvider context, // so ensure CallbackPage is rendered within ImmutableAuthProvider - const result = await signIn('immutable', { + const result = await signIn(IMMUTABLE_PROVIDER_ID, { tokens: JSON.stringify(tokenData), redirect: false, }); diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index bf2ae545d6..c21114a720 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -22,8 +22,14 @@ import type { ImmutableTokenData, } from '../types'; import { getTokenExpiry } from '../utils/token'; - -const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; +import { + DEFAULT_AUTH_DOMAIN, + DEFAULT_AUDIENCE, + DEFAULT_SCOPE, + DEFAULT_NEXTAUTH_BASE_PATH, + DEFAULT_TOKEN_EXPIRY_SECONDS, + IMMUTABLE_PROVIDER_ID, +} from '../constants'; /** * Internal context for Immutable auth state @@ -36,8 +42,6 @@ interface ImmutableAuthContextValue { const ImmutableAuthContext = createContext(null); -const DEFAULT_BASE_PATH = '/api/auth'; - /** * Internal provider that manages Auth instance */ @@ -74,8 +78,8 @@ function ImmutableAuthInner({ clientId: config.clientId, redirectUri: config.redirectUri, logoutRedirectUri: config.logoutRedirectUri, - audience: config.audience || 'platform_api', - scope: config.scope || 'openid profile email offline_access transact', + audience: config.audience || DEFAULT_AUDIENCE, + scope: config.scope || DEFAULT_SCOPE, authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, }); @@ -104,7 +108,7 @@ function ImmutableAuthInner({ // Calculate expires_in from accessTokenExpires const expiresIn = accessTokenExpires ? Math.max(0, Math.floor((accessTokenExpires - Date.now()) / 1000)) - : 900; // Default 15 minutes + : DEFAULT_TOKEN_EXPIRY_SECONDS; // Hydrate Auth with tokens from NextAuth session const tokenResponse: DeviceTokenResponse = { @@ -191,7 +195,7 @@ export function ImmutableAuthProvider({ children, config, session, - basePath = DEFAULT_BASE_PATH, + basePath = DEFAULT_NEXTAUTH_BASE_PATH, }: ImmutableAuthProviderProps) { return ( @@ -276,7 +280,7 @@ export function useImmutableAuth(): UseImmutableAuthReturn { }; // Sign in to NextAuth with the tokens - const result = await signIn('immutable', { + const result = await signIn(IMMUTABLE_PROVIDER_ID, { tokens: JSON.stringify(tokenData), redirect: false, }); diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index f846438742..ba24736e6d 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -2,12 +2,15 @@ import type { NextAuthOptions } from 'next-auth'; import Credentials from 'next-auth/providers/credentials'; import type { ImmutableAuthConfig, ImmutableTokenData, UserInfoResponse } from './types'; import { refreshAccessToken, isTokenExpired } from './refresh'; +import { + DEFAULT_AUTH_DOMAIN, + IMMUTABLE_PROVIDER_ID, + DEFAULT_SESSION_MAX_AGE_SECONDS, +} from './constants'; // Handle ESM/CJS interop - CredentialsProvider may be default export or the module itself const CredentialsProvider = (Credentials as unknown as { default?: typeof Credentials }).default || Credentials; -const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; - /** * Validate tokens by calling the userinfo endpoint. * This is the standard OAuth 2.0 way to validate access tokens server-side. @@ -69,7 +72,7 @@ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions return { providers: [ CredentialsProvider({ - id: 'immutable', + id: IMMUTABLE_PROVIDER_ID, name: 'Immutable', credentials: { tokens: { label: 'Tokens', type: 'text' }, @@ -188,7 +191,7 @@ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions session: { strategy: 'jwt', // Session max age in seconds (30 days default) - maxAge: 30 * 24 * 60 * 60, + maxAge: DEFAULT_SESSION_MAX_AGE_SECONDS, }, // Use NEXTAUTH_SECRET from environment diff --git a/packages/auth-nextjs/src/constants.ts b/packages/auth-nextjs/src/constants.ts new file mode 100644 index 0000000000..af450ce5fe --- /dev/null +++ b/packages/auth-nextjs/src/constants.ts @@ -0,0 +1,51 @@ +/** + * Shared constants for @imtbl/auth-nextjs + */ + +/** + * Default Immutable authentication domain + */ +export const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; + +/** + * Default OAuth audience + */ +export const DEFAULT_AUDIENCE = 'platform_api'; + +/** + * Default OAuth scopes + */ +export const DEFAULT_SCOPE = 'openid profile email offline_access transact'; + +/** + * NextAuth credentials provider ID for Immutable + */ +export const IMMUTABLE_PROVIDER_ID = 'immutable'; + +/** + * Default NextAuth API base path + */ +export const DEFAULT_NEXTAUTH_BASE_PATH = '/api/auth'; + +/** + * Default token expiry in seconds (15 minutes) + * Used as fallback when exp claim cannot be extracted from JWT + */ +export const DEFAULT_TOKEN_EXPIRY_SECONDS = 900; + +/** + * Default token expiry in milliseconds + */ +export const DEFAULT_TOKEN_EXPIRY_MS = DEFAULT_TOKEN_EXPIRY_SECONDS * 1000; + +/** + * Buffer time in seconds before token expiry to trigger refresh + * Tokens will be refreshed when they expire within this window + */ +export const TOKEN_EXPIRY_BUFFER_SECONDS = 60; + +/** + * Default session max age in seconds (30 days) + * This is how long the NextAuth session cookie will be valid + */ +export const DEFAULT_SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60; diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index 8733dbd89c..5388cccd50 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -1,7 +1,10 @@ import type { JWT } from 'next-auth/jwt'; import type { ImmutableAuthConfig } from './types'; - -const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; +import { + DEFAULT_AUTH_DOMAIN, + DEFAULT_TOKEN_EXPIRY_SECONDS, + TOKEN_EXPIRY_BUFFER_SECONDS, +} from './constants'; /** * Refresh the access token using the refresh token @@ -40,7 +43,7 @@ export async function refreshAccessToken( } // Calculate expiry (access_token typically expires in 1 hour) - const expiresIn = data.expires_in || 900; + const expiresIn = data.expires_in || DEFAULT_TOKEN_EXPIRY_SECONDS; const accessTokenExpires = Date.now() + expiresIn * 1000; return { @@ -67,7 +70,7 @@ export async function refreshAccessToken( */ export function isTokenExpired( accessTokenExpires: number, - bufferSeconds: number = 60, + bufferSeconds: number = TOKEN_EXPIRY_BUFFER_SECONDS, ): boolean { return Date.now() >= accessTokenExpires - bufferSeconds * 1000; } diff --git a/packages/auth-nextjs/src/utils/token.ts b/packages/auth-nextjs/src/utils/token.ts index d01bc37479..1264fcdffd 100644 --- a/packages/auth-nextjs/src/utils/token.ts +++ b/packages/auth-nextjs/src/utils/token.ts @@ -1,4 +1,5 @@ import { decodeJwtPayload } from '@imtbl/auth'; +import { DEFAULT_TOKEN_EXPIRY_MS } from '../constants'; /** * JWT payload with expiry claim @@ -9,22 +10,16 @@ interface JwtPayload { [key: string]: unknown; } -/** - * Default token expiry in milliseconds (1 hour) - * Used as fallback when exp claim cannot be extracted - */ -const DEFAULT_EXPIRY_MS = 900 * 1000; - /** * Extract the expiry timestamp from a JWT access token. * Returns the expiry as a Unix timestamp in milliseconds. * * @param accessToken - JWT access token - * @returns Expiry timestamp in milliseconds, or a default 1-hour expiry if extraction fails + * @returns Expiry timestamp in milliseconds, or a default 15-minute expiry if extraction fails */ export function getTokenExpiry(accessToken: string | undefined): number { if (!accessToken) { - return Date.now() + DEFAULT_EXPIRY_MS; + return Date.now() + DEFAULT_TOKEN_EXPIRY_MS; } try { @@ -36,9 +31,9 @@ export function getTokenExpiry(accessToken: string | undefined): number { } // No exp claim, fall back to default - return Date.now() + DEFAULT_EXPIRY_MS; + return Date.now() + DEFAULT_TOKEN_EXPIRY_MS; } catch { // Failed to decode token, fall back to default - return Date.now() + DEFAULT_EXPIRY_MS; + return Date.now() + DEFAULT_TOKEN_EXPIRY_MS; } } From ea20a8ff2908d2b1e0bb06bb634e4fab4cf20d96 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 15:41:44 +1100 Subject: [PATCH 14/88] bug fixes --- packages/auth-nextjs/src/client/callback.tsx | 9 +++++++-- packages/auth-nextjs/src/config.ts | 14 ++++++++++++++ packages/auth-nextjs/src/server/with-page-auth.ts | 2 +- packages/auth-nextjs/src/types.ts | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index e90c4b152e..56e7fad593 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, useRef } from 'react'; import { useRouter } from 'next/router'; import { signIn } from 'next-auth/react'; import { Auth } from '@imtbl/auth'; @@ -56,6 +56,9 @@ export function CallbackPage({ }: CallbackPageProps) { const router = useRouter(); const [error, setError] = useState(null); + // Track whether callback has been processed to prevent double invocation + // (React 18 StrictMode runs effects twice, and OAuth codes are single-use) + const callbackProcessedRef = useRef(false); useEffect(() => { const handleCallback = async () => { @@ -140,7 +143,9 @@ export function CallbackPage({ } // Handle successful OAuth callback with authorization code - if (router.query.code) { + // Guard against double invocation (React 18 StrictMode runs effects twice) + if (router.query.code && !callbackProcessedRef.current) { + callbackProcessedRef.current = true; handleCallback(); } }, [ diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index ba24736e6d..7ce452c44d 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -91,6 +91,20 @@ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions return null; } + // Validate required fields exist to prevent TypeError on malformed requests + if ( + !tokenData.accessToken + || typeof tokenData.accessToken !== 'string' + || !tokenData.profile + || typeof tokenData.profile !== 'object' + || !tokenData.profile.sub + || typeof tokenData.profile.sub !== 'string' + ) { + // eslint-disable-next-line no-console + console.error('[auth-nextjs] Invalid token data structure - missing required fields'); + return null; + } + // Validate tokens server-side via userinfo endpoint. // This is the standard OAuth 2.0 way - the auth server validates the token. const userInfo = await validateTokens(tokenData.accessToken, authDomain); diff --git a/packages/auth-nextjs/src/server/with-page-auth.ts b/packages/auth-nextjs/src/server/with-page-auth.ts index a3d1d0c58f..bd58e57734 100644 --- a/packages/auth-nextjs/src/server/with-page-auth.ts +++ b/packages/auth-nextjs/src/server/with-page-auth.ts @@ -117,7 +117,7 @@ export function withPageAuthRequired< options: WithPageAuthRequiredFullOptions

= {}, ): GetServerSideProps { const { - loginUrl = '/', + loginUrl = '/login', returnTo, getServerSideProps: customGetServerSideProps, } = options; diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-nextjs/src/types.ts index d707e6c267..da93ec523c 100644 --- a/packages/auth-nextjs/src/types.ts +++ b/packages/auth-nextjs/src/types.ts @@ -197,7 +197,7 @@ export interface UseImmutableAuthReturn { export interface WithPageAuthRequiredOptions { /** * URL to redirect to when not authenticated - * @default "/" + * @default "/login" */ loginUrl?: string; /** From e6a377f924a1a486c5d1ab6c3ffe0b51bf799b5c Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 15:54:45 +1100 Subject: [PATCH 15/88] bug fixes --- packages/auth-nextjs/src/index.ts | 87 +++++++++++++++++++++++++---- packages/auth-nextjs/src/refresh.ts | 5 ++ 2 files changed, 81 insertions(+), 11 deletions(-) diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts index 9f5682fd37..295276a68d 100644 --- a/packages/auth-nextjs/src/index.ts +++ b/packages/auth-nextjs/src/index.ts @@ -21,6 +21,12 @@ export type ImmutableAuthOverrides = Omit; * @param config - Immutable auth configuration * @param overrides - Optional NextAuth options to override defaults * + * @remarks + * Callback composition: The `jwt` and `session` callbacks are composed rather than + * replaced. Internal callbacks run first (handling token storage and refresh), then + * your custom callbacks receive the result. Other callbacks (`signIn`, `redirect`) + * are replaced entirely if provided. + * * @example Basic usage * ```typescript * // pages/api/auth/[...nextauth].ts @@ -42,6 +48,23 @@ export type ImmutableAuthOverrides = Omit; * } * ); * ``` + * + * @example With custom jwt callback (composed with internal callback) + * ```typescript + * export default ImmutableAuth( + * { clientId: "...", redirectUri: "..." }, + * { + * callbacks: { + * // Your jwt callback receives the token after internal processing + * async jwt({ token }) { + * // Add custom claims + * token.customClaim = "value"; + * return token; + * }, + * }, + * } + * ); + * ``` */ export function ImmutableAuth( config: ImmutableAuthConfig, @@ -49,18 +72,60 @@ export function ImmutableAuth( ) { const authOptions = createAuthOptions(config); - // Merge overrides with generated options - const mergedOptions: NextAuthOptions = overrides - ? { - ...authOptions, - ...overrides, - // Deep merge callbacks if both exist - callbacks: { - ...authOptions.callbacks, - ...overrides.callbacks, - }, + // If no overrides, use auth options as-is + if (!overrides) { + return NextAuth(authOptions); + } + + // Compose callbacks to ensure internal callbacks always run first + // User callbacks receive the result and can modify it further + const composedCallbacks: NextAuthOptions['callbacks'] = { + ...authOptions.callbacks, + }; + + if (overrides.callbacks) { + // Compose jwt callback - internal callback runs first, then user callback + if (overrides.callbacks.jwt) { + const internalJwt = authOptions.callbacks?.jwt; + const userJwt = overrides.callbacks.jwt; + composedCallbacks.jwt = async (params) => { + // Run internal jwt callback first to handle token storage and refresh + const token = internalJwt ? await internalJwt(params) : params.token; + // Then run user's jwt callback with the result + return userJwt({ ...params, token }); + }; + } + + // Compose session callback - internal callback runs first, then user callback + if (overrides.callbacks.session) { + const internalSession = authOptions.callbacks?.session; + const userSession = overrides.callbacks.session; + composedCallbacks.session = async (params) => { + // Run internal session callback first to expose token data + const session = internalSession + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ? await internalSession(params as any) + : params.session; + // Then run user's session callback with the result + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return userSession({ ...params, session } as any); + }; } - : authOptions; + + // For other callbacks (signIn, redirect), just use overrides if provided + if (overrides.callbacks.signIn) { + composedCallbacks.signIn = overrides.callbacks.signIn; + } + if (overrides.callbacks.redirect) { + composedCallbacks.redirect = overrides.callbacks.redirect; + } + } + + const mergedOptions: NextAuthOptions = { + ...authOptions, + ...overrides, + callbacks: composedCallbacks, + }; return NextAuth(mergedOptions); } diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index 5388cccd50..0ac71e0eca 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -42,6 +42,11 @@ export async function refreshAccessToken( throw new Error(data.error_description || data.error || 'Token refresh failed'); } + // Validate that access_token exists in the response + if (!data.access_token || typeof data.access_token !== 'string') { + throw new Error('Invalid token response: missing access_token'); + } + // Calculate expiry (access_token typically expires in 1 hour) const expiresIn = data.expires_in || DEFAULT_TOKEN_EXPIRY_SECONDS; const accessTokenExpires = Date.now() + expiresIn * 1000; From 1becb640aabda0aff92bc07611116a0c1c0e0c16 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 16:07:37 +1100 Subject: [PATCH 16/88] fix bug --- packages/auth-nextjs/src/config.ts | 4 ++++ packages/auth-nextjs/src/refresh.ts | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index 7ce452c44d..7ec1972517 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -92,6 +92,8 @@ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions } // Validate required fields exist to prevent TypeError on malformed requests + // accessTokenExpires must be a valid number to ensure isTokenExpired() works correctly + // (NaN comparisons always return false, which would prevent token refresh) if ( !tokenData.accessToken || typeof tokenData.accessToken !== 'string' @@ -99,6 +101,8 @@ export function createAuthOptions(config: ImmutableAuthConfig): NextAuthOptions || typeof tokenData.profile !== 'object' || !tokenData.profile.sub || typeof tokenData.profile.sub !== 'string' + || typeof tokenData.accessTokenExpires !== 'number' + || Number.isNaN(tokenData.accessTokenExpires) ) { // eslint-disable-next-line no-console console.error('[auth-nextjs] Invalid token data structure - missing required fields'); diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index 0ac71e0eca..c126991d17 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -72,10 +72,19 @@ export async function refreshAccessToken( /** * Check if the access token is expired or about to expire * Returns true if token expires within the buffer time (default 60 seconds) + * + * @remarks + * If accessTokenExpires is not a valid number (undefined, null, NaN), + * returns true to trigger a refresh as a safety measure. */ export function isTokenExpired( accessTokenExpires: number, bufferSeconds: number = TOKEN_EXPIRY_BUFFER_SECONDS, ): boolean { + // If accessTokenExpires is invalid (not a number or NaN), treat as expired + // This prevents NaN comparisons from incorrectly returning false + if (typeof accessTokenExpires !== 'number' || Number.isNaN(accessTokenExpires)) { + return true; + } return Date.now() >= accessTokenExpires - bufferSeconds * 1000; } From 38db4d6790a674ce04bd57e77f92ae6edf9831af Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 16:51:28 +1100 Subject: [PATCH 17/88] bug --- packages/auth-nextjs/src/client/callback.tsx | 64 ++++++++++---------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index 56e7fad593..78a523faa2 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -80,42 +80,44 @@ export function CallbackPage({ if (window.opener) { // Close the popup - the parent window will receive the tokens via Auth events window.close(); - } else { + } else if (authUser) { // Not in a popup - create NextAuth session before redirecting // This ensures SSR/session-based auth is authenticated - if (authUser) { - const tokenData: ImmutableTokenData = { - accessToken: authUser.accessToken, - refreshToken: authUser.refreshToken, - idToken: authUser.idToken, - accessTokenExpires: getTokenExpiry(authUser.accessToken), - profile: { - sub: authUser.profile.sub, - email: authUser.profile.email, - nickname: authUser.profile.nickname, - }, - zkEvm: authUser.zkEvm, - }; - - // Sign in to NextAuth with the tokens - // Note: signIn uses the basePath from SessionProvider context, - // so ensure CallbackPage is rendered within ImmutableAuthProvider - const result = await signIn(IMMUTABLE_PROVIDER_ID, { - tokens: JSON.stringify(tokenData), - redirect: false, - }); - - // signIn with redirect: false returns a result object instead of throwing - if (result?.error) { - throw new Error(`NextAuth sign-in failed: ${result.error}`); - } - if (!result?.ok) { - throw new Error('NextAuth sign-in failed: unknown error'); - } + const tokenData: ImmutableTokenData = { + accessToken: authUser.accessToken, + refreshToken: authUser.refreshToken, + idToken: authUser.idToken, + accessTokenExpires: getTokenExpiry(authUser.accessToken), + profile: { + sub: authUser.profile.sub, + email: authUser.profile.email, + nickname: authUser.profile.nickname, + }, + zkEvm: authUser.zkEvm, + }; + + // Sign in to NextAuth with the tokens + // Note: signIn uses the basePath from SessionProvider context, + // so ensure CallbackPage is rendered within ImmutableAuthProvider + const result = await signIn(IMMUTABLE_PROVIDER_ID, { + tokens: JSON.stringify(tokenData), + redirect: false, + }); + + // signIn with redirect: false returns a result object instead of throwing + if (result?.error) { + throw new Error(`NextAuth sign-in failed: ${result.error}`); + } + if (!result?.ok) { + throw new Error('NextAuth sign-in failed: unknown error'); } - // Redirect to specified page + // Only redirect after successful session creation router.replace(redirectTo); + } else { + // authUser is undefined - loginCallback failed silently + // This can happen if the OIDC signinCallback returns null + throw new Error('Authentication failed: no user data received from login callback'); } } catch (err) { setError(err instanceof Error ? err.message : 'Authentication failed'); From ebe4e0eed7a698248afe861a0446f434c01d0ded Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 18 Dec 2025 17:50:06 +1100 Subject: [PATCH 18/88] bug --- packages/auth-nextjs/src/server/with-page-auth.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/auth-nextjs/src/server/with-page-auth.ts b/packages/auth-nextjs/src/server/with-page-auth.ts index bd58e57734..d9874f3ba4 100644 --- a/packages/auth-nextjs/src/server/with-page-auth.ts +++ b/packages/auth-nextjs/src/server/with-page-auth.ts @@ -156,9 +156,11 @@ export function withPageAuthRequired< } // Merge props with session + // Note: result.props can be P | Promise

, so we must await it + const userProps = await result.props; return { props: { - ...result.props, + ...userProps, session, } as WithPageAuthRequiredProps & P, }; From c6f7b3e5730be378e38a1ccd1a7cc290b03924d9 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 09:04:41 +1100 Subject: [PATCH 19/88] bug --- packages/auth-nextjs/src/client/callback.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index 78a523faa2..33fe96128e 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -78,6 +78,11 @@ export function CallbackPage({ // Check if we're in a popup window if (window.opener) { + // Validate authUser before closing - if loginCallback failed silently, + // we need to show an error instead of closing the popup + if (!authUser) { + throw new Error('Authentication failed: no user data received from login callback'); + } // Close the popup - the parent window will receive the tokens via Auth events window.close(); } else if (authUser) { From 7b2d6f9861c32fcdb9b624dbb9cbca5859eaa9dc Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 09:58:18 +1100 Subject: [PATCH 20/88] bug --- packages/auth-nextjs/src/client/provider.tsx | 12 ++++++++++-- packages/auth-nextjs/src/refresh.ts | 18 +++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index c21114a720..b806e3b689 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -64,8 +64,16 @@ function ImmutableAuthInner({ useEffect(() => { if (typeof window === 'undefined') return; - // Create a config key to detect changes (clientId + authDomain uniquely identify the environment) - const configKey = `${config.clientId}:${config.authenticationDomain || DEFAULT_AUTH_DOMAIN}`; + // Create a config key to detect changes - include all properties used in Auth constructor + // to ensure the Auth instance is recreated when any config property changes + const configKey = [ + config.clientId, + config.redirectUri, + config.logoutRedirectUri || '', + config.audience || DEFAULT_AUDIENCE, + config.scope || DEFAULT_SCOPE, + config.authenticationDomain || DEFAULT_AUTH_DOMAIN, + ].join(':'); // Only recreate if config actually changed if (prevConfigRef.current === configKey) { diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index c126991d17..0cedbe4f3c 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -36,12 +36,24 @@ export async function refreshAccessToken( }), }); - const data = await response.json(); - + // Check response.ok before parsing JSON to avoid confusing errors + // when server returns non-JSON responses (e.g., HTML error pages) if (!response.ok) { - throw new Error(data.error_description || data.error || 'Token refresh failed'); + let errorMessage = `Token refresh failed with status ${response.status}`; + try { + const errorData = await response.json(); + if (errorData.error_description || errorData.error) { + errorMessage = errorData.error_description || errorData.error; + } + } catch { + // Response is not JSON (e.g., HTML error page from proxy/load balancer) + // Use the status-based error message + } + throw new Error(errorMessage); } + const data = await response.json(); + // Validate that access_token exists in the response if (!data.access_token || typeof data.access_token !== 'string') { throw new Error('Invalid token response: missing access_token'); From f65f510ba78e8ea88c578346fed57fb401c35e1d Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 12:13:14 +1100 Subject: [PATCH 21/88] build --- pnpm-lock.yaml | 695 ++++++++++++---------------------- sdk/package.json | 65 ++++ sdk/src/auth.ts | 1 + sdk/src/auth_nextjs.ts | 1 + sdk/src/auth_nextjs_client.ts | 1 + sdk/src/auth_nextjs_server.ts | 1 + sdk/src/index.ts | 3 + sdk/src/wallet.ts | 1 + 8 files changed, 324 insertions(+), 444 deletions(-) create mode 100644 sdk/src/auth.ts create mode 100644 sdk/src/auth_nextjs.ts create mode 100644 sdk/src/auth_nextjs_client.ts create mode 100644 sdk/src/auth_nextjs_server.ts create mode 100644 sdk/src/wallet.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6512dcbf6c..202ad09307 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,13 +117,13 @@ importers: version: 29.7.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) typescript: specifier: ^5 version: 5.6.2 @@ -135,7 +135,7 @@ importers: version: 0.25.21(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(framer-motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@imtbl/sdk': specifier: latest - version: 2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1051,10 +1051,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.15.3 + version: 1.15.3(@swc/helpers@0.5.13) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.15.3) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1066,7 +1066,7 @@ importers: version: 18.3.12 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1081,10 +1081,10 @@ importers: version: 18.3.1 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.15.3)(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1291,7 +1291,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1457,7 +1457,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1469,7 +1469,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2633,6 +2633,9 @@ importers: '@imtbl/auth': specifier: workspace:* version: link:../packages/auth + '@imtbl/auth-nextjs': + specifier: workspace:* + version: link:../packages/auth-nextjs '@imtbl/blockchain-data': specifier: workspace:* version: link:../packages/blockchain-data/sdk @@ -17598,7 +17601,7 @@ snapshots: '@babel/traverse': 7.27.0 '@babel/types': 7.27.0 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -19288,7 +19291,7 @@ snapshots: '@babel/parser': 7.27.0 '@babel/template': 7.27.0 '@babel/types': 7.27.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -20396,12 +20399,12 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@imtbl/checkout-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/blockchain-data': 2.12.3 '@imtbl/bridge-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/config': 2.12.3 - '@imtbl/dex-sdk': 2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@imtbl/dex-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20465,12 +20468,12 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@imtbl/dex-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.12.3 '@uniswap/sdk-core': 3.2.3 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -20547,11 +20550,11 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@imtbl/sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/blockchain-data': 2.12.3 - '@imtbl/checkout-sdk': 2.12.3(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@imtbl/checkout-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/config': 2.12.3 '@imtbl/minting-backend': 2.12.3 '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20808,43 +20811,6 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0(node-notifier@8.0.2) - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 @@ -20956,43 +20922,6 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0(node-notifier@8.0.2) - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 @@ -21299,7 +21228,7 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@26.6.3': + '@jest/test-sequencer@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 @@ -21307,7 +21236,11 @@ snapshots: jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - ts-node + - utf-8-validate '@jest/test-sequencer@27.5.1': dependencies: @@ -24680,22 +24613,6 @@ snapshots: '@swc/core-win32-x64-msvc@1.9.3': optional: true - '@swc/core@1.15.3': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 - optionalDependencies: - '@swc/core-darwin-arm64': 1.15.3 - '@swc/core-darwin-x64': 1.15.3 - '@swc/core-linux-arm-gnueabihf': 1.15.3 - '@swc/core-linux-arm64-gnu': 1.15.3 - '@swc/core-linux-arm64-musl': 1.15.3 - '@swc/core-linux-x64-gnu': 1.15.3 - '@swc/core-linux-x64-musl': 1.15.3 - '@swc/core-win32-arm64-msvc': 1.15.3 - '@swc/core-win32-ia32-msvc': 1.15.3 - '@swc/core-win32-x64-msvc': 1.15.3 - '@swc/core@1.15.3(@swc/helpers@0.5.13)': dependencies: '@swc/counter': 0.1.3 @@ -24748,10 +24665,10 @@ snapshots: '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 - '@swc/jest@0.2.37(@swc/core@1.15.3)': + '@swc/jest@0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13))': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.15.3 + '@swc/core': 1.15.3(@swc/helpers@0.5.13) '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -25261,6 +25178,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + debug: 4.3.7(supports-color@8.1.1) + eslint: 9.16.0(jiti@1.21.0) + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -25422,17 +25358,6 @@ snapshots: tiny-invariant: 1.3.1 toformat: 2.0.0 - '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': - dependencies: - '@openzeppelin/contracts': 3.4.2 - '@uniswap/v2-core': 1.0.1 - '@uniswap/v3-core': 1.0.0 - '@uniswap/v3-periphery': 1.4.4 - dotenv: 14.3.2 - hardhat-watcher: 2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - transitivePeerDependencies: - - hardhat - '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@openzeppelin/contracts': 3.4.2 @@ -25464,19 +25389,6 @@ snapshots: '@uniswap/v3-core': 1.0.0 base64-sol: 1.0.1 - '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/solidity': 5.7.0 - '@uniswap/sdk-core': 4.0.6 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@uniswap/v3-periphery': 1.4.3 - '@uniswap/v3-staker': 1.0.0 - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - transitivePeerDependencies: - - hardhat - '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 @@ -26031,7 +25943,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -26492,20 +26404,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.9) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - optional: true - babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26715,13 +26613,6 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) - babel-preset-jest@29.6.3(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) - optional: true - babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -27667,21 +27558,6 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 @@ -27697,21 +27573,6 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 @@ -27742,21 +27603,6 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 @@ -28080,10 +27926,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.3.7(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -28759,7 +28601,7 @@ snapshots: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -28770,13 +28612,13 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@5.0.0(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.0) @@ -28790,8 +28632,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -28809,8 +28651,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28828,8 +28670,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28847,7 +28689,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28864,8 +28706,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28875,18 +28717,45 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@babel/core': 7.26.9 + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28902,23 +28771,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28943,7 +28812,7 @@ snapshots: enhanced-resolve: 5.15.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.15.0 @@ -28960,8 +28829,8 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.15.0 @@ -28984,7 +28853,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -28995,6 +28864,16 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -29005,6 +28884,14 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): + dependencies: + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + eslint: 8.57.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -29013,42 +28900,15 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 8.57.0 + eslint: 9.16.0(jiti@1.21.0) lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -29075,7 +28935,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -29083,9 +28943,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 9.16.0(jiti@1.21.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -29151,6 +29011,17 @@ snapshots: - supports-color - typescript + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -30565,11 +30436,6 @@ snapshots: - debug - utf-8-validate - hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): - dependencies: - chokidar: 3.6.0 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): dependencies: chokidar: 3.6.0 @@ -30940,7 +30806,7 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -30999,7 +30865,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -31454,7 +31320,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -31644,11 +31510,11 @@ snapshots: jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) @@ -31684,27 +31550,6 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) @@ -31749,11 +31594,11 @@ snapshots: jest-cli@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) @@ -31813,7 +31658,7 @@ snapshots: jest-config@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 - '@jest/test-sequencer': 26.6.3 + '@jest/test-sequencer': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.26.10) chalk: 4.1.2 @@ -31937,37 +31782,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.15.13 - ts-node: 10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 @@ -32092,37 +31906,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 @@ -33131,7 +32914,7 @@ snapshots: jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) @@ -33157,20 +32940,6 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2)) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) @@ -33201,7 +32970,7 @@ snapshots: jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 jest-cli: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) @@ -36363,7 +36132,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -36381,7 +36150,7 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 @@ -36449,6 +36218,92 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.26.9 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.26.9) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) + babel-preset-react-app: 10.0.1 + bfj: 7.0.2 + browserslist: 4.23.3 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 9.16.0(jiti@1.21.0) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + fs-extra: 10.1.0 + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss: 8.4.49 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) + postcss-preset-env: 7.8.3(postcss@8.4.49) + prompts: 2.4.2 + react: 18.3.1 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-refresh: 0.11.0 + resolve: 1.22.8 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + semver: 7.6.3 + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 @@ -38270,12 +38125,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38290,12 +38145,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38310,12 +38165,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38330,12 +38185,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38344,10 +38199,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.10 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.9) + babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 ts-mockito@2.6.1: @@ -38474,26 +38329,6 @@ snapshots: optionalDependencies: '@swc/core': 1.15.3(@swc/helpers@0.5.13) - ts-node@10.9.2(@swc/core@1.15.3)(@types/node@18.15.13)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.15.13 - acorn: 8.14.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.15.3 - ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -38598,34 +38433,6 @@ snapshots: - tsx - yaml - tsup@8.3.0(@swc/core@1.15.3)(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): - dependencies: - bundle-require: 5.0.0(esbuild@0.23.1) - cac: 6.7.14 - chokidar: 3.6.0 - consola: 3.2.3 - debug: 4.3.7 - esbuild: 0.23.1 - execa: 5.1.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@1.21.0)(postcss@8.4.49)(yaml@2.5.0) - resolve-from: 5.0.0 - rollup: 4.28.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyglobby: 0.2.10 - tree-kill: 1.2.2 - optionalDependencies: - '@swc/core': 1.15.3 - postcss: 8.4.49 - typescript: 5.6.2 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tsup@8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) diff --git a/sdk/package.json b/sdk/package.json index 7708f843bd..4b4d6cafa1 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -6,6 +6,7 @@ "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", "dependencies": { "@imtbl/auth": "workspace:*", + "@imtbl/auth-nextjs": "workspace:*", "@imtbl/blockchain-data": "workspace:*", "@imtbl/checkout-sdk": "workspace:*", "@imtbl/config": "workspace:*", @@ -148,6 +149,70 @@ "require": "./dist/minting_backend.cjs", "default": "./dist/minting_backend.js" } + }, + "./auth": { + "development": { + "types": "./src/auth.ts", + "browser": "./dist/auth.js", + "require": "./dist/auth.cjs", + "default": "./dist/auth.js" + }, + "default": { + "types": "./dist/auth.d.ts", + "browser": "./dist/auth.js", + "require": "./dist/auth.cjs", + "default": "./dist/auth.js" + } + }, + "./wallet": { + "development": { + "types": "./src/wallet.ts", + "browser": "./dist/wallet.js", + "require": "./dist/wallet.cjs", + "default": "./dist/wallet.js" + }, + "default": { + "types": "./dist/wallet.d.ts", + "browser": "./dist/wallet.js", + "require": "./dist/wallet.cjs", + "default": "./dist/wallet.js" + } + }, + "./auth_nextjs": { + "development": { + "types": "./src/auth_nextjs.ts", + "require": "./dist/auth_nextjs.cjs", + "default": "./dist/auth_nextjs.js" + }, + "default": { + "types": "./dist/auth_nextjs.d.ts", + "require": "./dist/auth_nextjs.cjs", + "default": "./dist/auth_nextjs.js" + } + }, + "./auth_nextjs/client": { + "development": { + "types": "./src/auth_nextjs_client.ts", + "require": "./dist/auth_nextjs_client.cjs", + "default": "./dist/auth_nextjs_client.js" + }, + "default": { + "types": "./dist/auth_nextjs_client.d.ts", + "require": "./dist/auth_nextjs_client.cjs", + "default": "./dist/auth_nextjs_client.js" + } + }, + "./auth_nextjs/server": { + "development": { + "types": "./src/auth_nextjs_server.ts", + "require": "./dist/auth_nextjs_server.cjs", + "default": "./dist/auth_nextjs_server.js" + }, + "default": { + "types": "./dist/auth_nextjs_server.d.ts", + "require": "./dist/auth_nextjs_server.cjs", + "default": "./dist/auth_nextjs_server.js" + } } }, "files": [ diff --git a/sdk/src/auth.ts b/sdk/src/auth.ts new file mode 100644 index 0000000000..fdb9a410af --- /dev/null +++ b/sdk/src/auth.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth'; diff --git a/sdk/src/auth_nextjs.ts b/sdk/src/auth_nextjs.ts new file mode 100644 index 0000000000..4151b2b137 --- /dev/null +++ b/sdk/src/auth_nextjs.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth-nextjs'; diff --git a/sdk/src/auth_nextjs_client.ts b/sdk/src/auth_nextjs_client.ts new file mode 100644 index 0000000000..b5f1cd4265 --- /dev/null +++ b/sdk/src/auth_nextjs_client.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth-nextjs/client'; diff --git a/sdk/src/auth_nextjs_server.ts b/sdk/src/auth_nextjs_server.ts new file mode 100644 index 0000000000..6bd4d6fd8c --- /dev/null +++ b/sdk/src/auth_nextjs_server.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth-nextjs/server'; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index c8d0123eb1..b958894de4 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -6,3 +6,6 @@ export * as checkout from './checkout'; export * as x from './x'; export * as webhook from './webhook'; export * as mintingBackend from './minting_backend'; +export * as auth from './auth'; +export * as wallet from './wallet'; +export * as authNextjs from './auth_nextjs'; diff --git a/sdk/src/wallet.ts b/sdk/src/wallet.ts new file mode 100644 index 0000000000..6d49f54f24 --- /dev/null +++ b/sdk/src/wallet.ts @@ -0,0 +1 @@ +export * from '@imtbl/wallet'; From 9afc0600bbbbcf1574ce15bd52316c4bc417a411 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 12:40:16 +1100 Subject: [PATCH 22/88] bug --- packages/auth-nextjs/src/client/provider.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index b806e3b689..f919361392 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -335,7 +335,13 @@ export function useImmutableAuth(): UseImmutableAuthReturn { } } - // Fall back to session token + // Fall back to session token, but check for errors first + // When server-side token refresh fails, the session contains both an error flag + // and the original stale token. We must not return the stale token in this case. + if (session?.error) { + throw new Error(`Token refresh failed: ${session.error}`); + } + if (session?.accessToken) { return session.accessToken; } From eb868d32f7a54fec8a5c6c3f3438520aa76b3b00 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 13:25:49 +1100 Subject: [PATCH 23/88] dep install --- .npmrc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.npmrc b/.npmrc index f65dd218b5..53a09bef8f 100644 --- a/.npmrc +++ b/.npmrc @@ -7,3 +7,10 @@ public-hoist-pattern[]=@imtbl/* public-hoist-pattern[]=*openzeppelin* public-hoist-pattern[]=*solidity* public-hoist-pattern[]=eslint-* + +# Skip preparing git-hosted seaport dependencies that run yarn install +# These packages provide Solidity contracts/types and don't require building +# Their prepare script is only for development (Husky git hooks) +# Without this, parallel yarn installs cause race conditions on CI +neverBuiltDependencies[]=seaport +neverBuiltDependencies[]=seaport-core From 6c695f99b405995fdb7c6725ff0bb766fb0b6474 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 13:35:12 +1100 Subject: [PATCH 24/88] dep install --- .npmrc | 3 +-- package.json | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.npmrc b/.npmrc index 53a09bef8f..73b0a413d6 100644 --- a/.npmrc +++ b/.npmrc @@ -12,5 +12,4 @@ public-hoist-pattern[]=eslint-* # These packages provide Solidity contracts/types and don't require building # Their prepare script is only for development (Husky git hooks) # Without this, parallel yarn installs cause race conditions on CI -neverBuiltDependencies[]=seaport -neverBuiltDependencies[]=seaport-core +never-built-dependencies=seaport seaport-core diff --git a/package.json b/package.json index 07a3b88546..f6f9af84fe 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,9 @@ "*.{js,jsx,ts,tsx}": "eslint" }, "packageManager": "pnpm@9.12.0", + "pnpm": { + "neverBuiltDependencies": ["seaport", "seaport-core"] + }, "private": true, "repository": "immutable/ts-immutable-sdk.git", "resolutions": { From 3fc1329986dbeda267c48306d8717e94a5daf0a8 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 13:40:58 +1100 Subject: [PATCH 25/88] revert --- .npmrc | 6 ---- package.json | 3 -- sdk/package.json | 64 ----------------------------------- sdk/src/auth.ts | 1 - sdk/src/auth_nextjs.ts | 1 - sdk/src/auth_nextjs_client.ts | 1 - sdk/src/auth_nextjs_server.ts | 1 - sdk/src/index.ts | 3 -- sdk/src/wallet.ts | 1 - 9 files changed, 81 deletions(-) diff --git a/.npmrc b/.npmrc index 73b0a413d6..f65dd218b5 100644 --- a/.npmrc +++ b/.npmrc @@ -7,9 +7,3 @@ public-hoist-pattern[]=@imtbl/* public-hoist-pattern[]=*openzeppelin* public-hoist-pattern[]=*solidity* public-hoist-pattern[]=eslint-* - -# Skip preparing git-hosted seaport dependencies that run yarn install -# These packages provide Solidity contracts/types and don't require building -# Their prepare script is only for development (Husky git hooks) -# Without this, parallel yarn installs cause race conditions on CI -never-built-dependencies=seaport seaport-core diff --git a/package.json b/package.json index f6f9af84fe..07a3b88546 100644 --- a/package.json +++ b/package.json @@ -46,9 +46,6 @@ "*.{js,jsx,ts,tsx}": "eslint" }, "packageManager": "pnpm@9.12.0", - "pnpm": { - "neverBuiltDependencies": ["seaport", "seaport-core"] - }, "private": true, "repository": "immutable/ts-immutable-sdk.git", "resolutions": { diff --git a/sdk/package.json b/sdk/package.json index 4b4d6cafa1..f307144e6a 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -149,70 +149,6 @@ "require": "./dist/minting_backend.cjs", "default": "./dist/minting_backend.js" } - }, - "./auth": { - "development": { - "types": "./src/auth.ts", - "browser": "./dist/auth.js", - "require": "./dist/auth.cjs", - "default": "./dist/auth.js" - }, - "default": { - "types": "./dist/auth.d.ts", - "browser": "./dist/auth.js", - "require": "./dist/auth.cjs", - "default": "./dist/auth.js" - } - }, - "./wallet": { - "development": { - "types": "./src/wallet.ts", - "browser": "./dist/wallet.js", - "require": "./dist/wallet.cjs", - "default": "./dist/wallet.js" - }, - "default": { - "types": "./dist/wallet.d.ts", - "browser": "./dist/wallet.js", - "require": "./dist/wallet.cjs", - "default": "./dist/wallet.js" - } - }, - "./auth_nextjs": { - "development": { - "types": "./src/auth_nextjs.ts", - "require": "./dist/auth_nextjs.cjs", - "default": "./dist/auth_nextjs.js" - }, - "default": { - "types": "./dist/auth_nextjs.d.ts", - "require": "./dist/auth_nextjs.cjs", - "default": "./dist/auth_nextjs.js" - } - }, - "./auth_nextjs/client": { - "development": { - "types": "./src/auth_nextjs_client.ts", - "require": "./dist/auth_nextjs_client.cjs", - "default": "./dist/auth_nextjs_client.js" - }, - "default": { - "types": "./dist/auth_nextjs_client.d.ts", - "require": "./dist/auth_nextjs_client.cjs", - "default": "./dist/auth_nextjs_client.js" - } - }, - "./auth_nextjs/server": { - "development": { - "types": "./src/auth_nextjs_server.ts", - "require": "./dist/auth_nextjs_server.cjs", - "default": "./dist/auth_nextjs_server.js" - }, - "default": { - "types": "./dist/auth_nextjs_server.d.ts", - "require": "./dist/auth_nextjs_server.cjs", - "default": "./dist/auth_nextjs_server.js" - } } }, "files": [ diff --git a/sdk/src/auth.ts b/sdk/src/auth.ts index fdb9a410af..e69de29bb2 100644 --- a/sdk/src/auth.ts +++ b/sdk/src/auth.ts @@ -1 +0,0 @@ -export * from '@imtbl/auth'; diff --git a/sdk/src/auth_nextjs.ts b/sdk/src/auth_nextjs.ts index 4151b2b137..e69de29bb2 100644 --- a/sdk/src/auth_nextjs.ts +++ b/sdk/src/auth_nextjs.ts @@ -1 +0,0 @@ -export * from '@imtbl/auth-nextjs'; diff --git a/sdk/src/auth_nextjs_client.ts b/sdk/src/auth_nextjs_client.ts index b5f1cd4265..e69de29bb2 100644 --- a/sdk/src/auth_nextjs_client.ts +++ b/sdk/src/auth_nextjs_client.ts @@ -1 +0,0 @@ -export * from '@imtbl/auth-nextjs/client'; diff --git a/sdk/src/auth_nextjs_server.ts b/sdk/src/auth_nextjs_server.ts index 6bd4d6fd8c..e69de29bb2 100644 --- a/sdk/src/auth_nextjs_server.ts +++ b/sdk/src/auth_nextjs_server.ts @@ -1 +0,0 @@ -export * from '@imtbl/auth-nextjs/server'; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index b958894de4..c8d0123eb1 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -6,6 +6,3 @@ export * as checkout from './checkout'; export * as x from './x'; export * as webhook from './webhook'; export * as mintingBackend from './minting_backend'; -export * as auth from './auth'; -export * as wallet from './wallet'; -export * as authNextjs from './auth_nextjs'; diff --git a/sdk/src/wallet.ts b/sdk/src/wallet.ts index 6d49f54f24..e69de29bb2 100644 --- a/sdk/src/wallet.ts +++ b/sdk/src/wallet.ts @@ -1 +0,0 @@ -export * from '@imtbl/wallet'; From f40556e70792ed1ad2ab9bb39044183f1d8d85cc Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 13:44:59 +1100 Subject: [PATCH 26/88] revert --- packages/auth-nextjs/src/client/provider.tsx | 2 - pnpm-lock.yaml | 332 +++++-------------- sdk/package.json | 1 - 3 files changed, 81 insertions(+), 254 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index f919361392..72f7e70b73 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -128,8 +128,6 @@ function ImmutableAuthInner({ }; await auth.storeTokens(tokenResponse); - // eslint-disable-next-line no-console - console.log('[auth-nextjs] Hydrated Auth instance from session'); } catch (error) { // eslint-disable-next-line no-console console.warn('[auth-nextjs] Failed to hydrate Auth instance:', error); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 202ad09307..0c6f8159aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,7 +135,7 @@ importers: version: 0.25.21(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(framer-motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@imtbl/sdk': specifier: latest - version: 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 2.12.3 next: specifier: 14.2.25 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1291,7 +1291,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1457,7 +1457,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1469,7 +1469,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2633,9 +2633,6 @@ importers: '@imtbl/auth': specifier: workspace:* version: link:../packages/auth - '@imtbl/auth-nextjs': - specifier: workspace:* - version: link:../packages/auth-nextjs '@imtbl/blockchain-data': specifier: workspace:* version: link:../packages/blockchain-data/sdk @@ -20387,7 +20384,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/bridge-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/bridge-sdk@2.12.3': dependencies: '@imtbl/config': 2.12.3 '@jest/globals': 29.7.0 @@ -20399,16 +20396,16 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/checkout-sdk@2.12.3': dependencies: '@imtbl/blockchain-data': 2.12.3 - '@imtbl/bridge-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/bridge-sdk': 2.12.3 '@imtbl/config': 2.12.3 - '@imtbl/dex-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/dex-sdk': 2.12.3 '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 - '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/passport': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/orderbook': 2.12.3 + '@imtbl/passport': 2.12.3 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20468,7 +20465,7 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/dex-sdk@2.12.3': dependencies: '@imtbl/config': 2.12.3 '@uniswap/sdk-core': 3.2.3 @@ -20510,7 +20507,7 @@ snapshots: - debug - pg-native - '@imtbl/orderbook@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/orderbook@2.12.3': dependencies: '@imtbl/config': 2.12.3 '@imtbl/metrics': 2.12.3 @@ -20524,16 +20521,16 @@ snapshots: - debug - utf-8-validate - '@imtbl/passport@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/passport@2.12.3': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/config': 2.12.3 '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 - '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/wallet': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-provider': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/toolkit': 2.12.3 + '@imtbl/wallet': 2.12.3 + '@imtbl/x-client': 2.12.3 + '@imtbl/x-provider': 2.12.3 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) localforage: 1.10.0 oidc-client-ts: 3.4.1 @@ -20550,19 +20547,19 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/sdk@2.12.3': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/blockchain-data': 2.12.3 - '@imtbl/checkout-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/checkout-sdk': 2.12.3 '@imtbl/config': 2.12.3 '@imtbl/minting-backend': 2.12.3 - '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/passport': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/wallet': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/orderbook': 2.12.3 + '@imtbl/passport': 2.12.3 + '@imtbl/wallet': 2.12.3 '@imtbl/webhook': 2.12.3 - '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-provider': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.12.3 + '@imtbl/x-provider': 2.12.3 transitivePeerDependencies: - bufferutil - debug @@ -20571,9 +20568,9 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/toolkit@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/toolkit@2.12.3': dependencies: - '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.12.3 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 bn.js: 5.2.1 @@ -20585,12 +20582,12 @@ snapshots: - debug - utf-8-validate - '@imtbl/wallet@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/wallet@2.12.3': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 - '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/toolkit': 2.12.3 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -20605,7 +20602,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/x-client@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-client@2.12.3': dependencies: '@ethereumjs/wallet': 2.0.4 '@imtbl/config': 2.12.3 @@ -20621,12 +20618,12 @@ snapshots: - debug - utf-8-validate - '@imtbl/x-provider@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@imtbl/x-provider@2.12.3': dependencies: '@imtbl/config': 2.12.3 '@imtbl/generated-clients': 2.12.3 - '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/toolkit': 2.12.3 + '@imtbl/x-client': 2.12.3 '@metamask/detect-provider': 2.0.0 axios: 1.7.7 enc-utils: 3.0.0 @@ -25178,25 +25175,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - debug: 4.3.7(supports-color@8.1.1) - eslint: 9.16.0(jiti@1.21.0) - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -26404,6 +26382,20 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + optional: true + babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26613,6 +26605,13 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) + babel-preset-jest@29.6.3(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) + optional: true + babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -28717,45 +28716,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28771,23 +28743,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 9.16.0(jiti@1.21.0) - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28864,16 +28836,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28884,14 +28846,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): - dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - eslint: 8.57.0 - lodash: 4.17.21 - string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28900,11 +28854,11 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 9.16.0(jiti@1.21.0) + eslint: 8.57.0 lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -28935,33 +28889,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) - hasown: 2.0.2 - is-core-module: 2.15.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 @@ -29011,17 +28938,6 @@ snapshots: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - eslint: 9.16.0(jiti@1.21.0) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - transitivePeerDependencies: - - supports-color - - typescript - eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -36132,7 +36048,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -36150,7 +36066,7 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 @@ -36218,92 +36134,6 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): - dependencies: - '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) - babel-preset-react-app: 10.0.1 - bfj: 7.0.2 - browserslist: 4.23.3 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss: 8.4.49 - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) - postcss-preset-env: 7.8.3(postcss@8.4.49) - prompts: 2.4.2 - react: 18.3.1 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - react-refresh: 0.11.0 - resolve: 1.22.8 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - optionalDependencies: - fsevents: 2.3.3 - typescript: 5.6.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@parcel/css' - - '@swc/core' - - '@types/babel__core' - - '@types/webpack' - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 @@ -38125,12 +37955,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38145,12 +37975,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38165,12 +37995,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38185,12 +38015,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38199,10 +38029,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.26.9 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) + babel-jest: 29.7.0(@babel/core@7.26.9) esbuild: 0.23.1 ts-mockito@2.6.1: diff --git a/sdk/package.json b/sdk/package.json index f307144e6a..7708f843bd 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -6,7 +6,6 @@ "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", "dependencies": { "@imtbl/auth": "workspace:*", - "@imtbl/auth-nextjs": "workspace:*", "@imtbl/blockchain-data": "workspace:*", "@imtbl/checkout-sdk": "workspace:*", "@imtbl/config": "workspace:*", From 0c0ea254a74b8dd068c3aac3300af36774a8cc44 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 13:52:54 +1100 Subject: [PATCH 27/88] build --- sdk/src/auth.ts | 0 sdk/src/auth_nextjs.ts | 0 sdk/src/auth_nextjs_client.ts | 0 sdk/src/auth_nextjs_server.ts | 0 sdk/src/wallet.ts | 0 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sdk/src/auth.ts delete mode 100644 sdk/src/auth_nextjs.ts delete mode 100644 sdk/src/auth_nextjs_client.ts delete mode 100644 sdk/src/auth_nextjs_server.ts delete mode 100644 sdk/src/wallet.ts diff --git a/sdk/src/auth.ts b/sdk/src/auth.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/sdk/src/auth_nextjs.ts b/sdk/src/auth_nextjs.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/sdk/src/auth_nextjs_client.ts b/sdk/src/auth_nextjs_client.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/sdk/src/auth_nextjs_server.ts b/sdk/src/auth_nextjs_server.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/sdk/src/wallet.ts b/sdk/src/wallet.ts deleted file mode 100644 index e69de29bb2..0000000000 From 55c1e7f62ef37cd5cab15fa556b87df1f32bb7f9 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 14:12:43 +1100 Subject: [PATCH 28/88] clear cache --- .github/actions/setup/action.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml index d62f4aab35..f2089f1166 100644 --- a/.github/actions/setup/action.yaml +++ b/.github/actions/setup/action.yaml @@ -17,6 +17,10 @@ runs: registry-url: https://registry.npmjs.org/ cache: "pnpm" + - name: Clear yarn cache (workaround for git-hosted packages) + shell: bash + run: yarn cache clean || true + - name: install dependencies shell: bash - run: pnpm install --frozen-lockfile \ No newline at end of file + run: pnpm install --frozen-lockfile From 613177b0e1a60de67a22f3222b3aba62a98ef787 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 14:17:56 +1100 Subject: [PATCH 29/88] fix action --- .github/actions/setup/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml index f2089f1166..6ef5a33943 100644 --- a/.github/actions/setup/action.yaml +++ b/.github/actions/setup/action.yaml @@ -19,7 +19,7 @@ runs: - name: Clear yarn cache (workaround for git-hosted packages) shell: bash - run: yarn cache clean || true + run: rm -rf ~/.cache/yarn || true - name: install dependencies shell: bash From 44a2003924b6c7910c55ac51b724917bc2105339 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 14:21:13 +1100 Subject: [PATCH 30/88] fix action --- .github/actions/setup/action.yaml | 4 ---- .npmrc | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml index 6ef5a33943..daf93703e2 100644 --- a/.github/actions/setup/action.yaml +++ b/.github/actions/setup/action.yaml @@ -17,10 +17,6 @@ runs: registry-url: https://registry.npmjs.org/ cache: "pnpm" - - name: Clear yarn cache (workaround for git-hosted packages) - shell: bash - run: rm -rf ~/.cache/yarn || true - - name: install dependencies shell: bash run: pnpm install --frozen-lockfile diff --git a/.npmrc b/.npmrc index f65dd218b5..0b2d90ec57 100644 --- a/.npmrc +++ b/.npmrc @@ -7,3 +7,7 @@ public-hoist-pattern[]=@imtbl/* public-hoist-pattern[]=*openzeppelin* public-hoist-pattern[]=*solidity* public-hoist-pattern[]=eslint-* + +# Serialize git-hosted package preparation to prevent parallel yarn installs +# from corrupting each other (seaport packages use yarn install as prepare script) +network-concurrency=1 From 7d62d3f7efcf1f8a96255c422b59e9e29446e3d5 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 14:30:44 +1100 Subject: [PATCH 31/88] add package --- packages/auth-nextjs/src/client/provider.tsx | 4 ++ sdk/package.json | 65 ++++++++++++++++++++ sdk/src/auth.ts | 1 + sdk/src/auth_nextjs.ts | 1 + sdk/src/auth_nextjs_client.ts | 1 + sdk/src/auth_nextjs_server.ts | 1 + sdk/src/index.ts | 3 + sdk/src/wallet.ts | 1 + 8 files changed, 77 insertions(+) create mode 100644 sdk/src/auth.ts create mode 100644 sdk/src/auth_nextjs.ts create mode 100644 sdk/src/auth_nextjs_client.ts create mode 100644 sdk/src/auth_nextjs_server.ts create mode 100644 sdk/src/wallet.ts diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 72f7e70b73..c0e4dadf99 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -99,6 +99,10 @@ function ImmutableAuthInner({ // This handles the case where a valid session exists but Auth has no local state useEffect(() => { if (!auth || !isAuthReady) return; + // Don't hydrate if session has an error (e.g., RefreshTokenError) + // When server-side token refresh fails, the session contains both stale tokens + // AND an error flag - we must not store these stale tokens in the Auth instance + if (session?.error) return; if (!session?.accessToken || !session?.idToken) return; const hydrateAuth = async () => { diff --git a/sdk/package.json b/sdk/package.json index 7708f843bd..4b4d6cafa1 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -6,6 +6,7 @@ "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", "dependencies": { "@imtbl/auth": "workspace:*", + "@imtbl/auth-nextjs": "workspace:*", "@imtbl/blockchain-data": "workspace:*", "@imtbl/checkout-sdk": "workspace:*", "@imtbl/config": "workspace:*", @@ -148,6 +149,70 @@ "require": "./dist/minting_backend.cjs", "default": "./dist/minting_backend.js" } + }, + "./auth": { + "development": { + "types": "./src/auth.ts", + "browser": "./dist/auth.js", + "require": "./dist/auth.cjs", + "default": "./dist/auth.js" + }, + "default": { + "types": "./dist/auth.d.ts", + "browser": "./dist/auth.js", + "require": "./dist/auth.cjs", + "default": "./dist/auth.js" + } + }, + "./wallet": { + "development": { + "types": "./src/wallet.ts", + "browser": "./dist/wallet.js", + "require": "./dist/wallet.cjs", + "default": "./dist/wallet.js" + }, + "default": { + "types": "./dist/wallet.d.ts", + "browser": "./dist/wallet.js", + "require": "./dist/wallet.cjs", + "default": "./dist/wallet.js" + } + }, + "./auth_nextjs": { + "development": { + "types": "./src/auth_nextjs.ts", + "require": "./dist/auth_nextjs.cjs", + "default": "./dist/auth_nextjs.js" + }, + "default": { + "types": "./dist/auth_nextjs.d.ts", + "require": "./dist/auth_nextjs.cjs", + "default": "./dist/auth_nextjs.js" + } + }, + "./auth_nextjs/client": { + "development": { + "types": "./src/auth_nextjs_client.ts", + "require": "./dist/auth_nextjs_client.cjs", + "default": "./dist/auth_nextjs_client.js" + }, + "default": { + "types": "./dist/auth_nextjs_client.d.ts", + "require": "./dist/auth_nextjs_client.cjs", + "default": "./dist/auth_nextjs_client.js" + } + }, + "./auth_nextjs/server": { + "development": { + "types": "./src/auth_nextjs_server.ts", + "require": "./dist/auth_nextjs_server.cjs", + "default": "./dist/auth_nextjs_server.js" + }, + "default": { + "types": "./dist/auth_nextjs_server.d.ts", + "require": "./dist/auth_nextjs_server.cjs", + "default": "./dist/auth_nextjs_server.js" + } } }, "files": [ diff --git a/sdk/src/auth.ts b/sdk/src/auth.ts new file mode 100644 index 0000000000..fdb9a410af --- /dev/null +++ b/sdk/src/auth.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth'; diff --git a/sdk/src/auth_nextjs.ts b/sdk/src/auth_nextjs.ts new file mode 100644 index 0000000000..4151b2b137 --- /dev/null +++ b/sdk/src/auth_nextjs.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth-nextjs'; diff --git a/sdk/src/auth_nextjs_client.ts b/sdk/src/auth_nextjs_client.ts new file mode 100644 index 0000000000..b5f1cd4265 --- /dev/null +++ b/sdk/src/auth_nextjs_client.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth-nextjs/client'; diff --git a/sdk/src/auth_nextjs_server.ts b/sdk/src/auth_nextjs_server.ts new file mode 100644 index 0000000000..6bd4d6fd8c --- /dev/null +++ b/sdk/src/auth_nextjs_server.ts @@ -0,0 +1 @@ +export * from '@imtbl/auth-nextjs/server'; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index c8d0123eb1..b958894de4 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -6,3 +6,6 @@ export * as checkout from './checkout'; export * as x from './x'; export * as webhook from './webhook'; export * as mintingBackend from './minting_backend'; +export * as auth from './auth'; +export * as wallet from './wallet'; +export * as authNextjs from './auth_nextjs'; diff --git a/sdk/src/wallet.ts b/sdk/src/wallet.ts new file mode 100644 index 0000000000..6d49f54f24 --- /dev/null +++ b/sdk/src/wallet.ts @@ -0,0 +1 @@ +export * from '@imtbl/wallet'; From 5b504b552aa351567d571225112dd10f35ca35f3 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 19 Dec 2025 14:34:17 +1100 Subject: [PATCH 32/88] lock file --- pnpm-lock.yaml | 332 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 251 insertions(+), 81 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c6f8159aa..202ad09307 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,7 +135,7 @@ importers: version: 0.25.21(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(framer-motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@imtbl/sdk': specifier: latest - version: 2.12.3 + version: 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1291,7 +1291,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1457,7 +1457,7 @@ importers: version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1469,7 +1469,7 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2633,6 +2633,9 @@ importers: '@imtbl/auth': specifier: workspace:* version: link:../packages/auth + '@imtbl/auth-nextjs': + specifier: workspace:* + version: link:../packages/auth-nextjs '@imtbl/blockchain-data': specifier: workspace:* version: link:../packages/blockchain-data/sdk @@ -20384,7 +20387,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/bridge-sdk@2.12.3': + '@imtbl/bridge-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.12.3 '@jest/globals': 29.7.0 @@ -20396,16 +20399,16 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/checkout-sdk@2.12.3': + '@imtbl/checkout-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/blockchain-data': 2.12.3 - '@imtbl/bridge-sdk': 2.12.3 + '@imtbl/bridge-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/config': 2.12.3 - '@imtbl/dex-sdk': 2.12.3 + '@imtbl/dex-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 - '@imtbl/orderbook': 2.12.3 - '@imtbl/passport': 2.12.3 + '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20465,7 +20468,7 @@ snapshots: - typescript - utf-8-validate - '@imtbl/dex-sdk@2.12.3': + '@imtbl/dex-sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.12.3 '@uniswap/sdk-core': 3.2.3 @@ -20507,7 +20510,7 @@ snapshots: - debug - pg-native - '@imtbl/orderbook@2.12.3': + '@imtbl/orderbook@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.12.3 '@imtbl/metrics': 2.12.3 @@ -20521,16 +20524,16 @@ snapshots: - debug - utf-8-validate - '@imtbl/passport@2.12.3': + '@imtbl/passport@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/config': 2.12.3 '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 - '@imtbl/toolkit': 2.12.3 - '@imtbl/wallet': 2.12.3 - '@imtbl/x-client': 2.12.3 - '@imtbl/x-provider': 2.12.3 + '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/wallet': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) localforage: 1.10.0 oidc-client-ts: 3.4.1 @@ -20547,19 +20550,19 @@ snapshots: - encoding - supports-color - '@imtbl/sdk@2.12.3': + '@imtbl/sdk@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/blockchain-data': 2.12.3 - '@imtbl/checkout-sdk': 2.12.3 + '@imtbl/checkout-sdk': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/config': 2.12.3 '@imtbl/minting-backend': 2.12.3 - '@imtbl/orderbook': 2.12.3 - '@imtbl/passport': 2.12.3 - '@imtbl/wallet': 2.12.3 + '@imtbl/orderbook': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/passport': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/wallet': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@imtbl/webhook': 2.12.3 - '@imtbl/x-client': 2.12.3 - '@imtbl/x-provider': 2.12.3 + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-provider': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -20568,9 +20571,9 @@ snapshots: - supports-color - utf-8-validate - '@imtbl/toolkit@2.12.3': + '@imtbl/toolkit@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@imtbl/x-client': 2.12.3 + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 bn.js: 5.2.1 @@ -20582,12 +20585,12 @@ snapshots: - debug - utf-8-validate - '@imtbl/wallet@2.12.3': + '@imtbl/wallet@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/auth': 2.12.3 '@imtbl/generated-clients': 2.12.3 '@imtbl/metrics': 2.12.3 - '@imtbl/toolkit': 2.12.3 + '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -20602,7 +20605,7 @@ snapshots: transitivePeerDependencies: - debug - '@imtbl/x-client@2.12.3': + '@imtbl/x-client@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethereumjs/wallet': 2.0.4 '@imtbl/config': 2.12.3 @@ -20618,12 +20621,12 @@ snapshots: - debug - utf-8-validate - '@imtbl/x-provider@2.12.3': + '@imtbl/x-provider@2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@imtbl/config': 2.12.3 '@imtbl/generated-clients': 2.12.3 - '@imtbl/toolkit': 2.12.3 - '@imtbl/x-client': 2.12.3 + '@imtbl/toolkit': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@imtbl/x-client': 2.12.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metamask/detect-provider': 2.0.0 axios: 1.7.7 enc-utils: 3.0.0 @@ -25175,6 +25178,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + debug: 4.3.7(supports-color@8.1.1) + eslint: 9.16.0(jiti@1.21.0) + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -26382,20 +26404,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.9) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - optional: true - babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 @@ -26605,13 +26613,6 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.10) - babel-preset-jest@29.6.3(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) - optional: true - babel-preset-react-app@10.0.1: dependencies: '@babel/core': 7.26.9 @@ -28716,18 +28717,45 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@babel/core': 7.26.9 + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) + eslint-plugin-react: 7.35.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) @@ -28743,23 +28771,23 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) + '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) - eslint-plugin-react: 7.35.0(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) + eslint-plugin-testing-library: 5.11.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -28836,6 +28864,16 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)): dependencies: debug: 3.2.7 @@ -28846,6 +28884,14 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0): + dependencies: + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) + eslint: 8.57.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.10) @@ -28854,11 +28900,11 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)): dependencies: '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) - eslint: 8.57.0 + eslint: 9.16.0(jiti@1.21.0) lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -28889,6 +28935,33 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.16.0(jiti@1.21.0) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@1.21.0)) + hasown: 2.0.2 + is-core-module: 2.15.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)): dependencies: array-includes: 3.1.8 @@ -28938,6 +29011,17 @@ snapshots: - supports-color - typescript + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + eslint: 9.16.0(jiti@1.21.0) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0): dependencies: aria-query: 5.1.3 @@ -36048,7 +36132,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) @@ -36066,7 +36150,7 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) fs-extra: 10.1.0 @@ -36134,6 +36218,92 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.26.9 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.26.9) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) + babel-preset-react-app: 10.0.1 + bfj: 7.0.2 + browserslist: 4.23.3 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 9.16.0(jiti@1.21.0) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + fs-extra: 10.1.0 + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss: 8.4.49 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) + postcss-preset-env: 7.8.3(postcss@8.4.49) + prompts: 2.4.2 + react: 18.3.1 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-refresh: 0.11.0 + resolve: 1.22.8 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + semver: 7.6.3 + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.6.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 @@ -37955,12 +38125,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37975,12 +38145,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -37995,12 +38165,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38015,12 +38185,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.9))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38029,10 +38199,10 @@ snapshots: typescript: 5.6.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.26.10 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.9) + babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 ts-mockito@2.6.1: From e9223f994d989ffa2aedf0bc27bda435b72dc28e Mon Sep 17 00:00:00 2001 From: Shine Li Date: Mon, 5 Jan 2026 12:13:28 +1100 Subject: [PATCH 33/88] add login options --- packages/auth-nextjs/src/client/index.ts | 6 +++++- packages/auth-nextjs/src/client/provider.tsx | 10 ++++++---- packages/auth-nextjs/src/index.ts | 4 ++++ packages/auth-nextjs/src/types.ts | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/auth-nextjs/src/client/index.ts b/packages/auth-nextjs/src/client/index.ts index 70d08b59bd..edd5ba9ff5 100644 --- a/packages/auth-nextjs/src/client/index.ts +++ b/packages/auth-nextjs/src/client/index.ts @@ -7,10 +7,14 @@ export { export { CallbackPage, type CallbackPageProps } from './callback'; -// Re-export useful types +// Re-export useful types from this package export type { ImmutableAuthProviderProps, UseImmutableAuthReturn, ImmutableAuthConfig, ImmutableUser, } from '../types'; + +// Re-export login-related types from @imtbl/auth for convenience +export type { LoginOptions, DirectLoginOptions } from '@imtbl/auth'; +export { MarketingConsentStatus } from '@imtbl/auth'; diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index c0e4dadf99..304c8b3431 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -13,7 +13,9 @@ import { SessionProvider, useSession, signIn, signOut, } from 'next-auth/react'; import type { Session } from 'next-auth'; -import { Auth, type User, type DeviceTokenResponse } from '@imtbl/auth'; +import { + Auth, type User, type DeviceTokenResponse, type LoginOptions, +} from '@imtbl/auth'; import type { ImmutableAuthConfig, ImmutableAuthProviderProps, @@ -264,13 +266,13 @@ export function useImmutableAuth(): UseImmutableAuthReturn { : null; // Sign in with Immutable popup - const handleSignIn = useCallback(async () => { + const handleSignIn = useCallback(async (options?: LoginOptions) => { if (!auth) { throw new Error('Auth not initialized'); } - // Open popup login - const authUser = await auth.login(); + // Open popup login with optional login options + const authUser = await auth.login(options); if (!authUser) { throw new Error('Login failed'); } diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts index 295276a68d..e376509f1e 100644 --- a/packages/auth-nextjs/src/index.ts +++ b/packages/auth-nextjs/src/index.ts @@ -139,5 +139,9 @@ export type { WithPageAuthRequiredOptions, } from './types'; +// Re-export login-related types from @imtbl/auth for convenience +export type { LoginOptions, DirectLoginOptions } from '@imtbl/auth'; +export { MarketingConsentStatus } from '@imtbl/auth'; + // Token refresh utilities (for advanced use) export { refreshAccessToken, isTokenExpired } from './refresh'; diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-nextjs/src/types.ts index da93ec523c..7a15103d1e 100644 --- a/packages/auth-nextjs/src/types.ts +++ b/packages/auth-nextjs/src/types.ts @@ -175,8 +175,9 @@ export interface UseImmutableAuthReturn { isAuthenticated: boolean; /** * Sign in with Immutable (opens popup) + * @param options - Optional login options (cached session, silent login, redirect flow, direct login) */ - signIn: () => Promise; + signIn: (options?: import('@imtbl/auth').LoginOptions) => Promise; /** * Sign out from both NextAuth and Immutable */ From ba99a04f55bab23db1304b093e78bb8490c9fa83 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Mon, 5 Jan 2026 13:59:13 +1100 Subject: [PATCH 34/88] app router --- packages/auth-nextjs/README.md | 253 +++++++++--------- packages/auth-nextjs/package.json | 6 +- packages/auth-nextjs/src/client/callback.tsx | 33 +-- packages/auth-nextjs/src/client/provider.tsx | 26 +- packages/auth-nextjs/src/config.ts | 76 +++--- packages/auth-nextjs/src/index.ts | 89 +++--- packages/auth-nextjs/src/refresh.ts | 2 +- packages/auth-nextjs/src/server/index.ts | 171 +++++++++++- packages/auth-nextjs/src/types.ts | 53 ++-- packages/auth-nextjs/tsup.config.ts | 2 +- .../app/api/auth/dev/[...nextauth]/route.ts | 4 + .../app/api/auth/prod/[...nextauth]/route.ts | 4 + .../api/auth/sandbox/[...nextauth]/route.ts | 4 + .../passport/sdk-sample-app/app/layout.tsx | 11 + .../passport/sdk-sample-app/next.config.js | 14 +- packages/passport/sdk-sample-app/package.json | 2 +- .../src/context/ImmutableProvider.tsx | 1 + .../sdk-sample-app/src/lib/auth-nextjs.ts | 29 +- .../pages/api/auth/dev/[...nextauth].api.ts | 5 - .../pages/api/auth/prod/[...nextauth].api.ts | 5 - .../api/auth/sandbox/[...nextauth].api.ts | 5 - .../src/pages/callback.page.tsx | 15 +- .../sdk-sample-app/tsconfig.build.json | 32 ++- pnpm-lock.yaml | 192 +++++-------- 24 files changed, 620 insertions(+), 414 deletions(-) create mode 100644 packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts create mode 100644 packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts create mode 100644 packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts create mode 100644 packages/passport/sdk-sample-app/app/layout.tsx delete mode 100644 packages/passport/sdk-sample-app/src/pages/api/auth/dev/[...nextauth].api.ts delete mode 100644 packages/passport/sdk-sample-app/src/pages/api/auth/prod/[...nextauth].api.ts delete mode 100644 packages/passport/sdk-sample-app/src/pages/api/auth/sandbox/[...nextauth].api.ts diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index d7eaffc9fe..5d2ef20568 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -1,38 +1,58 @@ # @imtbl/auth-nextjs -Next.js authentication integration for Immutable SDK using NextAuth.js. +Next.js App Router authentication integration for Immutable SDK using Auth.js v5. -This package bridges `@imtbl/auth` popup-based authentication with NextAuth.js session management, providing: +This package bridges `@imtbl/auth` popup-based authentication with Auth.js session management, providing: - Server-side session storage in encrypted JWT cookies - Automatic token refresh on both server and client -- Full SSR support with `getServerSession` +- Full SSR support with `auth()` function - React hooks for easy client-side authentication +- Middleware support for protecting routes + +## Requirements + +- Next.js 14+ with App Router +- Auth.js v5 (next-auth@5.x) +- React 18+ ## Installation ```bash -pnpm add @imtbl/auth-nextjs next-auth +pnpm add @imtbl/auth-nextjs next-auth@beta ``` ## Quick Start -### 1. Set Up Auth API Route +### 1. Create Auth Configuration ```typescript -// pages/api/auth/[...nextauth].ts -import { ImmutableAuth } from "@imtbl/auth-nextjs"; +// lib/auth.ts +import { createImmutableAuth } from "@imtbl/auth-nextjs"; -export default ImmutableAuth({ +const config = { clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, -}); +}; + +export const { handlers, auth, signIn, signOut } = createImmutableAuth(config); ``` -### 2. Create Callback Page +### 2. Set Up Auth API Route ```typescript -// pages/callback.tsx +// app/api/auth/[...nextauth]/route.ts +import { handlers } from "@/lib/auth"; + +export const { GET, POST } = handlers; +``` + +### 3. Create Callback Page + +```typescript +// app/callback/page.tsx +"use client"; + import { CallbackPage } from "@imtbl/auth-nextjs/client"; const config = { @@ -45,10 +65,12 @@ export default function Callback() { } ``` -### 3. Add Provider to App +### 4. Add Provider to Layout ```typescript -// pages/_app.tsx +// app/providers.tsx +"use client"; + import { ImmutableAuthProvider } from "@imtbl/auth-nextjs/client"; const config = { @@ -56,21 +78,39 @@ const config = { redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, }; -export default function App({ Component, pageProps }: AppProps) { +export function Providers({ children }: { children: React.ReactNode }) { return ( - - - + {children} + ); +} + +// app/layout.tsx +import { Providers } from "./providers"; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + {children} + + ); } ``` -### 4. Use in Components +### 5. Use in Components ```typescript +// app/components/LoginButton.tsx +"use client"; + import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; -function LoginButton() { +export function LoginButton() { const { user, isLoading, signIn, signOut } = useImmutableAuth(); if (isLoading) return

Loading...
; @@ -84,52 +124,42 @@ function LoginButton() { ); } - return ; + return ; } ``` -### 5. Access Session Server-Side (SSR) +### 6. Access Session in Server Components ```typescript -// pages/profile.tsx -import { getImmutableSession } from "@imtbl/auth-nextjs/server"; -import type { GetServerSideProps } from "next"; +// app/profile/page.tsx +import { auth } from "@/lib/auth"; +import { redirect } from "next/navigation"; -const config = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, -}; +export default async function ProfilePage() { + const session = await auth(); -export default function ProfilePage({ user }) { - if (!user) return

Not logged in

; - return

Welcome, {user.email}

; -} + if (!session) { + redirect("/login"); + } -export const getServerSideProps: GetServerSideProps = async (ctx) => { - const session = await getImmutableSession(ctx.req, ctx.res, config); - return { props: { user: session?.user ?? null } }; -}; + return

Welcome, {session.user.email}

; +} ``` -### 6. Protect Pages (Optional) +### 7. Protect Routes with Middleware (Optional) ```typescript -// pages/dashboard.tsx -import { withPageAuthRequired } from "@imtbl/auth-nextjs/server"; - -const config = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, -}; +// middleware.ts +import { createAuthMiddleware } from "@imtbl/auth-nextjs/server"; +import { auth } from "@/lib/auth"; -function DashboardPage() { - return

Dashboard (protected)

; -} - -export default DashboardPage; +export default createAuthMiddleware(auth, { + loginUrl: "/login", +}); -// Redirects to /login if not authenticated -export const getServerSideProps = withPageAuthRequired(config); +export const config = { + matcher: ["/dashboard/:path*", "/profile/:path*"], +}; ``` ## Configuration Options @@ -152,9 +182,8 @@ The `ImmutableAuthConfig` object accepts the following properties: NEXT_PUBLIC_IMMUTABLE_CLIENT_ID=your-client-id NEXT_PUBLIC_BASE_URL=http://localhost:3000 -# Required by NextAuth for cookie encryption -NEXTAUTH_SECRET=generate-with-openssl-rand-base64-32 -NEXTAUTH_URL=http://localhost:3000 +# Required by Auth.js for cookie encryption +AUTH_SECRET=generate-with-openssl-rand-base64-32 ``` Generate a secret: @@ -167,99 +196,83 @@ openssl rand -base64 32 ### Main Exports (`@imtbl/auth-nextjs`) -| Export | Description | -| ----------------------------------- | ------------------------------------------- | -| `ImmutableAuth(config, overrides?)` | Creates NextAuth handler (use in API route) | -| `refreshAccessToken(token)` | Utility to refresh an expired access token | -| `isTokenExpired(token)` | Utility to check if a token is expired | +| Export | Description | +| --------------------------------------- | ------------------------------------------------------------------- | +| `createImmutableAuth(config, options?)` | Creates Auth.js instance with `{ handlers, auth, signIn, signOut }` | +| `createAuthConfig(config)` | Creates Auth.js config (for advanced use) | +| `refreshAccessToken(token, config)` | Utility to refresh an expired access token | +| `isTokenExpired(expires, buffer?)` | Utility to check if a token is expired | **Types:** -| Type | Description | -| ----------------------------- | ----------------------------------------- | -| `ImmutableAuthConfig` | Configuration options | -| `ImmutableAuthOverrides` | NextAuth options override type | -| `ImmutableUser` | User profile type | -| `ImmutableTokenData` | Token data passed to credentials provider | -| `ZkEvmInfo` | zkEVM wallet information type | -| `WithPageAuthRequiredOptions` | Options for page protection | +| Type | Description | +| ------------------------ | ----------------------------------------- | +| `ImmutableAuthConfig` | Configuration options | +| `ImmutableAuthOverrides` | Auth.js options override type | +| `ImmutableAuthResult` | Return type of createImmutableAuth | +| `ImmutableUser` | User profile type | +| `ImmutableTokenData` | Token data passed to credentials provider | +| `ZkEvmInfo` | zkEVM wallet information type | ### Client Exports (`@imtbl/auth-nextjs/client`) -| Export | Description | -| ----------------------- | ------------------------------------------------------- | -| `ImmutableAuthProvider` | React context provider (wraps NextAuth SessionProvider) | -| `useImmutableAuth()` | Hook for authentication state and methods (see below) | -| `useAccessToken()` | Hook returning `getAccessToken` function | -| `CallbackPage` | Pre-built callback page component for OAuth redirects | +| Export | Description | +| ----------------------- | ------------------------------------------------------ | +| `ImmutableAuthProvider` | React context provider (wraps Auth.js SessionProvider) | +| `useImmutableAuth()` | Hook for authentication state and methods (see below) | +| `useAccessToken()` | Hook returning `getAccessToken` function | +| `CallbackPage` | Pre-built callback page component for OAuth redirects | **`useImmutableAuth()` Return Value:** | Property | Type | Description | | ----------------- | ----------------------- | ------------------------------------------------ | | `user` | `ImmutableUser \| null` | Current user profile (null if not authenticated) | -| `session` | `Session \| null` | Full NextAuth session with tokens | +| `session` | `Session \| null` | Full Auth.js session with tokens | | `isLoading` | `boolean` | Whether authentication state is loading | | `isAuthenticated` | `boolean` | Whether user is authenticated | -| `signIn` | `() => Promise` | Sign in with Immutable (opens popup) | -| `signOut` | `() => Promise` | Sign out from both NextAuth and Immutable | +| `signIn` | `(options?) => Promise` | Sign in with Immutable (opens popup) | +| `signOut` | `() => Promise` | Sign out from both Auth.js and Immutable | | `getAccessToken` | `() => Promise` | Get a valid access token (refreshes if needed) | | `auth` | `Auth \| null` | The underlying Auth instance (for advanced use) | -**Types:** - -| Type | Description | -| ---------------------------- | -------------------------------- | -| `ImmutableAuthProviderProps` | Props for the provider component | -| `UseImmutableAuthReturn` | Return type of useImmutableAuth | -| `CallbackPageProps` | Props for CallbackPage component | -| `ImmutableAuthConfig` | Re-exported configuration type | -| `ImmutableUser` | Re-exported user type | - ### Server Exports (`@imtbl/auth-nextjs/server`) -| Export | Description | -| ---------------------------------------- | ---------------------------------------- | -| `getImmutableSession(req, res, config)` | Get session server-side | -| `withPageAuthRequired(config, options?)` | HOC for protecting pages with auth check | - -**`withPageAuthRequired` Options:** - -| Option | Type | Default | Description | -| -------------------- | ----------------------- | ------------ | ---------------------------------------------------- | -| `loginUrl` | `string` | `"/login"` | URL to redirect to when not authenticated | -| `returnTo` | `string \| false` | current page | URL to redirect to after login (`false` to disable) | -| `getServerSideProps` | `(ctx, session) => ...` | - | Custom getServerSideProps that runs after auth check | - -**Example with custom getServerSideProps:** - -```typescript -export const getServerSideProps = withPageAuthRequired(config, { - loginUrl: "/auth/signin", - async getServerSideProps(ctx, session) { - // session is guaranteed to exist here - const data = await fetchData(session.accessToken); - return { props: { data } }; - }, -}); -``` +| Export | Description | +| ----------------------------------- | ------------------------------------------------ | +| `createImmutableAuth` | Re-exported for convenience | +| `createAuthMiddleware(auth, opts?)` | Create middleware for protecting routes | +| `withAuth(auth, handler)` | HOC for protecting Server Actions/Route Handlers | -**Types:** +**`createAuthMiddleware` Options:** -| Type | Description | -| --------------------------------- | ----------------------------------------- | -| `WithPageAuthRequiredOptions` | Basic options for page protection | -| `WithPageAuthRequiredFullOptions` | Full options including getServerSideProps | -| `WithPageAuthRequiredProps` | Props added to protected pages (session) | +| Option | Type | Default | Description | +| ---------------- | ---------------------- | ---------- | -------------------------------------- | +| `loginUrl` | `string` | `"/login"` | URL to redirect when not authenticated | +| `protectedPaths` | `(string \| RegExp)[]` | - | Paths that require authentication | +| `publicPaths` | `(string \| RegExp)[]` | - | Paths to exclude from protection | ## How It Works 1. **Login**: User clicks login → `@imtbl/auth` opens popup → tokens returned -2. **Session Creation**: Tokens passed to NextAuth's credentials provider → stored in encrypted JWT cookie -3. **Token Refresh**: NextAuth JWT callback automatically refreshes expired tokens using refresh_token -4. **SSR**: `getServerSession()` reads and decrypts cookie, providing full session with tokens +2. **Session Creation**: Tokens passed to Auth.js credentials provider → stored in encrypted JWT cookie +3. **Token Refresh**: Auth.js JWT callback automatically refreshes expired tokens using refresh_token +4. **SSR**: `auth()` reads and decrypts cookie, providing full session with tokens 5. **Auto-hydration**: If localStorage is cleared but session cookie exists, the Auth instance is automatically hydrated from session tokens +## Migration from v4 (Pages Router) + +If you're migrating from the Pages Router version: + +| v4 (Pages Router) | v5 (App Router) | +| --------------------------------------- | --------------------------------------------- | +| `ImmutableAuth(config)` | `createImmutableAuth(config)` | +| `getImmutableSession(req, res, config)` | `auth()` (from createImmutableAuth) | +| `withPageAuthRequired(config)` | `createAuthMiddleware(auth)` or layout checks | +| `pages/api/auth/[...nextauth].ts` | `app/api/auth/[...nextauth]/route.ts` | +| `pages/_app.tsx` with provider | `app/layout.tsx` with provider | +| `NEXTAUTH_SECRET` | `AUTH_SECRET` | + ## License Apache-2.0 diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 9993e7de4b..26362a7379 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -1,7 +1,7 @@ { "name": "@imtbl/auth-nextjs", "version": "0.0.0", - "description": "Next.js authentication integration for Immutable SDK using NextAuth", + "description": "Next.js App Router authentication integration for Immutable SDK using Auth.js v5", "author": "Immutable", "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", "homepage": "https://github.com/immutable/ts-immutable-sdk#readme", @@ -65,7 +65,7 @@ }, "peerDependencies": { "next": "14.2.25", - "next-auth": "^4.24.0", + "next-auth": "^5.0.0-beta.30", "react": "^18.2.0" }, "devDependencies": { @@ -77,7 +77,7 @@ "jest": "^29.4.3", "jest-environment-jsdom": "^29.4.3", "next": "14.2.25", - "next-auth": "^4.24.0", + "next-auth": "^5.0.0-beta.30", "react": "^18.2.0", "ts-node": "^10.9.1", "tsup": "^8.3.0", diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index 33fe96128e..75894c90ad 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useEffect, useState, useRef } from 'react'; -import { useRouter } from 'next/router'; +import { useRouter, useSearchParams } from 'next/navigation'; import { signIn } from 'next-auth/react'; import { Auth } from '@imtbl/auth'; import type { ImmutableAuthConfig, ImmutableTokenData } from '../types'; @@ -33,18 +33,23 @@ export interface CallbackPageProps { } /** - * Callback page component for handling OAuth redirects. + * Callback page component for handling OAuth redirects (App Router version). * * Use this in your callback page to process authentication responses. * * @example * ```tsx - * // pages/callback.tsx + * // app/callback/page.tsx + * "use client"; * import { CallbackPage } from "@imtbl/auth-nextjs/client"; - * import { immutableConfig } from "@/lib/auth-nextjs"; + * + * const config = { + * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + * }; * * export default function Callback() { - * return ; + * return ; * } * ``` */ @@ -55,6 +60,7 @@ export function CallbackPage({ errorComponent, }: CallbackPageProps) { const router = useRouter(); + const searchParams = useSearchParams(); const [error, setError] = useState(null); // Track whether callback has been processed to prevent double invocation // (React 18 StrictMode runs effects twice, and OAuth codes are single-use) @@ -132,32 +138,26 @@ export function CallbackPage({ const handleOAuthError = () => { // OAuth providers return error and error_description when authentication fails // (e.g., user cancels, consent denied, invalid request) - const errorCode = router.query.error as string; - const errorDescription = router.query.error_description as string; + const errorCode = searchParams.get('error'); + const errorDescription = searchParams.get('error_description'); const errorMessage = errorDescription || errorCode || 'Authentication failed'; setError(errorMessage); }; - if (!router.isReady) { - return; - } - // Handle OAuth error responses (user cancelled, consent denied, etc.) - if (router.query.error) { + if (searchParams.get('error')) { handleOAuthError(); return; } // Handle successful OAuth callback with authorization code // Guard against double invocation (React 18 StrictMode runs effects twice) - if (router.query.code && !callbackProcessedRef.current) { + if (searchParams.get('code') && !callbackProcessedRef.current) { callbackProcessedRef.current = true; handleCallback(); } - }, [ - router.isReady, router.query.code, router.query.error, router.query.error_description, router, config, redirectTo, - ]); + }, [searchParams, router, config, redirectTo]); if (error) { if (errorComponent) { @@ -170,6 +170,7 @@ export function CallbackPage({

{error}

+ + ); + } + + if (!user) { + return ; + } + + return
Welcome, {user.email}
; +} +``` + +### Using getAccessToken + +The `getAccessToken()` function will throw an error if the token cannot be refreshed: + +```typescript +const { getAccessToken } = useImmutableAuth(); + +async function fetchData() { + try { + const token = await getAccessToken(); + const response = await fetch("/api/data", { + headers: { Authorization: `Bearer ${token}` }, + }); + return response.json(); + } catch (error) { + // Token refresh failed - redirect to login or show error + console.error("Failed to get access token:", error); + } +} +``` ## Migration from v4 (Pages Router) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 3ea8437629..e08fb95cca 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -119,17 +119,20 @@ function ImmutableAuthInner({ }; }, [config]); - // Hydrate Auth instance from NextAuth session if localStorage is cleared - // This handles the case where a valid session exists but Auth has no local state + // Sync tokens from NextAuth session to Auth instance + // This handles two cases: + // 1. Initial hydration when Auth has no local state (e.g., localStorage cleared) + // 2. Token refresh sync when server-side refresh happened and tokens are newer + // (critical for refresh token rotation - the old refresh token is invalidated) useEffect(() => { if (!auth || !isAuthReady) return; - // Don't hydrate if session has an error (e.g., RefreshTokenError) + // Don't sync if session has an error (e.g., RefreshTokenError) // When server-side token refresh fails, the session contains both stale tokens // AND an error flag - we must not store these stale tokens in the Auth instance if (session?.error) return; if (!session?.accessToken || !session?.idToken) return; - const hydrateAuth = async () => { + const syncTokensToAuth = async () => { try { // Re-check tokens inside async function for TypeScript narrowing const { @@ -137,16 +140,29 @@ function ImmutableAuthInner({ } = session; if (!accessToken || !idToken) return; - // Check if Auth already has user data + // Check if Auth already has user data with same or newer tokens const existingUser = await auth.getUser(); - if (existingUser) return; // Already hydrated + if (existingUser) { + // Compare tokens - only update if session has different tokens + // This handles the case where server-side refresh happened: + // - Server refreshed tokens → new refresh token returned + // - Old refresh token is invalidated (refresh token rotation) + // - Client Auth still has old refresh token → sync the new one + const sessionHasNewerTokens = existingUser.accessToken !== accessToken + || existingUser.refreshToken !== refreshToken; + + if (!sessionHasNewerTokens) { + return; // Tokens are the same, no need to sync + } + // Tokens are different - session has updated tokens from server-side refresh + } // Calculate expires_in from accessTokenExpires const expiresIn = accessTokenExpires ? Math.max(0, Math.floor((accessTokenExpires - Date.now()) / 1000)) : DEFAULT_TOKEN_EXPIRY_SECONDS; - // Hydrate Auth with tokens from NextAuth session + // Store tokens from NextAuth session into Auth instance const tokenResponse: DeviceTokenResponse = { access_token: accessToken, refresh_token: refreshToken, @@ -158,11 +174,11 @@ function ImmutableAuthInner({ await auth.storeTokens(tokenResponse); } catch (error) { // eslint-disable-next-line no-console - console.warn('[auth-nextjs] Failed to hydrate Auth instance:', error); + console.warn('[auth-nextjs] Failed to sync tokens to Auth instance:', error); } }; - hydrateAuth(); + syncTokensToAuth(); }, [auth, isAuthReady, session]); // Listen for Auth events to sync tokens back to NextAuth diff --git a/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts index 75ee2f79e6..e3e55c33cf 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts @@ -3,3 +3,4 @@ import { devAuth } from "@/lib/auth-nextjs"; export const { GET, POST } = devAuth.handlers; + diff --git a/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts index 7369cb62ae..5969e98df2 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts @@ -3,3 +3,4 @@ import { prodAuth } from "@/lib/auth-nextjs"; export const { GET, POST } = prodAuth.handlers; + diff --git a/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts index 6d6cb1192c..78afa41374 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts @@ -3,3 +3,4 @@ import { sandboxAuth } from "@/lib/auth-nextjs"; export const { GET, POST } = sandboxAuth.handlers; + From aecce9d911bf0108062ae20794931de5b635c431 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 9 Jan 2026 14:15:10 +1100 Subject: [PATCH 46/88] fix bug passport domain is dropped --- .../wallets-connect-with-nextjs/package.json | 2 +- .../wallets-signing-with-nextjs/package.json | 2 +- .../package.json | 2 +- packages/auth-nextjs/README.md | 58 ++++++++++++++++--- packages/auth-nextjs/src/client/callback.tsx | 1 + packages/auth-nextjs/src/client/provider.tsx | 2 + packages/auth-nextjs/src/types.ts | 11 ++++ 7 files changed, 66 insertions(+), 12 deletions(-) diff --git a/examples/passport/wallets-connect-with-nextjs/package.json b/examples/passport/wallets-connect-with-nextjs/package.json index efa9960cea..66e95867b4 100644 --- a/examples/passport/wallets-connect-with-nextjs/package.json +++ b/examples/passport/wallets-connect-with-nextjs/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "dependencies": { "@biom3/react": "^0.27.12", - "@imtbl/sdk": "workspace:*", + "@imtbl/sdk": "file:.yalc/@imtbl/sdk", "@tanstack/react-query": "^5.51.11", "ethers": "^6.13.4", "next": "14.2.25", diff --git a/examples/passport/wallets-signing-with-nextjs/package.json b/examples/passport/wallets-signing-with-nextjs/package.json index 054afbc778..c22d7ad7d9 100644 --- a/examples/passport/wallets-signing-with-nextjs/package.json +++ b/examples/passport/wallets-signing-with-nextjs/package.json @@ -4,7 +4,7 @@ "dependencies": { "@biom3/design-tokens": "^0.4.4", "@biom3/react": "^0.27.12", - "@imtbl/sdk": "workspace:*", + "@imtbl/sdk": "file:.yalc/@imtbl/sdk", "@tanstack/react-query": "^5.51.11", "ethers": "^6.13.4", "next": "14.2.25", diff --git a/examples/passport/wallets-transactions-with-nextjs/package.json b/examples/passport/wallets-transactions-with-nextjs/package.json index 53d813193a..3852eba1a7 100644 --- a/examples/passport/wallets-transactions-with-nextjs/package.json +++ b/examples/passport/wallets-transactions-with-nextjs/package.json @@ -2,7 +2,7 @@ "name": "@examples/wallets-transactions-with-nextjs", "version": "0.1.0", "dependencies": { - "@imtbl/sdk": "workspace:*", + "@imtbl/sdk": "file:.yalc/@imtbl/sdk", "ethers": "^6.13.4", "next": "14.2.25", "react": "^18.2.0", diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index f932a71df5..6cf216895e 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -168,15 +168,23 @@ export const config = { The `ImmutableAuthConfig` object accepts the following properties: -| Property | Type | Required | Default | Description | -| ---------------------- | -------- | -------- | ------------------------------------------------ | ----------------------------------------------- | -| `clientId` | `string` | Yes | - | Immutable OAuth client ID | -| `redirectUri` | `string` | Yes | - | OAuth callback redirect URI (for redirect flow) | -| `popupRedirectUri` | `string` | No | `redirectUri` | OAuth callback redirect URI for popup flow | -| `logoutRedirectUri` | `string` | No | - | Where to redirect after logout | -| `audience` | `string` | No | `"platform_api"` | OAuth audience | -| `scope` | `string` | No | `"openid profile email offline_access transact"` | OAuth scopes | -| `authenticationDomain` | `string` | No | `"https://auth.immutable.com"` | Authentication domain | +| Property | Type | Required | Default | Description | +| ---------------------- | -------- | -------- | ------------------------------------------------ | -------------------------------------------------------------- | +| `clientId` | `string` | Yes | - | Immutable OAuth client ID | +| `redirectUri` | `string` | Yes | - | OAuth callback redirect URI (for redirect flow) | +| `popupRedirectUri` | `string` | No | `redirectUri` | OAuth callback redirect URI for popup flow | +| `logoutRedirectUri` | `string` | No | - | Where to redirect after logout | +| `audience` | `string` | No | `"platform_api"` | OAuth audience | +| `scope` | `string` | No | `"openid profile email offline_access transact"` | OAuth scopes | +| `authenticationDomain` | `string` | No | `"https://auth.immutable.com"` | Authentication domain | +| `passportDomain` | `string` | No | `"https://passport.immutable.com"` | Passport domain for transaction confirmations (see note below) | + +> **Important:** The `passportDomain` must match your target environment for transaction signing to work correctly: +> +> - **Production:** `https://passport.immutable.com` (default) +> - **Sandbox:** `https://passport.sandbox.immutable.com` +> +> If you're using the sandbox environment, you must explicitly set `passportDomain` to the sandbox URL. ## Environment Variables @@ -195,6 +203,38 @@ Generate a secret: openssl rand -base64 32 ``` +## Sandbox vs Production Configuration + +When developing or testing, you'll typically use the **Sandbox** environment. Make sure to configure `passportDomain` correctly: + +```typescript +// lib/auth.ts + +// For SANDBOX environment +const sandboxConfig = { + clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + passportDomain: "https://passport.sandbox.immutable.com", // Required for sandbox! +}; + +// For PRODUCTION environment +const productionConfig = { + clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + // passportDomain defaults to 'https://passport.immutable.com' +}; + +// Use environment variable to switch between configs +const config = + process.env.NEXT_PUBLIC_IMMUTABLE_ENV === "production" + ? productionConfig + : sandboxConfig; + +export const { handlers, auth, signIn, signOut } = createImmutableAuth(config); +``` + +> **Note:** The `passportDomain` is used for transaction confirmation popups. If not set correctly for your environment, transaction signing will not work as expected. + ## API Reference ### Main Exports (`@imtbl/auth-nextjs`) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index 1a7786a65c..ab9bf6d845 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -108,6 +108,7 @@ export function CallbackPage({ audience: config.audience || DEFAULT_AUDIENCE, scope: config.scope || DEFAULT_SCOPE, authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, + passportDomain: config.passportDomain, }); // Process the callback - this extracts tokens from the URL and returns the user diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index e08fb95cca..4403d7a310 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -79,6 +79,7 @@ function ImmutableAuthInner({ config.audience || DEFAULT_AUDIENCE, config.scope || DEFAULT_SCOPE, config.authenticationDomain || DEFAULT_AUTH_DOMAIN, + config.passportDomain || '', ].join(':'); // Only skip recreation if BOTH: @@ -101,6 +102,7 @@ function ImmutableAuthInner({ audience: config.audience || DEFAULT_AUDIENCE, scope: config.scope || DEFAULT_SCOPE, authenticationDomain: config.authenticationDomain || DEFAULT_AUTH_DOMAIN, + passportDomain: config.passportDomain, }); authInstanceRef.current = newAuth; diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-nextjs/src/types.ts index b69ff78895..0735868590 100644 --- a/packages/auth-nextjs/src/types.ts +++ b/packages/auth-nextjs/src/types.ts @@ -40,6 +40,17 @@ export interface ImmutableAuthConfig { * Authentication domain (default: "https://auth.immutable.com") */ authenticationDomain?: string; + + /** + * Passport domain for transaction confirmation popups. + * Must be set correctly for the target environment: + * - Production: "https://passport.immutable.com" + * - Sandbox: "https://passport.sandbox.immutable.com" + * + * If not provided, defaults to production ("https://passport.immutable.com"). + * This is important for transaction signing flows to work correctly. + */ + passportDomain?: string; } /** From 41b9a01f841d6e4a6bbe4c170ce49087014a82db Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 9 Jan 2026 14:43:06 +1100 Subject: [PATCH 47/88] fix deps --- examples/passport/wallets-connect-with-nextjs/package.json | 2 +- examples/passport/wallets-signing-with-nextjs/package.json | 2 +- examples/passport/wallets-transactions-with-nextjs/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/passport/wallets-connect-with-nextjs/package.json b/examples/passport/wallets-connect-with-nextjs/package.json index 66e95867b4..efa9960cea 100644 --- a/examples/passport/wallets-connect-with-nextjs/package.json +++ b/examples/passport/wallets-connect-with-nextjs/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "dependencies": { "@biom3/react": "^0.27.12", - "@imtbl/sdk": "file:.yalc/@imtbl/sdk", + "@imtbl/sdk": "workspace:*", "@tanstack/react-query": "^5.51.11", "ethers": "^6.13.4", "next": "14.2.25", diff --git a/examples/passport/wallets-signing-with-nextjs/package.json b/examples/passport/wallets-signing-with-nextjs/package.json index c22d7ad7d9..054afbc778 100644 --- a/examples/passport/wallets-signing-with-nextjs/package.json +++ b/examples/passport/wallets-signing-with-nextjs/package.json @@ -4,7 +4,7 @@ "dependencies": { "@biom3/design-tokens": "^0.4.4", "@biom3/react": "^0.27.12", - "@imtbl/sdk": "file:.yalc/@imtbl/sdk", + "@imtbl/sdk": "workspace:*", "@tanstack/react-query": "^5.51.11", "ethers": "^6.13.4", "next": "14.2.25", diff --git a/examples/passport/wallets-transactions-with-nextjs/package.json b/examples/passport/wallets-transactions-with-nextjs/package.json index 3852eba1a7..53d813193a 100644 --- a/examples/passport/wallets-transactions-with-nextjs/package.json +++ b/examples/passport/wallets-transactions-with-nextjs/package.json @@ -2,7 +2,7 @@ "name": "@examples/wallets-transactions-with-nextjs", "version": "0.1.0", "dependencies": { - "@imtbl/sdk": "file:.yalc/@imtbl/sdk", + "@imtbl/sdk": "workspace:*", "ethers": "^6.13.4", "next": "14.2.25", "react": "^18.2.0", From 24cfe5869f67afb42098bec20cbfaea11d96f3af Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 9 Jan 2026 15:01:56 +1100 Subject: [PATCH 48/88] race condition --- packages/auth-nextjs/src/client/provider.tsx | 23 ++++++-- packages/auth/src/Auth.test.ts | 56 ++++++++++++++++++++ packages/auth/src/Auth.ts | 7 ++- packages/auth/src/types.ts | 7 +++ 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 4403d7a310..86bb992b36 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -14,7 +14,7 @@ import { } from 'next-auth/react'; import type { Session } from 'next-auth'; import { - Auth, type User, type DeviceTokenResponse, type LoginOptions, + Auth, AuthEvents, type User, type DeviceTokenResponse, type LoginOptions, } from '@imtbl/auth'; import type { ImmutableAuthConfig, @@ -200,10 +200,27 @@ function ImmutableAuthInner({ } }; - auth.eventEmitter.on('loggedIn', handleLoggedIn); + // Handle client-side token refresh - critical for refresh token rotation. + // When Auth refreshes tokens via signinSilent(), we must sync the new tokens + // (especially the new refresh token) to the NextAuth session. Without this, + // the server-side JWT callback may use a stale refresh token that Auth0 has + // already invalidated, causing "Unknown or invalid refresh token" errors. + const handleTokenRefreshed = async (authUser: User) => { + await updateSession({ + accessToken: authUser.accessToken, + refreshToken: authUser.refreshToken, + idToken: authUser.idToken, + accessTokenExpires: getTokenExpiry(authUser.accessToken), + zkEvm: authUser.zkEvm, + }); + }; + + auth.eventEmitter.on(AuthEvents.LOGGED_IN, handleLoggedIn); + auth.eventEmitter.on(AuthEvents.TOKEN_REFRESHED, handleTokenRefreshed); return () => { - auth.eventEmitter.removeListener('loggedIn', handleLoggedIn); + auth.eventEmitter.removeListener(AuthEvents.LOGGED_IN, handleLoggedIn); + auth.eventEmitter.removeListener(AuthEvents.TOKEN_REFRESHED, handleTokenRefreshed); }; }, [auth, isAuthReady, session, updateSession]); diff --git a/packages/auth/src/Auth.test.ts b/packages/auth/src/Auth.test.ts index f1163d710f..f33f600368 100644 --- a/packages/auth/src/Auth.test.ts +++ b/packages/auth/src/Auth.test.ts @@ -186,6 +186,62 @@ describe('Auth', () => { }); }); + describe('refreshTokenAndUpdatePromise', () => { + it('emits TOKEN_REFRESHED event when signinSilent succeeds', async () => { + const mockOidcUser = { + id_token: 'new-id', + access_token: 'new-access', + refresh_token: 'new-refresh', + expired: false, + profile: { sub: 'user-123', email: 'test@example.com', nickname: 'tester' }, + }; + + (decodeJwtPayload as jest.Mock).mockReturnValue({ + username: undefined, + passport: undefined, + }); + + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn().mockResolvedValue(mockOidcUser), + }; + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + const user = await (auth as any).refreshTokenAndUpdatePromise(); + + expect(user).toBeDefined(); + expect(user.accessToken).toBe('new-access'); + expect(mockEventEmitter.emit).toHaveBeenCalledWith( + AuthEvents.TOKEN_REFRESHED, + expect.objectContaining({ + accessToken: 'new-access', + refreshToken: 'new-refresh', + }), + ); + }); + + it('does not emit TOKEN_REFRESHED event when signinSilent returns null', async () => { + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn().mockResolvedValue(null), + }; + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + const user = await (auth as any).refreshTokenAndUpdatePromise(); + + expect(user).toBeNull(); + expect(mockEventEmitter.emit).not.toHaveBeenCalled(); + }); + }); + describe('loginWithPopup', () => { let mockUserManager: any; let originalCryptoRandomUUID: any; diff --git a/packages/auth/src/Auth.ts b/packages/auth/src/Auth.ts index f3267cf170..60d5597e2e 100644 --- a/packages/auth/src/Auth.ts +++ b/packages/auth/src/Auth.ts @@ -765,7 +765,12 @@ export class Auth { try { const newOidcUser = await this.userManager.signinSilent(); if (newOidcUser) { - resolve(Auth.mapOidcUserToDomainModel(newOidcUser)); + const user = Auth.mapOidcUserToDomainModel(newOidcUser); + // Emit TOKEN_REFRESHED event so consumers (e.g., auth-nextjs) can sync + // the new tokens to their session. This is critical for refresh token + // rotation - without this, the server-side session may have stale tokens. + this.eventEmitter.emit(AuthEvents.TOKEN_REFRESHED, user); + resolve(user); return; } resolve(null); diff --git a/packages/auth/src/types.ts b/packages/auth/src/types.ts index 72d828bc50..47f954ab75 100644 --- a/packages/auth/src/types.ts +++ b/packages/auth/src/types.ts @@ -140,6 +140,12 @@ export type LoginOptions = { export enum AuthEvents { LOGGED_OUT = 'loggedOut', LOGGED_IN = 'loggedIn', + /** + * Emitted when tokens are refreshed via signinSilent(). + * This is critical for refresh token rotation - when client-side refresh happens, + * the new tokens must be synced to server-side session to prevent race conditions. + */ + TOKEN_REFRESHED = 'tokenRefreshed', } /** @@ -148,4 +154,5 @@ export enum AuthEvents { export interface AuthEventMap extends Record { [AuthEvents.LOGGED_OUT]: []; [AuthEvents.LOGGED_IN]: [User]; + [AuthEvents.TOKEN_REFRESHED]: [User]; } From cf939ae05fb5b7b2d4581375a8e3b020682bfb64 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 9 Jan 2026 15:22:28 +1100 Subject: [PATCH 49/88] reset error --- packages/auth-nextjs/src/config.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index ad157084a4..f25c8642f8 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -170,6 +170,9 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { } // Handle session update (for client-side token sync) + // When client-side Auth refreshes tokens via TOKEN_REFRESHED event and syncs them here, + // we must clear any stale error (e.g., from a previous server-side refresh failure). + // This matches refreshAccessToken's behavior of setting error: undefined on success. if (trigger === 'update' && sessionUpdate) { const update = sessionUpdate as Record; return { @@ -179,6 +182,8 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { ...(update.idToken ? { idToken: update.idToken } : {}), ...(update.accessTokenExpires ? { accessTokenExpires: update.accessTokenExpires } : {}), ...(update.zkEvm ? { zkEvm: update.zkEvm } : {}), + // Clear any stale error when valid tokens are synced from client-side + error: undefined, }; } From 3cdbada40263531ae7891ec4059f25731a85ee22 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 9 Jan 2026 16:03:29 +1100 Subject: [PATCH 50/88] clean up --- packages/auth-nextjs/README.md | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index 6cf216895e..c5bac77953 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -443,20 +443,3 @@ async function fetchData() { } } ``` - -## Migration from v4 (Pages Router) - -If you're migrating from the Pages Router version: - -| v4 (Pages Router) | v5 (App Router) | -| --------------------------------------- | --------------------------------------------- | -| `ImmutableAuth(config)` | `createImmutableAuth(config)` | -| `getImmutableSession(req, res, config)` | `auth()` (from createImmutableAuth) | -| `withPageAuthRequired(config)` | `createAuthMiddleware(auth)` or layout checks | -| `pages/api/auth/[...nextauth].ts` | `app/api/auth/[...nextauth]/route.ts` | -| `pages/_app.tsx` with provider | `app/layout.tsx` with provider | -| `NEXTAUTH_SECRET` | `AUTH_SECRET` | - -## License - -Apache-2.0 From 613d1831f156ff88fdc5c319712cb23f3d61ec78 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 9 Jan 2026 16:56:55 +1100 Subject: [PATCH 51/88] add isLoggingIn state --- packages/auth-nextjs/src/client/provider.tsx | 75 +++++++++++--------- packages/auth-nextjs/src/constants.ts | 2 +- packages/auth-nextjs/src/refresh.ts | 2 +- packages/auth-nextjs/src/types.ts | 6 +- 4 files changed, 50 insertions(+), 35 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 86bb992b36..4c17d254fa 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -295,9 +295,9 @@ export function ImmutableAuthProvider({ * @example * ```tsx * function MyComponent() { - * const { user, isLoading, signIn, signOut } = useImmutableAuth(); + * const { user, isLoading, isLoggingIn, signIn, signOut } = useImmutableAuth(); * - * if (isLoading) return
Loading...
; + * if (isLoading) return
Loading session...
; * * if (user) { * return ( @@ -308,13 +308,18 @@ export function ImmutableAuthProvider({ * ); * } * - * return ; + * return ( + * + * ); * } * ``` */ export function useImmutableAuth(): UseImmutableAuthReturn { const context = useContext(ImmutableAuthContext); const { data: sessionData, status } = useSession(); + const [isLoggingIn, setIsLoggingIn] = useState(false); if (!context) { throw new Error('useImmutableAuth must be used within ImmutableAuthProvider'); @@ -342,38 +347,43 @@ export function useImmutableAuth(): UseImmutableAuthReturn { throw new Error('Auth not initialized'); } - // Open popup login with optional login options - const authUser = await auth.login(options); - if (!authUser) { - throw new Error('Login failed'); - } + setIsLoggingIn(true); + try { + // Open popup login with optional login options + const authUser = await auth.login(options); + if (!authUser) { + throw new Error('Login failed'); + } - // Build token data for NextAuth - const tokenData: ImmutableTokenData = { - accessToken: authUser.accessToken, - refreshToken: authUser.refreshToken, - idToken: authUser.idToken, - accessTokenExpires: getTokenExpiry(authUser.accessToken), - profile: { - sub: authUser.profile.sub, - email: authUser.profile.email, - nickname: authUser.profile.nickname, - }, - zkEvm: authUser.zkEvm, - }; + // Build token data for NextAuth + const tokenData: ImmutableTokenData = { + accessToken: authUser.accessToken, + refreshToken: authUser.refreshToken, + idToken: authUser.idToken, + accessTokenExpires: getTokenExpiry(authUser.accessToken), + profile: { + sub: authUser.profile.sub, + email: authUser.profile.email, + nickname: authUser.profile.nickname, + }, + zkEvm: authUser.zkEvm, + }; - // Sign in to NextAuth with the tokens - const result = await signIn(IMMUTABLE_PROVIDER_ID, { - tokens: JSON.stringify(tokenData), - redirect: false, - }); + // Sign in to NextAuth with the tokens + const result = await signIn(IMMUTABLE_PROVIDER_ID, { + tokens: JSON.stringify(tokenData), + redirect: false, + }); - // signIn with redirect: false returns a result object instead of throwing - if (result?.error) { - throw new Error(`NextAuth sign-in failed: ${result.error}`); - } - if (!result?.ok) { - throw new Error('NextAuth sign-in failed: unknown error'); + // signIn with redirect: false returns a result object instead of throwing + if (result?.error) { + throw new Error(`NextAuth sign-in failed: ${result.error}`); + } + if (!result?.ok) { + throw new Error('NextAuth sign-in failed: unknown error'); + } + } finally { + setIsLoggingIn(false); } }, [auth]); @@ -428,6 +438,7 @@ export function useImmutableAuth(): UseImmutableAuthReturn { user, session, isLoading, + isLoggingIn, isAuthenticated, signIn: handleSignIn, signOut: handleSignOut, diff --git a/packages/auth-nextjs/src/constants.ts b/packages/auth-nextjs/src/constants.ts index af450ce5fe..d9bb941727 100644 --- a/packages/auth-nextjs/src/constants.ts +++ b/packages/auth-nextjs/src/constants.ts @@ -48,4 +48,4 @@ export const TOKEN_EXPIRY_BUFFER_SECONDS = 60; * Default session max age in seconds (30 days) * This is how long the NextAuth session cookie will be valid */ -export const DEFAULT_SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60; +export const DEFAULT_SESSION_MAX_AGE_SECONDS = 365 * 24 * 60 * 60; diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index 39acabb017..9fb93bac22 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -59,7 +59,7 @@ export async function refreshAccessToken( throw new Error('Invalid token response: missing access_token'); } - // Calculate expiry (access_token typically expires in 1 hour) + // Calculate expiry const expiresIn = data.expires_in || DEFAULT_TOKEN_EXPIRY_SECONDS; const accessTokenExpires = Date.now() + expiresIn * 1000; diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-nextjs/src/types.ts index 0735868590..233eb83e4b 100644 --- a/packages/auth-nextjs/src/types.ts +++ b/packages/auth-nextjs/src/types.ts @@ -185,9 +185,13 @@ export interface UseImmutableAuthReturn { */ session: Session | null; /** - * Whether authentication state is loading + * Whether authentication state is loading (initial session fetch) */ isLoading: boolean; + /** + * Whether a login flow is in progress (popup open, waiting for OAuth callback) + */ + isLoggingIn: boolean; /** * Whether user is authenticated */ From fde7d71990e7299edbf32db0f4460e300db4131c Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 9 Jan 2026 17:11:20 +1100 Subject: [PATCH 52/88] change doc --- packages/auth-nextjs/README.md | 2 +- packages/auth-nextjs/src/config.ts | 2 +- packages/auth-nextjs/src/constants.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index c5bac77953..284bcc5af2 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -368,7 +368,7 @@ export default function Callback() { ## Handling Token Refresh Errors -When a refresh token expires or becomes invalid (e.g., after 30 days of inactivity, or revoked from another session), the session will contain an `error` property. You should handle this gracefully: +When a refresh token expires or becomes invalid (e.g., after 365 days of inactivity, or revoked from another session), the session will contain an `error` property. You should handle this gracefully: ### Server Components diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index f25c8642f8..6b909681a8 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -219,7 +219,7 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { session: { strategy: 'jwt', - // Session max age in seconds (30 days default) + // Session max age in seconds (365 days default) maxAge: DEFAULT_SESSION_MAX_AGE_SECONDS, }, }; diff --git a/packages/auth-nextjs/src/constants.ts b/packages/auth-nextjs/src/constants.ts index d9bb941727..a4e367b54a 100644 --- a/packages/auth-nextjs/src/constants.ts +++ b/packages/auth-nextjs/src/constants.ts @@ -45,7 +45,7 @@ export const DEFAULT_TOKEN_EXPIRY_MS = DEFAULT_TOKEN_EXPIRY_SECONDS * 1000; export const TOKEN_EXPIRY_BUFFER_SECONDS = 60; /** - * Default session max age in seconds (30 days) + * Default session max age in seconds (365 days) * This is how long the NextAuth session cookie will be valid */ export const DEFAULT_SESSION_MAX_AGE_SECONDS = 365 * 24 * 60 * 60; From fe319779269b2f6c6a768a43ce2a7bd863b33bb2 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Mon, 12 Jan 2026 10:19:00 +1100 Subject: [PATCH 53/88] refresh race condition --- packages/auth-nextjs/jest.config.ts | 17 ++ packages/auth-nextjs/src/refresh.test.ts | 243 +++++++++++++++++++++++ packages/auth-nextjs/src/refresh.ts | 90 +++++++-- 3 files changed, 337 insertions(+), 13 deletions(-) create mode 100644 packages/auth-nextjs/jest.config.ts create mode 100644 packages/auth-nextjs/src/refresh.test.ts diff --git a/packages/auth-nextjs/jest.config.ts b/packages/auth-nextjs/jest.config.ts new file mode 100644 index 0000000000..521c8b6f29 --- /dev/null +++ b/packages/auth-nextjs/jest.config.ts @@ -0,0 +1,17 @@ +import type { Config } from 'jest'; + +const config: Config = { + clearMocks: true, + coverageProvider: 'v8', + moduleDirectories: ['node_modules', 'src'], + testEnvironment: 'node', + transform: { + '^.+\\.(t|j)sx?$': '@swc/jest', + }, + transformIgnorePatterns: [], + restoreMocks: true, + roots: ['/src'], +}; + +export default config; + diff --git a/packages/auth-nextjs/src/refresh.test.ts b/packages/auth-nextjs/src/refresh.test.ts new file mode 100644 index 0000000000..8a4cda6de0 --- /dev/null +++ b/packages/auth-nextjs/src/refresh.test.ts @@ -0,0 +1,243 @@ +import type { JWT } from 'next-auth/jwt'; +import { refreshAccessToken, isTokenExpired } from './refresh'; +import type { ImmutableAuthConfig } from './types'; + +// Mock fetch globally +const mockFetch = jest.fn(); +global.fetch = mockFetch; + +// Helper to create a mock JWT token +const createMockToken = (overrides: Partial = {}): JWT => ({ + sub: 'user-123', + email: 'test@example.com', + accessToken: 'old-access-token', + refreshToken: 'valid-refresh-token', + idToken: 'old-id-token', + accessTokenExpires: Date.now() - 1000, // expired + ...overrides, +}); + +// Mock config +const mockConfig: ImmutableAuthConfig = { + clientId: 'test-client-id', + redirectUri: 'http://localhost:3000/callback', +}; + +// Helper to create a successful refresh response +const createSuccessResponse = (delay = 0) => { + const responseData = { + access_token: 'new-access-token', + refresh_token: 'new-refresh-token', + id_token: 'new-id-token', + expires_in: 900, + }; + + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + ok: true, + json: async () => responseData, + } as Response); + }, delay); + }); +}; + +// Helper to create a 403 error response +const createErrorResponse = (delay = 0) => new Promise((resolve) => { + setTimeout(() => { + resolve({ + ok: false, + status: 403, + json: async () => ({ + error: 'invalid_grant', + error_description: 'Unknown or invalid refresh token.', + }), + } as Response); + }, delay); +}); + +describe('refreshAccessToken', () => { + beforeEach(() => { + mockFetch.mockReset(); + jest.spyOn(console, 'error').mockImplementation(() => {}); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + describe('basic functionality', () => { + it('should successfully refresh a token', async () => { + mockFetch.mockResolvedValueOnce({ + ok: true, + json: async () => ({ + access_token: 'new-access-token', + refresh_token: 'new-refresh-token', + id_token: 'new-id-token', + expires_in: 900, + }), + }); + + const token = createMockToken(); + const result = await refreshAccessToken(token, mockConfig); + + expect(result.accessToken).toBe('new-access-token'); + expect(result.refreshToken).toBe('new-refresh-token'); + expect(result.idToken).toBe('new-id-token'); + expect(result.error).toBeUndefined(); + }); + + it('should return NoRefreshToken error when refresh token is missing', async () => { + const token = createMockToken({ refreshToken: undefined }); + const result = await refreshAccessToken(token, mockConfig); + + expect(result.error).toBe('NoRefreshToken'); + expect(mockFetch).not.toHaveBeenCalled(); + }); + + it('should return RefreshTokenError on 403 response', async () => { + mockFetch.mockResolvedValueOnce({ + ok: false, + status: 403, + json: async () => ({ + error: 'invalid_grant', + error_description: 'Unknown or invalid refresh token.', + }), + }); + + const token = createMockToken(); + const result = await refreshAccessToken(token, mockConfig); + + expect(result.error).toBe('RefreshTokenError'); + }); + }); + + describe('race condition prevention (deduplication)', () => { + it('should deduplicate concurrent refresh requests for the same refresh token', async () => { + // First call will succeed after a delay + // This tests that concurrent requests share the same refresh result + mockFetch.mockImplementation(() => createSuccessResponse(100)); + + const token = createMockToken(); + + // Simulate multiple concurrent auth() calls that all detect expired token + const [result1, result2, result3] = await Promise.all([ + refreshAccessToken(token, mockConfig), + refreshAccessToken(token, mockConfig), + refreshAccessToken(token, mockConfig), + ]); + + // All should get the same successful result + expect(result1.accessToken).toBe('new-access-token'); + expect(result2.accessToken).toBe('new-access-token'); + expect(result3.accessToken).toBe('new-access-token'); + + // CRITICAL: Only ONE fetch call should have been made + // This prevents the race condition where multiple requests use the same + // refresh token and get 403 errors due to token rotation + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it('should allow new refresh after previous one completes', async () => { + mockFetch + .mockImplementationOnce(() => createSuccessResponse(10)) + .mockImplementationOnce(() => createSuccessResponse(10)); + + const token1 = createMockToken({ refreshToken: 'refresh-token-1' }); + const token2 = createMockToken({ refreshToken: 'refresh-token-2' }); + + // First refresh + await refreshAccessToken(token1, mockConfig); + + // Second refresh with different token (simulating rotated token) + await refreshAccessToken(token2, mockConfig); + + // Both should have triggered separate fetch calls since they're sequential + // and use different refresh tokens + expect(mockFetch).toHaveBeenCalledTimes(2); + }); + + it('should handle concurrent requests with different refresh tokens independently', async () => { + mockFetch.mockImplementation(() => createSuccessResponse(50)); + + const token1 = createMockToken({ refreshToken: 'refresh-token-A' }); + const token2 = createMockToken({ refreshToken: 'refresh-token-B' }); + + // Two concurrent requests with DIFFERENT refresh tokens + await Promise.all([ + refreshAccessToken(token1, mockConfig), + refreshAccessToken(token2, mockConfig), + ]); + + // Each should trigger its own fetch call since they have different refresh tokens + expect(mockFetch).toHaveBeenCalledTimes(2); + }); + + it('should propagate errors to all waiting requests', async () => { + mockFetch.mockImplementation(() => createErrorResponse(50)); + + const token = createMockToken(); + + // Multiple concurrent requests + const [result1, result2, result3] = await Promise.all([ + refreshAccessToken(token, mockConfig), + refreshAccessToken(token, mockConfig), + refreshAccessToken(token, mockConfig), + ]); + + // All should get the error + expect(result1.error).toBe('RefreshTokenError'); + expect(result2.error).toBe('RefreshTokenError'); + expect(result3.error).toBe('RefreshTokenError'); + + // But only ONE fetch call should have been made + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it('should allow retry after failed refresh completes', async () => { + // First call fails, second succeeds + mockFetch + .mockImplementationOnce(() => createErrorResponse(10)) + .mockImplementationOnce(() => createSuccessResponse(10)); + + const token = createMockToken(); + + // First refresh fails + const result1 = await refreshAccessToken(token, mockConfig); + expect(result1.error).toBe('RefreshTokenError'); + + // Retry should work (new fetch call) + const result2 = await refreshAccessToken(token, mockConfig); + expect(result2.accessToken).toBe('new-access-token'); + + // Two separate fetch calls + expect(mockFetch).toHaveBeenCalledTimes(2); + }); + }); +}); + +describe('isTokenExpired', () => { + it('should return true for expired tokens', () => { + const expiredTime = Date.now() - 1000; + expect(isTokenExpired(expiredTime)).toBe(true); + }); + + it('should return true for tokens expiring within buffer', () => { + const almostExpired = Date.now() + 30 * 1000; // 30 seconds from now + expect(isTokenExpired(almostExpired, 60)).toBe(true); // 60 second buffer + }); + + it('should return false for valid tokens outside buffer', () => { + const validTime = Date.now() + 120 * 1000; // 2 minutes from now + expect(isTokenExpired(validTime, 60)).toBe(false); + }); + + it('should return true for NaN', () => { + expect(isTokenExpired(NaN)).toBe(true); + }); + + it('should return true for undefined/invalid values', () => { + expect(isTokenExpired(undefined as unknown as number)).toBe(true); + expect(isTokenExpired(null as unknown as number)).toBe(true); + }); +}); diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index 9fb93bac22..923398bfc1 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -7,22 +7,29 @@ import { } from './constants'; /** - * Refresh the access token using the refresh token - * Called by Auth.js JWT callback when token is expired + * Map of pending refresh promises keyed by refresh token. + * Used to deduplicate concurrent refresh requests and prevent race conditions + * caused by OAuth refresh token rotation. + * + * When multiple concurrent requests detect an expired token, they all attempt + * to refresh simultaneously. Due to refresh token rotation, only the first + * request succeeds - the rest would fail with "Unknown or invalid refresh token" + * because the original refresh token was invalidated. + * + * This map ensures only ONE actual refresh request is made per refresh token. + * All concurrent requests wait for and share the same result. */ -export async function refreshAccessToken( +const pendingRefreshes = new Map>(); + +/** + * Internal function that performs the actual token refresh HTTP request. + * This is called by refreshAccessToken after deduplication checks. + */ +async function doRefreshAccessToken( token: JWT, config: ImmutableAuthConfig, + authDomain: string, ): Promise { - const authDomain = config.authenticationDomain || DEFAULT_AUTH_DOMAIN; - - if (!token.refreshToken) { - return { - ...token, - error: 'NoRefreshToken', - }; - } - try { const response = await fetch(`${authDomain}/oauth/token`, { method: 'POST', @@ -32,7 +39,7 @@ export async function refreshAccessToken( body: new URLSearchParams({ grant_type: 'refresh_token', client_id: config.clientId, - refresh_token: token.refreshToken, + refresh_token: token.refreshToken!, }), }); @@ -81,6 +88,63 @@ export async function refreshAccessToken( } } +/** + * Refresh the access token using the refresh token. + * Called by Auth.js JWT callback when token is expired. + * + * This function implements deduplication to handle concurrent refresh requests. + * When multiple requests detect an expired token simultaneously, only ONE actual + * refresh request is made to the OAuth server. All concurrent requests wait for + * and share the same result. + * + * This prevents "Unknown or invalid refresh token" errors caused by OAuth + * refresh token rotation, where using the same refresh token twice fails + * because it was invalidated after the first use. + */ +export async function refreshAccessToken( + token: JWT, + config: ImmutableAuthConfig, +): Promise { + const authDomain = config.authenticationDomain || DEFAULT_AUTH_DOMAIN; + + if (!token.refreshToken) { + return { + ...token, + error: 'NoRefreshToken', + }; + } + + const { refreshToken } = token; + + // Check if a refresh is already in progress for this refresh token + const existingRefresh = pendingRefreshes.get(refreshToken); + if (existingRefresh) { + // Wait for the existing refresh to complete and use its result + // The result will have updated tokens that we merge with our token's other fields + const result = await existingRefresh; + return { + ...token, + accessToken: result.accessToken, + refreshToken: result.refreshToken, + idToken: result.idToken, + accessTokenExpires: result.accessTokenExpires, + error: result.error, + }; + } + + // Start a new refresh and store the promise + const refreshPromise = doRefreshAccessToken(token, config, authDomain); + pendingRefreshes.set(refreshToken, refreshPromise); + + try { + const result = await refreshPromise; + return result; + } finally { + // Clean up the pending refresh after completion (success or failure) + pendingRefreshes.delete(refreshToken); + } +} + /** * Check if the access token is expired or about to expire * Returns true if token expires within the buffer time (default 60 seconds) From c05ad4e90cbe4c314b0ca2bc715dc443aa66df89 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Mon, 12 Jan 2026 13:34:35 +1100 Subject: [PATCH 54/88] bug --- packages/auth-nextjs/src/index.ts | 12 ++++++++++++ .../app/api/auth/dev/[...nextauth]/route.ts | 3 --- .../app/api/auth/prod/[...nextauth]/route.ts | 3 --- .../app/api/auth/sandbox/[...nextauth]/route.ts | 3 --- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts index e973b667bf..b205c6ef45 100644 --- a/packages/auth-nextjs/src/index.ts +++ b/packages/auth-nextjs/src/index.ts @@ -137,10 +137,22 @@ export function createImmutableAuth( } } + // Merge session config to preserve critical settings like strategy: 'jwt' + // User can override maxAge, updateAge, etc. but strategy is always preserved + const mergedSession = overrides.session + ? { + ...authConfig.session, + ...overrides.session, + // Always enforce JWT strategy - this is required for token storage/refresh + strategy: 'jwt' as const, + } + : authConfig.session; + const mergedConfig: NextAuthConfig = { ...authConfig, ...overrides, callbacks: composedCallbacks, + session: mergedSession, }; return NextAuth(mergedConfig); diff --git a/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts index e3e55c33cf..10676ea7ce 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts @@ -1,6 +1,3 @@ import { devAuth } from "@/lib/auth-nextjs"; export const { GET, POST } = devAuth.handlers; - - - diff --git a/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts index 5969e98df2..1d58f8e2ee 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts @@ -1,6 +1,3 @@ import { prodAuth } from "@/lib/auth-nextjs"; export const { GET, POST } = prodAuth.handlers; - - - diff --git a/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts index 78afa41374..4494056efc 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts @@ -1,6 +1,3 @@ import { sandboxAuth } from "@/lib/auth-nextjs"; export const { GET, POST } = sandboxAuth.handlers; - - - From b5a437c5d032eb34018cdf09f9e964cac3a3a0a6 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Tue, 13 Jan 2026 16:33:19 +1100 Subject: [PATCH 55/88] fix refresh --- packages/auth-nextjs/src/config.ts | 26 ++- packages/auth-nextjs/src/index.ts | 4 +- packages/auth-nextjs/src/refresh.test.ts | 218 +---------------------- packages/auth-nextjs/src/refresh.ts | 147 +-------------- 4 files changed, 24 insertions(+), 371 deletions(-) diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-nextjs/src/config.ts index 6b909681a8..8403d2947c 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-nextjs/src/config.ts @@ -4,7 +4,7 @@ import type { NextAuthConfig } from 'next-auth'; import CredentialsImport from 'next-auth/providers/credentials'; import type { ImmutableAuthConfig, ImmutableTokenData, UserInfoResponse } from './types'; -import { refreshAccessToken, isTokenExpired } from './refresh'; +import { isTokenExpired } from './refresh'; import { DEFAULT_AUTH_DOMAIN, IMMUTABLE_PROVIDER_ID, @@ -170,9 +170,9 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { } // Handle session update (for client-side token sync) - // When client-side Auth refreshes tokens via TOKEN_REFRESHED event and syncs them here, - // we must clear any stale error (e.g., from a previous server-side refresh failure). - // This matches refreshAccessToken's behavior of setting error: undefined on success. + // When client-side Auth refreshes tokens via TOKEN_REFRESHED event, + // it calls updateSession() which triggers this callback with the new tokens. + // We clear any stale error (e.g., TokenExpired) on successful update. if (trigger === 'update' && sessionUpdate) { const update = sessionUpdate as Record; return { @@ -192,8 +192,22 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { return token; } - // Token expired - refresh it - return refreshAccessToken(token, config); + // Token expired - DON'T refresh server-side! + // Server-side refresh causes race conditions with 403 errors when multiple + // concurrent SSR requests detect expired tokens. The pendingRefreshes Map + // mutex doesn't work across serverless isolates/processes. + // + // Instead, mark the token as expired and let the client handle refresh: + // 1. SSR completes with session.error = "TokenExpired" + // 2. Client hydrates, calls getAccessToken() for data fetches + // 3. getAccessToken() calls auth.getAccessToken() which auto-refreshes + // with proper mutex protection (refreshingPromise in @imtbl/auth) + // 4. TOKEN_REFRESHED event fires → updateSession() syncs fresh tokens + // 5. NextAuth receives update trigger → clears error, stores fresh tokens + return { + ...token, + error: 'TokenExpired', + }; }, // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts index b205c6ef45..77c25a37a2 100644 --- a/packages/auth-nextjs/src/index.ts +++ b/packages/auth-nextjs/src/index.ts @@ -176,8 +176,8 @@ export type { export type { LoginOptions, DirectLoginOptions } from '@imtbl/auth'; export { MarketingConsentStatus } from '@imtbl/auth'; -// Token refresh utilities (for advanced use) -export { refreshAccessToken, isTokenExpired } from './refresh'; +// Token expiry check utility +export { isTokenExpired } from './refresh'; // Default constants (useful for configuration reference) export { diff --git a/packages/auth-nextjs/src/refresh.test.ts b/packages/auth-nextjs/src/refresh.test.ts index 8a4cda6de0..4ceaab8839 100644 --- a/packages/auth-nextjs/src/refresh.test.ts +++ b/packages/auth-nextjs/src/refresh.test.ts @@ -1,220 +1,4 @@ -import type { JWT } from 'next-auth/jwt'; -import { refreshAccessToken, isTokenExpired } from './refresh'; -import type { ImmutableAuthConfig } from './types'; - -// Mock fetch globally -const mockFetch = jest.fn(); -global.fetch = mockFetch; - -// Helper to create a mock JWT token -const createMockToken = (overrides: Partial = {}): JWT => ({ - sub: 'user-123', - email: 'test@example.com', - accessToken: 'old-access-token', - refreshToken: 'valid-refresh-token', - idToken: 'old-id-token', - accessTokenExpires: Date.now() - 1000, // expired - ...overrides, -}); - -// Mock config -const mockConfig: ImmutableAuthConfig = { - clientId: 'test-client-id', - redirectUri: 'http://localhost:3000/callback', -}; - -// Helper to create a successful refresh response -const createSuccessResponse = (delay = 0) => { - const responseData = { - access_token: 'new-access-token', - refresh_token: 'new-refresh-token', - id_token: 'new-id-token', - expires_in: 900, - }; - - return new Promise((resolve) => { - setTimeout(() => { - resolve({ - ok: true, - json: async () => responseData, - } as Response); - }, delay); - }); -}; - -// Helper to create a 403 error response -const createErrorResponse = (delay = 0) => new Promise((resolve) => { - setTimeout(() => { - resolve({ - ok: false, - status: 403, - json: async () => ({ - error: 'invalid_grant', - error_description: 'Unknown or invalid refresh token.', - }), - } as Response); - }, delay); -}); - -describe('refreshAccessToken', () => { - beforeEach(() => { - mockFetch.mockReset(); - jest.spyOn(console, 'error').mockImplementation(() => {}); - }); - - afterEach(() => { - jest.restoreAllMocks(); - }); - - describe('basic functionality', () => { - it('should successfully refresh a token', async () => { - mockFetch.mockResolvedValueOnce({ - ok: true, - json: async () => ({ - access_token: 'new-access-token', - refresh_token: 'new-refresh-token', - id_token: 'new-id-token', - expires_in: 900, - }), - }); - - const token = createMockToken(); - const result = await refreshAccessToken(token, mockConfig); - - expect(result.accessToken).toBe('new-access-token'); - expect(result.refreshToken).toBe('new-refresh-token'); - expect(result.idToken).toBe('new-id-token'); - expect(result.error).toBeUndefined(); - }); - - it('should return NoRefreshToken error when refresh token is missing', async () => { - const token = createMockToken({ refreshToken: undefined }); - const result = await refreshAccessToken(token, mockConfig); - - expect(result.error).toBe('NoRefreshToken'); - expect(mockFetch).not.toHaveBeenCalled(); - }); - - it('should return RefreshTokenError on 403 response', async () => { - mockFetch.mockResolvedValueOnce({ - ok: false, - status: 403, - json: async () => ({ - error: 'invalid_grant', - error_description: 'Unknown or invalid refresh token.', - }), - }); - - const token = createMockToken(); - const result = await refreshAccessToken(token, mockConfig); - - expect(result.error).toBe('RefreshTokenError'); - }); - }); - - describe('race condition prevention (deduplication)', () => { - it('should deduplicate concurrent refresh requests for the same refresh token', async () => { - // First call will succeed after a delay - // This tests that concurrent requests share the same refresh result - mockFetch.mockImplementation(() => createSuccessResponse(100)); - - const token = createMockToken(); - - // Simulate multiple concurrent auth() calls that all detect expired token - const [result1, result2, result3] = await Promise.all([ - refreshAccessToken(token, mockConfig), - refreshAccessToken(token, mockConfig), - refreshAccessToken(token, mockConfig), - ]); - - // All should get the same successful result - expect(result1.accessToken).toBe('new-access-token'); - expect(result2.accessToken).toBe('new-access-token'); - expect(result3.accessToken).toBe('new-access-token'); - - // CRITICAL: Only ONE fetch call should have been made - // This prevents the race condition where multiple requests use the same - // refresh token and get 403 errors due to token rotation - expect(mockFetch).toHaveBeenCalledTimes(1); - }); - - it('should allow new refresh after previous one completes', async () => { - mockFetch - .mockImplementationOnce(() => createSuccessResponse(10)) - .mockImplementationOnce(() => createSuccessResponse(10)); - - const token1 = createMockToken({ refreshToken: 'refresh-token-1' }); - const token2 = createMockToken({ refreshToken: 'refresh-token-2' }); - - // First refresh - await refreshAccessToken(token1, mockConfig); - - // Second refresh with different token (simulating rotated token) - await refreshAccessToken(token2, mockConfig); - - // Both should have triggered separate fetch calls since they're sequential - // and use different refresh tokens - expect(mockFetch).toHaveBeenCalledTimes(2); - }); - - it('should handle concurrent requests with different refresh tokens independently', async () => { - mockFetch.mockImplementation(() => createSuccessResponse(50)); - - const token1 = createMockToken({ refreshToken: 'refresh-token-A' }); - const token2 = createMockToken({ refreshToken: 'refresh-token-B' }); - - // Two concurrent requests with DIFFERENT refresh tokens - await Promise.all([ - refreshAccessToken(token1, mockConfig), - refreshAccessToken(token2, mockConfig), - ]); - - // Each should trigger its own fetch call since they have different refresh tokens - expect(mockFetch).toHaveBeenCalledTimes(2); - }); - - it('should propagate errors to all waiting requests', async () => { - mockFetch.mockImplementation(() => createErrorResponse(50)); - - const token = createMockToken(); - - // Multiple concurrent requests - const [result1, result2, result3] = await Promise.all([ - refreshAccessToken(token, mockConfig), - refreshAccessToken(token, mockConfig), - refreshAccessToken(token, mockConfig), - ]); - - // All should get the error - expect(result1.error).toBe('RefreshTokenError'); - expect(result2.error).toBe('RefreshTokenError'); - expect(result3.error).toBe('RefreshTokenError'); - - // But only ONE fetch call should have been made - expect(mockFetch).toHaveBeenCalledTimes(1); - }); - - it('should allow retry after failed refresh completes', async () => { - // First call fails, second succeeds - mockFetch - .mockImplementationOnce(() => createErrorResponse(10)) - .mockImplementationOnce(() => createSuccessResponse(10)); - - const token = createMockToken(); - - // First refresh fails - const result1 = await refreshAccessToken(token, mockConfig); - expect(result1.error).toBe('RefreshTokenError'); - - // Retry should work (new fetch call) - const result2 = await refreshAccessToken(token, mockConfig); - expect(result2.accessToken).toBe('new-access-token'); - - // Two separate fetch calls - expect(mockFetch).toHaveBeenCalledTimes(2); - }); - }); -}); +import { isTokenExpired } from './refresh'; describe('isTokenExpired', () => { it('should return true for expired tokens', () => { diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-nextjs/src/refresh.ts index 923398bfc1..f1276b557d 100644 --- a/packages/auth-nextjs/src/refresh.ts +++ b/packages/auth-nextjs/src/refresh.ts @@ -1,149 +1,4 @@ -import type { JWT } from 'next-auth/jwt'; -import type { ImmutableAuthConfig } from './types'; -import { - DEFAULT_AUTH_DOMAIN, - DEFAULT_TOKEN_EXPIRY_SECONDS, - TOKEN_EXPIRY_BUFFER_SECONDS, -} from './constants'; - -/** - * Map of pending refresh promises keyed by refresh token. - * Used to deduplicate concurrent refresh requests and prevent race conditions - * caused by OAuth refresh token rotation. - * - * When multiple concurrent requests detect an expired token, they all attempt - * to refresh simultaneously. Due to refresh token rotation, only the first - * request succeeds - the rest would fail with "Unknown or invalid refresh token" - * because the original refresh token was invalidated. - * - * This map ensures only ONE actual refresh request is made per refresh token. - * All concurrent requests wait for and share the same result. - */ -const pendingRefreshes = new Map>(); - -/** - * Internal function that performs the actual token refresh HTTP request. - * This is called by refreshAccessToken after deduplication checks. - */ -async function doRefreshAccessToken( - token: JWT, - config: ImmutableAuthConfig, - authDomain: string, -): Promise { - try { - const response = await fetch(`${authDomain}/oauth/token`, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: new URLSearchParams({ - grant_type: 'refresh_token', - client_id: config.clientId, - refresh_token: token.refreshToken!, - }), - }); - - // Check response.ok before parsing JSON to avoid confusing errors - // when server returns non-JSON responses (e.g., HTML error pages) - if (!response.ok) { - let errorMessage = `Token refresh failed with status ${response.status}`; - try { - const errorData = await response.json(); - if (errorData.error_description || errorData.error) { - errorMessage = errorData.error_description || errorData.error; - } - } catch { - // Response is not JSON (e.g., HTML error page from proxy/load balancer) - // Use the status-based error message - } - throw new Error(errorMessage); - } - - const data = await response.json(); - - // Validate that access_token exists in the response - if (!data.access_token || typeof data.access_token !== 'string') { - throw new Error('Invalid token response: missing access_token'); - } - - // Calculate expiry - const expiresIn = data.expires_in || DEFAULT_TOKEN_EXPIRY_SECONDS; - const accessTokenExpires = Date.now() + expiresIn * 1000; - - return { - ...token, - accessToken: data.access_token, - refreshToken: data.refresh_token ?? token.refreshToken, - idToken: data.id_token ?? token.idToken, - accessTokenExpires, - error: undefined, - }; - } catch (error) { - // eslint-disable-next-line no-console - console.error('[auth-nextjs] Failed to refresh token:', error); - return { - ...token, - error: 'RefreshTokenError', - }; - } -} - -/** - * Refresh the access token using the refresh token. - * Called by Auth.js JWT callback when token is expired. - * - * This function implements deduplication to handle concurrent refresh requests. - * When multiple requests detect an expired token simultaneously, only ONE actual - * refresh request is made to the OAuth server. All concurrent requests wait for - * and share the same result. - * - * This prevents "Unknown or invalid refresh token" errors caused by OAuth - * refresh token rotation, where using the same refresh token twice fails - * because it was invalidated after the first use. - */ -export async function refreshAccessToken( - token: JWT, - config: ImmutableAuthConfig, -): Promise { - const authDomain = config.authenticationDomain || DEFAULT_AUTH_DOMAIN; - - if (!token.refreshToken) { - return { - ...token, - error: 'NoRefreshToken', - }; - } - - const { refreshToken } = token; - - // Check if a refresh is already in progress for this refresh token - const existingRefresh = pendingRefreshes.get(refreshToken); - if (existingRefresh) { - // Wait for the existing refresh to complete and use its result - // The result will have updated tokens that we merge with our token's other fields - const result = await existingRefresh; - return { - ...token, - accessToken: result.accessToken, - refreshToken: result.refreshToken, - idToken: result.idToken, - accessTokenExpires: result.accessTokenExpires, - error: result.error, - }; - } - - // Start a new refresh and store the promise - const refreshPromise = doRefreshAccessToken(token, config, authDomain); - pendingRefreshes.set(refreshToken, refreshPromise); - - try { - const result = await refreshPromise; - return result; - } finally { - // Clean up the pending refresh after completion (success or failure) - pendingRefreshes.delete(refreshToken); - } -} +import { TOKEN_EXPIRY_BUFFER_SECONDS } from './constants'; /** * Check if the access token is expired or about to expire From 52828d932ba6b1cc7289de5c9c1a397b662da29c Mon Sep 17 00:00:00 2001 From: Shine Li Date: Tue, 13 Jan 2026 19:47:20 +1100 Subject: [PATCH 56/88] fix path match --- packages/auth-nextjs/src/server/index.ts | 5 +- .../auth-nextjs/src/utils/pathMatch.test.ts | 77 +++++++++++++++++++ packages/auth-nextjs/src/utils/pathMatch.ts | 16 ++++ 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 packages/auth-nextjs/src/utils/pathMatch.test.ts create mode 100644 packages/auth-nextjs/src/utils/pathMatch.ts diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-nextjs/src/server/index.ts index 53dd0bf056..aa329160af 100644 --- a/packages/auth-nextjs/src/server/index.ts +++ b/packages/auth-nextjs/src/server/index.ts @@ -2,6 +2,7 @@ import { type NextRequest, NextResponse } from 'next/server'; import type { Session } from 'next-auth'; +import { matchPathPrefix } from '../utils/pathMatch'; // Re-export createImmutableAuth for convenience export { createImmutableAuth, createAuthConfig } from '../index'; @@ -78,7 +79,7 @@ export function createAuthMiddleware( if (publicPaths) { const isPublic = publicPaths.some((pattern) => { if (typeof pattern === 'string') { - return pathname === pattern || pathname.startsWith(pattern); + return matchPathPrefix(pathname, pattern); } return pattern.test(pathname); }); @@ -91,7 +92,7 @@ export function createAuthMiddleware( if (protectedPaths) { const isProtected = protectedPaths.some((pattern) => { if (typeof pattern === 'string') { - return pathname === pattern || pathname.startsWith(pattern); + return matchPathPrefix(pathname, pattern); } return pattern.test(pathname); }); diff --git a/packages/auth-nextjs/src/utils/pathMatch.test.ts b/packages/auth-nextjs/src/utils/pathMatch.test.ts new file mode 100644 index 0000000000..0e8f75dcbb --- /dev/null +++ b/packages/auth-nextjs/src/utils/pathMatch.test.ts @@ -0,0 +1,77 @@ +import { matchPathPrefix } from './pathMatch'; + +describe('matchPathPrefix', () => { + describe('exact matches', () => { + it('should match exact path', () => { + expect(matchPathPrefix('/api', '/api')).toBe(true); + }); + + it('should match exact path with trailing slash', () => { + expect(matchPathPrefix('/api/', '/api/')).toBe(true); + }); + + it('should match root path', () => { + expect(matchPathPrefix('/', '/')).toBe(true); + }); + }); + + describe('prefix matches with path boundaries', () => { + it('should match nested paths under the pattern', () => { + expect(matchPathPrefix('/api/users', '/api')).toBe(true); + expect(matchPathPrefix('/api/users/123', '/api')).toBe(true); + expect(matchPathPrefix('/dashboard/settings/profile', '/dashboard')).toBe(true); + }); + + it('should match when pattern has trailing slash', () => { + expect(matchPathPrefix('/api/users', '/api/')).toBe(true); + }); + + it('should match deeply nested paths', () => { + expect(matchPathPrefix('/api/v1/users/123/posts', '/api')).toBe(true); + }); + }); + + describe('non-matches due to path boundary', () => { + it('should NOT match paths that share prefix but different segment', () => { + expect(matchPathPrefix('/apiversion', '/api')).toBe(false); + expect(matchPathPrefix('/api-docs', '/api')).toBe(false); + expect(matchPathPrefix('/api2', '/api')).toBe(false); + }); + + it('should NOT match paths with similar but different prefix', () => { + expect(matchPathPrefix('/dashboard-admin', '/dashboard')).toBe(false); + expect(matchPathPrefix('/dashboardv2', '/dashboard')).toBe(false); + }); + + it('should NOT match completely different paths', () => { + expect(matchPathPrefix('/users', '/api')).toBe(false); + expect(matchPathPrefix('/profile', '/dashboard')).toBe(false); + }); + + it('should NOT match when pathname is shorter', () => { + expect(matchPathPrefix('/ap', '/api')).toBe(false); + expect(matchPathPrefix('/a', '/api')).toBe(false); + }); + }); + + describe('edge cases', () => { + it('should handle multi-segment patterns', () => { + expect(matchPathPrefix('/api/v1/users', '/api/v1')).toBe(true); + expect(matchPathPrefix('/api/v1', '/api/v1')).toBe(true); + expect(matchPathPrefix('/api/v12', '/api/v1')).toBe(false); + }); + + it('should handle patterns ending with slash correctly', () => { + // Pattern '/api/' should match '/api/users' but not '/api' (no trailing slash) + expect(matchPathPrefix('/api/users', '/api/')).toBe(true); + expect(matchPathPrefix('/api/', '/api/')).toBe(true); + // '/api' does not start with '/api/' so this should be false + expect(matchPathPrefix('/api', '/api/')).toBe(false); + }); + + it('should handle root pattern', () => { + expect(matchPathPrefix('/anything', '/')).toBe(true); + expect(matchPathPrefix('/api/users', '/')).toBe(true); + }); + }); +}); diff --git a/packages/auth-nextjs/src/utils/pathMatch.ts b/packages/auth-nextjs/src/utils/pathMatch.ts new file mode 100644 index 0000000000..bf5139620c --- /dev/null +++ b/packages/auth-nextjs/src/utils/pathMatch.ts @@ -0,0 +1,16 @@ +/** + * Check if pathname matches a string pattern as a path prefix. + * Ensures proper path boundary checking: '/api' matches '/api' and '/api/users' + * but NOT '/apiversion' or '/api-docs'. + * + * @param pathname - The URL pathname to check + * @param pattern - The string pattern to match against + * @returns true if pathname matches the pattern with proper path boundaries + */ +export function matchPathPrefix(pathname: string, pattern: string): boolean { + if (pathname === pattern) return true; + // Ensure pattern acts as a complete path segment prefix + // Add trailing slash if pattern doesn't end with one to enforce boundary + const prefix = pattern.endsWith('/') ? pattern : `${pattern}/`; + return pathname.startsWith(prefix); +} From 8048bd5fa84c6c9497295a6231a273e8c7fbd8ab Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 14 Jan 2026 14:55:44 +1100 Subject: [PATCH 57/88] server side never refresh tokens --- packages/auth-nextjs/src/client/provider.tsx | 67 +------------------- 1 file changed, 2 insertions(+), 65 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 4c17d254fa..cf2a61e50f 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -14,7 +14,7 @@ import { } from 'next-auth/react'; import type { Session } from 'next-auth'; import { - Auth, AuthEvents, type User, type DeviceTokenResponse, type LoginOptions, + Auth, AuthEvents, type User, type LoginOptions, } from '@imtbl/auth'; import type { ImmutableAuthConfig, @@ -29,7 +29,6 @@ import { DEFAULT_AUDIENCE, DEFAULT_SCOPE, DEFAULT_NEXTAUTH_BASE_PATH, - DEFAULT_TOKEN_EXPIRY_SECONDS, IMMUTABLE_PROVIDER_ID, } from '../constants'; @@ -121,69 +120,7 @@ function ImmutableAuthInner({ }; }, [config]); - // Sync tokens from NextAuth session to Auth instance - // This handles two cases: - // 1. Initial hydration when Auth has no local state (e.g., localStorage cleared) - // 2. Token refresh sync when server-side refresh happened and tokens are newer - // (critical for refresh token rotation - the old refresh token is invalidated) - useEffect(() => { - if (!auth || !isAuthReady) return; - // Don't sync if session has an error (e.g., RefreshTokenError) - // When server-side token refresh fails, the session contains both stale tokens - // AND an error flag - we must not store these stale tokens in the Auth instance - if (session?.error) return; - if (!session?.accessToken || !session?.idToken) return; - - const syncTokensToAuth = async () => { - try { - // Re-check tokens inside async function for TypeScript narrowing - const { - accessToken, idToken, refreshToken, accessTokenExpires, - } = session; - if (!accessToken || !idToken) return; - - // Check if Auth already has user data with same or newer tokens - const existingUser = await auth.getUser(); - if (existingUser) { - // Compare tokens - only update if session has different tokens - // This handles the case where server-side refresh happened: - // - Server refreshed tokens → new refresh token returned - // - Old refresh token is invalidated (refresh token rotation) - // - Client Auth still has old refresh token → sync the new one - const sessionHasNewerTokens = existingUser.accessToken !== accessToken - || existingUser.refreshToken !== refreshToken; - - if (!sessionHasNewerTokens) { - return; // Tokens are the same, no need to sync - } - // Tokens are different - session has updated tokens from server-side refresh - } - - // Calculate expires_in from accessTokenExpires - const expiresIn = accessTokenExpires - ? Math.max(0, Math.floor((accessTokenExpires - Date.now()) / 1000)) - : DEFAULT_TOKEN_EXPIRY_SECONDS; - - // Store tokens from NextAuth session into Auth instance - const tokenResponse: DeviceTokenResponse = { - access_token: accessToken, - refresh_token: refreshToken, - id_token: idToken, - token_type: 'Bearer', - expires_in: expiresIn, - }; - - await auth.storeTokens(tokenResponse); - } catch (error) { - // eslint-disable-next-line no-console - console.warn('[auth-nextjs] Failed to sync tokens to Auth instance:', error); - } - }; - - syncTokensToAuth(); - }, [auth, isAuthReady, session]); - - // Listen for Auth events to sync tokens back to NextAuth + // Listen for Auth events to sync tokens to NextAuth useEffect(() => { if (!auth || !isAuthReady) return undefined; From b9f611402c902645ec4c6911ef1309d4999ad45a Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 14 Jan 2026 17:03:42 +1100 Subject: [PATCH 58/88] no server refresh --- packages/auth-nextjs/src/server/index.ts | 32 ++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-nextjs/src/server/index.ts index aa329160af..77aa5150e4 100644 --- a/packages/auth-nextjs/src/server/index.ts +++ b/packages/auth-nextjs/src/server/index.ts @@ -104,9 +104,8 @@ export function createAuthMiddleware( // Check authentication const session = await auth(); + // No session at all - user is not authenticated, redirect to login if (!session) { - // Build redirect URL with returnTo parameter - // Include search params to preserve query string (e.g., ?tab=settings) const url = new URL(loginUrl, request.url); const returnTo = request.nextUrl.search ? `${pathname}${request.nextUrl.search}` @@ -115,6 +114,23 @@ export function createAuthMiddleware( return NextResponse.redirect(url); } + // Session exists but has error - distinguish between error types: + // - "TokenExpired": Access token expired but user may have valid refresh token. + // Let the page load - client-side Auth will refresh tokens silently. + // - Other errors (e.g., "RefreshTokenError"): Refresh token is invalid/expired. + // User must re-authenticate, redirect to login. + if (session.error && session.error !== 'TokenExpired') { + const url = new URL(loginUrl, request.url); + const returnTo = request.nextUrl.search + ? `${pathname}${request.nextUrl.search}` + : pathname; + url.searchParams.set('returnTo', returnTo); + url.searchParams.set('error', session.error); + return NextResponse.redirect(url); + } + + // Session valid OR TokenExpired (client will refresh) - allow access + return NextResponse.next(); }; } @@ -172,6 +188,18 @@ export function withAuth( throw new Error('Unauthorized: No active session'); } + // Check for session error - distinguish between error types: + // - "TokenExpired": Access token expired. Server can't make authenticated API calls, + // but handler may not need to. If handler needs tokens, it should check session.error. + // Throwing here would break SSR for pages that could work with stale data + client refresh. + // - Other errors (e.g., "RefreshTokenError"): Refresh token is invalid/expired. + // User must re-authenticate, throw to signal unauthorized. + if (session.error && session.error !== 'TokenExpired') { + throw new Error(`Unauthorized: ${session.error}`); + } + + // Pass session to handler - handler can check session.error === 'TokenExpired' + // if it needs to make authenticated API calls and handle accordingly return handler(session, ...args); }; } From 89d47d5df3caa70f29f6315c9e264719a82eb262 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Wed, 14 Jan 2026 18:11:19 +1100 Subject: [PATCH 59/88] utility for ssr --- packages/auth-nextjs/README.md | 216 ++++++++++-- packages/auth-nextjs/src/client/index.ts | 6 + packages/auth-nextjs/src/client/provider.tsx | 124 +++++++ packages/auth-nextjs/src/server/index.ts | 334 +++++++++++++++++++ 4 files changed, 646 insertions(+), 34 deletions(-) diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index 284bcc5af2..d896a67736 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -5,8 +5,8 @@ Next.js App Router authentication integration for Immutable SDK using Auth.js v5 This package bridges `@imtbl/auth` popup-based authentication with Auth.js session management, providing: - Server-side session storage in encrypted JWT cookies -- Automatic token refresh on both server and client -- Full SSR support with `auth()` function +- Client-side token refresh with automatic session sync +- SSR data fetching with automatic fallback when tokens are expired - React hooks for easy client-side authentication - Middleware support for protecting routes @@ -164,6 +164,91 @@ export const config = { }; ``` +## SSR Data Fetching + +This package provides utilities for fetching authenticated data during SSR with automatic client-side fallback when tokens are expired. + +### How It Works + +| Token State | Server Behavior | Client Behavior | +| --------------- | -------------------------------------------- | ------------------------------------- | +| **Valid** | Fetches data → `{ ssr: true, data: {...} }` | Uses server data immediately | +| **Expired** | Skips fetch → `{ ssr: false, data: null }` | Refreshes token, fetches client-side | +| **Auth Error** | Returns `{ authError: "..." }` | Redirect to login | + +### Server Component: `getAuthenticatedData` + +```typescript +// app/dashboard/page.tsx (Server Component) +import { getAuthenticatedData } from "@imtbl/auth-nextjs/server"; +import { auth } from "@/lib/auth"; +import { redirect } from "next/navigation"; +import Dashboard from "./Dashboard"; + +// Define your data fetcher +async function fetchDashboardData(token: string) { + const res = await fetch("https://api.example.com/dashboard", { + headers: { Authorization: `Bearer ${token}` }, + cache: "no-store", + }); + if (!res.ok) throw new Error("Failed to fetch dashboard data"); + return res.json(); +} + +export default async function DashboardPage() { + // Fetch data on server if token is valid, skip if expired + const props = await getAuthenticatedData(auth, fetchDashboardData); + + // Only redirect on auth errors (e.g., refresh token invalid) + if (props.authError) redirect(`/login?error=${props.authError}`); + + // Pass everything to client component - it handles both SSR and CSR cases + return ; +} +``` + +### Client Component: `useHydratedData` + +```typescript +// app/dashboard/Dashboard.tsx (Client Component) +"use client"; + +import { useHydratedData } from "@imtbl/auth-nextjs/client"; +import type { AuthPropsWithData } from "@imtbl/auth-nextjs/server"; + +// Same fetcher as server (or a client-optimized version) +async function fetchDashboardData(token: string) { + const res = await fetch("/api/dashboard", { + headers: { Authorization: `Bearer ${token}` }, + }); + return res.json(); +} + +interface DashboardData { + items: Array<{ id: string; name: string }>; +} + +export default function Dashboard(props: AuthPropsWithData) { + // When ssr=true: uses server-fetched data immediately (no loading state!) + // When ssr=false: refreshes token client-side and fetches data + const { data, isLoading, error, refetch } = useHydratedData( + props, + fetchDashboardData + ); + + if (isLoading) return ; + if (error) return ; + return ; +} +``` + +### Benefits + +- **Optimal UX**: When tokens are valid, data is pre-fetched on the server - no loading spinner on initial render +- **Graceful Degradation**: When tokens expire, the page still loads and data is fetched client-side after token refresh +- **No Race Conditions**: Token refresh only happens on the client, avoiding refresh token rotation conflicts +- **Simple API**: The `useHydratedData` hook handles all the complexity automatically + ## Configuration Options The `ImmutableAuthConfig` object accepts the following properties: @@ -243,7 +328,6 @@ export const { handlers, auth, signIn, signOut } = createImmutableAuth(config); | --------------------------------------- | ------------------------------------------------------------------- | | `createImmutableAuth(config, options?)` | Creates Auth.js instance with `{ handlers, auth, signIn, signOut }` | | `createAuthConfig(config)` | Creates Auth.js config (for advanced use) | -| `refreshAccessToken(token, config)` | Utility to refresh an expired access token | | `isTokenExpired(expires, buffer?)` | Utility to check if a token is expired | **Types:** @@ -264,6 +348,7 @@ export const { handlers, auth, signIn, signOut } = createImmutableAuth(config); | `ImmutableAuthProvider` | React context provider (wraps Auth.js SessionProvider) | | `useImmutableAuth()` | Hook for authentication state and methods (see below) | | `useAccessToken()` | Hook returning `getAccessToken` function | +| `useHydratedData()` | Hook for hydrating server data with client fallback | | `CallbackPage` | Pre-built callback page component for OAuth redirects | #### CallbackPage Props @@ -336,19 +421,33 @@ export default function Callback() { | `user` | `ImmutableUser \| null` | Current user profile (null if not authenticated) | | `session` | `Session \| null` | Full Auth.js session with tokens | | `isLoading` | `boolean` | Whether authentication state is loading | +| `isLoggingIn` | `boolean` | Whether a login is in progress | | `isAuthenticated` | `boolean` | Whether user is authenticated | | `signIn` | `(options?) => Promise` | Sign in with Immutable (opens popup) | | `signOut` | `() => Promise` | Sign out from both Auth.js and Immutable | | `getAccessToken` | `() => Promise` | Get a valid access token (refreshes if needed) | | `auth` | `Auth \| null` | The underlying Auth instance (for advanced use) | +**`useHydratedData()` Return Value:** + +| Property | Type | Description | +| ----------- | ------------------------- | ------------------------------------------ | +| `data` | `T \| null` | The fetched data (server or client) | +| `isLoading` | `boolean` | Whether data is being fetched client-side | +| `error` | `Error \| null` | Error if fetch failed | +| `refetch` | `() => Promise` | Function to manually refetch data | + ### Server Exports (`@imtbl/auth-nextjs/server`) -| Export | Description | -| ----------------------------------- | ------------------------------------------------ | -| `createImmutableAuth` | Re-exported for convenience | -| `createAuthMiddleware(auth, opts?)` | Create middleware for protecting routes | -| `withAuth(auth, handler)` | HOC for protecting Server Actions/Route Handlers | +| Export | Description | +| ----------------------------------- | -------------------------------------------------- | +| `createImmutableAuth` | Re-exported for convenience | +| `getAuthProps(auth)` | Get auth props without data fetching | +| `getAuthenticatedData(auth, fetch)` | Fetch data on server with automatic SSR/CSR switch | +| `getValidSession(auth)` | Get session with detailed status | +| `withServerAuth(auth, render, opts)`| Helper for conditional rendering based on auth | +| `createAuthMiddleware(auth, opts?)` | Create middleware for protecting routes | +| `withAuth(auth, handler)` | HOC for protecting Server Actions/Route Handlers | **`createAuthMiddleware` Options:** @@ -358,42 +457,91 @@ export default function Callback() { | `protectedPaths` | `(string \| RegExp)[]` | - | Paths that require authentication | | `publicPaths` | `(string \| RegExp)[]` | - | Paths to exclude from protection | +**Types:** + +| Type | Description | +| ------------------- | ---------------------------------------------- | +| `AuthProps` | Basic auth props (session, ssr, authError) | +| `AuthPropsWithData` | Auth props with pre-fetched data | +| `ValidSessionResult`| Detailed session status result | + ## How It Works 1. **Login**: User clicks login → `@imtbl/auth` opens popup → tokens returned 2. **Session Creation**: Tokens passed to Auth.js credentials provider → stored in encrypted JWT cookie -3. **Token Refresh**: Auth.js JWT callback automatically refreshes expired tokens using refresh_token -4. **SSR**: `auth()` reads and decrypts cookie, providing full session with tokens -5. **Auto-sync**: Tokens are automatically synced between server (NextAuth session) and client (Auth instance) to handle refresh token rotation +3. **SSR Data Fetching**: Server checks token validity → fetches data if valid, skips if expired +4. **Client Hydration**: `useHydratedData` uses server data if available, or refreshes token and fetches if SSR was skipped +5. **Token Refresh**: Only happens on client via `@imtbl/auth` → new tokens synced to NextAuth session +6. **Auto-sync**: When client refreshes tokens, they're automatically synced to the server session -## Handling Token Refresh Errors +## Token Refresh Architecture -When a refresh token expires or becomes invalid (e.g., after 365 days of inactivity, or revoked from another session), the session will contain an `error` property. You should handle this gracefully: +This package uses a **client-only token refresh** strategy to avoid race conditions with refresh token rotation: -### Server Components +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Token Flow │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ [Server Request] │ +│ │ │ +│ ▼ │ +│ ┌─────────────┐ Valid? ┌──────────────────┐ │ +│ │ Check Token │──────Yes─────▶│ Fetch Data (SSR) │ │ +│ │ Expiry │ └──────────────────┘ │ +│ └─────────────┘ │ +│ │ │ +│ No (Expired) │ +│ │ │ +│ ▼ │ +│ ┌─────────────────┐ │ +│ │ Mark as Expired │ (Don't refresh on server!) │ +│ │ Skip SSR Fetch │ │ +│ └─────────────────┘ │ +│ │ │ +│ ▼ │ +│ [Client Hydration] │ +│ │ │ +│ ▼ │ +│ ┌─────────────────┐ ┌───────────────────┐ │ +│ │ useHydratedData │──ssr:false──▶│ getAccessToken() │ │ +│ └─────────────────┘ │ (triggers refresh) │ │ +│ └───────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────┐ │ +│ │ Sync new tokens │ │ +│ │ to NextAuth │ │ +│ └───────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` -```typescript -// app/profile/page.tsx -import { auth } from "@/lib/auth"; -import { redirect } from "next/navigation"; +### Why Client-Only Refresh? -export default async function ProfilePage() { - const session = await auth(); +Immutable uses **refresh token rotation** - each refresh invalidates the previous refresh token. If both server and client attempt to refresh simultaneously, one will fail with an "invalid_grant" error. By keeping refresh client-only: - // Handle refresh token failure - prompt user to re-login - if (session?.error === "RefreshTokenError") { - redirect("/login?error=session_expired"); - } +- No race conditions between server and client +- Refresh tokens are never exposed to server logs +- Simpler architecture with predictable behavior - if (!session) { - redirect("/login"); - } +## Handling Token Expiration - return

Welcome, {session.user.email}

; -} +### With SSR Data Fetching (Recommended) + +Use `getAuthenticatedData` + `useHydratedData` for automatic handling: + +```typescript +// Server: Fetches if valid, skips if expired +const props = await getAuthenticatedData(auth, fetchData); + +// Client: Uses server data or fetches after refresh +const { data, isLoading } = useHydratedData(props, fetchData); ``` -### Client Components +### Manual Handling + +For components that don't use SSR data fetching: ```typescript "use client"; @@ -401,11 +549,11 @@ export default async function ProfilePage() { import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; export function ProtectedContent() { - const { session, user, signIn, isLoading } = useImmutableAuth(); + const { session, user, signIn, isLoading, getAccessToken } = useImmutableAuth(); if (isLoading) return
Loading...
; - // Handle refresh token failure + // Handle expired tokens or errors if (session?.error) { return (
@@ -425,14 +573,14 @@ export function ProtectedContent() { ### Using getAccessToken -The `getAccessToken()` function will throw an error if the token cannot be refreshed: +The `getAccessToken()` function automatically refreshes expired tokens: ```typescript const { getAccessToken } = useImmutableAuth(); async function fetchData() { try { - const token = await getAccessToken(); + const token = await getAccessToken(); // Refreshes if needed const response = await fetch("/api/data", { headers: { Authorization: `Bearer ${token}` }, }); diff --git a/packages/auth-nextjs/src/client/index.ts b/packages/auth-nextjs/src/client/index.ts index edd5ba9ff5..8b4bc3999c 100644 --- a/packages/auth-nextjs/src/client/index.ts +++ b/packages/auth-nextjs/src/client/index.ts @@ -3,6 +3,9 @@ export { ImmutableAuthProvider, useImmutableAuth, useAccessToken, + useHydratedData, + type UseHydratedDataResult, + type HydratedDataProps, } from './provider'; export { CallbackPage, type CallbackPageProps } from './callback'; @@ -15,6 +18,9 @@ export type { ImmutableUser, } from '../types'; +// Re-export AuthProps and AuthPropsWithData from server for use in client components +export type { AuthProps, AuthPropsWithData } from '../server/index'; + // Re-export login-related types from @imtbl/auth for convenience export type { LoginOptions, DirectLoginOptions } from '@imtbl/auth'; export { MarketingConsentStatus } from '@imtbl/auth'; diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index cf2a61e50f..ac43c1a443 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -405,3 +405,127 @@ export function useAccessToken(): () => Promise { const { getAccessToken } = useImmutableAuth(); return getAccessToken; } + +/** + * Result from useHydratedData hook + */ +export interface UseHydratedDataResult { + data: T | null; + isLoading: boolean; + error: Error | null; + refetch: () => Promise; +} + +/** + * Props for useHydratedData hook - matches AuthPropsWithData from server + */ +export interface HydratedDataProps { + session: Session | null; + ssr: boolean; + data: T | null; + fetchError?: string; + authError?: string; +} + +/** + * Hook for hydrating server-fetched data with automatic client-side fallback. + * + * This is the recommended pattern for components that receive data from `getAuthenticatedData`: + * - When `ssr: true` and `data` exists: Uses pre-fetched server data immediately (no loading state) + * - When `ssr: false`: Refreshes token client-side and fetches data + * - When `fetchError` exists: Retries fetch client-side + * + * @param props - Props from getAuthenticatedData (session, ssr, data, fetchError) + * @param fetcher - Async function that receives access token and returns data (for client-side fallback) + * @returns Object with data, isLoading, error, and refetch function + * + * @example + * ```tsx + * // app/dashboard/page.tsx (Server Component) + * import { getAuthenticatedData } from "@imtbl/auth-nextjs/server"; + * + * export default async function DashboardPage() { + * const props = await getAuthenticatedData(auth, fetchDashboardData); + * if (props.authError) redirect("/login"); + * return ; + * } + * + * // app/dashboard/Dashboard.tsx (Client Component) + * "use client"; + * import { useHydratedData } from "@imtbl/auth-nextjs/client"; + * + * export default function Dashboard(props: AuthPropsWithData) { + * const { data, isLoading, error } = useHydratedData(props, fetchDashboardData); + * + * if (isLoading) return ; + * if (error) return ; + * return ; + * } + * ``` + */ +export function useHydratedData( + props: HydratedDataProps, + fetcher: (accessToken: string) => Promise, +): UseHydratedDataResult { + const { getAccessToken } = useImmutableAuth(); + const { + session, + ssr, + data: serverData, + fetchError, + } = props; + + // Determine if we need to fetch client-side: + // 1. SSR was skipped (token expired) - need to refresh token and fetch + // 2. Server fetch failed - retry on client + // 3. No server data - need to fetch + const needsClientFetch = !ssr || Boolean(fetchError) || serverData === null; + + // Initialize state with server data if available + const [data, setData] = useState(serverData); + const [isLoading, setIsLoading] = useState(needsClientFetch); + const [error, setError] = useState( + fetchError ? new Error(fetchError) : null, + ); + + const fetchData = useCallback(async () => { + setIsLoading(true); + setError(null); + + try { + let token: string; + + if (ssr && session?.accessToken) { + // SSR mode with valid session: use session token + token = session.accessToken; + } else { + // CSR mode: get/refresh token client-side + token = await getAccessToken(); + } + + const result = await fetcher(token); + setData(result); + } catch (err) { + setError(err instanceof Error ? err : new Error(String(err))); + } finally { + setIsLoading(false); + } + }, [session, ssr, fetcher, getAccessToken]); + + // Only fetch on mount if we need client-side data + // Using empty deps intentionally - we only want to run once on mount. + // The needsClientFetch check inside handles the condition. + useEffect(() => { + if (needsClientFetch) { + fetchData(); + } + // eslint-disable-next-line + }, []); + + return { + data, + isLoading, + error, + refetch: fetchData, + }; +} diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-nextjs/src/server/index.ts index 77aa5150e4..0f666d8d0c 100644 --- a/packages/auth-nextjs/src/server/index.ts +++ b/packages/auth-nextjs/src/server/index.ts @@ -7,6 +7,340 @@ import { matchPathPrefix } from '../utils/pathMatch'; // Re-export createImmutableAuth for convenience export { createImmutableAuth, createAuthConfig } from '../index'; +/** + * Result from getValidSession indicating auth state + */ +export type ValidSessionResult = + | { status: 'authenticated'; session: Session } + | { status: 'token_expired'; session: Session } + | { status: 'unauthenticated'; session: null } + | { status: 'error'; session: Session; error: string }; + +/** + * Auth props to pass to components - enables automatic SSR/CSR switching. + * When token is valid, session contains accessToken for immediate use. + * When token is expired, ssr is false and component should fetch client-side. + */ +export interface AuthProps { + /** Session with valid tokens, or null if token expired/unauthenticated */ + session: Session | null; + /** If true, SSR data fetching occurred with valid token */ + ssr: boolean; + /** Auth error that requires user action (not TokenExpired) */ + authError?: string; +} + +/** + * Auth props with pre-fetched data for SSR hydration. + * Extends AuthProps with optional data that was fetched server-side. + */ +export interface AuthPropsWithData extends AuthProps { + /** Pre-fetched data from server (null if SSR was skipped or fetch failed) */ + data: T | null; + /** Error message if server-side fetch failed */ + fetchError?: string; +} + +/** + * Get auth props for passing to Client Components (without data fetching). + * Use this when you want to handle data fetching separately or client-side only. + * + * For SSR data fetching, use `getAuthenticatedData` instead. + * + * @param auth - The auth function from createImmutableAuth + * @returns AuthProps with session and ssr flag + * + * @example + * ```typescript + * const authProps = await getAuthProps(auth); + * if (authProps.authError) redirect("/login"); + * return ; + * ``` + */ +export async function getAuthProps(auth: AuthFunction): Promise { + const session = await auth(); + + // No session - unauthenticated + if (!session) { + return { session: null, ssr: false }; + } + + // Token expired - skip SSR, let client refresh + if (session.error === 'TokenExpired') { + return { session: null, ssr: false }; + } + + // Other error (e.g., RefreshTokenError) - needs user action + if (session.error) { + return { session: null, ssr: false, authError: session.error }; + } + + // Valid session - enable SSR + return { session, ssr: true }; +} + +/** + * Fetch authenticated data on the server with automatic SSR/CSR switching. + * + * This is the recommended pattern for Server Components that need authenticated data: + * - When token is valid: Fetches data server-side, returns with `ssr: true` + * - When token is expired: Skips fetch, returns `ssr: false` for client-side handling + * + * @param auth - The auth function from createImmutableAuth + * @param fetcher - Async function that receives access token and returns data + * @returns AuthPropsWithData containing session, ssr flag, and pre-fetched data + * + * @example + * ```typescript + * // app/dashboard/page.tsx (Server Component) + * import { getAuthenticatedData } from "@imtbl/auth-nextjs/server"; + * import { auth } from "@/lib/auth"; + * import { redirect } from "next/navigation"; + * import Dashboard from "./Dashboard"; + * + * async function fetchDashboardData(token: string) { + * const res = await fetch("https://api.example.com/dashboard", { + * headers: { Authorization: `Bearer ${token}` }, + * }); + * return res.json(); + * } + * + * export default async function DashboardPage() { + * const props = await getAuthenticatedData(auth, fetchDashboardData); + * + * // Only redirect on auth errors (e.g., refresh token invalid) + * if (props.authError) redirect(`/login?error=${props.authError}`); + * + * // Pass everything to client component - it handles both SSR and CSR cases + * return ; + * } + * + * // app/dashboard/Dashboard.tsx (Client Component) + * "use client"; + * import { useHydratedData } from "@imtbl/auth-nextjs/client"; + * import type { AuthPropsWithData } from "@imtbl/auth-nextjs/server"; + * + * async function fetchDashboardData(token: string) { + * const res = await fetch("/api/dashboard", { + * headers: { Authorization: `Bearer ${token}` }, + * }); + * return res.json(); + * } + * + * export default function Dashboard(props: AuthPropsWithData) { + * // When ssr=true: uses server-fetched data immediately (no loading) + * // When ssr=false: refreshes token client-side and fetches data + * const { data, isLoading, error } = useHydratedData(props, fetchDashboardData); + * + * if (isLoading) return ; + * if (error) return ; + * return ; + * } + * ``` + */ +export async function getAuthenticatedData( + auth: AuthFunction, + fetcher: (accessToken: string) => Promise, +): Promise> { + const session = await auth(); + + // No session - unauthenticated + if (!session) { + return { session: null, ssr: false, data: null }; + } + + // Token expired - skip SSR, let client refresh and fetch + if (session.error === 'TokenExpired') { + return { session: null, ssr: false, data: null }; + } + + // Other error (e.g., RefreshTokenError) - needs user action + if (session.error) { + return { + session: null, + ssr: false, + data: null, + authError: session.error, + }; + } + + // Valid session - fetch data server-side + try { + const data = await fetcher(session.accessToken!); + return { session, ssr: true, data }; + } catch (err) { + // Fetch failed but auth is valid - return error for client to handle + const errorMessage = err instanceof Error ? err.message : String(err); + return { + session, + ssr: true, + data: null, + fetchError: errorMessage, + }; + } +} + +/** + * Get session with detailed status for Server Components. + * Use this when you need fine-grained control over different auth states. + * + * @param auth - The auth function from createImmutableAuth + * @returns Object with status and session + * + * @example + * ```typescript + * const result = await getValidSession(auth); + * + * switch (result.status) { + * case 'authenticated': + * return ; + * case 'token_expired': + * return ; // Client will refresh tokens + * case 'unauthenticated': + * redirect('/login'); + * case 'error': + * redirect(`/login?error=${result.error}`); + * } + * ``` + */ +export async function getValidSession(auth: AuthFunction): Promise { + const session = await auth(); + + if (!session) { + return { status: 'unauthenticated', session: null }; + } + + if (!session.error) { + return { status: 'authenticated', session }; + } + + if (session.error === 'TokenExpired') { + return { status: 'token_expired', session }; + } + + return { status: 'error', session, error: session.error }; +} + +/** + * Options for withServerAuth + */ +export interface WithServerAuthOptions { + /** + * Content to render when token is expired. + * This should typically be a Client Component that will refresh tokens and fetch data. + * If not provided, the serverRender function will still be called with the expired session. + */ + onTokenExpired?: TFallback | (() => TFallback); + + /** + * Content to render when user is not authenticated at all. + * If not provided, throws an error. + */ + onUnauthenticated?: TFallback | (() => TFallback); + + /** + * Content to render when there's an auth error (e.g., refresh token invalid). + * If not provided, throws an error. + */ + onError?: TFallback | ((error: string) => TFallback); +} + +/** + * Helper for Server Components that need authenticated data. + * Automatically handles token expiration by rendering a client fallback. + * + * This eliminates the need for manual conditional checks in your Server Components: + * + * @param auth - The auth function from createImmutableAuth + * @param serverRender - Async function that receives valid session and returns JSX + * @param options - Fallback options for different auth states + * @returns The rendered content based on auth state + * + * @example Basic usage with client fallback: + * ```typescript + * // app/dashboard/page.tsx + * import { withServerAuth } from "@imtbl/auth-nextjs/server"; + * import { auth } from "@/lib/auth"; + * import { ClientDashboard } from "./ClientDashboard"; + * + * export default function DashboardPage() { + * return withServerAuth( + * auth, + * async (session) => { + * // This only runs when token is valid + * const data = await fetchDashboardData(session.accessToken); + * return ; + * }, + * { + * // Render client component when token expired - it will refresh & fetch + * onTokenExpired: , + * onUnauthenticated: , + * } + * ); + * } + * ``` + * + * @example With redirect on unauthenticated: + * ```typescript + * import { redirect } from "next/navigation"; + * + * export default function ProtectedPage() { + * return withServerAuth( + * auth, + * async (session) => { + * const data = await fetchProtectedData(session.accessToken); + * return ; + * }, + * { + * onTokenExpired: , + * onUnauthenticated: () => redirect("/login"), + * onError: (error) => redirect(`/login?error=${error}`), + * } + * ); + * } + * ``` + */ +export async function withServerAuth( + auth: AuthFunction, + serverRender: (session: Session) => Promise, + options: WithServerAuthOptions = {}, +): Promise { + const result = await getValidSession(auth); + + switch (result.status) { + case 'authenticated': + return serverRender(result.session); + + case 'token_expired': + if (options.onTokenExpired !== undefined) { + return typeof options.onTokenExpired === 'function' + ? (options.onTokenExpired as () => TFallback)() + : options.onTokenExpired; + } + // If no fallback provided, still call serverRender - handler can check session.error + return serverRender(result.session); + + case 'unauthenticated': + if (options.onUnauthenticated !== undefined) { + return typeof options.onUnauthenticated === 'function' + ? (options.onUnauthenticated as () => TFallback)() + : options.onUnauthenticated; + } + throw new Error('Unauthorized: No active session'); + + case 'error': + if (options.onError !== undefined) { + return typeof options.onError === 'function' + ? (options.onError as (error: string) => TFallback)(result.error) + : options.onError; + } + throw new Error(`Unauthorized: ${result.error}`); + + default: + throw new Error('Unknown auth state'); + } +} + /** * Options for createAuthMiddleware */ From c85f218ff3a1363e41156170737cbbde1e07735b Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 11:13:44 +1100 Subject: [PATCH 60/88] session clearing --- packages/auth-nextjs/README.md | 53 ++++++------ packages/auth-nextjs/src/client/provider.tsx | 39 +++++++-- packages/auth/src/Auth.test.ts | 85 ++++++++++++++++++++ packages/auth/src/Auth.ts | 13 +++ packages/auth/src/index.ts | 1 + packages/auth/src/types.ts | 16 ++++ 6 files changed, 176 insertions(+), 31 deletions(-) diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index d896a67736..5065313eeb 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -170,11 +170,11 @@ This package provides utilities for fetching authenticated data during SSR with ### How It Works -| Token State | Server Behavior | Client Behavior | -| --------------- | -------------------------------------------- | ------------------------------------- | -| **Valid** | Fetches data → `{ ssr: true, data: {...} }` | Uses server data immediately | -| **Expired** | Skips fetch → `{ ssr: false, data: null }` | Refreshes token, fetches client-side | -| **Auth Error** | Returns `{ authError: "..." }` | Redirect to login | +| Token State | Server Behavior | Client Behavior | +| -------------- | ------------------------------------------- | ------------------------------------ | +| **Valid** | Fetches data → `{ ssr: true, data: {...} }` | Uses server data immediately | +| **Expired** | Skips fetch → `{ ssr: false, data: null }` | Refreshes token, fetches client-side | +| **Auth Error** | Returns `{ authError: "..." }` | Redirect to login | ### Server Component: `getAuthenticatedData` @@ -430,24 +430,24 @@ export default function Callback() { **`useHydratedData()` Return Value:** -| Property | Type | Description | -| ----------- | ------------------------- | ------------------------------------------ | -| `data` | `T \| null` | The fetched data (server or client) | -| `isLoading` | `boolean` | Whether data is being fetched client-side | -| `error` | `Error \| null` | Error if fetch failed | -| `refetch` | `() => Promise` | Function to manually refetch data | +| Property | Type | Description | +| ----------- | --------------------- | ----------------------------------------- | +| `data` | `T \| null` | The fetched data (server or client) | +| `isLoading` | `boolean` | Whether data is being fetched client-side | +| `error` | `Error \| null` | Error if fetch failed | +| `refetch` | `() => Promise` | Function to manually refetch data | ### Server Exports (`@imtbl/auth-nextjs/server`) -| Export | Description | -| ----------------------------------- | -------------------------------------------------- | -| `createImmutableAuth` | Re-exported for convenience | -| `getAuthProps(auth)` | Get auth props without data fetching | -| `getAuthenticatedData(auth, fetch)` | Fetch data on server with automatic SSR/CSR switch | -| `getValidSession(auth)` | Get session with detailed status | -| `withServerAuth(auth, render, opts)`| Helper for conditional rendering based on auth | -| `createAuthMiddleware(auth, opts?)` | Create middleware for protecting routes | -| `withAuth(auth, handler)` | HOC for protecting Server Actions/Route Handlers | +| Export | Description | +| ------------------------------------ | -------------------------------------------------- | +| `createImmutableAuth` | Re-exported for convenience | +| `getAuthProps(auth)` | Get auth props without data fetching | +| `getAuthenticatedData(auth, fetch)` | Fetch data on server with automatic SSR/CSR switch | +| `getValidSession(auth)` | Get session with detailed status | +| `withServerAuth(auth, render, opts)` | Helper for conditional rendering based on auth | +| `createAuthMiddleware(auth, opts?)` | Create middleware for protecting routes | +| `withAuth(auth, handler)` | HOC for protecting Server Actions/Route Handlers | **`createAuthMiddleware` Options:** @@ -459,11 +459,11 @@ export default function Callback() { **Types:** -| Type | Description | -| ------------------- | ---------------------------------------------- | -| `AuthProps` | Basic auth props (session, ssr, authError) | -| `AuthPropsWithData` | Auth props with pre-fetched data | -| `ValidSessionResult`| Detailed session status result | +| Type | Description | +| -------------------- | ------------------------------------------ | +| `AuthProps` | Basic auth props (session, ssr, authError) | +| `AuthPropsWithData` | Auth props with pre-fetched data | +| `ValidSessionResult` | Detailed session status result | ## How It Works @@ -549,7 +549,8 @@ For components that don't use SSR data fetching: import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; export function ProtectedContent() { - const { session, user, signIn, isLoading, getAccessToken } = useImmutableAuth(); + const { session, user, signIn, isLoading, getAccessToken } = + useImmutableAuth(); if (isLoading) return
Loading...
; diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index ac43c1a443..f00cf4add4 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -14,7 +14,7 @@ import { } from 'next-auth/react'; import type { Session } from 'next-auth'; import { - Auth, AuthEvents, type User, type LoginOptions, + Auth, AuthEvents, type User, type LoginOptions, type UserRemovedReason, } from '@imtbl/auth'; import type { ImmutableAuthConfig, @@ -152,12 +152,35 @@ function ImmutableAuthInner({ }); }; + // Handle user removal from Auth due to unrecoverable errors + // (e.g., network error during refresh, invalid refresh token). + // When this happens, we must clear the NextAuth session to prevent + // a mismatch where NextAuth thinks user is logged in but Auth SDK has no user. + const handleUserRemoved = async (payload: { reason: UserRemovedReason; error?: string }) => { + // eslint-disable-next-line no-console + console.warn('[auth-nextjs] User removed from Auth SDK:', payload.reason, payload.error); + // Sign out from NextAuth to clear the session cookie + // This prevents the state mismatch where session exists but Auth has no user + await signOut({ redirect: false }); + }; + + // Handle explicit logout from Auth SDK (e.g., if user calls auth.logout() directly) + // This ensures NextAuth session is always in sync with Auth SDK state + const handleLoggedOut = async () => { + // Sign out from NextAuth to clear the session cookie + await signOut({ redirect: false }); + }; + auth.eventEmitter.on(AuthEvents.LOGGED_IN, handleLoggedIn); auth.eventEmitter.on(AuthEvents.TOKEN_REFRESHED, handleTokenRefreshed); + auth.eventEmitter.on(AuthEvents.USER_REMOVED, handleUserRemoved); + auth.eventEmitter.on(AuthEvents.LOGGED_OUT, handleLoggedOut); return () => { auth.eventEmitter.removeListener(AuthEvents.LOGGED_IN, handleLoggedIn); auth.eventEmitter.removeListener(AuthEvents.TOKEN_REFRESHED, handleTokenRefreshed); + auth.eventEmitter.removeListener(AuthEvents.USER_REMOVED, handleUserRemoved); + auth.eventEmitter.removeListener(AuthEvents.LOGGED_OUT, handleLoggedOut); }; }, [auth, isAuthReady, session, updateSession]); @@ -357,11 +380,17 @@ export function useImmutableAuth(): UseImmutableAuthReturn { } } - // Fall back to session token, but check for errors first - // When server-side token refresh fails, the session contains both an error flag - // and the original stale token. We must not return the stale token in this case. + // Fall back to session token, but check for errors first. + // Session errors indicate authentication issues that require user action: + // - "TokenExpired": Access token expired and Auth instance couldn't refresh + // (this happens if localStorage was cleared but session cookie remains) + // - "RefreshTokenError": Refresh token is invalid/expired, need re-login if (session?.error) { - throw new Error(`Token refresh failed: ${session.error}`); + throw new Error( + session.error === 'TokenExpired' + ? 'Session expired. Please log in again.' + : `Authentication error: ${session.error}`, + ); } if (session?.accessToken) { diff --git a/packages/auth/src/Auth.test.ts b/packages/auth/src/Auth.test.ts index f33f600368..0930e1afd4 100644 --- a/packages/auth/src/Auth.test.ts +++ b/packages/auth/src/Auth.test.ts @@ -240,6 +240,91 @@ describe('Auth', () => { expect(user).toBeNull(); expect(mockEventEmitter.emit).not.toHaveBeenCalled(); }); + + it('emits USER_REMOVED event when signinSilent fails with ErrorResponse', async () => { + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn().mockRejectedValue( + Object.assign(new Error('invalid_grant'), { + error: 'invalid_grant', + error_description: 'Unknown or invalid refresh token', + }), + ), + removeUser: jest.fn().mockResolvedValue(undefined), + }; + + // Make the error an instance of ErrorResponse + const { ErrorResponse } = jest.requireActual('oidc-client-ts'); + const errorResponse = new ErrorResponse({ + error: 'invalid_grant', + error_description: 'Unknown or invalid refresh token', + }); + mockUserManager.signinSilent.mockRejectedValue(errorResponse); + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); + + expect(mockEventEmitter.emit).toHaveBeenCalledWith( + AuthEvents.USER_REMOVED, + expect.objectContaining({ + reason: 'refresh_token_invalid', + }), + ); + expect(mockUserManager.removeUser).toHaveBeenCalled(); + }); + + it('emits USER_REMOVED event with network_error reason for network failures', async () => { + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn().mockRejectedValue(new Error('Network error: Failed to fetch')), + removeUser: jest.fn().mockResolvedValue(undefined), + }; + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); + + expect(mockEventEmitter.emit).toHaveBeenCalledWith( + AuthEvents.USER_REMOVED, + expect.objectContaining({ + reason: 'network_error', + }), + ); + expect(mockUserManager.removeUser).toHaveBeenCalled(); + }); + + it('does not emit USER_REMOVED event for ErrorTimeout', async () => { + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn(), + removeUser: jest.fn().mockResolvedValue(undefined), + }; + + // Mock ErrorTimeout + const { ErrorTimeout } = jest.requireActual('oidc-client-ts'); + const timeoutError = new ErrorTimeout('Silent sign-in timed out'); + mockUserManager.signinSilent.mockRejectedValue(timeoutError); + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); + + expect(mockEventEmitter.emit).not.toHaveBeenCalledWith( + AuthEvents.USER_REMOVED, + expect.anything(), + ); + expect(mockUserManager.removeUser).not.toHaveBeenCalled(); + }); }); describe('loginWithPopup', () => { diff --git a/packages/auth/src/Auth.ts b/packages/auth/src/Auth.ts index 60d5597e2e..44704b67d5 100644 --- a/packages/auth/src/Auth.ts +++ b/packages/auth/src/Auth.ts @@ -778,6 +778,7 @@ export class Auth { let passportErrorType = PassportErrorType.AUTHENTICATION_ERROR; let errorMessage = 'Failed to refresh token'; let removeUser = true; + let removeReason: 'refresh_token_invalid' | 'refresh_failed' | 'network_error' | 'unknown' = 'unknown'; if (err instanceof ErrorTimeout) { passportErrorType = PassportErrorType.SILENT_LOGIN_ERROR; @@ -786,13 +787,25 @@ export class Auth { } else if (err instanceof ErrorResponse) { passportErrorType = PassportErrorType.NOT_LOGGED_IN_ERROR; errorMessage = `${errorMessage}: ${err.message || err.error_description}`; + // Check for invalid_grant which indicates refresh token is invalid/expired + removeReason = err.error === 'invalid_grant' ? 'refresh_token_invalid' : 'refresh_failed'; } else if (err instanceof Error) { errorMessage = `${errorMessage}: ${err.message}`; + // Network errors typically have specific messages + removeReason = err.message.toLowerCase().includes('network') ? 'network_error' : 'refresh_failed'; } else if (typeof err === 'string') { errorMessage = `${errorMessage}: ${err}`; + removeReason = 'refresh_failed'; } if (removeUser) { + // Emit USER_REMOVED event BEFORE removing user so consumers can react + // (e.g., auth-nextjs can clear the NextAuth session) + this.eventEmitter.emit(AuthEvents.USER_REMOVED, { + reason: removeReason, + error: errorMessage, + }); + try { await this.userManager.removeUser(); } catch (removeUserError) { diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts index 7c01005990..2ceb2d929d 100644 --- a/packages/auth/src/index.ts +++ b/packages/auth/src/index.ts @@ -20,6 +20,7 @@ export type { IdTokenPayload, PKCEData, AuthEventMap, + UserRemovedReason, } from './types'; export { isUserZkEvm, RollupType, MarketingConsentStatus, AuthEvents, diff --git a/packages/auth/src/types.ts b/packages/auth/src/types.ts index 47f954ab75..e6ddd7667b 100644 --- a/packages/auth/src/types.ts +++ b/packages/auth/src/types.ts @@ -146,8 +146,23 @@ export enum AuthEvents { * the new tokens must be synced to server-side session to prevent race conditions. */ TOKEN_REFRESHED = 'tokenRefreshed', + /** + * Emitted when the user is removed from local storage due to an unrecoverable error + * (e.g., network error during token refresh, invalid refresh token). + * Consumers should sync this state by clearing their session (e.g., NextAuth signOut). + */ + USER_REMOVED = 'userRemoved', } +/** + * Error reason for USER_REMOVED event + */ +export type UserRemovedReason = + | 'refresh_token_invalid' + | 'refresh_failed' + | 'network_error' + | 'unknown'; + /** * Event map for typed event emitter */ @@ -155,4 +170,5 @@ export interface AuthEventMap extends Record { [AuthEvents.LOGGED_OUT]: []; [AuthEvents.LOGGED_IN]: [User]; [AuthEvents.TOKEN_REFRESHED]: [User]; + [AuthEvents.USER_REMOVED]: [{ reason: UserRemovedReason; error?: string }]; } From d0d974959520166bf788405a1005e346f1939b3b Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 13:09:22 +1100 Subject: [PATCH 61/88] remove user for invalid_grant only --- packages/auth/src/Auth.test.ts | 43 ++++++++++++++++++++++++++++------ packages/auth/src/Auth.ts | 23 +++++++++++++----- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/packages/auth/src/Auth.test.ts b/packages/auth/src/Auth.test.ts index 0930e1afd4..ddf8c11a05 100644 --- a/packages/auth/src/Auth.test.ts +++ b/packages/auth/src/Auth.test.ts @@ -241,7 +241,7 @@ describe('Auth', () => { expect(mockEventEmitter.emit).not.toHaveBeenCalled(); }); - it('emits USER_REMOVED event when signinSilent fails with ErrorResponse', async () => { + it('emits USER_REMOVED event ONLY for invalid_grant error (refresh token invalid)', async () => { const auth = Object.create(Auth.prototype) as Auth; const mockEventEmitter = { emit: jest.fn() }; const mockUserManager = { @@ -277,7 +277,7 @@ describe('Auth', () => { expect(mockUserManager.removeUser).toHaveBeenCalled(); }); - it('emits USER_REMOVED event with network_error reason for network failures', async () => { + it('does not emit USER_REMOVED event for network errors (transient)', async () => { const auth = Object.create(Auth.prototype) as Auth; const mockEventEmitter = { emit: jest.fn() }; const mockUserManager = { @@ -291,13 +291,42 @@ describe('Auth', () => { await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); - expect(mockEventEmitter.emit).toHaveBeenCalledWith( + // Network errors are transient - should NOT remove user or emit USER_REMOVED + expect(mockEventEmitter.emit).not.toHaveBeenCalledWith( AuthEvents.USER_REMOVED, - expect.objectContaining({ - reason: 'network_error', - }), + expect.anything(), ); - expect(mockUserManager.removeUser).toHaveBeenCalled(); + expect(mockUserManager.removeUser).not.toHaveBeenCalled(); + }); + + it('does not emit USER_REMOVED event for non-invalid_grant OAuth errors', async () => { + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn(), + removeUser: jest.fn().mockResolvedValue(undefined), + }; + + // Mock ErrorResponse with a different error (not invalid_grant) + const { ErrorResponse } = jest.requireActual('oidc-client-ts'); + const errorResponse = new ErrorResponse({ + error: 'server_error', + error_description: 'Internal server error', + }); + mockUserManager.signinSilent.mockRejectedValue(errorResponse); + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); + + // Non-invalid_grant errors might be transient - should NOT remove user + expect(mockEventEmitter.emit).not.toHaveBeenCalledWith( + AuthEvents.USER_REMOVED, + expect.anything(), + ); + expect(mockUserManager.removeUser).not.toHaveBeenCalled(); }); it('does not emit USER_REMOVED event for ErrorTimeout', async () => { diff --git a/packages/auth/src/Auth.ts b/packages/auth/src/Auth.ts index 44704b67d5..87d80bb0a9 100644 --- a/packages/auth/src/Auth.ts +++ b/packages/auth/src/Auth.ts @@ -777,22 +777,33 @@ export class Auth { } catch (err) { let passportErrorType = PassportErrorType.AUTHENTICATION_ERROR; let errorMessage = 'Failed to refresh token'; - let removeUser = true; + // Default to NOT removing user - only remove for permanent auth errors + let removeUser = false; let removeReason: 'refresh_token_invalid' | 'refresh_failed' | 'network_error' | 'unknown' = 'unknown'; if (err instanceof ErrorTimeout) { + // Timeout is transient - don't remove user passportErrorType = PassportErrorType.SILENT_LOGIN_ERROR; errorMessage = `${errorMessage}: ${err.message}`; - removeUser = false; + removeReason = 'network_error'; } else if (err instanceof ErrorResponse) { passportErrorType = PassportErrorType.NOT_LOGGED_IN_ERROR; errorMessage = `${errorMessage}: ${err.message || err.error_description}`; - // Check for invalid_grant which indicates refresh token is invalid/expired - removeReason = err.error === 'invalid_grant' ? 'refresh_token_invalid' : 'refresh_failed'; + // ONLY remove user for invalid_grant - this means refresh token is truly invalid + // Other OAuth errors might be transient (server issues, rate limiting, etc.) + if (err.error === 'invalid_grant') { + removeUser = true; + removeReason = 'refresh_token_invalid'; + } else { + removeReason = 'refresh_failed'; + } } else if (err instanceof Error) { errorMessage = `${errorMessage}: ${err.message}`; - // Network errors typically have specific messages - removeReason = err.message.toLowerCase().includes('network') ? 'network_error' : 'refresh_failed'; + // Network/fetch errors are transient - don't remove user + removeReason = err.message.toLowerCase().includes('network') + || err.message.toLowerCase().includes('fetch') + ? 'network_error' + : 'refresh_failed'; } else if (typeof err === 'string') { errorMessage = `${errorMessage}: ${err}`; removeReason = 'refresh_failed'; From 0cd44d2b6b7d3169a96bda114c4be0763d8033ba Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 13:14:41 +1100 Subject: [PATCH 62/88] safer removal of user --- packages/auth-nextjs/src/client/provider.tsx | 8 +-- packages/auth/src/Auth.test.ts | 62 +++++++++++++++++++- packages/auth/src/Auth.ts | 39 ++++++++---- packages/auth/src/types.ts | 9 ++- 4 files changed, 96 insertions(+), 22 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index f00cf4add4..61e88589c1 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -152,10 +152,10 @@ function ImmutableAuthInner({ }); }; - // Handle user removal from Auth due to unrecoverable errors - // (e.g., network error during refresh, invalid refresh token). - // When this happens, we must clear the NextAuth session to prevent - // a mismatch where NextAuth thinks user is logged in but Auth SDK has no user. + // Handle user removal from Auth due to permanent auth errors + // (e.g., invalid_grant, login_required - refresh token is truly invalid). + // Transient errors (network, timeout, server errors) do NOT trigger this. + // When this happens, we must clear the NextAuth session to keep them in sync. const handleUserRemoved = async (payload: { reason: UserRemovedReason; error?: string }) => { // eslint-disable-next-line no-console console.warn('[auth-nextjs] User removed from Auth SDK:', payload.reason, payload.error); diff --git a/packages/auth/src/Auth.test.ts b/packages/auth/src/Auth.test.ts index ddf8c11a05..b22f6a4a33 100644 --- a/packages/auth/src/Auth.test.ts +++ b/packages/auth/src/Auth.test.ts @@ -277,6 +277,37 @@ describe('Auth', () => { expect(mockUserManager.removeUser).toHaveBeenCalled(); }); + it('emits USER_REMOVED event for login_required error (permanent)', async () => { + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn(), + removeUser: jest.fn().mockResolvedValue(undefined), + }; + + const { ErrorResponse } = jest.requireActual('oidc-client-ts'); + const errorResponse = new ErrorResponse({ + error: 'login_required', + error_description: 'User must re-authenticate', + }); + mockUserManager.signinSilent.mockRejectedValue(errorResponse); + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); + + // login_required is a permanent error - should remove user + expect(mockEventEmitter.emit).toHaveBeenCalledWith( + AuthEvents.USER_REMOVED, + expect.objectContaining({ + reason: 'refresh_token_invalid', + }), + ); + expect(mockUserManager.removeUser).toHaveBeenCalled(); + }); + it('does not emit USER_REMOVED event for network errors (transient)', async () => { const auth = Object.create(Auth.prototype) as Auth; const mockEventEmitter = { emit: jest.fn() }; @@ -299,7 +330,7 @@ describe('Auth', () => { expect(mockUserManager.removeUser).not.toHaveBeenCalled(); }); - it('does not emit USER_REMOVED event for non-invalid_grant OAuth errors', async () => { + it('does not emit USER_REMOVED event for transient OAuth errors (server_error)', async () => { const auth = Object.create(Auth.prototype) as Auth; const mockEventEmitter = { emit: jest.fn() }; const mockUserManager = { @@ -307,7 +338,8 @@ describe('Auth', () => { removeUser: jest.fn().mockResolvedValue(undefined), }; - // Mock ErrorResponse with a different error (not invalid_grant) + // Mock ErrorResponse with a transient error (server_error) + // These are temporary server issues - safe to keep user logged in const { ErrorResponse } = jest.requireActual('oidc-client-ts'); const errorResponse = new ErrorResponse({ error: 'server_error', @@ -321,7 +353,7 @@ describe('Auth', () => { await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); - // Non-invalid_grant errors might be transient - should NOT remove user + // server_error is a transient error - should NOT remove user expect(mockEventEmitter.emit).not.toHaveBeenCalledWith( AuthEvents.USER_REMOVED, expect.anything(), @@ -329,6 +361,30 @@ describe('Auth', () => { expect(mockUserManager.removeUser).not.toHaveBeenCalled(); }); + it('emits USER_REMOVED event for unknown errors (safer default)', async () => { + const auth = Object.create(Auth.prototype) as Auth; + const mockEventEmitter = { emit: jest.fn() }; + const mockUserManager = { + signinSilent: jest.fn().mockRejectedValue(new Error('Some unknown error')), + removeUser: jest.fn().mockResolvedValue(undefined), + }; + + (auth as any).eventEmitter = mockEventEmitter; + (auth as any).userManager = mockUserManager; + (auth as any).refreshingPromise = null; + + await expect((auth as any).refreshTokenAndUpdatePromise()).rejects.toThrow(); + + // Unknown errors should remove user (safer default) + expect(mockEventEmitter.emit).toHaveBeenCalledWith( + AuthEvents.USER_REMOVED, + expect.objectContaining({ + reason: 'refresh_failed', + }), + ); + expect(mockUserManager.removeUser).toHaveBeenCalled(); + }); + it('does not emit USER_REMOVED event for ErrorTimeout', async () => { const auth = Object.create(Auth.prototype) as Auth; const mockEventEmitter = { emit: jest.fn() }; diff --git a/packages/auth/src/Auth.ts b/packages/auth/src/Auth.ts index 87d80bb0a9..36f3a7e263 100644 --- a/packages/auth/src/Auth.ts +++ b/packages/auth/src/Auth.ts @@ -777,35 +777,48 @@ export class Auth { } catch (err) { let passportErrorType = PassportErrorType.AUTHENTICATION_ERROR; let errorMessage = 'Failed to refresh token'; - // Default to NOT removing user - only remove for permanent auth errors - let removeUser = false; + // Default to REMOVING user - safer to log out on unknown errors + // Only keep user logged in for explicitly known transient errors + let removeUser = true; let removeReason: 'refresh_token_invalid' | 'refresh_failed' | 'network_error' | 'unknown' = 'unknown'; if (err instanceof ErrorTimeout) { - // Timeout is transient - don't remove user + // Timeout is transient - safe to keep user logged in passportErrorType = PassportErrorType.SILENT_LOGIN_ERROR; errorMessage = `${errorMessage}: ${err.message}`; + removeUser = false; removeReason = 'network_error'; } else if (err instanceof ErrorResponse) { passportErrorType = PassportErrorType.NOT_LOGGED_IN_ERROR; errorMessage = `${errorMessage}: ${err.message || err.error_description}`; - // ONLY remove user for invalid_grant - this means refresh token is truly invalid - // Other OAuth errors might be transient (server issues, rate limiting, etc.) - if (err.error === 'invalid_grant') { - removeUser = true; - removeReason = 'refresh_token_invalid'; - } else { + // Check for known transient OAuth errors - safe to keep user logged in + // - server_error: auth server temporary issue + // - temporarily_unavailable: auth server overloaded + const transientErrors = ['server_error', 'temporarily_unavailable']; + if (err.error && transientErrors.includes(err.error)) { + removeUser = false; removeReason = 'refresh_failed'; + } else { + // All other OAuth errors (invalid_grant, login_required, etc.) are permanent + removeReason = 'refresh_token_invalid'; } } else if (err instanceof Error) { errorMessage = `${errorMessage}: ${err.message}`; - // Network/fetch errors are transient - don't remove user - removeReason = err.message.toLowerCase().includes('network') + // Network/fetch errors are transient - safe to keep user logged in + const isNetworkError = err.message.toLowerCase().includes('network') || err.message.toLowerCase().includes('fetch') - ? 'network_error' - : 'refresh_failed'; + || err.message.toLowerCase().includes('failed to fetch') + || err.message.toLowerCase().includes('networkerror'); + if (isNetworkError) { + removeUser = false; + removeReason = 'network_error'; + } else { + // Unknown errors - safer to remove user + removeReason = 'refresh_failed'; + } } else if (typeof err === 'string') { errorMessage = `${errorMessage}: ${err}`; + // Unknown string error - safer to remove user removeReason = 'refresh_failed'; } diff --git a/packages/auth/src/types.ts b/packages/auth/src/types.ts index e6ddd7667b..3175d08b1e 100644 --- a/packages/auth/src/types.ts +++ b/packages/auth/src/types.ts @@ -147,8 +147,13 @@ export enum AuthEvents { */ TOKEN_REFRESHED = 'tokenRefreshed', /** - * Emitted when the user is removed from local storage due to an unrecoverable error - * (e.g., network error during token refresh, invalid refresh token). + * Emitted when the user is removed from local storage due to a permanent auth error. + * Only emitted for errors where the refresh token is truly invalid: + * - invalid_grant: refresh token expired, revoked, or already used + * - login_required: user must re-authenticate + * - consent_required / interaction_required: user must interact with auth server + * + * NOT emitted for transient errors (network, timeout, server errors) - user stays logged in. * Consumers should sync this state by clearing their session (e.g., NextAuth signOut). */ USER_REMOVED = 'userRemoved', From 30f08ebed91d271d2b96fca6cba26cc841ec97c8 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 13:16:03 +1100 Subject: [PATCH 63/88] dead code removal --- packages/auth/src/Auth.ts | 6 +++--- packages/auth/src/types.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/auth/src/Auth.ts b/packages/auth/src/Auth.ts index 36f3a7e263..2a9175a0e3 100644 --- a/packages/auth/src/Auth.ts +++ b/packages/auth/src/Auth.ts @@ -780,14 +780,14 @@ export class Auth { // Default to REMOVING user - safer to log out on unknown errors // Only keep user logged in for explicitly known transient errors let removeUser = true; - let removeReason: 'refresh_token_invalid' | 'refresh_failed' | 'network_error' | 'unknown' = 'unknown'; + let removeReason: 'refresh_token_invalid' | 'refresh_failed' | 'unknown' = 'unknown'; if (err instanceof ErrorTimeout) { // Timeout is transient - safe to keep user logged in + // Note: removeReason is set but never used since removeUser=false passportErrorType = PassportErrorType.SILENT_LOGIN_ERROR; errorMessage = `${errorMessage}: ${err.message}`; removeUser = false; - removeReason = 'network_error'; } else if (err instanceof ErrorResponse) { passportErrorType = PassportErrorType.NOT_LOGGED_IN_ERROR; errorMessage = `${errorMessage}: ${err.message || err.error_description}`; @@ -810,8 +810,8 @@ export class Auth { || err.message.toLowerCase().includes('failed to fetch') || err.message.toLowerCase().includes('networkerror'); if (isNetworkError) { + // Note: removeReason is not set since removeUser=false (event won't be emitted) removeUser = false; - removeReason = 'network_error'; } else { // Unknown errors - safer to remove user removeReason = 'refresh_failed'; diff --git a/packages/auth/src/types.ts b/packages/auth/src/types.ts index 3175d08b1e..93901d58d7 100644 --- a/packages/auth/src/types.ts +++ b/packages/auth/src/types.ts @@ -160,12 +160,16 @@ export enum AuthEvents { } /** - * Error reason for USER_REMOVED event + * Error reason for USER_REMOVED event. + * Note: Network/timeout errors do NOT emit USER_REMOVED (user stays logged in), + * so 'network_error' is not a valid reason. */ export type UserRemovedReason = + // OAuth permanent errors (invalid_grant, login_required, etc.) | 'refresh_token_invalid' + // Unknown non-OAuth errors | 'refresh_failed' - | 'network_error' + // Fallback for truly unknown error types | 'unknown'; /** From d770b466f9ebed32c820787179874445669039ae Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 13:57:55 +1100 Subject: [PATCH 64/88] fix bug --- packages/auth-nextjs/src/client/provider.tsx | 33 ++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 61e88589c1..f06c4037f4 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -496,7 +496,7 @@ export function useHydratedData( props: HydratedDataProps, fetcher: (accessToken: string) => Promise, ): UseHydratedDataResult { - const { getAccessToken } = useImmutableAuth(); + const { getAccessToken, auth } = useImmutableAuth(); const { session, ssr, @@ -517,6 +517,9 @@ export function useHydratedData( fetchError ? new Error(fetchError) : null, ); + // Track if we've already started fetching to prevent duplicate calls + const hasFetchedRef = useRef(false); + const fetchData = useCallback(async () => { setIsLoading(true); setError(null); @@ -541,15 +544,27 @@ export function useHydratedData( } }, [session, ssr, fetcher, getAccessToken]); - // Only fetch on mount if we need client-side data - // Using empty deps intentionally - we only want to run once on mount. - // The needsClientFetch check inside handles the condition. + // Fetch client-side data when needed + // When ssr is false (token expired server-side), we must wait for the Auth instance + // to be initialized before fetching. Auth is created in a parent component's effect + // which runs AFTER this (child) effect due to React's bottom-up effect execution. + // Without waiting for auth, getAccessToken() would find auth === null, fall through + // to check the session (which has an error because token is expired), and throw + // "Session expired" instead of properly refreshing the token via Auth. useEffect(() => { - if (needsClientFetch) { - fetchData(); - } - // eslint-disable-next-line - }, []); + // Already fetched, don't fetch again + if (hasFetchedRef.current) return; + + // Don't need client fetch + if (!needsClientFetch) return; + + // When ssr is false, we need Auth to refresh the expired token. + // Wait for it to initialize before attempting to fetch. + if (!ssr && !auth) return; + + hasFetchedRef.current = true; + fetchData(); + }, [needsClientFetch, ssr, auth, fetchData]); return { data, From d936e9a22e8adc2d664d9b951654c3d868e6e691 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 14:14:17 +1100 Subject: [PATCH 65/88] bug fixes --- packages/auth-nextjs/src/client/provider.tsx | 38 ++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index f06c4037f4..0ec6a81044 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -507,8 +507,10 @@ export function useHydratedData( // Determine if we need to fetch client-side: // 1. SSR was skipped (token expired) - need to refresh token and fetch // 2. Server fetch failed - retry on client - // 3. No server data - need to fetch - const needsClientFetch = !ssr || Boolean(fetchError) || serverData === null; + // Note: We intentionally do NOT check serverData === null here. + // When ssr=true and no fetchError, null is a valid response (e.g., "no results found") + // and should not trigger a client-side refetch. + const needsClientFetch = !ssr || Boolean(fetchError); // Initialize state with server data if available const [data, setData] = useState(serverData); @@ -520,6 +522,38 @@ export function useHydratedData( // Track if we've already started fetching to prevent duplicate calls const hasFetchedRef = useRef(false); + // Track previous props to detect changes (for navigation between routes) + const prevPropsRef = useRef({ serverData, ssr, fetchError }); + + // Sync state when props change (e.g., navigating between routes with same component). + // useState only uses initial value on mount - subsequent prop changes are ignored + // unless we explicitly sync them. + useEffect(() => { + const prevProps = prevPropsRef.current; + const propsChanged = prevProps.serverData !== serverData + || prevProps.ssr !== ssr + || prevProps.fetchError !== fetchError; + + if (propsChanged) { + prevPropsRef.current = { serverData, ssr, fetchError }; + // Reset fetch guard to allow fetching with new props + hasFetchedRef.current = false; + + // Sync state from new props + if (ssr && !fetchError) { + // SSR succeeded: use server data directly (even if null - that's valid) + setData(serverData); + setIsLoading(false); + setError(null); + } else { + // Need client-side fetch: reset state to trigger fetch + setData(null); + setIsLoading(true); + setError(fetchError ? new Error(fetchError) : null); + } + } + }, [serverData, ssr, fetchError]); + const fetchData = useCallback(async () => { setIsLoading(true); setError(null); From 0b620218a486b98531424ebe4b25db282048c0c5 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 15:17:34 +1100 Subject: [PATCH 66/88] add missing arg --- packages/auth-nextjs/src/client/callback.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index ab9bf6d845..60e4159e60 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -104,6 +104,7 @@ export function CallbackPage({ const auth = new Auth({ clientId: config.clientId, redirectUri: config.redirectUri, + popupRedirectUri: config.popupRedirectUri, logoutRedirectUri: config.logoutRedirectUri, audience: config.audience || DEFAULT_AUDIENCE, scope: config.scope || DEFAULT_SCOPE, From 2adba1e01e79627fa8406732e2995196f5daedcc Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 15:46:28 +1100 Subject: [PATCH 67/88] bug fix --- packages/auth-nextjs/src/client/provider.tsx | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 0ec6a81044..34c8bf7ccc 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -498,7 +498,6 @@ export function useHydratedData( ): UseHydratedDataResult { const { getAccessToken, auth } = useImmutableAuth(); const { - session, ssr, data: serverData, fetchError, @@ -559,16 +558,10 @@ export function useHydratedData( setError(null); try { - let token: string; - - if (ssr && session?.accessToken) { - // SSR mode with valid session: use session token - token = session.accessToken; - } else { - // CSR mode: get/refresh token client-side - token = await getAccessToken(); - } - + // Always get the current valid token via getAccessToken() + // This handles token refresh and uses the live session from useSession() + // rather than stale props.session which doesn't update after client-side refresh + const token = await getAccessToken(); const result = await fetcher(token); setData(result); } catch (err) { @@ -576,7 +569,7 @@ export function useHydratedData( } finally { setIsLoading(false); } - }, [session, ssr, fetcher, getAccessToken]); + }, [fetcher, getAccessToken]); // Fetch client-side data when needed // When ssr is false (token expired server-side), we must wait for the Auth instance From 473f34de8afe93b0fc9b9cf1cd9dd79c02be097f Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 16:01:10 +1100 Subject: [PATCH 68/88] fix sample app --- packages/auth-nextjs/src/client/callback.tsx | 22 +++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-nextjs/src/client/callback.tsx index 60e4159e60..196fdfc63d 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-nextjs/src/client/callback.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useEffect, useState, useRef } from 'react'; -import { useRouter, useSearchParams } from 'next/navigation'; +import { useRouter } from 'next/navigation'; import { signIn } from 'next-auth/react'; import { Auth } from '@imtbl/auth'; import type { ImmutableAuthConfig, ImmutableTokenData, ImmutableUser } from '../types'; @@ -13,6 +13,18 @@ import { IMMUTABLE_PROVIDER_ID, } from '../constants'; +/** + * Get search params from the current URL. + * Uses window.location.search directly to avoid issues with useSearchParams() + * in Pages Router, where the hook may not be hydrated during initial render. + */ +function getSearchParams(): URLSearchParams { + if (typeof window === 'undefined') { + return new URLSearchParams(); + } + return new URLSearchParams(window.location.search); +} + export interface CallbackPageProps { /** * Immutable auth configuration @@ -91,13 +103,17 @@ export function CallbackPage({ onError, }: CallbackPageProps) { const router = useRouter(); - const searchParams = useSearchParams(); const [error, setError] = useState(null); // Track whether callback has been processed to prevent double invocation // (React 18 StrictMode runs effects twice, and OAuth codes are single-use) const callbackProcessedRef = useRef(false); useEffect(() => { + // Get search params directly from window.location to ensure compatibility + // with both App Router and Pages Router. useSearchParams() from next/navigation + // has hydration issues in Pages Router where params may be empty initially. + const searchParams = getSearchParams(); + const handleCallback = async () => { try { // Create Auth instance to handle the callback @@ -242,7 +258,7 @@ export function CallbackPage({ onError(errorMessage); } setError(errorMessage); - }, [searchParams, router, config, redirectTo, onSuccess, onError]); + }, [router, config, redirectTo, onSuccess, onError]); if (error) { if (errorComponent) { From 49e09601254a93de67a3fcb7c9244b5f0a34bb27 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 19:39:30 +1100 Subject: [PATCH 69/88] better interface --- packages/auth-nextjs/README.md | 627 ++++++----------------- packages/auth-nextjs/src/client/index.ts | 7 +- packages/auth-nextjs/src/server/index.ts | 189 +++++++ 3 files changed, 364 insertions(+), 459 deletions(-) diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index 5065313eeb..e946c798f2 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -1,20 +1,6 @@ # @imtbl/auth-nextjs -Next.js App Router authentication integration for Immutable SDK using Auth.js v5. - -This package bridges `@imtbl/auth` popup-based authentication with Auth.js session management, providing: - -- Server-side session storage in encrypted JWT cookies -- Client-side token refresh with automatic session sync -- SSR data fetching with automatic fallback when tokens are expired -- React hooks for easy client-side authentication -- Middleware support for protecting routes - -## Requirements - -- Next.js 14+ with App Router -- Auth.js v5 (next-auth@5.x) -- React 18+ +Next.js App Router authentication for Immutable SDK using Auth.js v5. ## Installation @@ -22,72 +8,70 @@ This package bridges `@imtbl/auth` popup-based authentication with Auth.js sessi pnpm add @imtbl/auth-nextjs next-auth@beta ``` -## Quick Start +## Setup + +### 1. Shared Auth Config -### 1. Create Auth Configuration +Create a single config used by all auth components: ```typescript -// lib/auth.ts -import { createImmutableAuth } from "@imtbl/auth-nextjs"; +// lib/auth-config.ts +import type { ImmutableAuthConfig } from "@imtbl/auth-nextjs"; -const config = { +export const authConfig: ImmutableAuthConfig = { clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + // OAuth callback URL - where Immutable redirects after login redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + // Optional: for popup-based login (defaults to redirectUri if not set) + // popupRedirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, }; +``` + +### 2. Server Auth (createImmutableAuth) -export const { handlers, auth, signIn, signOut } = createImmutableAuth(config); +```typescript +// lib/auth.ts +import { createImmutableAuth } from "@imtbl/auth-nextjs"; +import { authConfig } from "./auth-config"; + +export const { handlers, auth } = createImmutableAuth(authConfig); ``` -### 2. Set Up Auth API Route +### 3. API Route ```typescript // app/api/auth/[...nextauth]/route.ts import { handlers } from "@/lib/auth"; - export const { GET, POST } = handlers; ``` -### 3. Create Callback Page +### 4. Callback Page + +The callback page handles the OAuth redirect. The `redirectUri` in config must match this page's URL. ```typescript // app/callback/page.tsx "use client"; - import { CallbackPage } from "@imtbl/auth-nextjs/client"; - -const config = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, -}; +import { authConfig } from "@/lib/auth-config"; export default function Callback() { - return ; + return ( + + ); } ``` -See [CallbackPage Props](#callbackpage-props) for all available options. - -### 4. Add Provider to Layout +### 5. Provider ```typescript -// app/providers.tsx -"use client"; - -import { ImmutableAuthProvider } from "@imtbl/auth-nextjs/client"; - -const config = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, -}; - -export function Providers({ children }: { children: React.ReactNode }) { - return ( - {children} - ); -} - // app/layout.tsx -import { Providers } from "./providers"; +import { ImmutableAuthProvider } from "@imtbl/auth-nextjs/client"; +import { authConfig } from "@/lib/auth-config"; export default function RootLayout({ children, @@ -97,40 +81,59 @@ export default function RootLayout({ return ( - {children} + + {children} + ); } ``` -### 5. Use in Components +## Usage Examples + +### Client Component - Login/Logout ```typescript -// app/components/LoginButton.tsx "use client"; - import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; export function LoginButton() { - const { user, isLoading, signIn, signOut } = useImmutableAuth(); + const { user, isLoading, isLoggingIn, signIn, signOut } = useImmutableAuth(); if (isLoading) return
Loading...
; + if (user) return ; + + return ( + + ); +} +``` - if (user) { - return ( -
- Welcome, {user.email} - -
- ); +### Client Component - API Calls + +```typescript +"use client"; +import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; + +export function FetchData() { + const { getAccessToken } = useImmutableAuth(); + + async function handleFetch() { + const token = await getAccessToken(); // Auto-refreshes if expired + const res = await fetch("/api/data", { + headers: { Authorization: `Bearer ${token}` }, + }); + return res.json(); } - return ; + return ; } ``` -### 6. Access Session in Server Components +### Server Component - Basic ```typescript // app/profile/page.tsx @@ -139,137 +142,104 @@ import { redirect } from "next/navigation"; export default async function ProfilePage() { const session = await auth(); - - if (!session) { - redirect("/login"); - } - + if (!session) redirect("/login"); return

Welcome, {session.user.email}

; } ``` -### 7. Protect Routes with Middleware (Optional) +### Server Component - SSR Data Fetching (Recommended) ```typescript -// middleware.ts -import { createAuthMiddleware } from "@imtbl/auth-nextjs/server"; -import { auth } from "@/lib/auth"; +// lib/auth-server.ts +import { createProtectedFetchers } from "@imtbl/auth-nextjs/server"; +import { auth } from "./auth"; +import { redirect } from "next/navigation"; -export default createAuthMiddleware(auth, { - loginUrl: "/login", +// Define auth error handling once +export const { getData } = createProtectedFetchers(auth, (error) => { + redirect(`/login?error=${encodeURIComponent(error)}`); }); - -export const config = { - matcher: ["/dashboard/:path*", "/profile/:path*"], -}; ``` -## SSR Data Fetching - -This package provides utilities for fetching authenticated data during SSR with automatic client-side fallback when tokens are expired. - -### How It Works - -| Token State | Server Behavior | Client Behavior | -| -------------- | ------------------------------------------- | ------------------------------------ | -| **Valid** | Fetches data → `{ ssr: true, data: {...} }` | Uses server data immediately | -| **Expired** | Skips fetch → `{ ssr: false, data: null }` | Refreshes token, fetches client-side | -| **Auth Error** | Returns `{ authError: "..." }` | Redirect to login | - -### Server Component: `getAuthenticatedData` - ```typescript -// app/dashboard/page.tsx (Server Component) -import { getAuthenticatedData } from "@imtbl/auth-nextjs/server"; -import { auth } from "@/lib/auth"; -import { redirect } from "next/navigation"; -import Dashboard from "./Dashboard"; +// lib/fetchers.ts - Shared fetcher for server & client +export interface DashboardData { + stats: { views: number }; +} -// Define your data fetcher -async function fetchDashboardData(token: string) { +export async function fetchDashboard(token: string): Promise { const res = await fetch("https://api.example.com/dashboard", { headers: { Authorization: `Bearer ${token}` }, - cache: "no-store", }); - if (!res.ok) throw new Error("Failed to fetch dashboard data"); return res.json(); } +``` -export default async function DashboardPage() { - // Fetch data on server if token is valid, skip if expired - const props = await getAuthenticatedData(auth, fetchDashboardData); - - // Only redirect on auth errors (e.g., refresh token invalid) - if (props.authError) redirect(`/login?error=${props.authError}`); +```typescript +// app/dashboard/page.tsx (Server Component) +import { getData } from "@/lib/auth-server"; +import { fetchDashboard } from "@/lib/fetchers"; +import Dashboard from "./Dashboard"; - // Pass everything to client component - it handles both SSR and CSR cases +export default async function DashboardPage() { + const props = await getData(fetchDashboard); // Auth errors redirect automatically return ; } ``` -### Client Component: `useHydratedData` - ```typescript // app/dashboard/Dashboard.tsx (Client Component) "use client"; +import { + useHydratedData, + type ProtectedAuthPropsWithData, +} from "@imtbl/auth-nextjs/client"; +import { fetchDashboard, type DashboardData } from "@/lib/fetchers"; + +export default function Dashboard( + props: ProtectedAuthPropsWithData +) { + // ssr=true: uses server data immediately + // ssr=false: refreshes token client-side, then fetches + const { data, isLoading, error } = useHydratedData(props, fetchDashboard); -import { useHydratedData } from "@imtbl/auth-nextjs/client"; -import type { AuthPropsWithData } from "@imtbl/auth-nextjs/server"; - -// Same fetcher as server (or a client-optimized version) -async function fetchDashboardData(token: string) { - const res = await fetch("/api/dashboard", { - headers: { Authorization: `Bearer ${token}` }, - }); - return res.json(); -} - -interface DashboardData { - items: Array<{ id: string; name: string }>; -} - -export default function Dashboard(props: AuthPropsWithData) { - // When ssr=true: uses server-fetched data immediately (no loading state!) - // When ssr=false: refreshes token client-side and fetches data - const { data, isLoading, error, refetch } = useHydratedData( - props, - fetchDashboardData - ); - - if (isLoading) return ; - if (error) return ; - return ; + if (isLoading) return
Loading...
; + if (error) return
Error: {error}
; + return
Views: {data!.stats.views}
; } ``` -### Benefits +### Middleware - Route Protection -- **Optimal UX**: When tokens are valid, data is pre-fetched on the server - no loading spinner on initial render -- **Graceful Degradation**: When tokens expire, the page still loads and data is fetched client-side after token refresh -- **No Race Conditions**: Token refresh only happens on the client, avoiding refresh token rotation conflicts -- **Simple API**: The `useHydratedData` hook handles all the complexity automatically +```typescript +// middleware.ts +import { createAuthMiddleware } from "@imtbl/auth-nextjs/server"; +import { auth } from "@/lib/auth"; -## Configuration Options +export default createAuthMiddleware(auth, { loginUrl: "/login" }); -The `ImmutableAuthConfig` object accepts the following properties: +export const config = { + matcher: ["/dashboard/:path*", "/profile/:path*"], +}; +``` -| Property | Type | Required | Default | Description | -| ---------------------- | -------- | -------- | ------------------------------------------------ | -------------------------------------------------------------- | -| `clientId` | `string` | Yes | - | Immutable OAuth client ID | -| `redirectUri` | `string` | Yes | - | OAuth callback redirect URI (for redirect flow) | -| `popupRedirectUri` | `string` | No | `redirectUri` | OAuth callback redirect URI for popup flow | -| `logoutRedirectUri` | `string` | No | - | Where to redirect after logout | -| `audience` | `string` | No | `"platform_api"` | OAuth audience | -| `scope` | `string` | No | `"openid profile email offline_access transact"` | OAuth scopes | -| `authenticationDomain` | `string` | No | `"https://auth.immutable.com"` | Authentication domain | -| `passportDomain` | `string` | No | `"https://passport.immutable.com"` | Passport domain for transaction confirmations (see note below) | +### Server Action - Protected -> **Important:** The `passportDomain` must match your target environment for transaction signing to work correctly: -> -> - **Production:** `https://passport.immutable.com` (default) -> - **Sandbox:** `https://passport.sandbox.immutable.com` -> -> If you're using the sandbox environment, you must explicitly set `passportDomain` to the sandbox URL. +```typescript +// app/actions.ts +"use server"; +import { withAuth } from "@imtbl/auth-nextjs/server"; +import { auth } from "@/lib/auth"; + +export const updateProfile = withAuth( + auth, + async (session, formData: FormData) => { + // session.user, session.accessToken available + const name = formData.get("name"); + // ... update logic + } +); +``` ## Environment Variables @@ -277,318 +247,59 @@ The `ImmutableAuthConfig` object accepts the following properties: # .env.local NEXT_PUBLIC_IMMUTABLE_CLIENT_ID=your-client-id NEXT_PUBLIC_BASE_URL=http://localhost:3000 - -# Required by Auth.js for cookie encryption -AUTH_SECRET=generate-with-openssl-rand-base64-32 -``` - -Generate a secret: - -```bash -openssl rand -base64 32 -``` - -## Sandbox vs Production Configuration - -When developing or testing, you'll typically use the **Sandbox** environment. Make sure to configure `passportDomain` correctly: - -```typescript -// lib/auth.ts - -// For SANDBOX environment -const sandboxConfig = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, - passportDomain: "https://passport.sandbox.immutable.com", // Required for sandbox! -}; - -// For PRODUCTION environment -const productionConfig = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, - // passportDomain defaults to 'https://passport.immutable.com' -}; - -// Use environment variable to switch between configs -const config = - process.env.NEXT_PUBLIC_IMMUTABLE_ENV === "production" - ? productionConfig - : sandboxConfig; - -export const { handlers, auth, signIn, signOut } = createImmutableAuth(config); -``` - -> **Note:** The `passportDomain` is used for transaction confirmation popups. If not set correctly for your environment, transaction signing will not work as expected. - -## API Reference - -### Main Exports (`@imtbl/auth-nextjs`) - -| Export | Description | -| --------------------------------------- | ------------------------------------------------------------------- | -| `createImmutableAuth(config, options?)` | Creates Auth.js instance with `{ handlers, auth, signIn, signOut }` | -| `createAuthConfig(config)` | Creates Auth.js config (for advanced use) | -| `isTokenExpired(expires, buffer?)` | Utility to check if a token is expired | - -**Types:** - -| Type | Description | -| ------------------------ | ----------------------------------------- | -| `ImmutableAuthConfig` | Configuration options | -| `ImmutableAuthOverrides` | Auth.js options override type | -| `ImmutableAuthResult` | Return type of createImmutableAuth | -| `ImmutableUser` | User profile type | -| `ImmutableTokenData` | Token data passed to credentials provider | -| `ZkEvmInfo` | zkEVM wallet information type | - -### Client Exports (`@imtbl/auth-nextjs/client`) - -| Export | Description | -| ----------------------- | ------------------------------------------------------ | -| `ImmutableAuthProvider` | React context provider (wraps Auth.js SessionProvider) | -| `useImmutableAuth()` | Hook for authentication state and methods (see below) | -| `useAccessToken()` | Hook returning `getAccessToken` function | -| `useHydratedData()` | Hook for hydrating server data with client fallback | -| `CallbackPage` | Pre-built callback page component for OAuth redirects | - -#### CallbackPage Props - -| Prop | Type | Default | Description | -| ------------------ | ----------------------------------------------------- | ------- | ------------------------------------------------------------------ | -| `config` | `ImmutableAuthConfig` | - | Required. Immutable auth configuration | -| `redirectTo` | `string \| ((user: ImmutableUser) => string \| void)` | `"/"` | Where to redirect after successful auth (supports dynamic routing) | -| `loadingComponent` | `React.ReactElement \| null` | `null` | Custom loading UI while processing authentication | -| `errorComponent` | `(error: string) => React.ReactElement \| null` | - | Custom error UI component | -| `onSuccess` | `(user: ImmutableUser) => void \| Promise` | - | Callback fired after successful authentication | -| `onError` | `(error: string) => void` | - | Callback fired when authentication fails | - -**Example with all props:** - -```tsx -// app/callback/page.tsx -"use client"; - -import { CallbackPage } from "@imtbl/auth-nextjs/client"; -import { Spinner } from "@/components/ui/spinner"; - -const config = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, -}; - -export default function Callback() { - return ( - { - if (user.email?.endsWith("@admin.com")) return "/admin"; - return "/dashboard"; - }} - // Custom loading UI - loadingComponent={ -
- - Completing authentication... -
- } - // Custom error UI - errorComponent={(error) => ( -
-

Authentication Error

-

{error}

- Return Home -
- )} - // Success callback for analytics - onSuccess={async (user) => { - await analytics.track("login_success", { userId: user.sub }); - }} - // Error callback for logging - onError={(error) => { - console.error("Auth failed:", error); - Sentry.captureMessage(error); - }} - /> - ); -} +AUTH_SECRET=generate-with-openssl-rand-base64-32 # openssl rand -base64 32 ``` -**`useImmutableAuth()` Return Value:** - -| Property | Type | Description | -| ----------------- | ----------------------- | ------------------------------------------------ | -| `user` | `ImmutableUser \| null` | Current user profile (null if not authenticated) | -| `session` | `Session \| null` | Full Auth.js session with tokens | -| `isLoading` | `boolean` | Whether authentication state is loading | -| `isLoggingIn` | `boolean` | Whether a login is in progress | -| `isAuthenticated` | `boolean` | Whether user is authenticated | -| `signIn` | `(options?) => Promise` | Sign in with Immutable (opens popup) | -| `signOut` | `() => Promise` | Sign out from both Auth.js and Immutable | -| `getAccessToken` | `() => Promise` | Get a valid access token (refreshes if needed) | -| `auth` | `Auth \| null` | The underlying Auth instance (for advanced use) | - -**`useHydratedData()` Return Value:** - -| Property | Type | Description | -| ----------- | --------------------- | ----------------------------------------- | -| `data` | `T \| null` | The fetched data (server or client) | -| `isLoading` | `boolean` | Whether data is being fetched client-side | -| `error` | `Error \| null` | Error if fetch failed | -| `refetch` | `() => Promise` | Function to manually refetch data | - -### Server Exports (`@imtbl/auth-nextjs/server`) - -| Export | Description | -| ------------------------------------ | -------------------------------------------------- | -| `createImmutableAuth` | Re-exported for convenience | -| `getAuthProps(auth)` | Get auth props without data fetching | -| `getAuthenticatedData(auth, fetch)` | Fetch data on server with automatic SSR/CSR switch | -| `getValidSession(auth)` | Get session with detailed status | -| `withServerAuth(auth, render, opts)` | Helper for conditional rendering based on auth | -| `createAuthMiddleware(auth, opts?)` | Create middleware for protecting routes | -| `withAuth(auth, handler)` | HOC for protecting Server Actions/Route Handlers | - -**`createAuthMiddleware` Options:** - -| Option | Type | Default | Description | -| ---------------- | ---------------------- | ---------- | -------------------------------------- | -| `loginUrl` | `string` | `"/login"` | URL to redirect when not authenticated | -| `protectedPaths` | `(string \| RegExp)[]` | - | Paths that require authentication | -| `publicPaths` | `(string \| RegExp)[]` | - | Paths to exclude from protection | - -**Types:** - -| Type | Description | -| -------------------- | ------------------------------------------ | -| `AuthProps` | Basic auth props (session, ssr, authError) | -| `AuthPropsWithData` | Auth props with pre-fetched data | -| `ValidSessionResult` | Detailed session status result | - -## How It Works - -1. **Login**: User clicks login → `@imtbl/auth` opens popup → tokens returned -2. **Session Creation**: Tokens passed to Auth.js credentials provider → stored in encrypted JWT cookie -3. **SSR Data Fetching**: Server checks token validity → fetches data if valid, skips if expired -4. **Client Hydration**: `useHydratedData` uses server data if available, or refreshes token and fetches if SSR was skipped -5. **Token Refresh**: Only happens on client via `@imtbl/auth` → new tokens synced to NextAuth session -6. **Auto-sync**: When client refreshes tokens, they're automatically synced to the server session - -## Token Refresh Architecture - -This package uses a **client-only token refresh** strategy to avoid race conditions with refresh token rotation: +## Tips & Caveats -``` -┌─────────────────────────────────────────────────────────────────┐ -│ Token Flow │ -├─────────────────────────────────────────────────────────────────┤ -│ │ -│ [Server Request] │ -│ │ │ -│ ▼ │ -│ ┌─────────────┐ Valid? ┌──────────────────┐ │ -│ │ Check Token │──────Yes─────▶│ Fetch Data (SSR) │ │ -│ │ Expiry │ └──────────────────┘ │ -│ └─────────────┘ │ -│ │ │ -│ No (Expired) │ -│ │ │ -│ ▼ │ -│ ┌─────────────────┐ │ -│ │ Mark as Expired │ (Don't refresh on server!) │ -│ │ Skip SSR Fetch │ │ -│ └─────────────────┘ │ -│ │ │ -│ ▼ │ -│ [Client Hydration] │ -│ │ │ -│ ▼ │ -│ ┌─────────────────┐ ┌───────────────────┐ │ -│ │ useHydratedData │──ssr:false──▶│ getAccessToken() │ │ -│ └─────────────────┘ │ (triggers refresh) │ │ -│ └───────────────────┘ │ -│ │ │ -│ ▼ │ -│ ┌───────────────────┐ │ -│ │ Sync new tokens │ │ -│ │ to NextAuth │ │ -│ └───────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────────┘ -``` +### Redirect URIs Explained -### Why Client-Only Refresh? +| Config Property | Purpose | +| --------------- | ------- | +| `redirectUri` | OAuth callback URL - where Immutable redirects after authentication (must match your callback page URL) | +| `popupRedirectUri` | Same as `redirectUri` but for popup login flow. Defaults to `redirectUri` if not set | +| `redirectTo` (CallbackPage prop) | Where to navigate the user AFTER authentication completes (e.g., `/dashboard`) | -Immutable uses **refresh token rotation** - each refresh invalidates the previous refresh token. If both server and client attempt to refresh simultaneously, one will fail with an "invalid_grant" error. By keeping refresh client-only: +### Login Flows -- No race conditions between server and client -- Refresh tokens are never exposed to server logs -- Simpler architecture with predictable behavior +- **Popup (default)**: `signIn()` opens a popup window. Uses `popupRedirectUri` (or `redirectUri`) +- **Redirect**: `signIn({ useCachedSession: false, useRedirectFlow: true })` does a full page redirect -## Handling Token Expiration +Both flows redirect to your callback page, which completes the auth and navigates to `redirectTo`. -### With SSR Data Fetching (Recommended) +### Sandbox Environment -Use `getAuthenticatedData` + `useHydratedData` for automatic handling: +For sandbox, set `passportDomain` explicitly: ```typescript -// Server: Fetches if valid, skips if expired -const props = await getAuthenticatedData(auth, fetchData); - -// Client: Uses server data or fetches after refresh -const { data, isLoading } = useHydratedData(props, fetchData); +export const authConfig: ImmutableAuthConfig = { + clientId: "...", + redirectUri: "...", + passportDomain: "https://passport.sandbox.immutable.com", // Required for sandbox +}; ``` -### Manual Handling - -For components that don't use SSR data fetching: - -```typescript -"use client"; - -import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; - -export function ProtectedContent() { - const { session, user, signIn, isLoading, getAccessToken } = - useImmutableAuth(); - - if (isLoading) return
Loading...
; - - // Handle expired tokens or errors - if (session?.error) { - return ( -
-

Your session has expired. Please log in again.

- -
- ); - } - - if (!user) { - return ; - } +### Token Refresh - return
Welcome, {user.email}
; -} -``` +- Tokens are refreshed **client-side only** to avoid race conditions with refresh token rotation +- `getAccessToken()` automatically refreshes expired tokens +- `useHydratedData` handles SSR/CSR switching automatically - if server token is expired, it fetches client-side after refresh -### Using getAccessToken +### SSR Data Fetching -The `getAccessToken()` function automatically refreshes expired tokens: +| Token State | Server | Client | +| ----------- | -------------------------- | ------------------------ | +| Valid | Fetches data (`ssr: true`) | Uses server data | +| Expired | Skips fetch (`ssr: false`) | Refreshes token, fetches | +| Auth Error | Redirects via handler | - | -```typescript -const { getAccessToken } = useImmutableAuth(); +### CallbackPage Props -async function fetchData() { - try { - const token = await getAccessToken(); // Refreshes if needed - const response = await fetch("/api/data", { - headers: { Authorization: `Bearer ${token}` }, - }); - return response.json(); - } catch (error) { - // Token refresh failed - redirect to login or show error - console.error("Failed to get access token:", error); - } -} -``` +| Prop | Description | +| ------------------ | ----------------------------------------------------------- | +| `config` | Required. Auth configuration | +| `redirectTo` | Where to redirect after auth (string or `(user) => string`) | +| `loadingComponent` | Custom loading UI | +| `errorComponent` | Custom error UI `(error) => ReactElement` | +| `onSuccess` | Callback after successful auth | +| `onError` | Callback when auth fails | diff --git a/packages/auth-nextjs/src/client/index.ts b/packages/auth-nextjs/src/client/index.ts index 8b4bc3999c..61d4f85feb 100644 --- a/packages/auth-nextjs/src/client/index.ts +++ b/packages/auth-nextjs/src/client/index.ts @@ -19,7 +19,12 @@ export type { } from '../types'; // Re-export AuthProps and AuthPropsWithData from server for use in client components -export type { AuthProps, AuthPropsWithData } from '../server/index'; +export type { + AuthProps, + AuthPropsWithData, + ProtectedAuthProps, + ProtectedAuthPropsWithData, +} from '../server/index'; // Re-export login-related types from @imtbl/auth for convenience export type { LoginOptions, DirectLoginOptions } from '@imtbl/auth'; diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-nextjs/src/server/index.ts index 0f666d8d0c..a734dd99a2 100644 --- a/packages/auth-nextjs/src/server/index.ts +++ b/packages/auth-nextjs/src/server/index.ts @@ -41,6 +41,28 @@ export interface AuthPropsWithData extends AuthProps { fetchError?: string; } +/** + * Auth props without the authError field. + * Used when auth error handling is automatic via onAuthError callback. + */ +export interface ProtectedAuthProps { + /** Session with valid tokens, or null if token expired/unauthenticated */ + session: Session | null; + /** If true, SSR data fetching occurred with valid token */ + ssr: boolean; +} + +/** + * Protected auth props with pre-fetched data. + * Used when auth error handling is automatic via onAuthError callback. + */ +export interface ProtectedAuthPropsWithData extends ProtectedAuthProps { + /** Pre-fetched data from server (null if SSR was skipped or fetch failed) */ + data: T | null; + /** Error message if server-side fetch failed */ + fetchError?: string; +} + /** * Get auth props for passing to Client Components (without data fetching). * Use this when you want to handle data fetching separately or client-side only. @@ -221,6 +243,173 @@ export async function getValidSession(auth: AuthFunction): Promise never; + +/** + * Create a protected data fetcher with automatic auth error handling. + * + * This eliminates the need to check `authError` on every page. Define the error + * handling once, and all pages using this fetcher will automatically redirect + * on auth errors. + * + * @param auth - The auth function from createImmutableAuth + * @param onAuthError - Handler called when there's an auth error (should redirect or throw) + * @returns A function to fetch protected data without needing authError checks + * + * @example + * ```typescript + * // lib/auth-server.ts + * import { createProtectedDataFetcher } from "@imtbl/auth-nextjs/server"; + * import { auth } from "./auth"; + * import { redirect } from "next/navigation"; + * + * export const getProtectedData = createProtectedDataFetcher(auth, (error) => { + * redirect(`/login?error=${encodeURIComponent(error)}`); + * }); + * + * // app/dashboard/page.tsx - No authError check needed! + * export default async function DashboardPage() { + * const props = await getProtectedData(fetchDashboardData); + * return ; // authError is handled automatically + * } + * ``` + */ +export function createProtectedDataFetcher( + auth: AuthFunction, + onAuthError: AuthErrorHandler, +): (fetcher: (accessToken: string) => Promise) => Promise> { + return async function getProtectedData( + fetcher: (accessToken: string) => Promise, + ): Promise> { + const result = await getAuthenticatedData(auth, fetcher); + + // If there's an auth error, call the handler (which should redirect/throw) + if (result.authError) { + onAuthError(result.authError); + // TypeScript knows this is unreachable due to `never` return type + } + + // Remove authError from the result since it's handled + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { authError: handledAuthError, ...props } = result; + return props; + }; +} + +/** + * Create auth props getter with automatic auth error handling. + * + * Similar to createProtectedDataFetcher but for cases where you don't need + * server-side data fetching. + * + * @param auth - The auth function from createImmutableAuth + * @param onAuthError - Handler called when there's an auth error (should redirect or throw) + * @returns A function to get auth props without needing authError checks + * + * @example + * ```typescript + * // lib/auth-server.ts + * export const getProtectedAuthProps = createProtectedAuthProps(auth, (error) => { + * redirect(`/login?error=${encodeURIComponent(error)}`); + * }); + * + * // app/profile/page.tsx + * export default async function ProfilePage() { + * const props = await getProtectedAuthProps(); + * return ; + * } + * ``` + */ +export function createProtectedAuthProps( + auth: AuthFunction, + onAuthError: AuthErrorHandler, +): () => Promise { + return async function getProtectedAuth(): Promise { + const result = await getAuthProps(auth); + + if (result.authError) { + onAuthError(result.authError); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { authError: handledAuthError, ...props } = result; + return props; + }; +} + +/** + * Result of createProtectedFetchers + */ +export interface ProtectedFetchers { + /** + * Get auth props with automatic auth error handling. + * No data fetching - use when you only need session/auth state. + */ + getAuthProps: () => Promise; + /** + * Fetch authenticated data with automatic auth error handling. + * Use for SSR data fetching with automatic fallback. + */ + getData: (fetcher: (accessToken: string) => Promise) => Promise>; +} + +/** + * Create protected fetchers with centralized auth error handling. + * + * This is the recommended way to set up auth error handling once and use it + * across all protected pages. Define your error handler once, then use the + * returned functions without needing to check authError on each page. + * + * @param auth - The auth function from createImmutableAuth + * @param onAuthError - Handler called when there's an auth error (should redirect or throw) + * @returns Object with getAuthProps and getData functions + * + * @example + * ```typescript + * // lib/auth-server.ts + * import { createProtectedFetchers } from "@imtbl/auth-nextjs/server"; + * import { auth } from "./auth"; + * import { redirect } from "next/navigation"; + * + * // Define auth error handling ONCE + * export const { getAuthProps, getData } = createProtectedFetchers(auth, (error) => { + * redirect(`/login?error=${encodeURIComponent(error)}`); + * }); + * + * // app/dashboard/page.tsx - Clean, no boilerplate! + * import { getData } from "@/lib/auth-server"; + * + * export default async function DashboardPage() { + * const props = await getData(fetchDashboardData); + * return ; + * } + * + * // app/profile/page.tsx - Works for auth-only pages too + * import { getAuthProps } from "@/lib/auth-server"; + * + * export default async function ProfilePage() { + * const props = await getAuthProps(); + * return ; + * } + * ``` + */ +export function createProtectedFetchers( + auth: AuthFunction, + onAuthError: AuthErrorHandler, +): ProtectedFetchers { + return { + getAuthProps: createProtectedAuthProps(auth, onAuthError), + getData: createProtectedDataFetcher(auth, onAuthError), + }; +} + /** * Options for withServerAuth */ From f9d115158696143e1f3a3bbf949c49892d13253f Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 20:27:10 +1100 Subject: [PATCH 70/88] change next version --- packages/auth-nextjs/README.md | 10 +++++----- packages/auth-nextjs/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md index e946c798f2..9ef50b5f19 100644 --- a/packages/auth-nextjs/README.md +++ b/packages/auth-nextjs/README.md @@ -254,11 +254,11 @@ AUTH_SECRET=generate-with-openssl-rand-base64-32 # openssl rand -base64 32 ### Redirect URIs Explained -| Config Property | Purpose | -| --------------- | ------- | -| `redirectUri` | OAuth callback URL - where Immutable redirects after authentication (must match your callback page URL) | -| `popupRedirectUri` | Same as `redirectUri` but for popup login flow. Defaults to `redirectUri` if not set | -| `redirectTo` (CallbackPage prop) | Where to navigate the user AFTER authentication completes (e.g., `/dashboard`) | +| Config Property | Purpose | +| -------------------------------- | ------------------------------------------------------------------------------------------------------- | +| `redirectUri` | OAuth callback URL - where Immutable redirects after authentication (must match your callback page URL) | +| `popupRedirectUri` | Same as `redirectUri` but for popup login flow. Defaults to `redirectUri` if not set | +| `redirectTo` (CallbackPage prop) | Where to navigate the user AFTER authentication completes (e.g., `/dashboard`) | ### Login Flows diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 26362a7379..ba79cb66ad 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -64,7 +64,7 @@ "@imtbl/auth": "workspace:*" }, "peerDependencies": { - "next": "14.2.25", + "next": "^14.2.0 || ^15.0.0", "next-auth": "^5.0.0-beta.30", "react": "^18.2.0" }, From 91dabf031ffb0901daec756a1b39ad065f0cee24 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 20:30:48 +1100 Subject: [PATCH 71/88] sync pack --- packages/auth-nextjs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index ba79cb66ad..26362a7379 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -64,7 +64,7 @@ "@imtbl/auth": "workspace:*" }, "peerDependencies": { - "next": "^14.2.0 || ^15.0.0", + "next": "14.2.25", "next-auth": "^5.0.0-beta.30", "react": "^18.2.0" }, From 7fba6c03e5759b19388d4da21471ae909ca44c74 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 20:56:00 +1100 Subject: [PATCH 72/88] peer deps --- packages/auth-nextjs/package.json | 2 +- sdk/package.json | 16 ++++++++++++++++ sdk/tsup.config.js | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 26362a7379..ba79cb66ad 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -64,7 +64,7 @@ "@imtbl/auth": "workspace:*" }, "peerDependencies": { - "next": "14.2.25", + "next": "^14.2.0 || ^15.0.0", "next-auth": "^5.0.0-beta.30", "react": "^18.2.0" }, diff --git a/sdk/package.json b/sdk/package.json index 4b4d6cafa1..5dd51746e9 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -23,6 +23,22 @@ "tsup": "^8.3.0", "typescript": "^5.6.2" }, + "peerDependencies": { + "next": "^14.2.0 || ^15.0.0", + "next-auth": "^5.0.0-beta.30", + "react": "^18.2.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "next-auth": { + "optional": true + }, + "react": { + "optional": true + } + }, "engines": { "node": ">=20.0.0" }, diff --git a/sdk/tsup.config.js b/sdk/tsup.config.js index 56b516140f..e61c8a148a 100644 --- a/sdk/tsup.config.js +++ b/sdk/tsup.config.js @@ -4,6 +4,18 @@ import { nodeModulesPolyfillPlugin } from 'esbuild-plugins-node-modules-polyfill import { replace } from 'esbuild-plugin-replace'; import pkg from './package.json' assert { type: 'json' }; +// Packages that should NOT be bundled - they are peer dependencies +// and should use the consumer's installed version +const peerDepsExternal = [ + 'next', + 'next-auth', + 'next/navigation', + 'next/headers', + 'next/server', + 'react', + 'react-dom', +]; + export default defineConfig((options) => { if (options.watch) { // Watch mode @@ -27,6 +39,7 @@ export default defineConfig((options) => { bundle: true, treeshake: true, splitting: false, + external: peerDepsExternal, }, // Node Bundle for CJS @@ -38,6 +51,7 @@ export default defineConfig((options) => { target: 'es2022', bundle: true, treeshake: true, + external: peerDepsExternal, }, // Browser Bundle for CDN From 71b28e728ca52de59f4e9f1808bd38b186c65471 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 21:03:07 +1100 Subject: [PATCH 73/88] deps --- packages/auth-nextjs/package.json | 2 +- pnpm-lock.yaml | 66 ++++++++++++++++++++++++------- sdk/package.json | 2 +- 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index ba79cb66ad..26362a7379 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -64,7 +64,7 @@ "@imtbl/auth": "workspace:*" }, "peerDependencies": { - "next": "^14.2.0 || ^15.0.0", + "next": "14.2.25", "next-auth": "^5.0.0-beta.30", "react": "^18.2.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b60a8224b8..1e63ea57a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2666,6 +2666,15 @@ importers: '@imtbl/x-provider': specifier: workspace:* version: link:../packages/x-provider + next: + specifier: 14.2.25 + version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: ^5.0.0-beta.30 + version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 devDependencies: eslint: specifier: ^8.40.0 @@ -28610,7 +28619,7 @@ snapshots: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 @@ -28621,13 +28630,13 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.9.0(eslint@8.57.0))(eslint-plugin-react-hooks@5.0.0(eslint@8.57.0))(eslint-plugin-react@7.35.0(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.0) @@ -28642,7 +28651,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -28660,8 +28669,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28679,8 +28688,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28698,7 +28707,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28716,7 +28725,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -28737,7 +28746,7 @@ snapshots: confusing-browser-globals: 1.0.11 eslint: 8.57.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) @@ -28815,13 +28824,31 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 4.3.7(supports-color@8.1.1) + enhanced-resolve: 5.15.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + get-tsconfig: 4.6.2 + globby: 13.2.2 + is-core-module: 2.15.0 + is-glob: 4.0.3 + synckit: 0.8.5 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) get-tsconfig: 4.6.2 globby: 13.2.2 is-core-module: 2.15.0 @@ -28833,6 +28860,17 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): dependencies: debug: 3.2.7 @@ -28888,7 +28926,7 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -28898,7 +28936,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 diff --git a/sdk/package.json b/sdk/package.json index 5dd51746e9..a79b191239 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -24,7 +24,7 @@ "typescript": "^5.6.2" }, "peerDependencies": { - "next": "^14.2.0 || ^15.0.0", + "next": "14.2.25", "next-auth": "^5.0.0-beta.30", "react": "^18.2.0" }, From e96bfc83caca97f92920dd1fcaa0e2e81bad8cad Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 21:44:29 +1100 Subject: [PATCH 74/88] peer dep --- .syncpackrc | 7 +++++++ packages/auth-nextjs/package.json | 6 ++---- pnpm-lock.yaml | 16 ++++++++-------- sdk/package.json | 4 ++-- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/.syncpackrc b/.syncpackrc index 9c3e79cc10..40f0673c76 100644 --- a/.syncpackrc +++ b/.syncpackrc @@ -6,6 +6,13 @@ "dependencies": ["$LOCAL"], "dependencyTypes": ["prod", "dev"], "pinVersion": "workspace:*" + }, + { + "label": "Allow flexible Next.js peer dependency ranges for auth-nextjs and sdk", + "dependencies": ["next", "next-auth"], + "dependencyTypes": ["peer"], + "packages": ["@imtbl/auth-nextjs", "@imtbl/sdk"], + "isIgnored": true } ] } \ No newline at end of file diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 26362a7379..9552026575 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -64,8 +64,8 @@ "@imtbl/auth": "workspace:*" }, "peerDependencies": { - "next": "14.2.25", - "next-auth": "^5.0.0-beta.30", + "next": "^14.2.0 || ^15.0.0", + "next-auth": "^5.0.0-beta.25", "react": "^18.2.0" }, "devDependencies": { @@ -76,8 +76,6 @@ "@types/react": "^18.3.5", "jest": "^29.4.3", "jest-environment-jsdom": "^29.4.3", - "next": "14.2.25", - "next-auth": "^5.0.0-beta.30", "react": "^18.2.0", "ts-node": "^10.9.1", "tsup": "^8.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e63ea57a3..bade917358 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1048,6 +1048,12 @@ importers: '@imtbl/auth': specifier: workspace:* version: link:../auth + next: + specifier: ^14.2.0 || ^15.0.0 + version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: ^5.0.0-beta.25 + version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) devDependencies: '@swc/core': specifier: ^1.3.36 @@ -1070,12 +1076,6 @@ importers: jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - next: - specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-auth: - specifier: ^5.0.0-beta.30 - version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -2667,10 +2667,10 @@ importers: specifier: workspace:* version: link:../packages/x-provider next: - specifier: 14.2.25 + specifier: ^14.2.0 || ^15.0.0 version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: - specifier: ^5.0.0-beta.30 + specifier: ^5.0.0-beta.25 version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 diff --git a/sdk/package.json b/sdk/package.json index a79b191239..b8ec5857dd 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -24,8 +24,8 @@ "typescript": "^5.6.2" }, "peerDependencies": { - "next": "14.2.25", - "next-auth": "^5.0.0-beta.30", + "next": "^14.2.0 || ^15.0.0", + "next-auth": "^5.0.0-beta.25", "react": "^18.2.0" }, "peerDependenciesMeta": { From 5ccf7615f4566d1799354cdb88a887d9df1863e8 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Thu, 15 Jan 2026 21:48:57 +1100 Subject: [PATCH 75/88] dev dep --- packages/auth-nextjs/package.json | 2 ++ pnpm-lock.yaml | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 9552026575..e8947aaeb2 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -76,6 +76,8 @@ "@types/react": "^18.3.5", "jest": "^29.4.3", "jest-environment-jsdom": "^29.4.3", + "next": "14.2.25", + "next-auth": "^5.0.0-beta.30", "react": "^18.2.0", "ts-node": "^10.9.1", "tsup": "^8.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bade917358..cc0dc7eaf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1048,12 +1048,6 @@ importers: '@imtbl/auth': specifier: workspace:* version: link:../auth - next: - specifier: ^14.2.0 || ^15.0.0 - version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next-auth: - specifier: ^5.0.0-beta.25 - version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) devDependencies: '@swc/core': specifier: ^1.3.36 @@ -1076,6 +1070,12 @@ importers: jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + next: + specifier: 14.2.25 + version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: ^5.0.0-beta.30 + version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 From 9d3a6ec8a005f5d6d0725967050bba9fc4b256a4 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 07:11:52 +1100 Subject: [PATCH 76/88] react version --- .syncpackrc | 4 ++-- packages/auth-nextjs/package.json | 2 +- pnpm-lock.yaml | 2 +- sdk/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.syncpackrc b/.syncpackrc index 40f0673c76..7c1a83c6af 100644 --- a/.syncpackrc +++ b/.syncpackrc @@ -8,8 +8,8 @@ "pinVersion": "workspace:*" }, { - "label": "Allow flexible Next.js peer dependency ranges for auth-nextjs and sdk", - "dependencies": ["next", "next-auth"], + "label": "Allow flexible peer dependency ranges for auth-nextjs and sdk", + "dependencies": ["next", "next-auth", "react"], "dependencyTypes": ["peer"], "packages": ["@imtbl/auth-nextjs", "@imtbl/sdk"], "isIgnored": true diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index e8947aaeb2..0671d98301 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -66,7 +66,7 @@ "peerDependencies": { "next": "^14.2.0 || ^15.0.0", "next-auth": "^5.0.0-beta.25", - "react": "^18.2.0" + "react": "^18.2.0 || ^19.0.0" }, "devDependencies": { "@swc/core": "^1.3.36", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc0dc7eaf9..5868917b60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2673,7 +2673,7 @@ importers: specifier: ^5.0.0-beta.25 version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: - specifier: ^18.2.0 + specifier: ^18.2.0 || ^19.0.0 version: 18.3.1 devDependencies: eslint: diff --git a/sdk/package.json b/sdk/package.json index b8ec5857dd..92d3ea2b4b 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -26,7 +26,7 @@ "peerDependencies": { "next": "^14.2.0 || ^15.0.0", "next-auth": "^5.0.0-beta.25", - "react": "^18.2.0" + "react": "^18.2.0 || ^19.0.0" }, "peerDependenciesMeta": { "next": { From 874808c49850d04dc4c30dc368e7993a3be37a0b Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 08:07:18 +1100 Subject: [PATCH 77/88] split modules --- packages/auth-nextjs/src/client/provider.tsx | 31 +++- packages/auth-nextjs/src/index.ts | 172 ++----------------- packages/auth-nextjs/src/server/index.ts | 13 +- 3 files changed, 51 insertions(+), 165 deletions(-) diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-nextjs/src/client/provider.tsx index 34c8bf7ccc..e7e72e6d82 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-nextjs/src/client/provider.tsx @@ -521,6 +521,13 @@ export function useHydratedData( // Track if we've already started fetching to prevent duplicate calls const hasFetchedRef = useRef(false); + // Fetch ID counter to detect stale fetches. + // When props change, we increment this counter. In-flight fetches compare their + // captured ID against the current counter and ignore results if they don't match. + // This prevents race conditions where a slow client-side fetch overwrites + // fresh server data that arrived via prop changes (e.g., during soft navigation). + const fetchIdRef = useRef(0); + // Track previous props to detect changes (for navigation between routes) const prevPropsRef = useRef({ serverData, ssr, fetchError }); @@ -537,6 +544,8 @@ export function useHydratedData( prevPropsRef.current = { serverData, ssr, fetchError }; // Reset fetch guard to allow fetching with new props hasFetchedRef.current = false; + // Increment fetch ID to invalidate any in-flight fetches + fetchIdRef.current += 1; // Sync state from new props if (ssr && !fetchError) { @@ -554,6 +563,9 @@ export function useHydratedData( }, [serverData, ssr, fetchError]); const fetchData = useCallback(async () => { + // Capture current fetch ID to detect staleness after async operations + const currentFetchId = fetchIdRef.current; + setIsLoading(true); setError(null); @@ -563,11 +575,24 @@ export function useHydratedData( // rather than stale props.session which doesn't update after client-side refresh const token = await getAccessToken(); const result = await fetcher(token); - setData(result); + + // Only update state if this fetch is still current. + // If props changed while we were fetching, fetchIdRef will have been incremented + // and our captured ID will be stale - discard results to avoid overwriting + // fresh server data with stale client-fetched results. + if (fetchIdRef.current === currentFetchId) { + setData(result); + } } catch (err) { - setError(err instanceof Error ? err : new Error(String(err))); + // Only update error state if this fetch is still current + if (fetchIdRef.current === currentFetchId) { + setError(err instanceof Error ? err : new Error(String(err))); + } } finally { - setIsLoading(false); + // Only update loading state if this fetch is still current + if (fetchIdRef.current === currentFetchId) { + setIsLoading(false); + } } }, [fetcher, getAccessToken]); diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts index 77c25a37a2..b6c6db81ad 100644 --- a/packages/auth-nextjs/src/index.ts +++ b/packages/auth-nextjs/src/index.ts @@ -1,165 +1,17 @@ // Main entry point for @imtbl/auth-nextjs (Auth.js v5 / App Router) +// +// This module includes client-side types and re-exports from @imtbl/auth. +// For server-only usage (Edge Runtime, middleware), use @imtbl/auth-nextjs/server +// which doesn't import @imtbl/auth and its browser-only dependencies. -import NextAuthImport from 'next-auth'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore - Type exists in next-auth v5 but TS resolver may use stale types -import type { NextAuthConfig } from 'next-auth'; -import { createAuthConfig } from './config'; -import type { ImmutableAuthConfig } from './types'; - -// Handle ESM/CJS interop - in some bundler configurations, the default export -// may be nested under a 'default' property -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const NextAuth = ((NextAuthImport as any).default || NextAuthImport) as typeof NextAuthImport; - -/** - * Auth.js v5 config options that can be overridden. - * Excludes 'providers' as that's managed internally. - */ -export type ImmutableAuthOverrides = Omit; - -/** - * Return type of createImmutableAuth - the NextAuth instance with handlers - */ -export type ImmutableAuthResult = ReturnType; - -/** - * Create an Auth.js v5 instance with Immutable authentication - * - * @param config - Immutable auth configuration - * @param overrides - Optional Auth.js options to override defaults - * @returns NextAuth instance with { handlers, auth, signIn, signOut } - * - * @remarks - * Callback composition: The `jwt` and `session` callbacks are composed rather than - * replaced. Internal callbacks run first (handling token storage and refresh), then - * your custom callbacks receive the result. Other callbacks (`signIn`, `redirect`) - * are replaced entirely if provided. - * - * @example Basic usage (App Router) - * ```typescript - * // lib/auth.ts - * import { createImmutableAuth } from "@imtbl/auth-nextjs"; - * - * export const { handlers, auth, signIn, signOut } = createImmutableAuth({ - * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, - * }); - * - * // app/api/auth/[...nextauth]/route.ts - * import { handlers } from "@/lib/auth"; - * export const { GET, POST } = handlers; - * ``` - * - * @example With Auth.js overrides - * ```typescript - * export const { handlers, auth } = createImmutableAuth( - * { clientId: "...", redirectUri: "..." }, - * { - * pages: { signIn: "/custom-login", error: "/auth-error" }, - * debug: true, - * } - * ); - * ``` - * - * @example With custom jwt callback (composed with internal callback) - * ```typescript - * export const { handlers, auth } = createImmutableAuth( - * { clientId: "...", redirectUri: "..." }, - * { - * callbacks: { - * // Your jwt callback receives the token after internal processing - * async jwt({ token }) { - * // Add custom claims - * token.customClaim = "value"; - * return token; - * }, - * }, - * } - * ); - * ``` - */ -export function createImmutableAuth( - config: ImmutableAuthConfig, - overrides?: ImmutableAuthOverrides, -): ImmutableAuthResult { - const authConfig = createAuthConfig(config); - - // If no overrides, use auth config as-is - if (!overrides) { - return NextAuth(authConfig); - } - - // Compose callbacks to ensure internal callbacks always run first - // User callbacks receive the result and can modify it further - const composedCallbacks: NextAuthConfig['callbacks'] = { - ...authConfig.callbacks, - }; - - if (overrides.callbacks) { - // Compose jwt callback - internal callback runs first, then user callback - if (overrides.callbacks.jwt) { - const internalJwt = authConfig.callbacks?.jwt; - const userJwt = overrides.callbacks.jwt; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - composedCallbacks.jwt = async (params: any) => { - // Run internal jwt callback first to handle token storage and refresh - const token = internalJwt ? await internalJwt(params) : params.token; - // Then run user's jwt callback with the result - return userJwt({ ...params, token }); - }; - } - - // Compose session callback - internal callback runs first, then user callback - if (overrides.callbacks.session) { - const internalSession = authConfig.callbacks?.session; - const userSession = overrides.callbacks.session; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - composedCallbacks.session = async (params: any) => { - // Run internal session callback first to expose token data - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const session = internalSession ? await internalSession(params) : params.session; - // Then run user's session callback with the result - return userSession({ ...params, session }); - }; - } - - // For other callbacks (signIn, redirect, authorized), just use overrides if provided - // These don't need composition as there's no internal implementation - if (overrides.callbacks.signIn) { - composedCallbacks.signIn = overrides.callbacks.signIn; - } - if (overrides.callbacks.redirect) { - composedCallbacks.redirect = overrides.callbacks.redirect; - } - if (overrides.callbacks.authorized) { - composedCallbacks.authorized = overrides.callbacks.authorized; - } - } - - // Merge session config to preserve critical settings like strategy: 'jwt' - // User can override maxAge, updateAge, etc. but strategy is always preserved - const mergedSession = overrides.session - ? { - ...authConfig.session, - ...overrides.session, - // Always enforce JWT strategy - this is required for token storage/refresh - strategy: 'jwt' as const, - } - : authConfig.session; - - const mergedConfig: NextAuthConfig = { - ...authConfig, - ...overrides, - callbacks: composedCallbacks, - session: mergedSession, - }; - - return NextAuth(mergedConfig); -} - -// Legacy alias for backwards compatibility during migration -export const ImmutableAuth = createImmutableAuth; +// Re-export createImmutableAuth from the server-safe module +// This function doesn't depend on @imtbl/auth +export { + createImmutableAuth, + ImmutableAuth, + type ImmutableAuthOverrides, + type ImmutableAuthResult, +} from './createAuth'; // Export config creator for advanced use cases export { createAuthConfig } from './config'; diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-nextjs/src/server/index.ts index a734dd99a2..3fb9b8849c 100644 --- a/packages/auth-nextjs/src/server/index.ts +++ b/packages/auth-nextjs/src/server/index.ts @@ -1,11 +1,20 @@ // Server-side exports for App Router +// +// IMPORTANT: This module must NOT import from '../index' as that file imports +// @imtbl/auth which has side effects that access browser-only APIs (navigator). +// This breaks Edge Runtime (Next.js middleware) which doesn't have browser APIs. +// +// Instead, we import from '../createAuth' which is server-safe. import { type NextRequest, NextResponse } from 'next/server'; import type { Session } from 'next-auth'; import { matchPathPrefix } from '../utils/pathMatch'; -// Re-export createImmutableAuth for convenience -export { createImmutableAuth, createAuthConfig } from '../index'; +// Re-export createImmutableAuth from server-safe module (no @imtbl/auth dependency) +export { createImmutableAuth } from '../createAuth'; + +// Re-export createAuthConfig directly from config (server-safe, no @imtbl/auth) +export { createAuthConfig, createAuthOptions } from '../config'; /** * Result from getValidSession indicating auth state From 85afba9214711ce250e363e17c8e2071adf6e57d Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 08:16:56 +1100 Subject: [PATCH 78/88] split modules --- packages/auth-nextjs/src/createAuth.ts | 173 +++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 packages/auth-nextjs/src/createAuth.ts diff --git a/packages/auth-nextjs/src/createAuth.ts b/packages/auth-nextjs/src/createAuth.ts new file mode 100644 index 0000000000..c6fe84263f --- /dev/null +++ b/packages/auth-nextjs/src/createAuth.ts @@ -0,0 +1,173 @@ +/** + * Server-safe auth creation module. + * + * This file contains createImmutableAuth and createAuthConfig without importing + * from @imtbl/auth to avoid loading browser-only dependencies (metrics, oidc-client-ts) + * in Edge Runtime or server-side environments. + * + * For client-side usage with full @imtbl/auth types, use the main index.ts instead. + */ + +import NextAuthImport from 'next-auth'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - Type exists in next-auth v5 but TS resolver may use stale types +import type { NextAuthConfig } from 'next-auth'; +import { createAuthConfig } from './config'; +import type { ImmutableAuthConfig } from './types'; + +// Handle ESM/CJS interop - in some bundler configurations, the default export +// may be nested under a 'default' property +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const NextAuth = ((NextAuthImport as any).default || NextAuthImport) as typeof NextAuthImport; + +/** + * Auth.js v5 config options that can be overridden. + * Excludes 'providers' as that's managed internally. + */ +export type ImmutableAuthOverrides = Omit; + +/** + * Return type of createImmutableAuth - the NextAuth instance with handlers + */ +export type ImmutableAuthResult = ReturnType; + +/** + * Create an Auth.js v5 instance with Immutable authentication + * + * @param config - Immutable auth configuration + * @param overrides - Optional Auth.js options to override defaults + * @returns NextAuth instance with { handlers, auth, signIn, signOut } + * + * @remarks + * Callback composition: The `jwt` and `session` callbacks are composed rather than + * replaced. Internal callbacks run first (handling token storage and refresh), then + * your custom callbacks receive the result. Other callbacks (`signIn`, `redirect`) + * are replaced entirely if provided. + * + * @example Basic usage (App Router) + * ```typescript + * // lib/auth.ts + * import { createImmutableAuth } from "@imtbl/auth-nextjs"; + * + * export const { handlers, auth, signIn, signOut } = createImmutableAuth({ + * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + * }); + * + * // app/api/auth/[...nextauth]/route.ts + * import { handlers } from "@/lib/auth"; + * export const { GET, POST } = handlers; + * ``` + * + * @example With Auth.js overrides + * ```typescript + * export const { handlers, auth } = createImmutableAuth( + * { clientId: "...", redirectUri: "..." }, + * { + * pages: { signIn: "/custom-login", error: "/auth-error" }, + * debug: true, + * } + * ); + * ``` + * + * @example With custom jwt callback (composed with internal callback) + * ```typescript + * export const { handlers, auth } = createImmutableAuth( + * { clientId: "...", redirectUri: "..." }, + * { + * callbacks: { + * // Your jwt callback receives the token after internal processing + * async jwt({ token }) { + * // Add custom claims + * token.customClaim = "value"; + * return token; + * }, + * }, + * } + * ); + * ``` + */ +export function createImmutableAuth( + config: ImmutableAuthConfig, + overrides?: ImmutableAuthOverrides, +): ImmutableAuthResult { + const authConfig = createAuthConfig(config); + + // If no overrides, use auth config as-is + if (!overrides) { + return NextAuth(authConfig); + } + + // Compose callbacks to ensure internal callbacks always run first + // User callbacks receive the result and can modify it further + const composedCallbacks: NextAuthConfig['callbacks'] = { + ...authConfig.callbacks, + }; + + if (overrides.callbacks) { + // Compose jwt callback - internal callback runs first, then user callback + if (overrides.callbacks.jwt) { + const internalJwt = authConfig.callbacks?.jwt; + const userJwt = overrides.callbacks.jwt; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + composedCallbacks.jwt = async (params: any) => { + // Run internal jwt callback first to handle token storage and refresh + const token = internalJwt ? await internalJwt(params) : params.token; + // Then run user's jwt callback with the result + return userJwt({ ...params, token }); + }; + } + + // Compose session callback - internal callback runs first, then user callback + if (overrides.callbacks.session) { + const internalSession = authConfig.callbacks?.session; + const userSession = overrides.callbacks.session; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + composedCallbacks.session = async (params: any) => { + // Run internal session callback first to expose token data + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const session = internalSession ? await internalSession(params) : params.session; + // Then run user's session callback with the result + return userSession({ ...params, session }); + }; + } + + // For other callbacks (signIn, redirect, authorized), just use overrides if provided + // These don't need composition as there's no internal implementation + if (overrides.callbacks.signIn) { + composedCallbacks.signIn = overrides.callbacks.signIn; + } + if (overrides.callbacks.redirect) { + composedCallbacks.redirect = overrides.callbacks.redirect; + } + if (overrides.callbacks.authorized) { + composedCallbacks.authorized = overrides.callbacks.authorized; + } + } + + // Merge session config to preserve critical settings like strategy: 'jwt' + // User can override maxAge, updateAge, etc. but strategy is always preserved + const mergedSession = overrides.session + ? { + ...authConfig.session, + ...overrides.session, + // Always enforce JWT strategy - this is required for token storage/refresh + strategy: 'jwt' as const, + } + : authConfig.session; + + const mergedConfig: NextAuthConfig = { + ...authConfig, + ...overrides, + callbacks: composedCallbacks, + session: mergedSession, + }; + + return NextAuth(mergedConfig); +} + +// Legacy alias for backwards compatibility during migration +export const ImmutableAuth = createImmutableAuth; + +// Re-export createAuthConfig for convenience +export { createAuthConfig } from './config'; From 0d731e2357bcffd5e7f4b14168b8a9a22a1c8fde Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 09:00:13 +1100 Subject: [PATCH 79/88] split entries --- packages/auth-nextjs/tsup.config.ts | 37 +++++++++++++++++--- sdk/tsup.config.js | 52 ++++++++++++++++++++++++++--- 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/packages/auth-nextjs/tsup.config.ts b/packages/auth-nextjs/tsup.config.ts index dfd8b05a6b..61eb4ee841 100644 --- a/packages/auth-nextjs/tsup.config.ts +++ b/packages/auth-nextjs/tsup.config.ts @@ -1,5 +1,24 @@ import { defineConfig, type Options } from "tsup"; +// Peer dependencies that should never be bundled +const peerExternal = [ + "react", + "next", + "next-auth", + "next/navigation", + "next/headers", + "next/server", +]; + +// Browser-only packages that must NOT be bundled into server/Edge Runtime code +// These packages access browser APIs (navigator, window) at module load time +const browserOnlyPackages = [ + "@imtbl/auth", + "@imtbl/metrics", + "oidc-client-ts", + "localforage", +]; + // Base configuration shared across all builds const baseConfig: Options = { outDir: "dist/node", @@ -7,26 +26,36 @@ const baseConfig: Options = { target: "es2022", platform: "node", dts: false, - external: ["react", "next", "next-auth", "next/navigation", "next/headers", "next/server"], }; export default defineConfig([ - // Server-side entries (no 'use client' directive) + // Server-only entry - MUST NOT bundle @imtbl/auth or its dependencies + // This is used in Next.js middleware (Edge Runtime) where browser APIs don't exist { ...baseConfig, entry: { - index: "src/index.ts", "server/index": "src/server/index.ts", }, + external: [...peerExternal, ...browserOnlyPackages], clean: true, }, + // Main entry point - can bundle @imtbl/auth for client-side type re-exports + { + ...baseConfig, + entry: { + index: "src/index.ts", + }, + external: peerExternal, + clean: false, + }, // Client-side entry (needs 'use client' directive for Next.js) { ...baseConfig, entry: { "client/index": "src/client/index.ts", }, - clean: false, // Don't clean since server build runs first + external: peerExternal, + clean: false, banner: { js: "'use client';", }, diff --git a/sdk/tsup.config.js b/sdk/tsup.config.js index e61c8a148a..843a895045 100644 --- a/sdk/tsup.config.js +++ b/sdk/tsup.config.js @@ -16,6 +16,27 @@ const peerDepsExternal = [ 'react-dom', ]; +// Browser-only packages that access navigator/window at module load time +// These MUST be externalized for server/Edge Runtime entry points +const browserOnlyPackages = [ + '@imtbl/auth', + '@imtbl/metrics', + 'oidc-client-ts', + 'localforage', +]; + +// Entry points that run in server/Edge Runtime and must NOT include browser-only code +const serverEntryPoints = [ + 'src/auth_nextjs_server.ts', +]; + +// All other entry points (excluding server and browser-specific ones) +const standardEntryPoints = [ + 'src', + '!src/index.browser.ts', + ...serverEntryPoints.map(e => `!${e}`), +]; + export default defineConfig((options) => { if (options.watch) { // Watch mode @@ -30,9 +51,32 @@ export default defineConfig((options) => { } return [ - // Node & Browser Bundle for ESM + // Server/Edge Runtime entries - MUST externalize browser-only packages + // These are used in Next.js middleware where navigator/window don't exist { - entry: ['src'], + entry: serverEntryPoints, + outDir: 'dist', + format: 'esm', + target: 'es2022', + bundle: true, + treeshake: true, + splitting: false, + external: [...peerDepsExternal, ...browserOnlyPackages], + }, + { + entry: serverEntryPoints, + outDir: 'dist', + platform: 'node', + format: 'cjs', + target: 'es2022', + bundle: true, + treeshake: true, + external: [...peerDepsExternal, ...browserOnlyPackages], + }, + + // Standard entries - Node & Browser Bundle for ESM + { + entry: standardEntryPoints, outDir: 'dist', format: 'esm', target: 'es2022', @@ -42,9 +86,9 @@ export default defineConfig((options) => { external: peerDepsExternal, }, - // Node Bundle for CJS + // Standard entries - Node Bundle for CJS { - entry: ['src', '!src/index.browser.ts'], + entry: standardEntryPoints, outDir: 'dist', platform: 'node', format: 'cjs', From 09067f0a8231ad940660c6edce3cec245147cf71 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 09:44:46 +1100 Subject: [PATCH 80/88] server package setup --- packages/auth-nextjs/package.json | 3 ++- sdk/package.json | 3 ++- sdk/tsup.config.js | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index 0671d98301..d7e2191a22 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -87,5 +87,6 @@ "access": "public" }, "repository": "immutable/ts-immutable-sdk.git", - "type": "module" + "type": "module", + "sideEffects": false } diff --git a/sdk/package.json b/sdk/package.json index 92d3ea2b4b..74db53cbc7 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -252,5 +252,6 @@ "typecheck": "tsc --customConditions default --noEmit --jsx preserve" }, "type": "module", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "sideEffects": false } \ No newline at end of file diff --git a/sdk/tsup.config.js b/sdk/tsup.config.js index 843a895045..d428a811b2 100644 --- a/sdk/tsup.config.js +++ b/sdk/tsup.config.js @@ -25,6 +25,12 @@ const browserOnlyPackages = [ 'localforage', ]; +// Packages that should be bundled into server entry points (not left as external re-exports) +// This ensures Turbopack doesn't need to resolve these from the SDK's dependencies +const serverBundlePackages = [ + '@imtbl/auth-nextjs', +]; + // Entry points that run in server/Edge Runtime and must NOT include browser-only code const serverEntryPoints = [ 'src/auth_nextjs_server.ts', @@ -53,6 +59,8 @@ export default defineConfig((options) => { return [ // Server/Edge Runtime entries - MUST externalize browser-only packages // These are used in Next.js middleware where navigator/window don't exist + // We use noExternal to force bundling @imtbl/auth-nextjs content so Turbopack + // doesn't need to resolve it from SDK dependencies (which would load @imtbl/auth) { entry: serverEntryPoints, outDir: 'dist', @@ -62,6 +70,7 @@ export default defineConfig((options) => { treeshake: true, splitting: false, external: [...peerDepsExternal, ...browserOnlyPackages], + noExternal: serverBundlePackages, }, { entry: serverEntryPoints, @@ -72,6 +81,7 @@ export default defineConfig((options) => { bundle: true, treeshake: true, external: [...peerDepsExternal, ...browserOnlyPackages], + noExternal: serverBundlePackages, }, // Standard entries - Node & Browser Bundle for ESM From 2b8f4436522f21667cdfe9a2ae637fa9ef48f3fc Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 10:59:43 +1100 Subject: [PATCH 81/88] revert server handling --- packages/auth-nextjs/package.json | 3 +- packages/auth-nextjs/src/createAuth.ts | 173 ----------------------- packages/auth-nextjs/src/index.ts | 172 ++++++++++++++++++++-- packages/auth-nextjs/src/server/index.ts | 12 +- packages/auth-nextjs/tsup.config.ts | 16 +-- sdk/package.json | 3 +- sdk/tsup.config.js | 62 +------- 7 files changed, 172 insertions(+), 269 deletions(-) delete mode 100644 packages/auth-nextjs/src/createAuth.ts diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json index d7e2191a22..0671d98301 100644 --- a/packages/auth-nextjs/package.json +++ b/packages/auth-nextjs/package.json @@ -87,6 +87,5 @@ "access": "public" }, "repository": "immutable/ts-immutable-sdk.git", - "type": "module", - "sideEffects": false + "type": "module" } diff --git a/packages/auth-nextjs/src/createAuth.ts b/packages/auth-nextjs/src/createAuth.ts deleted file mode 100644 index c6fe84263f..0000000000 --- a/packages/auth-nextjs/src/createAuth.ts +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Server-safe auth creation module. - * - * This file contains createImmutableAuth and createAuthConfig without importing - * from @imtbl/auth to avoid loading browser-only dependencies (metrics, oidc-client-ts) - * in Edge Runtime or server-side environments. - * - * For client-side usage with full @imtbl/auth types, use the main index.ts instead. - */ - -import NextAuthImport from 'next-auth'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore - Type exists in next-auth v5 but TS resolver may use stale types -import type { NextAuthConfig } from 'next-auth'; -import { createAuthConfig } from './config'; -import type { ImmutableAuthConfig } from './types'; - -// Handle ESM/CJS interop - in some bundler configurations, the default export -// may be nested under a 'default' property -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const NextAuth = ((NextAuthImport as any).default || NextAuthImport) as typeof NextAuthImport; - -/** - * Auth.js v5 config options that can be overridden. - * Excludes 'providers' as that's managed internally. - */ -export type ImmutableAuthOverrides = Omit; - -/** - * Return type of createImmutableAuth - the NextAuth instance with handlers - */ -export type ImmutableAuthResult = ReturnType; - -/** - * Create an Auth.js v5 instance with Immutable authentication - * - * @param config - Immutable auth configuration - * @param overrides - Optional Auth.js options to override defaults - * @returns NextAuth instance with { handlers, auth, signIn, signOut } - * - * @remarks - * Callback composition: The `jwt` and `session` callbacks are composed rather than - * replaced. Internal callbacks run first (handling token storage and refresh), then - * your custom callbacks receive the result. Other callbacks (`signIn`, `redirect`) - * are replaced entirely if provided. - * - * @example Basic usage (App Router) - * ```typescript - * // lib/auth.ts - * import { createImmutableAuth } from "@imtbl/auth-nextjs"; - * - * export const { handlers, auth, signIn, signOut } = createImmutableAuth({ - * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, - * }); - * - * // app/api/auth/[...nextauth]/route.ts - * import { handlers } from "@/lib/auth"; - * export const { GET, POST } = handlers; - * ``` - * - * @example With Auth.js overrides - * ```typescript - * export const { handlers, auth } = createImmutableAuth( - * { clientId: "...", redirectUri: "..." }, - * { - * pages: { signIn: "/custom-login", error: "/auth-error" }, - * debug: true, - * } - * ); - * ``` - * - * @example With custom jwt callback (composed with internal callback) - * ```typescript - * export const { handlers, auth } = createImmutableAuth( - * { clientId: "...", redirectUri: "..." }, - * { - * callbacks: { - * // Your jwt callback receives the token after internal processing - * async jwt({ token }) { - * // Add custom claims - * token.customClaim = "value"; - * return token; - * }, - * }, - * } - * ); - * ``` - */ -export function createImmutableAuth( - config: ImmutableAuthConfig, - overrides?: ImmutableAuthOverrides, -): ImmutableAuthResult { - const authConfig = createAuthConfig(config); - - // If no overrides, use auth config as-is - if (!overrides) { - return NextAuth(authConfig); - } - - // Compose callbacks to ensure internal callbacks always run first - // User callbacks receive the result and can modify it further - const composedCallbacks: NextAuthConfig['callbacks'] = { - ...authConfig.callbacks, - }; - - if (overrides.callbacks) { - // Compose jwt callback - internal callback runs first, then user callback - if (overrides.callbacks.jwt) { - const internalJwt = authConfig.callbacks?.jwt; - const userJwt = overrides.callbacks.jwt; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - composedCallbacks.jwt = async (params: any) => { - // Run internal jwt callback first to handle token storage and refresh - const token = internalJwt ? await internalJwt(params) : params.token; - // Then run user's jwt callback with the result - return userJwt({ ...params, token }); - }; - } - - // Compose session callback - internal callback runs first, then user callback - if (overrides.callbacks.session) { - const internalSession = authConfig.callbacks?.session; - const userSession = overrides.callbacks.session; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - composedCallbacks.session = async (params: any) => { - // Run internal session callback first to expose token data - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const session = internalSession ? await internalSession(params) : params.session; - // Then run user's session callback with the result - return userSession({ ...params, session }); - }; - } - - // For other callbacks (signIn, redirect, authorized), just use overrides if provided - // These don't need composition as there's no internal implementation - if (overrides.callbacks.signIn) { - composedCallbacks.signIn = overrides.callbacks.signIn; - } - if (overrides.callbacks.redirect) { - composedCallbacks.redirect = overrides.callbacks.redirect; - } - if (overrides.callbacks.authorized) { - composedCallbacks.authorized = overrides.callbacks.authorized; - } - } - - // Merge session config to preserve critical settings like strategy: 'jwt' - // User can override maxAge, updateAge, etc. but strategy is always preserved - const mergedSession = overrides.session - ? { - ...authConfig.session, - ...overrides.session, - // Always enforce JWT strategy - this is required for token storage/refresh - strategy: 'jwt' as const, - } - : authConfig.session; - - const mergedConfig: NextAuthConfig = { - ...authConfig, - ...overrides, - callbacks: composedCallbacks, - session: mergedSession, - }; - - return NextAuth(mergedConfig); -} - -// Legacy alias for backwards compatibility during migration -export const ImmutableAuth = createImmutableAuth; - -// Re-export createAuthConfig for convenience -export { createAuthConfig } from './config'; diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts index b6c6db81ad..77c25a37a2 100644 --- a/packages/auth-nextjs/src/index.ts +++ b/packages/auth-nextjs/src/index.ts @@ -1,17 +1,165 @@ // Main entry point for @imtbl/auth-nextjs (Auth.js v5 / App Router) -// -// This module includes client-side types and re-exports from @imtbl/auth. -// For server-only usage (Edge Runtime, middleware), use @imtbl/auth-nextjs/server -// which doesn't import @imtbl/auth and its browser-only dependencies. -// Re-export createImmutableAuth from the server-safe module -// This function doesn't depend on @imtbl/auth -export { - createImmutableAuth, - ImmutableAuth, - type ImmutableAuthOverrides, - type ImmutableAuthResult, -} from './createAuth'; +import NextAuthImport from 'next-auth'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - Type exists in next-auth v5 but TS resolver may use stale types +import type { NextAuthConfig } from 'next-auth'; +import { createAuthConfig } from './config'; +import type { ImmutableAuthConfig } from './types'; + +// Handle ESM/CJS interop - in some bundler configurations, the default export +// may be nested under a 'default' property +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const NextAuth = ((NextAuthImport as any).default || NextAuthImport) as typeof NextAuthImport; + +/** + * Auth.js v5 config options that can be overridden. + * Excludes 'providers' as that's managed internally. + */ +export type ImmutableAuthOverrides = Omit; + +/** + * Return type of createImmutableAuth - the NextAuth instance with handlers + */ +export type ImmutableAuthResult = ReturnType; + +/** + * Create an Auth.js v5 instance with Immutable authentication + * + * @param config - Immutable auth configuration + * @param overrides - Optional Auth.js options to override defaults + * @returns NextAuth instance with { handlers, auth, signIn, signOut } + * + * @remarks + * Callback composition: The `jwt` and `session` callbacks are composed rather than + * replaced. Internal callbacks run first (handling token storage and refresh), then + * your custom callbacks receive the result. Other callbacks (`signIn`, `redirect`) + * are replaced entirely if provided. + * + * @example Basic usage (App Router) + * ```typescript + * // lib/auth.ts + * import { createImmutableAuth } from "@imtbl/auth-nextjs"; + * + * export const { handlers, auth, signIn, signOut } = createImmutableAuth({ + * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + * }); + * + * // app/api/auth/[...nextauth]/route.ts + * import { handlers } from "@/lib/auth"; + * export const { GET, POST } = handlers; + * ``` + * + * @example With Auth.js overrides + * ```typescript + * export const { handlers, auth } = createImmutableAuth( + * { clientId: "...", redirectUri: "..." }, + * { + * pages: { signIn: "/custom-login", error: "/auth-error" }, + * debug: true, + * } + * ); + * ``` + * + * @example With custom jwt callback (composed with internal callback) + * ```typescript + * export const { handlers, auth } = createImmutableAuth( + * { clientId: "...", redirectUri: "..." }, + * { + * callbacks: { + * // Your jwt callback receives the token after internal processing + * async jwt({ token }) { + * // Add custom claims + * token.customClaim = "value"; + * return token; + * }, + * }, + * } + * ); + * ``` + */ +export function createImmutableAuth( + config: ImmutableAuthConfig, + overrides?: ImmutableAuthOverrides, +): ImmutableAuthResult { + const authConfig = createAuthConfig(config); + + // If no overrides, use auth config as-is + if (!overrides) { + return NextAuth(authConfig); + } + + // Compose callbacks to ensure internal callbacks always run first + // User callbacks receive the result and can modify it further + const composedCallbacks: NextAuthConfig['callbacks'] = { + ...authConfig.callbacks, + }; + + if (overrides.callbacks) { + // Compose jwt callback - internal callback runs first, then user callback + if (overrides.callbacks.jwt) { + const internalJwt = authConfig.callbacks?.jwt; + const userJwt = overrides.callbacks.jwt; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + composedCallbacks.jwt = async (params: any) => { + // Run internal jwt callback first to handle token storage and refresh + const token = internalJwt ? await internalJwt(params) : params.token; + // Then run user's jwt callback with the result + return userJwt({ ...params, token }); + }; + } + + // Compose session callback - internal callback runs first, then user callback + if (overrides.callbacks.session) { + const internalSession = authConfig.callbacks?.session; + const userSession = overrides.callbacks.session; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + composedCallbacks.session = async (params: any) => { + // Run internal session callback first to expose token data + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const session = internalSession ? await internalSession(params) : params.session; + // Then run user's session callback with the result + return userSession({ ...params, session }); + }; + } + + // For other callbacks (signIn, redirect, authorized), just use overrides if provided + // These don't need composition as there's no internal implementation + if (overrides.callbacks.signIn) { + composedCallbacks.signIn = overrides.callbacks.signIn; + } + if (overrides.callbacks.redirect) { + composedCallbacks.redirect = overrides.callbacks.redirect; + } + if (overrides.callbacks.authorized) { + composedCallbacks.authorized = overrides.callbacks.authorized; + } + } + + // Merge session config to preserve critical settings like strategy: 'jwt' + // User can override maxAge, updateAge, etc. but strategy is always preserved + const mergedSession = overrides.session + ? { + ...authConfig.session, + ...overrides.session, + // Always enforce JWT strategy - this is required for token storage/refresh + strategy: 'jwt' as const, + } + : authConfig.session; + + const mergedConfig: NextAuthConfig = { + ...authConfig, + ...overrides, + callbacks: composedCallbacks, + session: mergedSession, + }; + + return NextAuth(mergedConfig); +} + +// Legacy alias for backwards compatibility during migration +export const ImmutableAuth = createImmutableAuth; // Export config creator for advanced use cases export { createAuthConfig } from './config'; diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-nextjs/src/server/index.ts index 3fb9b8849c..71b926e0bc 100644 --- a/packages/auth-nextjs/src/server/index.ts +++ b/packages/auth-nextjs/src/server/index.ts @@ -1,19 +1,13 @@ // Server-side exports for App Router -// -// IMPORTANT: This module must NOT import from '../index' as that file imports -// @imtbl/auth which has side effects that access browser-only APIs (navigator). -// This breaks Edge Runtime (Next.js middleware) which doesn't have browser APIs. -// -// Instead, we import from '../createAuth' which is server-safe. import { type NextRequest, NextResponse } from 'next/server'; import type { Session } from 'next-auth'; import { matchPathPrefix } from '../utils/pathMatch'; -// Re-export createImmutableAuth from server-safe module (no @imtbl/auth dependency) -export { createImmutableAuth } from '../createAuth'; +// Re-export createImmutableAuth from main module +export { createImmutableAuth } from '..'; -// Re-export createAuthConfig directly from config (server-safe, no @imtbl/auth) +// Re-export createAuthConfig export { createAuthConfig, createAuthOptions } from '../config'; /** diff --git a/packages/auth-nextjs/tsup.config.ts b/packages/auth-nextjs/tsup.config.ts index 61eb4ee841..f8d9b215b8 100644 --- a/packages/auth-nextjs/tsup.config.ts +++ b/packages/auth-nextjs/tsup.config.ts @@ -10,15 +10,6 @@ const peerExternal = [ "next/server", ]; -// Browser-only packages that must NOT be bundled into server/Edge Runtime code -// These packages access browser APIs (navigator, window) at module load time -const browserOnlyPackages = [ - "@imtbl/auth", - "@imtbl/metrics", - "oidc-client-ts", - "localforage", -]; - // Base configuration shared across all builds const baseConfig: Options = { outDir: "dist/node", @@ -29,17 +20,16 @@ const baseConfig: Options = { }; export default defineConfig([ - // Server-only entry - MUST NOT bundle @imtbl/auth or its dependencies - // This is used in Next.js middleware (Edge Runtime) where browser APIs don't exist + // Server entry point { ...baseConfig, entry: { "server/index": "src/server/index.ts", }, - external: [...peerExternal, ...browserOnlyPackages], + external: peerExternal, clean: true, }, - // Main entry point - can bundle @imtbl/auth for client-side type re-exports + // Main entry point { ...baseConfig, entry: { diff --git a/sdk/package.json b/sdk/package.json index 74db53cbc7..92d3ea2b4b 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -252,6 +252,5 @@ "typecheck": "tsc --customConditions default --noEmit --jsx preserve" }, "type": "module", - "types": "./dist/index.d.ts", - "sideEffects": false + "types": "./dist/index.d.ts" } \ No newline at end of file diff --git a/sdk/tsup.config.js b/sdk/tsup.config.js index d428a811b2..4ffc26ecaa 100644 --- a/sdk/tsup.config.js +++ b/sdk/tsup.config.js @@ -16,33 +16,6 @@ const peerDepsExternal = [ 'react-dom', ]; -// Browser-only packages that access navigator/window at module load time -// These MUST be externalized for server/Edge Runtime entry points -const browserOnlyPackages = [ - '@imtbl/auth', - '@imtbl/metrics', - 'oidc-client-ts', - 'localforage', -]; - -// Packages that should be bundled into server entry points (not left as external re-exports) -// This ensures Turbopack doesn't need to resolve these from the SDK's dependencies -const serverBundlePackages = [ - '@imtbl/auth-nextjs', -]; - -// Entry points that run in server/Edge Runtime and must NOT include browser-only code -const serverEntryPoints = [ - 'src/auth_nextjs_server.ts', -]; - -// All other entry points (excluding server and browser-specific ones) -const standardEntryPoints = [ - 'src', - '!src/index.browser.ts', - ...serverEntryPoints.map(e => `!${e}`), -]; - export default defineConfig((options) => { if (options.watch) { // Watch mode @@ -57,36 +30,9 @@ export default defineConfig((options) => { } return [ - // Server/Edge Runtime entries - MUST externalize browser-only packages - // These are used in Next.js middleware where navigator/window don't exist - // We use noExternal to force bundling @imtbl/auth-nextjs content so Turbopack - // doesn't need to resolve it from SDK dependencies (which would load @imtbl/auth) - { - entry: serverEntryPoints, - outDir: 'dist', - format: 'esm', - target: 'es2022', - bundle: true, - treeshake: true, - splitting: false, - external: [...peerDepsExternal, ...browserOnlyPackages], - noExternal: serverBundlePackages, - }, - { - entry: serverEntryPoints, - outDir: 'dist', - platform: 'node', - format: 'cjs', - target: 'es2022', - bundle: true, - treeshake: true, - external: [...peerDepsExternal, ...browserOnlyPackages], - noExternal: serverBundlePackages, - }, - - // Standard entries - Node & Browser Bundle for ESM + // Node & Browser Bundle for ESM { - entry: standardEntryPoints, + entry: ['src', '!src/index.browser.ts'], outDir: 'dist', format: 'esm', target: 'es2022', @@ -96,9 +42,9 @@ export default defineConfig((options) => { external: peerDepsExternal, }, - // Standard entries - Node Bundle for CJS + // Node Bundle for CJS { - entry: standardEntryPoints, + entry: ['src', '!src/index.browser.ts'], outDir: 'dist', platform: 'node', format: 'cjs', From 4344d54662a98061fce1849197a108233d75316f Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 11:34:07 +1100 Subject: [PATCH 82/88] split packages --- .syncpackrc | 4 +- .../.eslintrc.cjs | 4 +- packages/auth-next-client/jest.config.ts | 16 + packages/auth-next-client/package.json | 56 + .../src}/callback.tsx | 61 +- packages/auth-next-client/src/constants.ts | 39 + .../client => auth-next-client/src}/index.ts | 28 +- .../src}/provider.tsx | 104 +- .../src/types.ts | 167 +- .../src/utils/token.ts | 0 .../tsconfig.eslint.json | 0 .../tsconfig.json | 1 - packages/auth-next-client/tsconfig.types.json | 8 + .../tsup.config.ts | 23 +- packages/auth-next-server/.eslintrc.cjs | 17 + .../jest.config.ts | 1 - packages/auth-next-server/package.json | 49 + .../src/config.ts | 14 +- .../src/constants.ts | 2 +- .../server => auth-next-server/src}/index.ts | 379 ++- .../src/refresh.ts | 0 packages/auth-next-server/src/types.ts | 124 + .../src/utils/pathMatch.ts | 0 .../auth-next-server/tsconfig.eslint.json | 5 + packages/auth-next-server/tsconfig.json | 16 + packages/auth-next-server/tsconfig.types.json | 8 + packages/auth-next-server/tsup.config.ts | 29 + packages/auth-nextjs/README.md | 305 --- packages/auth-nextjs/package.json | 91 - packages/auth-nextjs/src/index.ts | 188 -- packages/auth-nextjs/src/refresh.test.ts | 27 - .../auth-nextjs/src/utils/pathMatch.test.ts | 77 - packages/passport/sdk-sample-app/package.json | 3 +- .../src/components/AuthNextJS.tsx | 4 +- .../src/context/ImmutableProvider.tsx | 4 +- .../sdk-sample-app/src/lib/auth-nextjs.ts | 2 +- .../src/pages/callback.page.tsx | 3 +- .../sdk-sample-app/src/pages/index.page.tsx | 2 +- pnpm-lock.yaml | 2063 +++++++++++------ pnpm-workspace.yaml | 3 +- sdk/package.json | 15 +- sdk/src/auth_nextjs.ts | 1 - sdk/src/auth_nextjs_client.ts | 2 +- sdk/src/auth_nextjs_server.ts | 2 +- sdk/src/index.ts | 1 - 45 files changed, 1951 insertions(+), 1997 deletions(-) rename packages/{auth-nextjs => auth-next-client}/.eslintrc.cjs (70%) create mode 100644 packages/auth-next-client/jest.config.ts create mode 100644 packages/auth-next-client/package.json rename packages/{auth-nextjs/src/client => auth-next-client/src}/callback.tsx (88%) create mode 100644 packages/auth-next-client/src/constants.ts rename packages/{auth-nextjs/src/client => auth-next-client/src}/index.ts (51%) rename packages/{auth-nextjs/src/client => auth-next-client/src}/provider.tsx (86%) rename packages/{auth-nextjs => auth-next-client}/src/types.ts (53%) rename packages/{auth-nextjs => auth-next-client}/src/utils/token.ts (100%) rename packages/{auth-nextjs => auth-next-client}/tsconfig.eslint.json (100%) rename packages/{auth-nextjs => auth-next-client}/tsconfig.json (99%) create mode 100644 packages/auth-next-client/tsconfig.types.json rename packages/{auth-nextjs => auth-next-client}/tsup.config.ts (56%) create mode 100644 packages/auth-next-server/.eslintrc.cjs rename packages/{auth-nextjs => auth-next-server}/jest.config.ts (99%) create mode 100644 packages/auth-next-server/package.json rename packages/{auth-nextjs => auth-next-server}/src/config.ts (93%) rename packages/{auth-nextjs => auth-next-server}/src/constants.ts (96%) rename packages/{auth-nextjs/src/server => auth-next-server/src}/index.ts (70%) rename packages/{auth-nextjs => auth-next-server}/src/refresh.ts (100%) create mode 100644 packages/auth-next-server/src/types.ts rename packages/{auth-nextjs => auth-next-server}/src/utils/pathMatch.ts (100%) create mode 100644 packages/auth-next-server/tsconfig.eslint.json create mode 100644 packages/auth-next-server/tsconfig.json create mode 100644 packages/auth-next-server/tsconfig.types.json create mode 100644 packages/auth-next-server/tsup.config.ts delete mode 100644 packages/auth-nextjs/README.md delete mode 100644 packages/auth-nextjs/package.json delete mode 100644 packages/auth-nextjs/src/index.ts delete mode 100644 packages/auth-nextjs/src/refresh.test.ts delete mode 100644 packages/auth-nextjs/src/utils/pathMatch.test.ts delete mode 100644 sdk/src/auth_nextjs.ts diff --git a/.syncpackrc b/.syncpackrc index 7c1a83c6af..19421a4016 100644 --- a/.syncpackrc +++ b/.syncpackrc @@ -8,10 +8,10 @@ "pinVersion": "workspace:*" }, { - "label": "Allow flexible peer dependency ranges for auth-nextjs and sdk", + "label": "Allow flexible peer dependency ranges for auth-next packages and sdk", "dependencies": ["next", "next-auth", "react"], "dependencyTypes": ["peer"], - "packages": ["@imtbl/auth-nextjs", "@imtbl/sdk"], + "packages": ["@imtbl/auth-next-server", "@imtbl/auth-next-client", "@imtbl/sdk"], "isIgnored": true } ] diff --git a/packages/auth-nextjs/.eslintrc.cjs b/packages/auth-next-client/.eslintrc.cjs similarity index 70% rename from packages/auth-nextjs/.eslintrc.cjs rename to packages/auth-next-client/.eslintrc.cjs index b136aaddaf..071610438d 100644 --- a/packages/auth-nextjs/.eslintrc.cjs +++ b/packages/auth-next-client/.eslintrc.cjs @@ -5,7 +5,6 @@ module.exports = { tsconfigRootDir: __dirname, }, rules: { - // Disable all import plugin rules due to stack overflow with auth package structure 'import/order': 'off', 'import/no-unresolved': 'off', 'import/named': 'off', @@ -14,7 +13,6 @@ module.exports = { 'import/no-cycle': 'off', 'import/no-named-as-default': 'off', 'import/no-named-as-default-member': 'off', - // Allow optional props without defaultProps in functional components (use destructuring defaults) 'react/require-default-props': 'off', }, -}; \ No newline at end of file +}; diff --git a/packages/auth-next-client/jest.config.ts b/packages/auth-next-client/jest.config.ts new file mode 100644 index 0000000000..e5d232fe05 --- /dev/null +++ b/packages/auth-next-client/jest.config.ts @@ -0,0 +1,16 @@ +import type { Config } from 'jest'; + +const config: Config = { + clearMocks: true, + coverageProvider: 'v8', + moduleDirectories: ['node_modules', 'src'], + testEnvironment: 'jsdom', + transform: { + '^.+\\.(t|j)sx?$': '@swc/jest', + }, + transformIgnorePatterns: [], + restoreMocks: true, + roots: ['/src'], +}; + +export default config; diff --git a/packages/auth-next-client/package.json b/packages/auth-next-client/package.json new file mode 100644 index 0000000000..b1b2d53a5d --- /dev/null +++ b/packages/auth-next-client/package.json @@ -0,0 +1,56 @@ +{ + "name": "@imtbl/auth-next-client", + "version": "0.0.1", + "description": "Immutable Auth.js v5 integration for Next.js - Client-side components", + "author": "Immutable", + "license": "Apache-2.0", + "repository": "immutable/ts-immutable-sdk.git", + "type": "module", + "main": "./dist/node/index.cjs", + "module": "./dist/node/index.js", + "types": "./dist/node/index.d.ts", + "exports": { + ".": { + "development": { + "types": "./src/index.ts", + "require": "./dist/node/index.cjs", + "default": "./dist/node/index.js" + }, + "default": { + "types": "./dist/node/index.d.ts", + "require": "./dist/node/index.cjs", + "default": "./dist/node/index.js" + } + } + }, + "scripts": { + "build": "tsup && pnpm build:types", + "build:types": "tsc --project tsconfig.types.json", + "clean": "rm -rf dist", + "lint": "eslint src/**/*.{ts,tsx} --max-warnings=0", + "test": "jest" + }, + "dependencies": { + "@imtbl/auth": "workspace:*", + "@imtbl/auth-next-server": "workspace:*" + }, + "peerDependencies": { + "next": "^14.2.0 || ^15.0.0", + "next-auth": "^5.0.0-beta.25", + "react": "^18.2.0 || ^19.0.0" + }, + "devDependencies": { + "@swc/core": "^1.4.2", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", + "@types/node": "^22.10.7", + "@types/react": "^18.2.0", + "eslint": "^8.56.0", + "jest": "^29.7.0", + "next": "^15.1.6", + "next-auth": "^5.0.0-beta.30", + "react": "^18.2.0", + "tsup": "^8.0.2", + "typescript": "^5.6.2" + } +} diff --git a/packages/auth-nextjs/src/client/callback.tsx b/packages/auth-next-client/src/callback.tsx similarity index 88% rename from packages/auth-nextjs/src/client/callback.tsx rename to packages/auth-next-client/src/callback.tsx index 196fdfc63d..e79762d4e4 100644 --- a/packages/auth-nextjs/src/client/callback.tsx +++ b/packages/auth-next-client/src/callback.tsx @@ -4,14 +4,14 @@ import React, { useEffect, useState, useRef } from 'react'; import { useRouter } from 'next/navigation'; import { signIn } from 'next-auth/react'; import { Auth } from '@imtbl/auth'; -import type { ImmutableAuthConfig, ImmutableTokenData, ImmutableUser } from '../types'; -import { getTokenExpiry } from '../utils/token'; +import type { ImmutableUserClient, ImmutableTokenDataClient } from './types'; +import { getTokenExpiry } from './utils/token'; import { DEFAULT_AUTH_DOMAIN, DEFAULT_AUDIENCE, DEFAULT_SCOPE, IMMUTABLE_PROVIDER_ID, -} from '../constants'; +} from './constants'; /** * Get search params from the current URL. @@ -25,31 +25,32 @@ function getSearchParams(): URLSearchParams { return new URLSearchParams(window.location.search); } +/** + * Config for CallbackPage + */ +interface CallbackConfig { + clientId: string; + redirectUri: string; + popupRedirectUri?: string; + logoutRedirectUri?: string; + audience?: string; + scope?: string; + authenticationDomain?: string; + passportDomain?: string; +} + export interface CallbackPageProps { /** * Immutable auth configuration */ - config: ImmutableAuthConfig; + config: CallbackConfig; /** * URL to redirect to after successful authentication (when not in popup). * Can be a string or a function that receives the authenticated user. * If a function returns void/undefined, defaults to "/". * @default "/" - * - * @example Static redirect - * ```tsx - * - * ``` - * - * @example Dynamic redirect based on user - * ```tsx - * user.email?.endsWith('@admin.com') ? '/admin' : '/dashboard'} - * /> - * ``` */ - redirectTo?: string | ((user: ImmutableUser) => string | void); + redirectTo?: string | ((user: ImmutableUserClient) => string | void); /** * Custom loading component */ @@ -64,7 +65,7 @@ export interface CallbackPageProps { * Called before redirect (non-popup) or before window.close (popup). * If this callback returns a Promise, it will be awaited before proceeding. */ - onSuccess?: (user: ImmutableUser) => void | Promise; + onSuccess?: (user: ImmutableUserClient) => void | Promise; /** * Callback fired when authentication fails. * Receives the error message as a parameter. @@ -77,22 +78,6 @@ export interface CallbackPageProps { * Callback page component for handling OAuth redirects (App Router version). * * Use this in your callback page to process authentication responses. - * - * @example - * ```tsx - * // app/callback/page.tsx - * "use client"; - * import { CallbackPage } from "@imtbl/auth-nextjs/client"; - * - * const config = { - * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, - * }; - * - * export default function Callback() { - * return ; - * } - * ``` */ export function CallbackPage({ config, @@ -139,7 +124,7 @@ export function CallbackPage({ throw new Error('Authentication failed: no user data received from login callback'); } // Create user object for callbacks - const user: ImmutableUser = { + const user: ImmutableUserClient = { sub: authUser.profile.sub, email: authUser.profile.email, nickname: authUser.profile.nickname, @@ -153,7 +138,7 @@ export function CallbackPage({ } else if (authUser) { // Not in a popup - create NextAuth session before redirecting // This ensures SSR/session-based auth is authenticated - const tokenData: ImmutableTokenData = { + const tokenData: ImmutableTokenDataClient = { accessToken: authUser.accessToken, refreshToken: authUser.refreshToken, idToken: authUser.idToken, @@ -183,7 +168,7 @@ export function CallbackPage({ } // Create user object for callbacks and dynamic redirect - const user: ImmutableUser = { + const user: ImmutableUserClient = { sub: authUser.profile.sub, email: authUser.profile.email, nickname: authUser.profile.nickname, diff --git a/packages/auth-next-client/src/constants.ts b/packages/auth-next-client/src/constants.ts new file mode 100644 index 0000000000..14e852b950 --- /dev/null +++ b/packages/auth-next-client/src/constants.ts @@ -0,0 +1,39 @@ +/** + * Shared constants for @imtbl/auth-next-client + */ + +/** + * Default Immutable authentication domain + */ +export const DEFAULT_AUTH_DOMAIN = 'https://auth.immutable.com'; + +/** + * Default OAuth audience + */ +export const DEFAULT_AUDIENCE = 'platform_api'; + +/** + * Default OAuth scopes + */ +export const DEFAULT_SCOPE = 'openid profile email offline_access transact'; + +/** + * NextAuth credentials provider ID for Immutable + */ +export const IMMUTABLE_PROVIDER_ID = 'immutable'; + +/** + * Default NextAuth API base path + */ +export const DEFAULT_NEXTAUTH_BASE_PATH = '/api/auth'; + +/** + * Default token expiry in seconds (15 minutes) + * Used as fallback when exp claim cannot be extracted from JWT + */ +export const DEFAULT_TOKEN_EXPIRY_SECONDS = 900; + +/** + * Default token expiry in milliseconds + */ +export const DEFAULT_TOKEN_EXPIRY_MS = DEFAULT_TOKEN_EXPIRY_SECONDS * 1000; diff --git a/packages/auth-nextjs/src/client/index.ts b/packages/auth-next-client/src/index.ts similarity index 51% rename from packages/auth-nextjs/src/client/index.ts rename to packages/auth-next-client/src/index.ts index 61d4f85feb..fc30cc9a6e 100644 --- a/packages/auth-nextjs/src/client/index.ts +++ b/packages/auth-next-client/src/index.ts @@ -1,4 +1,14 @@ -// Client-side exports +/** + * @imtbl/auth-next-client + * + * Client-side components for Immutable Auth.js v5 integration with Next.js. + * This package provides React components and hooks for authentication. + * + * Note: This package depends on @imtbl/auth and should only be used in + * browser/client environments. For server-side utilities, use @imtbl/auth-next-server. + */ + +// Client-side components and hooks export { ImmutableAuthProvider, useImmutableAuth, @@ -10,21 +20,25 @@ export { export { CallbackPage, type CallbackPageProps } from './callback'; -// Re-export useful types from this package +// Re-export types export type { ImmutableAuthProviderProps, UseImmutableAuthReturn, - ImmutableAuthConfig, - ImmutableUser, -} from '../types'; + ImmutableUserClient, + ImmutableTokenDataClient, + ZkEvmInfo, +} from './types'; -// Re-export AuthProps and AuthPropsWithData from server for use in client components +// Re-export server types for convenience (commonly used together) export type { + ImmutableAuthConfig, + ImmutableTokenData, + ImmutableUser, AuthProps, AuthPropsWithData, ProtectedAuthProps, ProtectedAuthPropsWithData, -} from '../server/index'; +} from '@imtbl/auth-next-server'; // Re-export login-related types from @imtbl/auth for convenience export type { LoginOptions, DirectLoginOptions } from '@imtbl/auth'; diff --git a/packages/auth-nextjs/src/client/provider.tsx b/packages/auth-next-client/src/provider.tsx similarity index 86% rename from packages/auth-nextjs/src/client/provider.tsx rename to packages/auth-next-client/src/provider.tsx index e7e72e6d82..ea6a08cf2b 100644 --- a/packages/auth-nextjs/src/client/provider.tsx +++ b/packages/auth-next-client/src/provider.tsx @@ -17,27 +17,26 @@ import { Auth, AuthEvents, type User, type LoginOptions, type UserRemovedReason, } from '@imtbl/auth'; import type { - ImmutableAuthConfig, ImmutableAuthProviderProps, UseImmutableAuthReturn, - ImmutableUser, - ImmutableTokenData, -} from '../types'; -import { getTokenExpiry } from '../utils/token'; + ImmutableUserClient, + ImmutableTokenDataClient, +} from './types'; +import { getTokenExpiry } from './utils/token'; import { DEFAULT_AUTH_DOMAIN, DEFAULT_AUDIENCE, DEFAULT_SCOPE, DEFAULT_NEXTAUTH_BASE_PATH, IMMUTABLE_PROVIDER_ID, -} from '../constants'; +} from './constants'; /** * Internal context for Immutable auth state */ interface ImmutableAuthContextValue { auth: Auth | null; - config: ImmutableAuthConfig; + config: ImmutableAuthProviderProps['config']; basePath: string; } @@ -52,7 +51,7 @@ function ImmutableAuthInner({ basePath, }: { children: React.ReactNode; - config: ImmutableAuthConfig; + config: ImmutableAuthProviderProps['config']; basePath: string; }) { // Use state instead of ref so changes trigger re-renders and update context consumers @@ -158,7 +157,7 @@ function ImmutableAuthInner({ // When this happens, we must clear the NextAuth session to keep them in sync. const handleUserRemoved = async (payload: { reason: UserRemovedReason; error?: string }) => { // eslint-disable-next-line no-console - console.warn('[auth-nextjs] User removed from Auth SDK:', payload.reason, payload.error); + console.warn('[auth-next-client] User removed from Auth SDK:', payload.reason, payload.error); // Sign out from NextAuth to clear the session cookie // This prevents the state mismatch where session exists but Auth has no user await signOut({ redirect: false }); @@ -205,7 +204,7 @@ function ImmutableAuthInner({ * ```tsx * // app/providers.tsx * "use client"; - * import { ImmutableAuthProvider } from "@imtbl/auth-nextjs/client"; + * import { ImmutableAuthProvider } from "@imtbl/auth-next-client"; * * const config = { * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, @@ -219,19 +218,6 @@ function ImmutableAuthInner({ * * ); * } - * - * // app/layout.tsx - * import { Providers } from "./providers"; - * - * export default function RootLayout({ children }: { children: React.ReactNode }) { - * return ( - * - * - * {children} - * - * - * ); - * } * ``` */ export function ImmutableAuthProvider({ @@ -251,30 +237,6 @@ export function ImmutableAuthProvider({ * Hook to access Immutable authentication state and methods * * Must be used within an ImmutableAuthProvider. - * - * @example - * ```tsx - * function MyComponent() { - * const { user, isLoading, isLoggingIn, signIn, signOut } = useImmutableAuth(); - * - * if (isLoading) return
Loading session...
; - * - * if (user) { - * return ( - *
- *

Welcome, {user.email}

- * - *
- * ); - * } - * - * return ( - * - * ); - * } - * ``` */ export function useImmutableAuth(): UseImmutableAuthReturn { const context = useContext(ImmutableAuthContext); @@ -293,7 +255,7 @@ export function useImmutableAuth(): UseImmutableAuthReturn { const isAuthenticated = status === 'authenticated' && !!session; // Extract user from session - const user: ImmutableUser | null = session?.user + const user: ImmutableUserClient | null = session?.user ? { sub: session.user.sub, email: session.user.email, @@ -316,7 +278,7 @@ export function useImmutableAuth(): UseImmutableAuthReturn { } // Build token data for NextAuth - const tokenData: ImmutableTokenData = { + const tokenData: ImmutableTokenDataClient = { accessToken: authUser.accessToken, refreshToken: authUser.refreshToken, idToken: authUser.idToken, @@ -361,7 +323,7 @@ export function useImmutableAuth(): UseImmutableAuthReturn { } catch (error) { // Ignore errors (user may already be logged out) // eslint-disable-next-line no-console - console.warn('[auth-nextjs] Logout cleanup error:', error); + console.warn('[auth-next-client] Logout cleanup error:', error); } } }, [auth]); @@ -415,20 +377,6 @@ export function useImmutableAuth(): UseImmutableAuthReturn { /** * Hook to get a function that returns a valid access token - * - * @example - * ```tsx - * function ApiComponent() { - * const getAccessToken = useAccessToken(); - * - * const fetchData = async () => { - * const token = await getAccessToken(); - * const response = await fetch("/api/data", { - * headers: { Authorization: `Bearer ${token}` }, - * }); - * }; - * } - * ``` */ export function useAccessToken(): () => Promise { const { getAccessToken } = useImmutableAuth(); @@ -463,34 +411,6 @@ export interface HydratedDataProps { * - When `ssr: true` and `data` exists: Uses pre-fetched server data immediately (no loading state) * - When `ssr: false`: Refreshes token client-side and fetches data * - When `fetchError` exists: Retries fetch client-side - * - * @param props - Props from getAuthenticatedData (session, ssr, data, fetchError) - * @param fetcher - Async function that receives access token and returns data (for client-side fallback) - * @returns Object with data, isLoading, error, and refetch function - * - * @example - * ```tsx - * // app/dashboard/page.tsx (Server Component) - * import { getAuthenticatedData } from "@imtbl/auth-nextjs/server"; - * - * export default async function DashboardPage() { - * const props = await getAuthenticatedData(auth, fetchDashboardData); - * if (props.authError) redirect("/login"); - * return ; - * } - * - * // app/dashboard/Dashboard.tsx (Client Component) - * "use client"; - * import { useHydratedData } from "@imtbl/auth-nextjs/client"; - * - * export default function Dashboard(props: AuthPropsWithData) { - * const { data, isLoading, error } = useHydratedData(props, fetchDashboardData); - * - * if (isLoading) return ; - * if (error) return ; - * return ; - * } - * ``` */ export function useHydratedData( props: HydratedDataProps, diff --git a/packages/auth-nextjs/src/types.ts b/packages/auth-next-client/src/types.ts similarity index 53% rename from packages/auth-nextjs/src/types.ts rename to packages/auth-next-client/src/types.ts index 233eb83e4b..82db0c45cf 100644 --- a/packages/auth-nextjs/src/types.ts +++ b/packages/auth-next-client/src/types.ts @@ -1,57 +1,12 @@ import type { DefaultSession, Session } from 'next-auth'; -import type { JWT } from 'next-auth/jwt'; -/** - * Configuration for ImmutableAuthProvider and createImmutableAuth - */ -export interface ImmutableAuthConfig { - /** - * Immutable OAuth client ID - */ - clientId: string; - - /** - * OAuth callback redirect URI (used for redirect flow) - */ - redirectUri: string; - - /** - * OAuth callback redirect URI for popup flow - * If not provided, falls back to redirectUri - */ - popupRedirectUri?: string; - - /** - * Where to redirect after logout - */ - logoutRedirectUri?: string; - - /** - * OAuth audience (default: "platform_api") - */ - audience?: string; - - /** - * OAuth scopes (default: "openid profile email offline_access transact") - */ - scope?: string; - - /** - * Authentication domain (default: "https://auth.immutable.com") - */ - authenticationDomain?: string; - - /** - * Passport domain for transaction confirmation popups. - * Must be set correctly for the target environment: - * - Production: "https://passport.immutable.com" - * - Sandbox: "https://passport.sandbox.immutable.com" - * - * If not provided, defaults to production ("https://passport.immutable.com"). - * This is important for transaction signing flows to work correctly. - */ - passportDomain?: string; -} +// Re-export types from auth-next-server for convenience +export type { + ImmutableAuthConfig, + ImmutableTokenData, + ZkEvmUser, + ImmutableUser, +} from '@imtbl/auth-next-server'; /** * zkEVM wallet information @@ -61,22 +16,17 @@ export interface ZkEvmInfo { userAdminAddress: string; } -/** - * User profile from Immutable - */ -export interface ImmutableUser { - sub: string; - email?: string; - nickname?: string; -} - /** * Auth.js v5 module augmentation to add Immutable-specific fields */ declare module 'next-auth' { // eslint-disable-next-line @typescript-eslint/no-shadow interface Session extends DefaultSession { - user: ImmutableUser & DefaultSession['user']; + user: { + sub: string; + email?: string; + nickname?: string; + } & DefaultSession['user']; accessToken: string; refreshToken?: string; idToken?: string; @@ -98,58 +48,6 @@ declare module 'next-auth' { } } -declare module 'next-auth/jwt' { - // eslint-disable-next-line @typescript-eslint/no-shadow - interface JWT { - sub?: string; - email?: string | null; - nickname?: string; - accessToken?: string; - refreshToken?: string; - idToken?: string; - accessTokenExpires?: number; - zkEvm?: ZkEvmInfo; - error?: string; - } -} - -/** - * Token data passed from client to Auth.js credentials provider - */ -export interface ImmutableTokenData { - accessToken: string; - refreshToken?: string; - idToken?: string; - accessTokenExpires: number; - profile: { - sub: string; - email?: string; - nickname?: string; - }; - zkEvm?: ZkEvmInfo; -} - -/** - * Response from the userinfo endpoint - * Used for server-side token validation - */ -export interface UserInfoResponse { - /** Subject - unique user identifier */ - sub: string; - /** User's email address */ - email?: string; - /** User's nickname/username */ - nickname?: string; - /** User's full name */ - name?: string; - /** User's profile picture URL */ - picture?: string; - /** When the user profile was last updated */ - updated_at?: string; - /** Whether the email has been verified */ - email_verified?: boolean; -} - /** * Props for ImmutableAuthProvider */ @@ -158,7 +56,16 @@ export interface ImmutableAuthProviderProps { /** * Immutable auth configuration */ - config: ImmutableAuthConfig; + config: { + clientId: string; + redirectUri: string; + popupRedirectUri?: string; + logoutRedirectUri?: string; + audience?: string; + scope?: string; + authenticationDomain?: string; + passportDomain?: string; + }; /** * Initial session from server (for SSR hydration) * Can be Session from auth() or any compatible session object @@ -172,6 +79,31 @@ export interface ImmutableAuthProviderProps { basePath?: string; } +/** + * User profile from Immutable (local definition for client) + */ +export interface ImmutableUserClient { + sub: string; + email?: string; + nickname?: string; +} + +/** + * Token data passed from client to Auth.js credentials provider + */ +export interface ImmutableTokenDataClient { + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + profile: { + sub: string; + email?: string; + nickname?: string; + }; + zkEvm?: ZkEvmInfo; +} + /** * Return type of useImmutableAuth hook */ @@ -179,7 +111,7 @@ export interface UseImmutableAuthReturn { /** * Current user profile (null if not authenticated) */ - user: ImmutableUser | null; + user: ImmutableUserClient | null; /** * Full Auth.js session with tokens */ @@ -214,6 +146,3 @@ export interface UseImmutableAuthReturn { */ auth: import('@imtbl/auth').Auth | null; } - -// Re-export JWT type for use in refresh.ts -export type { JWT }; diff --git a/packages/auth-nextjs/src/utils/token.ts b/packages/auth-next-client/src/utils/token.ts similarity index 100% rename from packages/auth-nextjs/src/utils/token.ts rename to packages/auth-next-client/src/utils/token.ts diff --git a/packages/auth-nextjs/tsconfig.eslint.json b/packages/auth-next-client/tsconfig.eslint.json similarity index 100% rename from packages/auth-nextjs/tsconfig.eslint.json rename to packages/auth-next-client/tsconfig.eslint.json diff --git a/packages/auth-nextjs/tsconfig.json b/packages/auth-next-client/tsconfig.json similarity index 99% rename from packages/auth-nextjs/tsconfig.json rename to packages/auth-next-client/tsconfig.json index af497ae60e..d9fb1336a4 100644 --- a/packages/auth-nextjs/tsconfig.json +++ b/packages/auth-next-client/tsconfig.json @@ -17,4 +17,3 @@ "src/**/*.spec.tsx" ] } - diff --git a/packages/auth-next-client/tsconfig.types.json b/packages/auth-next-client/tsconfig.types.json new file mode 100644 index 0000000000..8ac0b88b28 --- /dev/null +++ b/packages/auth-next-client/tsconfig.types.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "declarationDir": "./dist/node" + } +} diff --git a/packages/auth-nextjs/tsup.config.ts b/packages/auth-next-client/tsup.config.ts similarity index 56% rename from packages/auth-nextjs/tsup.config.ts rename to packages/auth-next-client/tsup.config.ts index f8d9b215b8..b536d1d168 100644 --- a/packages/auth-nextjs/tsup.config.ts +++ b/packages/auth-next-client/tsup.config.ts @@ -10,7 +10,6 @@ const peerExternal = [ "next/server", ]; -// Base configuration shared across all builds const baseConfig: Options = { outDir: "dist/node", format: ["esm", "cjs"], @@ -20,35 +19,15 @@ const baseConfig: Options = { }; export default defineConfig([ - // Server entry point - { - ...baseConfig, - entry: { - "server/index": "src/server/index.ts", - }, - external: peerExternal, - clean: true, - }, - // Main entry point { ...baseConfig, entry: { index: "src/index.ts", }, external: peerExternal, - clean: false, - }, - // Client-side entry (needs 'use client' directive for Next.js) - { - ...baseConfig, - entry: { - "client/index": "src/client/index.ts", - }, - external: peerExternal, - clean: false, + clean: true, banner: { js: "'use client';", }, }, ]); - diff --git a/packages/auth-next-server/.eslintrc.cjs b/packages/auth-next-server/.eslintrc.cjs new file mode 100644 index 0000000000..0ed94c01ff --- /dev/null +++ b/packages/auth-next-server/.eslintrc.cjs @@ -0,0 +1,17 @@ +module.exports = { + extends: ['../../.eslintrc'], + parserOptions: { + project: './tsconfig.eslint.json', + tsconfigRootDir: __dirname, + }, + rules: { + 'import/order': 'off', + 'import/no-unresolved': 'off', + 'import/named': 'off', + 'import/default': 'off', + 'import/namespace': 'off', + 'import/no-cycle': 'off', + 'import/no-named-as-default': 'off', + 'import/no-named-as-default-member': 'off', + }, +}; diff --git a/packages/auth-nextjs/jest.config.ts b/packages/auth-next-server/jest.config.ts similarity index 99% rename from packages/auth-nextjs/jest.config.ts rename to packages/auth-next-server/jest.config.ts index 521c8b6f29..7610652a83 100644 --- a/packages/auth-nextjs/jest.config.ts +++ b/packages/auth-next-server/jest.config.ts @@ -14,4 +14,3 @@ const config: Config = { }; export default config; - diff --git a/packages/auth-next-server/package.json b/packages/auth-next-server/package.json new file mode 100644 index 0000000000..152888f81c --- /dev/null +++ b/packages/auth-next-server/package.json @@ -0,0 +1,49 @@ +{ + "name": "@imtbl/auth-next-server", + "version": "0.0.1", + "description": "Immutable Auth.js v5 integration for Next.js - Server-side utilities", + "author": "Immutable", + "license": "Apache-2.0", + "repository": "immutable/ts-immutable-sdk.git", + "type": "module", + "main": "./dist/node/index.cjs", + "module": "./dist/node/index.js", + "types": "./dist/node/index.d.ts", + "exports": { + ".": { + "development": { + "types": "./src/index.ts", + "require": "./dist/node/index.cjs", + "default": "./dist/node/index.js" + }, + "default": { + "types": "./dist/node/index.d.ts", + "require": "./dist/node/index.cjs", + "default": "./dist/node/index.js" + } + } + }, + "scripts": { + "build": "tsup && pnpm build:types", + "build:types": "tsc --project tsconfig.types.json", + "clean": "rm -rf dist", + "lint": "eslint src/**/*.ts --max-warnings=0", + "test": "jest" + }, + "peerDependencies": { + "next": "^14.2.0 || ^15.0.0", + "next-auth": "^5.0.0-beta.25" + }, + "devDependencies": { + "@swc/core": "^1.4.2", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", + "@types/node": "^22.10.7", + "eslint": "^8.56.0", + "jest": "^29.7.0", + "next": "^15.1.6", + "next-auth": "^5.0.0-beta.30", + "tsup": "^8.0.2", + "typescript": "^5.6.2" + } +} diff --git a/packages/auth-nextjs/src/config.ts b/packages/auth-next-server/src/config.ts similarity index 93% rename from packages/auth-nextjs/src/config.ts rename to packages/auth-next-server/src/config.ts index 8403d2947c..3303d46cba 100644 --- a/packages/auth-nextjs/src/config.ts +++ b/packages/auth-next-server/src/config.ts @@ -39,14 +39,14 @@ async function validateTokens( if (!response.ok) { // eslint-disable-next-line no-console - console.error('[auth-nextjs] Token validation failed:', response.status, response.statusText); + console.error('[auth-next-server] Token validation failed:', response.status, response.statusText); return null; } return await response.json(); } catch (error) { // eslint-disable-next-line no-console - console.error('[auth-nextjs] Token validation error:', error); + console.error('[auth-next-server] Token validation error:', error); return null; } } @@ -58,7 +58,7 @@ async function validateTokens( * ```typescript * // lib/auth.ts * import NextAuth from "next-auth"; - * import { createAuthConfig } from "@imtbl/auth-nextjs"; + * import { createAuthConfig } from "@imtbl/auth-next-server"; * * const config = { * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, @@ -89,7 +89,7 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { tokenData = JSON.parse(credentials.tokens); } catch (error) { // eslint-disable-next-line no-console - console.error('[auth-nextjs] Failed to parse token data:', error); + console.error('[auth-next-server] Failed to parse token data:', error); return null; } @@ -107,7 +107,7 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { || Number.isNaN(tokenData.accessTokenExpires) ) { // eslint-disable-next-line no-console - console.error('[auth-nextjs] Invalid token data structure - missing required fields'); + console.error('[auth-next-server] Invalid token data structure - missing required fields'); return null; } @@ -116,7 +116,7 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { const userInfo = await validateTokens(tokenData.accessToken, authDomain); if (!userInfo) { // eslint-disable-next-line no-console - console.error('[auth-nextjs] Token validation failed - rejecting authentication'); + console.error('[auth-next-server] Token validation failed - rejecting authentication'); return null; } @@ -125,7 +125,7 @@ export function createAuthConfig(config: ImmutableAuthConfig): NextAuthConfig { if (userInfo.sub !== tokenData.profile.sub) { // eslint-disable-next-line no-console console.error( - '[auth-nextjs] User ID mismatch - userinfo sub:', + '[auth-next-server] User ID mismatch - userinfo sub:', userInfo.sub, 'provided sub:', tokenData.profile.sub, diff --git a/packages/auth-nextjs/src/constants.ts b/packages/auth-next-server/src/constants.ts similarity index 96% rename from packages/auth-nextjs/src/constants.ts rename to packages/auth-next-server/src/constants.ts index a4e367b54a..48c8926f2b 100644 --- a/packages/auth-nextjs/src/constants.ts +++ b/packages/auth-next-server/src/constants.ts @@ -1,5 +1,5 @@ /** - * Shared constants for @imtbl/auth-nextjs + * Shared constants for @imtbl/auth-next-server */ /** diff --git a/packages/auth-nextjs/src/server/index.ts b/packages/auth-next-server/src/index.ts similarity index 70% rename from packages/auth-nextjs/src/server/index.ts rename to packages/auth-next-server/src/index.ts index 71b926e0bc..34611d12c3 100644 --- a/packages/auth-nextjs/src/server/index.ts +++ b/packages/auth-next-server/src/index.ts @@ -1,14 +1,152 @@ -// Server-side exports for App Router +/** + * @imtbl/auth-next-server + * + * Server-side utilities for Immutable Auth.js v5 integration with Next.js. + * This package has NO dependency on @imtbl/auth and is safe to use in + * Next.js middleware and Edge Runtime environments. + * + * For client-side components (provider, hooks, callback), use @imtbl/auth-next-client. + */ +import NextAuthImport from 'next-auth'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore - Type exists in next-auth v5 but TS resolver may use stale types +import type { NextAuthConfig, Session } from 'next-auth'; import { type NextRequest, NextResponse } from 'next/server'; -import type { Session } from 'next-auth'; -import { matchPathPrefix } from '../utils/pathMatch'; +import { createAuthConfig } from './config'; +import type { ImmutableAuthConfig } from './types'; +import { matchPathPrefix } from './utils/pathMatch'; -// Re-export createImmutableAuth from main module -export { createImmutableAuth } from '..'; +// Handle ESM/CJS interop - in some bundler configurations, the default export +// may be nested under a 'default' property +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const NextAuth = ((NextAuthImport as any).default || NextAuthImport) as typeof NextAuthImport; + +// ============================================================================ +// createImmutableAuth +// ============================================================================ + +/** + * Auth.js v5 config options that can be overridden. + * Excludes 'providers' as that's managed internally. + */ +export type ImmutableAuthOverrides = Omit; -// Re-export createAuthConfig -export { createAuthConfig, createAuthOptions } from '../config'; +/** + * Return type of createImmutableAuth - the NextAuth instance with handlers + */ +export type ImmutableAuthResult = ReturnType; + +/** + * Create an Auth.js v5 instance with Immutable authentication + * + * @param config - Immutable auth configuration + * @param overrides - Optional Auth.js options to override defaults + * @returns NextAuth instance with { handlers, auth, signIn, signOut } + * + * @remarks + * Callback composition: The `jwt` and `session` callbacks are composed rather than + * replaced. Internal callbacks run first (handling token storage and refresh), then + * your custom callbacks receive the result. Other callbacks (`signIn`, `redirect`) + * are replaced entirely if provided. + * + * @example Basic usage (App Router) + * ```typescript + * // lib/auth.ts + * import { createImmutableAuth } from "@imtbl/auth-next-server"; + * + * export const { handlers, auth, signIn, signOut } = createImmutableAuth({ + * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, + * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, + * }); + * + * // app/api/auth/[...nextauth]/route.ts + * import { handlers } from "@/lib/auth"; + * export const { GET, POST } = handlers; + * ``` + */ +export function createImmutableAuth( + config: ImmutableAuthConfig, + overrides?: ImmutableAuthOverrides, +): ImmutableAuthResult { + const baseConfig = createAuthConfig(config); + + // If no overrides, use base config directly + if (!overrides) { + return NextAuth(baseConfig); + } + + // Merge configs with callback composition + const { callbacks: overrideCallbacks, ...otherOverrides } = overrides; + + // Compose callbacks - our callbacks run first, then user's callbacks + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const composedCallbacks: any = { ...baseConfig.callbacks }; + + if (overrideCallbacks) { + // For jwt and session callbacks, compose them (ours first, then user's) + if (overrideCallbacks.jwt) { + const baseJwt = baseConfig.callbacks?.jwt; + const userJwt = overrideCallbacks.jwt; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + composedCallbacks.jwt = async (params: any) => { + const result = baseJwt ? await baseJwt(params) : params.token; + return userJwt({ ...params, token: result }); + }; + } + + if (overrideCallbacks.session) { + const baseSession = baseConfig.callbacks?.session; + const userSession = overrideCallbacks.session; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + composedCallbacks.session = async (params: any) => { + const result = baseSession ? await baseSession(params) : params.session; + return userSession({ ...params, session: result }); + }; + } + + // For other callbacks, user's callbacks replace ours entirely + if (overrideCallbacks.signIn) { + composedCallbacks.signIn = overrideCallbacks.signIn; + } + if (overrideCallbacks.redirect) { + composedCallbacks.redirect = overrideCallbacks.redirect; + } + if (overrideCallbacks.authorized) { + composedCallbacks.authorized = overrideCallbacks.authorized; + } + } + + const mergedConfig: NextAuthConfig = { + ...baseConfig, + ...otherOverrides, + callbacks: composedCallbacks, + }; + + return NextAuth(mergedConfig); +} + +// ============================================================================ +// Re-export config utilities +// ============================================================================ + +export { createAuthConfig, createAuthOptions } from './config'; + +// ============================================================================ +// Type exports +// ============================================================================ + +export type { + ImmutableAuthConfig, + ImmutableTokenData, + UserInfoResponse, + ZkEvmUser, + ImmutableUser, +} from './types'; + +// ============================================================================ +// Server utilities +// ============================================================================ /** * Result from getValidSession indicating auth state @@ -66,6 +204,11 @@ export interface ProtectedAuthPropsWithData extends ProtectedAuthProps { fetchError?: string; } +/** + * Type for the auth function returned by createImmutableAuth + */ +export type AuthFunction = () => Promise; + /** * Get auth props for passing to Client Components (without data fetching). * Use this when you want to handle data fetching separately or client-side only. @@ -114,54 +257,6 @@ export async function getAuthProps(auth: AuthFunction): Promise { * @param auth - The auth function from createImmutableAuth * @param fetcher - Async function that receives access token and returns data * @returns AuthPropsWithData containing session, ssr flag, and pre-fetched data - * - * @example - * ```typescript - * // app/dashboard/page.tsx (Server Component) - * import { getAuthenticatedData } from "@imtbl/auth-nextjs/server"; - * import { auth } from "@/lib/auth"; - * import { redirect } from "next/navigation"; - * import Dashboard from "./Dashboard"; - * - * async function fetchDashboardData(token: string) { - * const res = await fetch("https://api.example.com/dashboard", { - * headers: { Authorization: `Bearer ${token}` }, - * }); - * return res.json(); - * } - * - * export default async function DashboardPage() { - * const props = await getAuthenticatedData(auth, fetchDashboardData); - * - * // Only redirect on auth errors (e.g., refresh token invalid) - * if (props.authError) redirect(`/login?error=${props.authError}`); - * - * // Pass everything to client component - it handles both SSR and CSR cases - * return ; - * } - * - * // app/dashboard/Dashboard.tsx (Client Component) - * "use client"; - * import { useHydratedData } from "@imtbl/auth-nextjs/client"; - * import type { AuthPropsWithData } from "@imtbl/auth-nextjs/server"; - * - * async function fetchDashboardData(token: string) { - * const res = await fetch("/api/dashboard", { - * headers: { Authorization: `Bearer ${token}` }, - * }); - * return res.json(); - * } - * - * export default function Dashboard(props: AuthPropsWithData) { - * // When ssr=true: uses server-fetched data immediately (no loading) - * // When ssr=false: refreshes token client-side and fetches data - * const { data, isLoading, error } = useHydratedData(props, fetchDashboardData); - * - * if (isLoading) return ; - * if (error) return ; - * return ; - * } - * ``` */ export async function getAuthenticatedData( auth: AuthFunction, @@ -211,22 +306,6 @@ export async function getAuthenticatedData( * * @param auth - The auth function from createImmutableAuth * @returns Object with status and session - * - * @example - * ```typescript - * const result = await getValidSession(auth); - * - * switch (result.status) { - * case 'authenticated': - * return ; - * case 'token_expired': - * return ; // Client will refresh tokens - * case 'unauthenticated': - * redirect('/login'); - * case 'error': - * redirect(`/login?error=${result.error}`); - * } - * ``` */ export async function getValidSession(auth: AuthFunction): Promise { const session = await auth(); @@ -265,24 +344,6 @@ export type AuthErrorHandler = (error: string) => never; * @param auth - The auth function from createImmutableAuth * @param onAuthError - Handler called when there's an auth error (should redirect or throw) * @returns A function to fetch protected data without needing authError checks - * - * @example - * ```typescript - * // lib/auth-server.ts - * import { createProtectedDataFetcher } from "@imtbl/auth-nextjs/server"; - * import { auth } from "./auth"; - * import { redirect } from "next/navigation"; - * - * export const getProtectedData = createProtectedDataFetcher(auth, (error) => { - * redirect(`/login?error=${encodeURIComponent(error)}`); - * }); - * - * // app/dashboard/page.tsx - No authError check needed! - * export default async function DashboardPage() { - * const props = await getProtectedData(fetchDashboardData); - * return ; // authError is handled automatically - * } - * ``` */ export function createProtectedDataFetcher( auth: AuthFunction, @@ -315,20 +376,6 @@ export function createProtectedDataFetcher( * @param auth - The auth function from createImmutableAuth * @param onAuthError - Handler called when there's an auth error (should redirect or throw) * @returns A function to get auth props without needing authError checks - * - * @example - * ```typescript - * // lib/auth-server.ts - * export const getProtectedAuthProps = createProtectedAuthProps(auth, (error) => { - * redirect(`/login?error=${encodeURIComponent(error)}`); - * }); - * - * // app/profile/page.tsx - * export default async function ProfilePage() { - * const props = await getProtectedAuthProps(); - * return ; - * } - * ``` */ export function createProtectedAuthProps( auth: AuthFunction, @@ -373,35 +420,6 @@ export interface ProtectedFetchers { * @param auth - The auth function from createImmutableAuth * @param onAuthError - Handler called when there's an auth error (should redirect or throw) * @returns Object with getAuthProps and getData functions - * - * @example - * ```typescript - * // lib/auth-server.ts - * import { createProtectedFetchers } from "@imtbl/auth-nextjs/server"; - * import { auth } from "./auth"; - * import { redirect } from "next/navigation"; - * - * // Define auth error handling ONCE - * export const { getAuthProps, getData } = createProtectedFetchers(auth, (error) => { - * redirect(`/login?error=${encodeURIComponent(error)}`); - * }); - * - * // app/dashboard/page.tsx - Clean, no boilerplate! - * import { getData } from "@/lib/auth-server"; - * - * export default async function DashboardPage() { - * const props = await getData(fetchDashboardData); - * return ; - * } - * - * // app/profile/page.tsx - Works for auth-only pages too - * import { getAuthProps } from "@/lib/auth-server"; - * - * export default async function ProfilePage() { - * const props = await getAuthProps(); - * return ; - * } - * ``` */ export function createProtectedFetchers( auth: AuthFunction, @@ -441,56 +459,10 @@ export interface WithServerAuthOptions { * Helper for Server Components that need authenticated data. * Automatically handles token expiration by rendering a client fallback. * - * This eliminates the need for manual conditional checks in your Server Components: - * * @param auth - The auth function from createImmutableAuth * @param serverRender - Async function that receives valid session and returns JSX * @param options - Fallback options for different auth states * @returns The rendered content based on auth state - * - * @example Basic usage with client fallback: - * ```typescript - * // app/dashboard/page.tsx - * import { withServerAuth } from "@imtbl/auth-nextjs/server"; - * import { auth } from "@/lib/auth"; - * import { ClientDashboard } from "./ClientDashboard"; - * - * export default function DashboardPage() { - * return withServerAuth( - * auth, - * async (session) => { - * // This only runs when token is valid - * const data = await fetchDashboardData(session.accessToken); - * return ; - * }, - * { - * // Render client component when token expired - it will refresh & fetch - * onTokenExpired: , - * onUnauthenticated: , - * } - * ); - * } - * ``` - * - * @example With redirect on unauthenticated: - * ```typescript - * import { redirect } from "next/navigation"; - * - * export default function ProtectedPage() { - * return withServerAuth( - * auth, - * async (session) => { - * const data = await fetchProtectedData(session.accessToken); - * return ; - * }, - * { - * onTokenExpired: , - * onUnauthenticated: () => redirect("/login"), - * onError: (error) => redirect(`/login?error=${error}`), - * } - * ); - * } - * ``` */ export async function withServerAuth( auth: AuthFunction, @@ -533,6 +505,10 @@ export async function withServerAuth( } } +// ============================================================================ +// Middleware +// ============================================================================ + /** * Options for createAuthMiddleware */ @@ -554,11 +530,6 @@ export interface AuthMiddlewareOptions { publicPaths?: (string | RegExp)[]; } -/** - * Type for the auth function returned by createImmutableAuth - */ -export type AuthFunction = () => Promise; - /** * Create a Next.js middleware for protecting routes with Immutable authentication. * @@ -571,7 +542,7 @@ export type AuthFunction = () => Promise; * @example Basic usage with Next.js middleware: * ```typescript * // middleware.ts - * import { createAuthMiddleware } from "@imtbl/auth-nextjs/server"; + * import { createAuthMiddleware } from "@imtbl/auth-next-server"; * import { auth } from "@/lib/auth"; * * export default createAuthMiddleware(auth, { @@ -582,15 +553,6 @@ export type AuthFunction = () => Promise; * matcher: ["/dashboard/:path*", "/profile/:path*"], * }; * ``` - * - * @example With path configuration: - * ```typescript - * export default createAuthMiddleware(auth, { - * loginUrl: "/login", - * protectedPaths: [/^\/dashboard/, /^\/profile/], - * publicPaths: [/^\/api\/public/], - * }); - * ``` */ export function createAuthMiddleware( auth: AuthFunction, @@ -671,37 +633,6 @@ export function createAuthMiddleware( * @param handler - The handler function to protect. Receives session as first arg, * followed by any arguments passed by Next.js (request, context, etc.) * @returns A protected handler that checks authentication before executing - * - * @example Protecting a Route Handler with request access: - * ```typescript - * // app/api/protected/route.ts - * import { withAuth } from "@imtbl/auth-nextjs/server"; - * import { auth } from "@/lib/auth"; - * - * export const POST = withAuth(auth, async (session, request: Request) => { - * const body = await request.json(); - * return Response.json({ user: session.user, data: body }); - * }); - * - * export const GET = withAuth(auth, async (session, request: Request, context) => { - * const { params } = context; - * return Response.json({ user: session.user, params: await params }); - * }); - * ``` - * - * @example Protecting a Server Action: - * ```typescript - * // app/actions.ts - * "use server"; - * import { withAuth } from "@imtbl/auth-nextjs/server"; - * import { auth } from "@/lib/auth"; - * - * export const protectedAction = withAuth(auth, async (session, formData: FormData) => { - * const userId = session.user.sub; - * const name = formData.get("name"); - * // ... your action logic - * }); - * ``` */ export function withAuth( auth: AuthFunction, diff --git a/packages/auth-nextjs/src/refresh.ts b/packages/auth-next-server/src/refresh.ts similarity index 100% rename from packages/auth-nextjs/src/refresh.ts rename to packages/auth-next-server/src/refresh.ts diff --git a/packages/auth-next-server/src/types.ts b/packages/auth-next-server/src/types.ts new file mode 100644 index 0000000000..d222098f31 --- /dev/null +++ b/packages/auth-next-server/src/types.ts @@ -0,0 +1,124 @@ +/** + * Server-side types for @imtbl/auth-next-server + */ + +import type { DefaultSession } from 'next-auth'; + +/** + * zkEVM wallet information for module augmentation + */ +interface ZkEvmInfo { + ethAddress: string; + userAdminAddress: string; +} + +/** + * Auth.js v5 module augmentation to add Immutable-specific fields + * This extends the Session type to include our custom fields + */ +declare module 'next-auth' { + // eslint-disable-next-line @typescript-eslint/no-shadow + interface Session extends DefaultSession { + user: { + sub: string; + email?: string; + nickname?: string; + } & DefaultSession['user']; + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + zkEvm?: ZkEvmInfo; + error?: string; + } + + interface User { + id: string; + sub: string; + email?: string | null; + nickname?: string; + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + zkEvm?: ZkEvmInfo; + } +} + +/** + * Configuration options for Immutable authentication + */ +export interface ImmutableAuthConfig { + /** + * Your Immutable application client ID + */ + clientId: string; + + /** + * The OAuth redirect URI configured in your Immutable Hub project + */ + redirectUri: string; + + /** + * OAuth audience (default: "platform_api") + */ + audience?: string; + + /** + * OAuth scopes (default: "openid profile email offline_access transact") + */ + scope?: string; + + /** + * The Immutable authentication domain (default: "https://auth.immutable.com") + */ + authenticationDomain?: string; +} + +/** + * Token data passed from client to server during authentication + */ +export interface ImmutableTokenData { + accessToken: string; + refreshToken?: string; + idToken?: string; + accessTokenExpires: number; + profile: { + sub: string; + email?: string; + nickname?: string; + }; + zkEvm?: { + ethAddress: string; + userAdminAddress: string; + }; +} + +/** + * Response from the userinfo endpoint + */ +export interface UserInfoResponse { + sub: string; + email?: string; + email_verified?: boolean; + nickname?: string; + [key: string]: unknown; +} + +/** + * zkEVM user data stored in session + */ +export interface ZkEvmUser { + ethAddress: string; + userAdminAddress: string; +} + +/** + * Immutable user data structure + */ +export interface ImmutableUser { + sub: string; + email?: string; + nickname?: string; + zkEvm?: ZkEvmUser; +} diff --git a/packages/auth-nextjs/src/utils/pathMatch.ts b/packages/auth-next-server/src/utils/pathMatch.ts similarity index 100% rename from packages/auth-nextjs/src/utils/pathMatch.ts rename to packages/auth-next-server/src/utils/pathMatch.ts diff --git a/packages/auth-next-server/tsconfig.eslint.json b/packages/auth-next-server/tsconfig.eslint.json new file mode 100644 index 0000000000..1eeb7d351c --- /dev/null +++ b/packages/auth-next-server/tsconfig.eslint.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "exclude": [], + "include": ["src"] +} diff --git a/packages/auth-next-server/tsconfig.json b/packages/auth-next-server/tsconfig.json new file mode 100644 index 0000000000..1d9e0dc808 --- /dev/null +++ b/packages/auth-next-server/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDirs": ["src"], + "customConditions": ["development"], + "types": ["node"] + }, + "include": ["src"], + "exclude": [ + "node_modules", + "dist", + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/packages/auth-next-server/tsconfig.types.json b/packages/auth-next-server/tsconfig.types.json new file mode 100644 index 0000000000..8ac0b88b28 --- /dev/null +++ b/packages/auth-next-server/tsconfig.types.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "declarationDir": "./dist/node" + } +} diff --git a/packages/auth-next-server/tsup.config.ts b/packages/auth-next-server/tsup.config.ts new file mode 100644 index 0000000000..541afdbb14 --- /dev/null +++ b/packages/auth-next-server/tsup.config.ts @@ -0,0 +1,29 @@ +import { defineConfig, type Options } from "tsup"; + +// Peer dependencies that should never be bundled +const peerExternal = [ + "next", + "next-auth", + "next/navigation", + "next/headers", + "next/server", +]; + +const baseConfig: Options = { + outDir: "dist/node", + format: ["esm", "cjs"], + target: "es2022", + platform: "node", + dts: false, +}; + +export default defineConfig([ + { + ...baseConfig, + entry: { + index: "src/index.ts", + }, + external: peerExternal, + clean: true, + }, +]); diff --git a/packages/auth-nextjs/README.md b/packages/auth-nextjs/README.md deleted file mode 100644 index 9ef50b5f19..0000000000 --- a/packages/auth-nextjs/README.md +++ /dev/null @@ -1,305 +0,0 @@ -# @imtbl/auth-nextjs - -Next.js App Router authentication for Immutable SDK using Auth.js v5. - -## Installation - -```bash -pnpm add @imtbl/auth-nextjs next-auth@beta -``` - -## Setup - -### 1. Shared Auth Config - -Create a single config used by all auth components: - -```typescript -// lib/auth-config.ts -import type { ImmutableAuthConfig } from "@imtbl/auth-nextjs"; - -export const authConfig: ImmutableAuthConfig = { - clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - // OAuth callback URL - where Immutable redirects after login - redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, - // Optional: for popup-based login (defaults to redirectUri if not set) - // popupRedirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, -}; -``` - -### 2. Server Auth (createImmutableAuth) - -```typescript -// lib/auth.ts -import { createImmutableAuth } from "@imtbl/auth-nextjs"; -import { authConfig } from "./auth-config"; - -export const { handlers, auth } = createImmutableAuth(authConfig); -``` - -### 3. API Route - -```typescript -// app/api/auth/[...nextauth]/route.ts -import { handlers } from "@/lib/auth"; -export const { GET, POST } = handlers; -``` - -### 4. Callback Page - -The callback page handles the OAuth redirect. The `redirectUri` in config must match this page's URL. - -```typescript -// app/callback/page.tsx -"use client"; -import { CallbackPage } from "@imtbl/auth-nextjs/client"; -import { authConfig } from "@/lib/auth-config"; - -export default function Callback() { - return ( - - ); -} -``` - -### 5. Provider - -```typescript -// app/layout.tsx -import { ImmutableAuthProvider } from "@imtbl/auth-nextjs/client"; -import { authConfig } from "@/lib/auth-config"; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - - - {children} - - - - ); -} -``` - -## Usage Examples - -### Client Component - Login/Logout - -```typescript -"use client"; -import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; - -export function LoginButton() { - const { user, isLoading, isLoggingIn, signIn, signOut } = useImmutableAuth(); - - if (isLoading) return
Loading...
; - if (user) return ; - - return ( - - ); -} -``` - -### Client Component - API Calls - -```typescript -"use client"; -import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; - -export function FetchData() { - const { getAccessToken } = useImmutableAuth(); - - async function handleFetch() { - const token = await getAccessToken(); // Auto-refreshes if expired - const res = await fetch("/api/data", { - headers: { Authorization: `Bearer ${token}` }, - }); - return res.json(); - } - - return ; -} -``` - -### Server Component - Basic - -```typescript -// app/profile/page.tsx -import { auth } from "@/lib/auth"; -import { redirect } from "next/navigation"; - -export default async function ProfilePage() { - const session = await auth(); - if (!session) redirect("/login"); - return

Welcome, {session.user.email}

; -} -``` - -### Server Component - SSR Data Fetching (Recommended) - -```typescript -// lib/auth-server.ts -import { createProtectedFetchers } from "@imtbl/auth-nextjs/server"; -import { auth } from "./auth"; -import { redirect } from "next/navigation"; - -// Define auth error handling once -export const { getData } = createProtectedFetchers(auth, (error) => { - redirect(`/login?error=${encodeURIComponent(error)}`); -}); -``` - -```typescript -// lib/fetchers.ts - Shared fetcher for server & client -export interface DashboardData { - stats: { views: number }; -} - -export async function fetchDashboard(token: string): Promise { - const res = await fetch("https://api.example.com/dashboard", { - headers: { Authorization: `Bearer ${token}` }, - }); - return res.json(); -} -``` - -```typescript -// app/dashboard/page.tsx (Server Component) -import { getData } from "@/lib/auth-server"; -import { fetchDashboard } from "@/lib/fetchers"; -import Dashboard from "./Dashboard"; - -export default async function DashboardPage() { - const props = await getData(fetchDashboard); // Auth errors redirect automatically - return ; -} -``` - -```typescript -// app/dashboard/Dashboard.tsx (Client Component) -"use client"; -import { - useHydratedData, - type ProtectedAuthPropsWithData, -} from "@imtbl/auth-nextjs/client"; -import { fetchDashboard, type DashboardData } from "@/lib/fetchers"; - -export default function Dashboard( - props: ProtectedAuthPropsWithData -) { - // ssr=true: uses server data immediately - // ssr=false: refreshes token client-side, then fetches - const { data, isLoading, error } = useHydratedData(props, fetchDashboard); - - if (isLoading) return
Loading...
; - if (error) return
Error: {error}
; - return
Views: {data!.stats.views}
; -} -``` - -### Middleware - Route Protection - -```typescript -// middleware.ts -import { createAuthMiddleware } from "@imtbl/auth-nextjs/server"; -import { auth } from "@/lib/auth"; - -export default createAuthMiddleware(auth, { loginUrl: "/login" }); - -export const config = { - matcher: ["/dashboard/:path*", "/profile/:path*"], -}; -``` - -### Server Action - Protected - -```typescript -// app/actions.ts -"use server"; -import { withAuth } from "@imtbl/auth-nextjs/server"; -import { auth } from "@/lib/auth"; - -export const updateProfile = withAuth( - auth, - async (session, formData: FormData) => { - // session.user, session.accessToken available - const name = formData.get("name"); - // ... update logic - } -); -``` - -## Environment Variables - -```bash -# .env.local -NEXT_PUBLIC_IMMUTABLE_CLIENT_ID=your-client-id -NEXT_PUBLIC_BASE_URL=http://localhost:3000 -AUTH_SECRET=generate-with-openssl-rand-base64-32 # openssl rand -base64 32 -``` - -## Tips & Caveats - -### Redirect URIs Explained - -| Config Property | Purpose | -| -------------------------------- | ------------------------------------------------------------------------------------------------------- | -| `redirectUri` | OAuth callback URL - where Immutable redirects after authentication (must match your callback page URL) | -| `popupRedirectUri` | Same as `redirectUri` but for popup login flow. Defaults to `redirectUri` if not set | -| `redirectTo` (CallbackPage prop) | Where to navigate the user AFTER authentication completes (e.g., `/dashboard`) | - -### Login Flows - -- **Popup (default)**: `signIn()` opens a popup window. Uses `popupRedirectUri` (or `redirectUri`) -- **Redirect**: `signIn({ useCachedSession: false, useRedirectFlow: true })` does a full page redirect - -Both flows redirect to your callback page, which completes the auth and navigates to `redirectTo`. - -### Sandbox Environment - -For sandbox, set `passportDomain` explicitly: - -```typescript -export const authConfig: ImmutableAuthConfig = { - clientId: "...", - redirectUri: "...", - passportDomain: "https://passport.sandbox.immutable.com", // Required for sandbox -}; -``` - -### Token Refresh - -- Tokens are refreshed **client-side only** to avoid race conditions with refresh token rotation -- `getAccessToken()` automatically refreshes expired tokens -- `useHydratedData` handles SSR/CSR switching automatically - if server token is expired, it fetches client-side after refresh - -### SSR Data Fetching - -| Token State | Server | Client | -| ----------- | -------------------------- | ------------------------ | -| Valid | Fetches data (`ssr: true`) | Uses server data | -| Expired | Skips fetch (`ssr: false`) | Refreshes token, fetches | -| Auth Error | Redirects via handler | - | - -### CallbackPage Props - -| Prop | Description | -| ------------------ | ----------------------------------------------------------- | -| `config` | Required. Auth configuration | -| `redirectTo` | Where to redirect after auth (string or `(user) => string`) | -| `loadingComponent` | Custom loading UI | -| `errorComponent` | Custom error UI `(error) => ReactElement` | -| `onSuccess` | Callback after successful auth | -| `onError` | Callback when auth fails | diff --git a/packages/auth-nextjs/package.json b/packages/auth-nextjs/package.json deleted file mode 100644 index 0671d98301..0000000000 --- a/packages/auth-nextjs/package.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "name": "@imtbl/auth-nextjs", - "version": "0.0.0", - "description": "Next.js App Router authentication integration for Immutable SDK using Auth.js v5", - "author": "Immutable", - "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", - "homepage": "https://github.com/immutable/ts-immutable-sdk#readme", - "license": "Apache-2.0", - "main": "dist/node/index.cjs", - "module": "dist/node/index.js", - "types": "./dist/types/index.d.ts", - "exports": { - ".": { - "development": { - "types": "./src/index.ts", - "require": "./dist/node/index.cjs", - "default": "./dist/node/index.js" - }, - "default": { - "types": "./dist/types/index.d.ts", - "require": "./dist/node/index.cjs", - "default": "./dist/node/index.js" - } - }, - "./client": { - "development": { - "types": "./src/client/index.ts", - "require": "./dist/node/client/index.cjs", - "default": "./dist/node/client/index.js" - }, - "default": { - "types": "./dist/types/client/index.d.ts", - "require": "./dist/node/client/index.cjs", - "default": "./dist/node/client/index.js" - } - }, - "./server": { - "development": { - "types": "./src/server/index.ts", - "require": "./dist/node/server/index.cjs", - "default": "./dist/node/server/index.js" - }, - "default": { - "types": "./dist/types/server/index.d.ts", - "require": "./dist/node/server/index.cjs", - "default": "./dist/node/server/index.js" - } - } - }, - "files": [ - "dist" - ], - "scripts": { - "build": "pnpm transpile && pnpm typegen", - "dev": "pnpm transpile && tsup --config tsup.config.ts --watch --no-clean", - "transpile": "tsup --config tsup.config.ts", - "typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types", - "lint": "eslint ./src --ext .ts,.tsx --max-warnings=0", - "lint:fix": "eslint ./src --ext .ts,.tsx --max-warnings=0 --fix", - "typecheck": "tsc --customConditions default --noEmit --jsx preserve", - "test": "jest --passWithNoTests" - }, - "dependencies": { - "@imtbl/auth": "workspace:*" - }, - "peerDependencies": { - "next": "^14.2.0 || ^15.0.0", - "next-auth": "^5.0.0-beta.25", - "react": "^18.2.0 || ^19.0.0" - }, - "devDependencies": { - "@swc/core": "^1.3.36", - "@swc/jest": "^0.2.37", - "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", - "@types/react": "^18.3.5", - "jest": "^29.4.3", - "jest-environment-jsdom": "^29.4.3", - "next": "14.2.25", - "next-auth": "^5.0.0-beta.30", - "react": "^18.2.0", - "ts-node": "^10.9.1", - "tsup": "^8.3.0", - "typescript": "^5.6.2" - }, - "publishConfig": { - "access": "public" - }, - "repository": "immutable/ts-immutable-sdk.git", - "type": "module" -} diff --git a/packages/auth-nextjs/src/index.ts b/packages/auth-nextjs/src/index.ts deleted file mode 100644 index 77c25a37a2..0000000000 --- a/packages/auth-nextjs/src/index.ts +++ /dev/null @@ -1,188 +0,0 @@ -// Main entry point for @imtbl/auth-nextjs (Auth.js v5 / App Router) - -import NextAuthImport from 'next-auth'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore - Type exists in next-auth v5 but TS resolver may use stale types -import type { NextAuthConfig } from 'next-auth'; -import { createAuthConfig } from './config'; -import type { ImmutableAuthConfig } from './types'; - -// Handle ESM/CJS interop - in some bundler configurations, the default export -// may be nested under a 'default' property -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const NextAuth = ((NextAuthImport as any).default || NextAuthImport) as typeof NextAuthImport; - -/** - * Auth.js v5 config options that can be overridden. - * Excludes 'providers' as that's managed internally. - */ -export type ImmutableAuthOverrides = Omit; - -/** - * Return type of createImmutableAuth - the NextAuth instance with handlers - */ -export type ImmutableAuthResult = ReturnType; - -/** - * Create an Auth.js v5 instance with Immutable authentication - * - * @param config - Immutable auth configuration - * @param overrides - Optional Auth.js options to override defaults - * @returns NextAuth instance with { handlers, auth, signIn, signOut } - * - * @remarks - * Callback composition: The `jwt` and `session` callbacks are composed rather than - * replaced. Internal callbacks run first (handling token storage and refresh), then - * your custom callbacks receive the result. Other callbacks (`signIn`, `redirect`) - * are replaced entirely if provided. - * - * @example Basic usage (App Router) - * ```typescript - * // lib/auth.ts - * import { createImmutableAuth } from "@imtbl/auth-nextjs"; - * - * export const { handlers, auth, signIn, signOut } = createImmutableAuth({ - * clientId: process.env.NEXT_PUBLIC_IMMUTABLE_CLIENT_ID!, - * redirectUri: `${process.env.NEXT_PUBLIC_BASE_URL}/callback`, - * }); - * - * // app/api/auth/[...nextauth]/route.ts - * import { handlers } from "@/lib/auth"; - * export const { GET, POST } = handlers; - * ``` - * - * @example With Auth.js overrides - * ```typescript - * export const { handlers, auth } = createImmutableAuth( - * { clientId: "...", redirectUri: "..." }, - * { - * pages: { signIn: "/custom-login", error: "/auth-error" }, - * debug: true, - * } - * ); - * ``` - * - * @example With custom jwt callback (composed with internal callback) - * ```typescript - * export const { handlers, auth } = createImmutableAuth( - * { clientId: "...", redirectUri: "..." }, - * { - * callbacks: { - * // Your jwt callback receives the token after internal processing - * async jwt({ token }) { - * // Add custom claims - * token.customClaim = "value"; - * return token; - * }, - * }, - * } - * ); - * ``` - */ -export function createImmutableAuth( - config: ImmutableAuthConfig, - overrides?: ImmutableAuthOverrides, -): ImmutableAuthResult { - const authConfig = createAuthConfig(config); - - // If no overrides, use auth config as-is - if (!overrides) { - return NextAuth(authConfig); - } - - // Compose callbacks to ensure internal callbacks always run first - // User callbacks receive the result and can modify it further - const composedCallbacks: NextAuthConfig['callbacks'] = { - ...authConfig.callbacks, - }; - - if (overrides.callbacks) { - // Compose jwt callback - internal callback runs first, then user callback - if (overrides.callbacks.jwt) { - const internalJwt = authConfig.callbacks?.jwt; - const userJwt = overrides.callbacks.jwt; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - composedCallbacks.jwt = async (params: any) => { - // Run internal jwt callback first to handle token storage and refresh - const token = internalJwt ? await internalJwt(params) : params.token; - // Then run user's jwt callback with the result - return userJwt({ ...params, token }); - }; - } - - // Compose session callback - internal callback runs first, then user callback - if (overrides.callbacks.session) { - const internalSession = authConfig.callbacks?.session; - const userSession = overrides.callbacks.session; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - composedCallbacks.session = async (params: any) => { - // Run internal session callback first to expose token data - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const session = internalSession ? await internalSession(params) : params.session; - // Then run user's session callback with the result - return userSession({ ...params, session }); - }; - } - - // For other callbacks (signIn, redirect, authorized), just use overrides if provided - // These don't need composition as there's no internal implementation - if (overrides.callbacks.signIn) { - composedCallbacks.signIn = overrides.callbacks.signIn; - } - if (overrides.callbacks.redirect) { - composedCallbacks.redirect = overrides.callbacks.redirect; - } - if (overrides.callbacks.authorized) { - composedCallbacks.authorized = overrides.callbacks.authorized; - } - } - - // Merge session config to preserve critical settings like strategy: 'jwt' - // User can override maxAge, updateAge, etc. but strategy is always preserved - const mergedSession = overrides.session - ? { - ...authConfig.session, - ...overrides.session, - // Always enforce JWT strategy - this is required for token storage/refresh - strategy: 'jwt' as const, - } - : authConfig.session; - - const mergedConfig: NextAuthConfig = { - ...authConfig, - ...overrides, - callbacks: composedCallbacks, - session: mergedSession, - }; - - return NextAuth(mergedConfig); -} - -// Legacy alias for backwards compatibility during migration -export const ImmutableAuth = createImmutableAuth; - -// Export config creator for advanced use cases -export { createAuthConfig } from './config'; - -// Types -export type { - ImmutableAuthConfig, - ImmutableTokenData, - ImmutableUser, - ZkEvmInfo, -} from './types'; - -// Re-export login-related types from @imtbl/auth for convenience -export type { LoginOptions, DirectLoginOptions } from '@imtbl/auth'; -export { MarketingConsentStatus } from '@imtbl/auth'; - -// Token expiry check utility -export { isTokenExpired } from './refresh'; - -// Default constants (useful for configuration reference) -export { - DEFAULT_AUTH_DOMAIN, - DEFAULT_AUDIENCE, - DEFAULT_SCOPE, - DEFAULT_NEXTAUTH_BASE_PATH, -} from './constants'; diff --git a/packages/auth-nextjs/src/refresh.test.ts b/packages/auth-nextjs/src/refresh.test.ts deleted file mode 100644 index 4ceaab8839..0000000000 --- a/packages/auth-nextjs/src/refresh.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { isTokenExpired } from './refresh'; - -describe('isTokenExpired', () => { - it('should return true for expired tokens', () => { - const expiredTime = Date.now() - 1000; - expect(isTokenExpired(expiredTime)).toBe(true); - }); - - it('should return true for tokens expiring within buffer', () => { - const almostExpired = Date.now() + 30 * 1000; // 30 seconds from now - expect(isTokenExpired(almostExpired, 60)).toBe(true); // 60 second buffer - }); - - it('should return false for valid tokens outside buffer', () => { - const validTime = Date.now() + 120 * 1000; // 2 minutes from now - expect(isTokenExpired(validTime, 60)).toBe(false); - }); - - it('should return true for NaN', () => { - expect(isTokenExpired(NaN)).toBe(true); - }); - - it('should return true for undefined/invalid values', () => { - expect(isTokenExpired(undefined as unknown as number)).toBe(true); - expect(isTokenExpired(null as unknown as number)).toBe(true); - }); -}); diff --git a/packages/auth-nextjs/src/utils/pathMatch.test.ts b/packages/auth-nextjs/src/utils/pathMatch.test.ts deleted file mode 100644 index 0e8f75dcbb..0000000000 --- a/packages/auth-nextjs/src/utils/pathMatch.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { matchPathPrefix } from './pathMatch'; - -describe('matchPathPrefix', () => { - describe('exact matches', () => { - it('should match exact path', () => { - expect(matchPathPrefix('/api', '/api')).toBe(true); - }); - - it('should match exact path with trailing slash', () => { - expect(matchPathPrefix('/api/', '/api/')).toBe(true); - }); - - it('should match root path', () => { - expect(matchPathPrefix('/', '/')).toBe(true); - }); - }); - - describe('prefix matches with path boundaries', () => { - it('should match nested paths under the pattern', () => { - expect(matchPathPrefix('/api/users', '/api')).toBe(true); - expect(matchPathPrefix('/api/users/123', '/api')).toBe(true); - expect(matchPathPrefix('/dashboard/settings/profile', '/dashboard')).toBe(true); - }); - - it('should match when pattern has trailing slash', () => { - expect(matchPathPrefix('/api/users', '/api/')).toBe(true); - }); - - it('should match deeply nested paths', () => { - expect(matchPathPrefix('/api/v1/users/123/posts', '/api')).toBe(true); - }); - }); - - describe('non-matches due to path boundary', () => { - it('should NOT match paths that share prefix but different segment', () => { - expect(matchPathPrefix('/apiversion', '/api')).toBe(false); - expect(matchPathPrefix('/api-docs', '/api')).toBe(false); - expect(matchPathPrefix('/api2', '/api')).toBe(false); - }); - - it('should NOT match paths with similar but different prefix', () => { - expect(matchPathPrefix('/dashboard-admin', '/dashboard')).toBe(false); - expect(matchPathPrefix('/dashboardv2', '/dashboard')).toBe(false); - }); - - it('should NOT match completely different paths', () => { - expect(matchPathPrefix('/users', '/api')).toBe(false); - expect(matchPathPrefix('/profile', '/dashboard')).toBe(false); - }); - - it('should NOT match when pathname is shorter', () => { - expect(matchPathPrefix('/ap', '/api')).toBe(false); - expect(matchPathPrefix('/a', '/api')).toBe(false); - }); - }); - - describe('edge cases', () => { - it('should handle multi-segment patterns', () => { - expect(matchPathPrefix('/api/v1/users', '/api/v1')).toBe(true); - expect(matchPathPrefix('/api/v1', '/api/v1')).toBe(true); - expect(matchPathPrefix('/api/v12', '/api/v1')).toBe(false); - }); - - it('should handle patterns ending with slash correctly', () => { - // Pattern '/api/' should match '/api/users' but not '/api' (no trailing slash) - expect(matchPathPrefix('/api/users', '/api/')).toBe(true); - expect(matchPathPrefix('/api/', '/api/')).toBe(true); - // '/api' does not start with '/api/' so this should be false - expect(matchPathPrefix('/api', '/api/')).toBe(false); - }); - - it('should handle root pattern', () => { - expect(matchPathPrefix('/anything', '/')).toBe(true); - expect(matchPathPrefix('/api/users', '/')).toBe(true); - }); - }); -}); diff --git a/packages/passport/sdk-sample-app/package.json b/packages/passport/sdk-sample-app/package.json index e00c217c85..62644da2e7 100644 --- a/packages/passport/sdk-sample-app/package.json +++ b/packages/passport/sdk-sample-app/package.json @@ -4,7 +4,8 @@ "dependencies": { "@biom3/design-tokens": "^0.4.5", "@biom3/react": "^0.29.4", - "@imtbl/auth-nextjs": "workspace:*", + "@imtbl/auth-next-client": "workspace:*", + "@imtbl/auth-next-server": "workspace:*", "@imtbl/blockchain-data": "workspace:*", "@imtbl/config": "workspace:*", "@imtbl/generated-clients": "workspace:*", diff --git a/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx b/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx index f68e4daad2..559ef113d4 100644 --- a/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx +++ b/packages/passport/sdk-sample-app/src/components/AuthNextJS.tsx @@ -1,7 +1,7 @@ import { useCallback } from "react"; import { Stack } from "react-bootstrap"; import { Body } from "@biom3/react"; -import { useImmutableAuth } from "@imtbl/auth-nextjs/client"; +import { useImmutableAuth } from "@imtbl/auth-next-client"; import CardStack from "@/components/CardStack"; import WorkflowButton from "@/components/WorkflowButton"; import { useStatusProvider } from "@/context/StatusProvider"; @@ -9,7 +9,7 @@ import { useImmutableProvider } from "@/context/ImmutableProvider"; import { usePassportProvider } from "@/context/PassportProvider"; /** - * Example component demonstrating @imtbl/auth-nextjs usage + * Example component demonstrating @imtbl/auth-next-client usage * Uses useImmutableAuth hook from the provider (which handles hydration automatically) */ export default function AuthNextJS() { diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 7d6a6f88c2..145c2e6a0a 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -10,9 +10,9 @@ import { import { Orderbook, OrderbookOverrides } from '@imtbl/orderbook'; import { Passport, PassportModuleConfiguration } from '@imtbl/passport'; import { Environment, ImmutableConfiguration, ModuleConfiguration } from '@imtbl/config'; -import { ImmutableAuthProvider } from '@imtbl/auth-nextjs/client'; +import { ImmutableAuthProvider } from '@imtbl/auth-next-client'; import type { Session } from 'next-auth'; -// Note: Session type is augmented in @imtbl/auth-nextjs/types +// Note: Session type is augmented in @imtbl/auth-next-client/types import { AUDIENCE, POPUP_REDIRECT_URI, diff --git a/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts b/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts index 2b0f3dee32..8308ac5bda 100644 --- a/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts +++ b/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts @@ -1,4 +1,4 @@ -import { createImmutableAuth, type ImmutableAuthConfig } from "@imtbl/auth-nextjs"; +import { createImmutableAuth, type ImmutableAuthConfig } from "@imtbl/auth-next-server"; import { EnvironmentNames } from "@/types"; import { BASE_PATH } from "@/config"; diff --git a/packages/passport/sdk-sample-app/src/pages/callback.page.tsx b/packages/passport/sdk-sample-app/src/pages/callback.page.tsx index fe8afd0285..cf5ac667fe 100644 --- a/packages/passport/sdk-sample-app/src/pages/callback.page.tsx +++ b/packages/passport/sdk-sample-app/src/pages/callback.page.tsx @@ -1,10 +1,9 @@ "use client"; import { useEffect, useState } from "react"; -import { CallbackPage } from "@imtbl/auth-nextjs/client"; +import { CallbackPage, type ImmutableAuthConfig } from "@imtbl/auth-next-client"; import { getAuthConfig } from "@/lib/auth-nextjs"; import { EnvironmentNames } from "@/types"; -import type { ImmutableAuthConfig } from "@imtbl/auth-nextjs"; import { Container, Spinner } from "react-bootstrap"; /** diff --git a/packages/passport/sdk-sample-app/src/pages/index.page.tsx b/packages/passport/sdk-sample-app/src/pages/index.page.tsx index 3929080ee1..231f162cdb 100644 --- a/packages/passport/sdk-sample-app/src/pages/index.page.tsx +++ b/packages/passport/sdk-sample-app/src/pages/index.page.tsx @@ -7,7 +7,7 @@ import Message from '@/components/Message'; import Environment from '@/components/Environment'; import { usePassportProvider } from '@/context/PassportProvider'; import { useStatusProvider } from '@/context/StatusProvider'; -import { useImmutableAuth } from '@imtbl/auth-nextjs/client'; +import { useImmutableAuth } from '@imtbl/auth-next-client'; import { BASE_PATH } from '@/config'; import PassportMethods from '@/components/PassportMethods'; import ZkEvmWorkflow from '@/components/zkevm/ZkEvmWorkflow'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5868917b60..7d1bfdc862 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,16 +29,16 @@ importers: version: 29.7.0 '@nx/js': specifier: ^19.7.2 - version: 19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)))(typescript@5.6.2) + version: 19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)))(typescript@5.6.2) '@swc-node/register': specifier: ^1.10.9 - version: 1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2) + version: 1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2) '@swc/cli': specifier: ^0.4.0 - version: 0.4.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(chokidar@3.6.0) + version: 0.4.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(chokidar@3.6.0) '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@types/chai': specifier: ^4.3.16 version: 4.3.16 @@ -83,7 +83,7 @@ importers: version: 9.4.0 nx: specifier: ^19.7.2 - version: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) process: specifier: ^0.11.10 version: 0.11.10 @@ -95,7 +95,7 @@ importers: version: 13.0.0(typescript@5.6.2) tsup: specifier: 8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typedoc: specifier: ^0.26.5 version: 0.26.5(typescript@5.6.2) @@ -117,13 +117,13 @@ importers: version: 29.7.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) typescript: specifier: ^5 version: 5.6.2 @@ -344,7 +344,7 @@ importers: dependencies: '@imtbl/contracts': specifier: latest - version: 2.2.18(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 2.2.18(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) '@imtbl/sdk': specifier: workspace:* version: link:../../sdk @@ -357,13 +357,13 @@ importers: version: 29.7.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) typescript: specifier: ^5 version: 5.6.2 @@ -771,7 +771,7 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -805,7 +805,7 @@ importers: version: 8.4.49 tailwindcss: specifier: ^3.4.1 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -829,7 +829,7 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -863,7 +863,7 @@ importers: version: 8.4.49 tailwindcss: specifier: ^3.4.1 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -912,7 +912,7 @@ importers: version: 8.4.49 tailwindcss: specifier: ^3.4.6 - version: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -949,10 +949,10 @@ importers: version: 6.3.0 ts-node: specifier: ^10.8.1 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@4.9.5) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@4.9.5) ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(node-notifier@8.0.2)(typescript@4.9.5) + version: 2.0.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(node-notifier@8.0.2)(typescript@4.9.5) typescript: specifier: ^4.7.4 version: 4.9.5 @@ -1017,10 +1017,10 @@ importers: version: 29.7.0 '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1029,62 +1029,95 @@ importers: version: 18.15.13 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 - packages/auth-nextjs: + packages/auth-next-client: dependencies: '@imtbl/auth': specifier: workspace:* version: link:../auth + '@imtbl/auth-next-server': + specifier: workspace:* + version: link:../auth-next-server devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.15.3(@swc/helpers@0.5.13) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': - specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13)) + specifier: ^0.2.36 + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': - specifier: ^18.3.5 + specifier: ^18.2.0 version: 18.3.12 + eslint: + specifier: ^8.56.0 + version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - jest-environment-jsdom: - specifier: ^29.4.3 - version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) next: - specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.1.6 + version: 15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: ^5.0.0-beta.30 - version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.30(next@15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) tsup: - specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + specifier: ^8.0.2 + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + typescript: + specifier: ^5.6.2 + version: 5.6.2 + + packages/auth-next-server: + devDependencies: + '@swc/core': + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) + '@swc/jest': + specifier: ^0.2.36 + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) + '@types/jest': + specifier: ^29.5.12 + version: 29.5.14 + '@types/node': + specifier: ^22.10.7 + version: 22.19.7 + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + next: + specifier: ^15.1.6 + version: 15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + next-auth: + specifier: ^5.0.0-beta.30 + version: 5.0.0-beta.30(next@15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + tsup: + specifier: ^8.0.2 + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1103,10 +1136,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1115,13 +1148,13 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1170,10 +1203,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1203,7 +1236,7 @@ importers: version: 0.7.0 tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typedoc: specifier: ^0.26.5 version: 0.26.5(typescript@5.6.2) @@ -1285,13 +1318,13 @@ importers: version: 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1406,7 +1439,7 @@ importers: version: 5.0.7(rollup@4.28.0) '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.28.0)(tslib@2.7.0)(typescript@5.6.2) + version: 11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.6.2) '@segment/analytics-next': specifier: ^1.53.2 version: 1.54.0(encoding@0.1.13) @@ -1415,10 +1448,10 @@ importers: version: 8.0.1(typescript@5.6.2) '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.17.0 @@ -1451,13 +1484,13 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1469,13 +1502,13 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 unplugin-swc: specifier: ^1.5.1 - version: 1.5.1(@swc/core@1.9.3(@swc/helpers@0.5.13))(rollup@4.28.0) + version: 1.5.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(rollup@4.28.0) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -1527,7 +1560,7 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.17.0 @@ -1573,10 +1606,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1594,7 +1627,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1603,10 +1636,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1637,7 +1670,7 @@ importers: version: 8.57.0 parcel: specifier: ^2.13.3 - version: 2.16.3(@swc/helpers@0.5.13) + version: 2.16.3(@swc/helpers@0.5.15) packages/internal/bridge/bridge-sample-app: dependencies: @@ -1668,7 +1701,7 @@ importers: version: 13.3.1(eslint@8.57.0)(typescript@5.6.2) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1690,10 +1723,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@typechain/ethers-v6': specifier: ^0.5.1 version: 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) @@ -1705,16 +1738,16 @@ importers: version: 18.15.13 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typechain: specifier: ^8.1.1 version: 8.3.0(typescript@5.6.2) @@ -1736,10 +1769,10 @@ importers: version: 29.7.0 '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1763,7 +1796,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1772,10 +1805,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1790,20 +1823,20 @@ importers: version: 3.2.3 '@uniswap/swap-router-contracts': specifier: ^1.3.1 - version: 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@uniswap/v3-sdk': specifier: ^3.9.0 - version: 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: specifier: ^6.13.4 version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@typechain/ethers-v6': specifier: ^0.5.1 version: 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) @@ -1818,16 +1851,16 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typechain: specifier: ^8.1.1 version: 8.3.0(typescript@5.6.2) @@ -1875,7 +1908,7 @@ importers: version: 18.3.1(react@18.3.1) tailwindcss: specifier: 3.3.2 - version: 3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1891,7 +1924,7 @@ importers: version: 2.13.4(encoding@0.1.13) '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1906,7 +1939,7 @@ importers: version: 6.0.1 tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1922,10 +1955,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -1946,7 +1979,7 @@ importers: version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1977,10 +2010,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/axios': specifier: ^0.14.0 version: 0.14.0 @@ -2010,7 +2043,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2019,10 +2052,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2057,10 +2090,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@testcontainers/postgresql': specifier: ^10.9.0 version: 10.9.0(encoding@0.1.13) @@ -2078,7 +2111,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2087,7 +2120,7 @@ importers: version: 10.9.0(encoding@0.1.13) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2118,10 +2151,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@typechain/ethers-v6': specifier: ^0.5.1 version: 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) @@ -2136,7 +2169,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2145,7 +2178,7 @@ importers: version: 2.6.1 tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typechain: specifier: ^8.1.1 version: 8.3.0(typescript@5.6.2) @@ -2194,10 +2227,10 @@ importers: version: 29.7.0 '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -2224,7 +2257,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2239,10 +2272,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2255,9 +2288,12 @@ importers: '@biom3/react': specifier: ^0.29.4 version: 0.29.11(@emotion/react@11.11.3(@types/react@18.3.12)(react@18.3.1))(@rive-app/react-canvas-lite@4.9.0(react@18.3.1))(embla-carousel-react@8.1.5(react@18.3.1))(motion@11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@imtbl/auth-nextjs': + '@imtbl/auth-next-client': + specifier: workspace:* + version: link:../../auth-next-client + '@imtbl/auth-next-server': specifier: workspace:* - version: link:../../auth-nextjs + version: link:../../auth-next-server '@imtbl/blockchain-data': specifier: workspace:* version: link:../../blockchain-data/sdk @@ -2324,7 +2360,7 @@ importers: version: 13.4.9 '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@types/node': specifier: ^18.14.2 version: 18.15.13 @@ -2373,10 +2409,10 @@ importers: version: 29.7.0 '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -2385,16 +2421,16 @@ importers: version: 18.15.13 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2413,10 +2449,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -2428,13 +2464,13 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2471,10 +2507,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/bn.js': specifier: ^5.1.6 version: 5.1.6 @@ -2489,13 +2525,13 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2532,10 +2568,10 @@ importers: devDependencies: '@swc/core': specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.13) + version: 1.9.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13)) + version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@types/axios': specifier: ^0.14.0 version: 0.14.0 @@ -2562,7 +2598,7 @@ importers: version: 8.57.0 jest: specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2571,10 +2607,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2616,7 +2652,7 @@ importers: version: 18.3.1(react@18.3.1) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2633,9 +2669,12 @@ importers: '@imtbl/auth': specifier: workspace:* version: link:../packages/auth - '@imtbl/auth-nextjs': + '@imtbl/auth-next-client': + specifier: workspace:* + version: link:../packages/auth-next-client + '@imtbl/auth-next-server': specifier: workspace:* - version: link:../packages/auth-nextjs + version: link:../packages/auth-next-server '@imtbl/blockchain-data': specifier: workspace:* version: link:../packages/blockchain-data/sdk @@ -2681,7 +2720,7 @@ importers: version: 8.57.0 tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2700,7 +2739,7 @@ importers: devDependencies: '@swc/jest': specifier: ^0.2.29 - version: 0.2.36(@swc/core@1.15.3(@swc/helpers@0.5.13)) + version: 0.2.36(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.4.3 version: 29.5.3 @@ -2709,19 +2748,19 @@ importers: version: 20.14.13 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) jest-cucumber: specifier: ^3.0.1 - version: 3.0.2(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + version: 3.0.2(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) pinst: specifier: ^3.0.0 version: 3.0.0 ts-jest: specifier: ^29.1.1 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2730,25 +2769,25 @@ importers: dependencies: '@imtbl/contracts': specifier: 2.2.6 - version: 2.2.6(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 2.2.6(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) '@imtbl/sdk': specifier: workspace:* version: link:../../../sdk '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.8 - version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^3.0.0 - version: 3.0.0(aq5qzs7bnda353hsdhxryfweyu) + version: 3.0.0(psd3grcaa6tu47tsyrqa7gq7oq) '@nomicfoundation/hardhat-verify': specifier: ^2.0.0 - version: 2.0.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 2.0.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-etherscan': specifier: ^3.0.0 - version: 3.1.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 3.1.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': specifier: ^4.9.3 version: 4.9.6 @@ -2757,7 +2796,7 @@ importers: version: 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) '@typechain/hardhat': specifier: ^9.0.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2)) '@types/chai': specifier: ^4.2.0 version: 4.3.16 @@ -2772,17 +2811,17 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: specifier: ^2.19.4 - version: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) hardhat-gas-reporter: specifier: ^1.0.8 - version: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: specifier: ^0.8.1 - version: 0.8.12(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 0.8.12(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) devDependencies: '@swc/jest': specifier: ^0.2.29 - version: 0.2.36(@swc/core@1.15.3(@swc/helpers@0.5.13)) + version: 0.2.36(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.4.3 version: 29.5.3 @@ -2791,19 +2830,19 @@ importers: version: 20.14.13 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + version: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) jest-cucumber: specifier: ^3.0.1 - version: 3.0.2(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + version: 3.0.2(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) pinst: specifier: ^3.0.0 version: 3.0.0 ts-jest: specifier: ^29.1.1 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -3946,6 +3985,9 @@ packages: '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} @@ -4496,6 +4538,143 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@imtbl/auth@2.12.3': resolution: {integrity: sha512-zUPwoYoiqyIyq4XKaJkvMMrKDhnPw0ND3AJUNN/ZZ2NMIKrDYpaIvCD2JmisO6HXiXrlb9HcocI+Bc+bfPnYhQ==} @@ -5073,6 +5252,9 @@ packages: '@next/env@14.2.25': resolution: {integrity: sha512-JnzQ2cExDeG7FxJwqAksZ3aqVJrHjFwZQAEJ9gQZSoEhIow7SNoKZzju/AwQ+PLIR4NY8V0rhcVozx/2izDO0w==} + '@next/env@15.5.9': + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} + '@next/eslint-plugin-next@13.3.1': resolution: {integrity: sha512-Hpd74UrYGF+bq9bBSRDXRsRfaWkPpcwjhvachy3sr/R/5fY6feC0T0s047pUthyqcaeNsqKOY1nUGQQJNm4WyA==} @@ -5097,42 +5279,84 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@14.2.25': resolution: {integrity: sha512-V+iYM/QR+aYeJl3/FWWU/7Ix4b07ovsQ5IbkwgUK29pTHmq+5UxeDr7/dphvtXEq5pLB/PucfcBNh9KZ8vWbug==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-linux-arm64-gnu@14.2.25': resolution: {integrity: sha512-LFnV2899PJZAIEHQ4IMmZIgL0FBieh5keMnriMY1cK7ompR+JUd24xeTtKkcaw8QmxmEdhoE5Mu9dPSuDBgtTg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@14.2.25': resolution: {integrity: sha512-QC5y5PPTmtqFExcKWKYgUNkHeHE/z3lUsu83di488nyP0ZzQ3Yse2G6TCxz6nNsQwgAx1BehAJTZez+UQxzLfw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-x64-gnu@14.2.25': resolution: {integrity: sha512-y6/ML4b9eQ2D/56wqatTJN5/JR8/xdObU2Fb1RBidnrr450HLCKr6IJZbPqbv7NXmje61UyxjF5kvSajvjye5w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@14.2.25': resolution: {integrity: sha512-sPX0TSXHGUOZFvv96GoBXpB3w4emMqKeMgemrSxI7A6l55VBJp/RKYLwZIB9JxSqYPApqiREaIIap+wWq0RU8w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-win32-arm64-msvc@14.2.25': resolution: {integrity: sha512-ReO9S5hkA1DU2cFCsGoOEp7WJkhFzNbU/3VUF6XxNGUCQChyug6hZdYL/istQgfT/GWE6PNIg9cm784OI4ddxQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-ia32-msvc@14.2.25': resolution: {integrity: sha512-DZ/gc0o9neuCDyD5IumyTGHVun2dCox5TfPQI/BJTYwpSNYM3CZDI4i6TOdjeq1JMo+Ug4kPSMuZdwsycwFbAw==} engines: {node: '>= 10'} @@ -5145,6 +5369,12 @@ packages: cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -7307,6 +7537,9 @@ packages: '@swc/helpers@0.5.13': resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -7600,6 +7833,9 @@ packages: '@types/node@20.14.13': resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} + '@types/node@22.19.7': + resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} + '@types/node@22.7.5': resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} @@ -13410,6 +13646,27 @@ packages: sass: optional: true + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nice-napi@1.0.2: resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} os: ['!win32'] @@ -15479,6 +15736,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -15539,6 +15801,10 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -16042,6 +16308,19 @@ packages: babel-plugin-macros: optional: true + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylehacks@5.1.1: resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} @@ -16491,6 +16770,9 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -16685,6 +16967,9 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -19749,6 +20034,11 @@ snapshots: dependencies: tslib: 2.7.0 + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.7.0 + optional: true + '@emnapi/wasi-threads@1.0.1': dependencies: tslib: 2.7.0 @@ -20388,6 +20678,103 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + '@imtbl/auth@2.12.3': dependencies: '@imtbl/generated-clients': 2.12.3 @@ -20443,7 +20830,7 @@ snapshots: dependencies: '@imtbl/metrics': 2.12.3 - '@imtbl/contracts@2.2.18(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@imtbl/contracts@2.2.18(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 '@limitbreak/creator-token-standards': 5.0.0 @@ -20451,8 +20838,8 @@ snapshots: '@openzeppelin/contracts-upgradeable': 4.9.6 openzeppelin-contracts-5.0.2: '@openzeppelin/contracts@5.0.2' openzeppelin-contracts-upgradeable-4.9.3: '@openzeppelin/contracts-upgradeable@4.9.6' - seaport: https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - seaport-16: seaport@https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + seaport: https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + seaport-16: seaport@https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) seaport-core-16: seaport-core@https://codeload.github.com/immutable/seaport-core/tar.gz/f9b2e50267862570d0df3ed7e3e32d1ff2cd9813 seaport-types-16: seaport-types@1.6.3 solidity-bits: 0.4.0 @@ -20465,7 +20852,7 @@ snapshots: - typescript - utf-8-validate - '@imtbl/contracts@2.2.6(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': + '@imtbl/contracts@2.2.6(bufferutil@4.0.8)(eslint@9.16.0(jiti@1.21.0))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)': dependencies: '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 '@openzeppelin/contracts': 4.9.6 @@ -20474,7 +20861,7 @@ snapshots: eslint-plugin-mocha: 10.5.0(eslint@9.16.0(jiti@1.21.0)) openzeppelin-contracts-5.0.2: '@openzeppelin/contracts@5.0.2' openzeppelin-contracts-upgradeable-4.9.3: '@openzeppelin/contracts-upgradeable@4.9.6' - seaport: https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + seaport: https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) solidity-bits: 0.4.0 solidity-bytes-utils: 0.8.2 transitivePeerDependencies: @@ -20490,8 +20877,8 @@ snapshots: dependencies: '@imtbl/config': 2.12.3 '@uniswap/sdk-core': 3.2.3 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -20714,7 +21101,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/core@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/console': 26.6.2 '@jest/reporters': 26.6.2 @@ -20727,14 +21114,14 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 26.6.2 - jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-resolve-dependencies: 26.6.3 - jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-snapshot: 26.6.2 jest-util: 26.6.2 jest-validate: 26.6.2 @@ -20751,7 +21138,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/core@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1(node-notifier@8.0.2) @@ -20765,7 +21152,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -20790,7 +21177,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/core@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1(node-notifier@8.0.2) @@ -20804,7 +21191,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -20829,7 +21216,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@8.0.2) @@ -20843,7 +21230,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -20866,7 +21253,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@8.0.2) @@ -20880,7 +21267,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -20903,7 +21290,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@8.0.2) @@ -20917,7 +21304,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -20940,7 +21327,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@8.0.2) @@ -20954,7 +21341,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -20977,7 +21364,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@8.0.2) @@ -20991,7 +21378,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -21246,13 +21633,13 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/test-sequencer@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/test-result': 26.6.2 graceful-fs: 4.2.11 jest-haste-map: 26.6.2 - jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-runner: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - canvas @@ -21766,6 +22153,8 @@ snapshots: '@next/env@14.2.25': {} + '@next/env@15.5.9': {} + '@next/eslint-plugin-next@13.3.1': dependencies: glob: 7.1.7 @@ -21793,30 +22182,54 @@ snapshots: '@next/swc-darwin-arm64@14.2.25': optional: true + '@next/swc-darwin-arm64@15.5.7': + optional: true + '@next/swc-darwin-x64@14.2.25': optional: true + '@next/swc-darwin-x64@15.5.7': + optional: true + '@next/swc-linux-arm64-gnu@14.2.25': optional: true + '@next/swc-linux-arm64-gnu@15.5.7': + optional: true + '@next/swc-linux-arm64-musl@14.2.25': optional: true + '@next/swc-linux-arm64-musl@15.5.7': + optional: true + '@next/swc-linux-x64-gnu@14.2.25': optional: true + '@next/swc-linux-x64-gnu@15.5.7': + optional: true + '@next/swc-linux-x64-musl@14.2.25': optional: true + '@next/swc-linux-x64-musl@15.5.7': + optional: true + '@next/swc-win32-arm64-msvc@14.2.25': optional: true + '@next/swc-win32-arm64-msvc@15.5.7': + optional: true + '@next/swc-win32-ia32-msvc@14.2.25': optional: true '@next/swc-win32-x64-msvc@14.2.25': optional: true + '@next/swc-win32-x64-msvc@15.5.7': + optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -21907,64 +22320,64 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: debug: 4.3.7(supports-color@8.1.1) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@3.0.0(aq5qzs7bnda353hsdhxryfweyu)': + '@nomicfoundation/hardhat-toolbox@3.0.0(psd3grcaa6tu47tsyrqa7gq7oq)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2)) '@types/chai': 4.3.16 '@types/mocha': 10.0.8 '@types/node': 20.14.13 chai: 4.5.0 ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.12(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.12(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) typechain: 8.3.0(typescript@5.6.2) typescript: 5.6.2 - '@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.7(supports-color@8.1.1) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 semver: 6.3.1 table: 6.8.2 @@ -22003,7 +22416,7 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 @@ -22011,7 +22424,7 @@ snapshots: chalk: 2.4.2 debug: 4.3.7(supports-color@8.1.1) fs-extra: 7.0.1 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) lodash: 4.17.21 semver: 6.3.1 table: 6.8.2 @@ -22023,15 +22436,15 @@ snapshots: dependencies: semver: 7.7.1 - '@nrwl/devkit@19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)))': + '@nrwl/devkit@19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)))': dependencies: - '@nx/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))) + '@nx/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))) transitivePeerDependencies: - nx - '@nrwl/js@19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)))(typescript@5.6.2)': + '@nrwl/js@19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)))(typescript@5.6.2)': dependencies: - '@nx/js': 19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)))(typescript@5.6.2) + '@nx/js': 19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)))(typescript@5.6.2) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -22044,18 +22457,18 @@ snapshots: - typescript - verdaccio - '@nrwl/tao@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))': + '@nrwl/tao@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))': dependencies: - nx: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) + nx: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) tslib: 2.7.0 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug - '@nrwl/workspace@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))': + '@nrwl/workspace@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))': dependencies: - '@nx/workspace': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) + '@nx/workspace': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@swc-node/register' - '@swc/core' @@ -22069,20 +22482,20 @@ snapshots: transitivePeerDependencies: - encoding - '@nx/devkit@19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)))': + '@nx/devkit@19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)))': dependencies: - '@nrwl/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))) + '@nrwl/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))) ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.1 minimatch: 9.0.3 - nx: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) + nx: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) semver: 7.7.1 tmp: 0.2.3 tslib: 2.7.0 yargs-parser: 21.1.1 - '@nx/js@19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)))(typescript@5.6.2)': + '@nx/js@19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)))(typescript@5.6.2)': dependencies: '@babel/core': 7.26.9 '@babel/plugin-proposal-decorators': 7.22.7(@babel/core@7.26.9) @@ -22091,9 +22504,9 @@ snapshots: '@babel/preset-env': 7.26.9(@babel/core@7.26.9) '@babel/preset-typescript': 7.27.0(@babel/core@7.26.9) '@babel/runtime': 7.25.0 - '@nrwl/js': 19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)))(typescript@5.6.2) - '@nx/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))) - '@nx/workspace': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) + '@nrwl/js': 19.7.3(@babel/traverse@7.27.0)(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)))(typescript@5.6.2) + '@nx/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))) + '@nx/workspace': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) babel-plugin-const-enum: 1.2.0(@babel/core@7.26.9) babel-plugin-macros: 2.8.0 babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.9)(@babel/traverse@7.27.0) @@ -22111,7 +22524,7 @@ snapshots: ora: 5.3.0 semver: 7.6.3 source-map-support: 0.5.19 - ts-node: 10.9.1(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + ts-node: 10.9.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsconfig-paths: 4.2.0 tslib: 2.6.3 transitivePeerDependencies: @@ -22155,13 +22568,13 @@ snapshots: '@nx/nx-win32-x64-msvc@19.7.3': optional: true - '@nx/workspace@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))': + '@nx/workspace@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))': dependencies: - '@nrwl/workspace': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) - '@nx/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13))) + '@nrwl/workspace': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) + '@nx/devkit': 19.7.3(nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15))) chalk: 4.1.2 enquirer: 2.3.6 - nx: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) + nx: 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) tslib: 2.7.0 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -22256,11 +22669,11 @@ snapshots: '@panva/hkdf@1.2.1': {} - '@parcel/bundler-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/bundler-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 '@parcel/graph': 3.6.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 nullthrows: 1.1.1 @@ -22268,10 +22681,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/cache@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/cache@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) - '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) + '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/logger': 2.16.3 '@parcel/utils': 2.16.3 lmdb: 2.8.5 @@ -22282,70 +22695,70 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/compressor-raw@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/compressor-raw@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/config-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))(@swc/helpers@0.5.13)': - dependencies: - '@parcel/bundler-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/compressor-raw': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) - '@parcel/namer-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/optimizer-css': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/optimizer-html': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/optimizer-image': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/optimizer-svg': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/optimizer-swc': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))(@swc/helpers@0.5.13) - '@parcel/packager-css': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/packager-html': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/packager-js': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/packager-raw': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/packager-svg': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/packager-wasm': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/reporter-dev-server': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/resolver-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/runtime-browser-hmr': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/runtime-js': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/runtime-rsc': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/runtime-service-worker': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-babel': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-css': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-html': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-image': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-js': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-json': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-node': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-postcss': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-posthtml': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-raw': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-react-refresh-wrap': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/transformer-svg': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/config-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': + dependencies: + '@parcel/bundler-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/compressor-raw': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) + '@parcel/namer-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-css': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-html': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-image': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-svg': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-swc': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/packager-css': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/packager-html': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/packager-js': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/packager-raw': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/packager-svg': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/packager-wasm': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/reporter-dev-server': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/resolver-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/runtime-browser-hmr': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/runtime-js': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/runtime-rsc': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/runtime-service-worker': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-babel': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-css': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-html': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-image': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-js': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-json': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-node': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-postcss': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-posthtml': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-raw': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-react-refresh-wrap': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/transformer-svg': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/core@2.16.3(@swc/helpers@0.5.13)': + '@parcel/core@2.16.3(@swc/helpers@0.5.15)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/cache': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/diagnostic': 2.16.3 '@parcel/events': 2.16.3 '@parcel/feature-flags': 2.16.3 - '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/graph': 3.6.3 '@parcel/logger': 2.16.3 - '@parcel/package-manager': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))(@swc/helpers@0.5.13) - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/package-manager': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/profiler': 2.16.3 '@parcel/rust': 2.16.3 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 - '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) base-x: 3.0.11 browserslist: 4.28.1 clone: 2.1.2 @@ -22370,15 +22783,15 @@ snapshots: '@parcel/feature-flags@2.16.3': {} - '@parcel/fs@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/fs@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) '@parcel/feature-flags': 2.16.3 '@parcel/rust': 2.16.3 '@parcel/types-internal': 2.16.3 '@parcel/utils': 2.16.3 '@parcel/watcher': 2.4.0 - '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - napi-wasm @@ -22396,20 +22809,20 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/namer-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/namer-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/node-resolver-core@3.7.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/node-resolver-core@3.7.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@mischnic/json-sourcemap': 0.1.1 '@parcel/diagnostic': 2.16.3 - '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 nullthrows: 1.1.1 @@ -22418,10 +22831,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-css@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/optimizer-css@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.3 browserslist: 4.28.1 @@ -22431,68 +22844,68 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-html@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/optimizer-html@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-image@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/optimizer-image@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 - '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - napi-wasm - '@parcel/optimizer-svg@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/optimizer-svg@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-swc@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))(@swc/helpers@0.5.13)': + '@parcel/optimizer-swc@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.3 - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - '@swc/helpers' - napi-wasm - '@parcel/package-manager@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))(@swc/helpers@0.5.13)': + '@parcel/package-manager@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': dependencies: - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.16.3 - '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/logger': 2.16.3 - '@parcel/node-resolver-core': 3.7.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/node-resolver-core': 3.7.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 - '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) semver: 7.7.1 transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/packager-css@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/packager-css@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.3 lightningcss: 1.30.2 @@ -22501,23 +22914,23 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-html@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/packager-html@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 - '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-js@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/packager-js@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 globals: 13.24.0 nullthrows: 1.1.1 @@ -22525,33 +22938,33 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-raw@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/packager-raw@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-svg@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/packager-svg@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 - '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-wasm@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/packager-wasm@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/plugin@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/plugin@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -22563,10 +22976,10 @@ snapshots: '@parcel/types-internal': 2.16.3 chrome-trace-event: 1.0.3 - '@parcel/reporter-cli@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/reporter-cli@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 chalk: 4.1.2 term-size: 2.2.1 @@ -22574,19 +22987,19 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/reporter-dev-server@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/reporter-dev-server@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/codeframe': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/reporter-tracer@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/reporter-tracer@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 chrome-trace-event: 1.0.3 nullthrows: 1.1.1 @@ -22594,35 +23007,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/resolver-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/resolver-default@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/node-resolver-core': 3.7.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/node-resolver-core': 3.7.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-browser-hmr@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/runtime-browser-hmr@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-js@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/runtime-js@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-rsc@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/runtime-rsc@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 nullthrows: 1.1.1 @@ -22630,9 +23043,9 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/runtime-service-worker@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/runtime-service-worker@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 nullthrows: 1.1.1 transitivePeerDependencies: @@ -22678,10 +23091,10 @@ snapshots: dependencies: detect-libc: 1.0.3 - '@parcel/transformer-babel@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-babel@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.3 browserslist: 4.28.1 @@ -22692,10 +23105,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-css@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-css@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.3 browserslist: 4.28.1 @@ -22705,34 +23118,34 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-html@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-html@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-image@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-image@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 - '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-js@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-js@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.3 - '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@swc/helpers': 0.5.13 browserslist: 4.28.1 nullthrows: 1.1.1 @@ -22741,25 +23154,25 @@ snapshots: transitivePeerDependencies: - napi-wasm - '@parcel/transformer-json@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-json@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) json5: 2.2.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-node@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-node@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-postcss@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-postcss@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 clone: 2.1.2 @@ -22770,35 +23183,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-posthtml@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-posthtml@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-raw@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-raw@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-react-refresh-wrap@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-react-refresh-wrap@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/error-overlay': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 react-refresh: 0.16.0 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-svg@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/transformer-svg@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/diagnostic': 2.16.3 - '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/plugin': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/rust': 2.16.3 transitivePeerDependencies: - '@parcel/core' @@ -22811,10 +23224,10 @@ snapshots: '@parcel/source-map': 2.1.1 utility-types: 3.11.0 - '@parcel/types@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/types@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: '@parcel/types-internal': 2.16.3 - '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/workers': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -22893,9 +23306,9 @@ snapshots: '@parcel/watcher-win32-ia32': 2.4.0 '@parcel/watcher-win32-x64': 2.4.0 - '@parcel/workers@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))': + '@parcel/workers@2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))': dependencies: - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.16.3 '@parcel/logger': 2.16.3 '@parcel/profiler': 2.16.3 @@ -22921,7 +23334,7 @@ snapshots: dependencies: playwright: 1.45.3 - '@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1))': dependencies: ansi-html-community: 0.0.8 common-path-prefix: 3.0.0 @@ -22933,12 +23346,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: type-fest: 2.19.0 - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - '@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1))': dependencies: ansi-html-community: 0.0.8 common-path-prefix: 3.0.0 @@ -22950,10 +23363,10 @@ snapshots: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: type-fest: 2.19.0 - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) '@popperjs/core@2.11.8': {} @@ -23376,14 +23789,14 @@ snapshots: optionalDependencies: rollup: 4.28.0 - '@rollup/plugin-typescript@11.1.6(rollup@4.28.0)(tslib@2.7.0)(typescript@5.6.2)': + '@rollup/plugin-typescript@11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.6.2)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.28.0) resolve: 1.22.8 typescript: 5.6.2 optionalDependencies: rollup: 4.28.0 - tslib: 2.7.0 + tslib: 2.8.1 '@rollup/pluginutils@3.1.0(rollup@2.79.1)': dependencies: @@ -24531,16 +24944,16 @@ snapshots: - supports-color - typescript - '@swc-node/core@1.13.3(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)': + '@swc-node/core@1.13.3(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)': dependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) '@swc/types': 0.1.25 - '@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2)': + '@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2)': dependencies: - '@swc-node/core': 1.13.3(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25) + '@swc-node/core': 1.13.3(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25) '@swc-node/sourcemap-support': 0.5.1 - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) colorette: 2.0.20 debug: 4.3.7(supports-color@8.1.1) oxc-resolver: 1.11.0 @@ -24556,10 +24969,10 @@ snapshots: source-map-support: 0.5.21 tslib: 2.7.0 - '@swc/cli@0.4.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(chokidar@3.6.0)': + '@swc/cli@0.4.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(chokidar@3.6.0)': dependencies: '@mole-inc/bin-wrapper': 8.0.1 - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) '@swc/counter': 0.1.3 commander: 8.3.0 fast-glob: 3.3.2 @@ -24631,7 +25044,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.9.3': optional: true - '@swc/core@1.15.3(@swc/helpers@0.5.13)': + '@swc/core@1.15.3(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 @@ -24646,9 +25059,9 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.15.3 '@swc/core-win32-ia32-msvc': 1.15.3 '@swc/core-win32-x64-msvc': 1.15.3 - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 - '@swc/core@1.9.3(@swc/helpers@0.5.13)': + '@swc/core@1.9.3(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.17 @@ -24663,7 +25076,7 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.9.3 '@swc/core-win32-ia32-msvc': 1.9.3 '@swc/core-win32-x64-msvc': 1.9.3 - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} @@ -24671,29 +25084,33 @@ snapshots: dependencies: tslib: 2.7.0 + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 tslib: 2.7.0 - '@swc/jest@0.2.36(@swc/core@1.15.3(@swc/helpers@0.5.13))': + '@swc/jest@0.2.36(@swc/core@1.15.3(@swc/helpers@0.5.15))': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 - '@swc/jest@0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.13))': + '@swc/jest@0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15))': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 - '@swc/jest@0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.13))': + '@swc/jest@0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15))': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -24798,12 +25215,12 @@ snapshots: typechain: 8.3.0(typescript@5.6.2) typescript: 5.6.2 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) typechain: 8.3.0(typescript@5.6.2) '@types/aria-query@5.0.1': {} @@ -25034,6 +25451,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.19.7': + dependencies: + undici-types: 6.21.0 + '@types/node@22.7.5': dependencies: undici-types: 6.19.8 @@ -25376,14 +25797,14 @@ snapshots: tiny-invariant: 1.3.1 toformat: 2.0.0 - '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@openzeppelin/contracts': 3.4.2 '@uniswap/v2-core': 1.0.1 '@uniswap/v3-core': 1.0.0 '@uniswap/v3-periphery': 1.4.4 dotenv: 14.3.2 - hardhat-watcher: 2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + hardhat-watcher: 2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) transitivePeerDependencies: - hardhat @@ -25407,12 +25828,12 @@ snapshots: '@uniswap/v3-core': 1.0.0 base64-sol: 1.0.1 - '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/solidity': 5.7.0 '@uniswap/sdk-core': 4.0.6 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@uniswap/v3-periphery': 1.4.3 '@uniswap/v3-staker': 1.0.0 tiny-invariant: 1.3.1 @@ -26422,23 +26843,23 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/core': 7.26.9 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) babel-plugin-const-enum@1.2.0(@babel/core@7.26.9): dependencies: @@ -27576,13 +27997,13 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -27591,13 +28012,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -27606,13 +28027,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -27621,13 +28042,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -27636,13 +28057,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + create-jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -27723,7 +28144,7 @@ snapshots: postcss: 8.4.49 postcss-selector-parser: 6.0.13 - css-loader@6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + css-loader@6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -27733,9 +28154,9 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.49) postcss-value-parser: 4.2.0 semver: 7.7.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - css-loader@6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + css-loader@6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -27745,9 +28166,9 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.4.49) postcss-value-parser: 4.2.0 semver: 7.7.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - css-minimizer-webpack-plugin@3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + css-minimizer-webpack-plugin@3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: cssnano: 5.1.15(postcss@8.4.49) jest-worker: 27.5.1 @@ -27755,11 +28176,11 @@ snapshots: schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: esbuild: 0.23.1 - css-minimizer-webpack-plugin@3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + css-minimizer-webpack-plugin@3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: cssnano: 5.1.15(postcss@8.4.49) jest-worker: 27.5.1 @@ -27767,7 +28188,7 @@ snapshots: schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: esbuild: 0.23.1 @@ -28735,7 +29156,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) @@ -28747,7 +29168,7 @@ snapshots: eslint: 8.57.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -28762,7 +29183,7 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) @@ -28774,7 +29195,7 @@ snapshots: eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) @@ -28789,7 +29210,7 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) @@ -28801,7 +29222,7 @@ snapshots: eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) @@ -29007,35 +29428,35 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) eslint: 9.16.0(jiti@1.21.0) optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) eslint: 9.16.0(jiti@1.21.0) optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript @@ -29193,7 +29614,7 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/eslint': 8.44.0 eslint: 8.57.0 @@ -29201,9 +29622,9 @@ snapshots: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - eslint-webpack-plugin@3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + eslint-webpack-plugin@3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/eslint': 8.44.0 eslint: 9.16.0(jiti@1.21.0) @@ -29211,7 +29632,7 @@ snapshots: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) eslint@8.57.0: dependencies: @@ -29860,17 +30281,17 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-loader@6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + file-loader@6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - file-loader@6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + file-loader@6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) file-type@17.1.6: dependencies: @@ -30010,7 +30431,7 @@ snapshots: forge-std@1.1.2: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/code-frame': 7.26.2 '@types/json-schema': 7.0.15 @@ -30026,11 +30447,11 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: eslint: 8.57.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/code-frame': 7.26.2 '@types/json-schema': 7.0.15 @@ -30046,7 +30467,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: eslint: 9.16.0(jiti@1.21.0) @@ -30442,11 +30863,11 @@ snapshots: optionalDependencies: uglify-js: 3.17.4 - hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -30454,12 +30875,12 @@ snapshots: - debug - utf-8-validate - hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): + hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): dependencies: chokidar: 3.6.0 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): + hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -30505,7 +30926,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - bufferutil @@ -30513,7 +30934,7 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): + hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -30559,7 +30980,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - bufferutil @@ -30567,7 +30988,7 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): + hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -30613,7 +31034,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - bufferutil @@ -30759,23 +31180,23 @@ snapshots: dependencies: void-elements: 3.1.0 - html-webpack-plugin@5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + html-webpack-plugin@5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - html-webpack-plugin@5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + html-webpack-plugin@5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) htmlparser2@6.1.0: dependencies: @@ -31458,9 +31879,9 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-cli@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 chalk: 4.1.2 @@ -31468,7 +31889,7 @@ snapshots: graceful-fs: 4.2.11 import-local: 3.1.0 is-ci: 2.0.0 - jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-util: 26.6.2 jest-validate: 26.6.2 prompts: 2.4.2 @@ -31480,16 +31901,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-cli@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -31503,16 +31924,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-cli@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -31528,14 +31949,14 @@ snapshots: jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -31547,16 +31968,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -31568,16 +31989,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -31589,16 +32010,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -31610,16 +32031,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): + jest-cli@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -31631,16 +32052,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -31652,16 +32073,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest-cli@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + create-jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-config: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -31673,10 +32094,10 @@ snapshots: - supports-color - ts-node - jest-config@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-config@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 - '@jest/test-sequencer': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/test-sequencer': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/types': 26.6.2 babel-jest: 26.6.3(@babel/core@7.26.10) chalk: 4.1.2 @@ -31686,7 +32107,7 @@ snapshots: jest-environment-jsdom: 26.6.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) jest-environment-node: 26.6.2 jest-get-type: 26.3.0 - jest-jasmine2: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-jasmine2: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-regex-util: 26.0.0 jest-resolve: 26.6.2 jest-util: 26.6.2 @@ -31694,14 +32115,14 @@ snapshots: micromatch: 4.0.5 pretty-format: 26.6.2 optionalDependencies: - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 27.5.1 @@ -31728,14 +32149,14 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 27.5.1 @@ -31762,14 +32183,14 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -31795,12 +32216,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.15.13 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -31826,12 +32247,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.15.13 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -31857,12 +32278,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -31888,12 +32309,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -31919,12 +32340,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -31950,12 +32371,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -31981,12 +32402,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -32011,13 +32432,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.7.5 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + '@types/node': 22.19.7 + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest-config@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -32042,13 +32463,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.7.5 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2) + '@types/node': 22.19.7 + ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-cucumber@3.0.2(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-cucumber@3.0.2(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@cucumber/gherkin': 17.0.2 '@types/glob': 7.2.0 @@ -32057,7 +32478,7 @@ snapshots: '@types/uuid': 8.3.4 callsites: 3.1.0 glob: 7.2.3 - jest: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - canvas @@ -32253,7 +32674,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-jasmine2@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-jasmine2@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/traverse': 7.27.0 '@jest/environment': 26.6.2 @@ -32268,7 +32689,7 @@ snapshots: jest-each: 26.6.2 jest-matcher-utils: 26.6.2 jest-message-util: 26.6.2 - jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-snapshot: 26.6.2 jest-util: 26.6.2 pretty-format: 26.6.2 @@ -32481,7 +32902,7 @@ snapshots: resolve.exports: 2.0.2 slash: 3.0.0 - jest-runner@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-runner@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@jest/console': 26.6.2 '@jest/environment': 26.6.2 @@ -32492,13 +32913,13 @@ snapshots: emittery: 0.7.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-docblock: 26.0.0 jest-haste-map: 26.6.2 jest-leak-detector: 26.6.2 jest-message-util: 26.6.2 jest-resolve: 26.6.2 - jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-runtime: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-util: 26.6.2 jest-worker: 26.6.2 source-map-support: 0.5.21 @@ -32565,7 +32986,7 @@ snapshots: transitivePeerDependencies: - supports-color - jest-runtime@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-runtime@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@jest/console': 26.6.2 '@jest/environment': 26.6.2 @@ -32582,7 +33003,7 @@ snapshots: exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-haste-map: 26.6.2 jest-message-util: 26.6.2 jest-mock: 26.6.2 @@ -32801,22 +33222,22 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)): + jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 string-length: 5.0.1 strip-ansi: 7.1.0 - jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)): + jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -32890,11 +33311,11 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) import-local: 3.1.0 - jest-cli: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-cli: 26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - canvas @@ -32902,11 +33323,11 @@ snapshots: - ts-node - utf-8-validate - jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) import-local: 3.1.0 - jest-cli: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-cli: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -32916,11 +33337,11 @@ snapshots: - ts-node - utf-8-validate - jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) import-local: 3.1.0 - jest-cli: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-cli: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -32932,7 +33353,7 @@ snapshots: jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) @@ -32944,12 +33365,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -32958,12 +33379,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -32972,12 +33393,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)): + jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -32986,12 +33407,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): + jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest-cli: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -33000,12 +33421,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -33014,12 +33435,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)): + jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest-cli: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -33921,15 +34342,15 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + mini-css-extract-plugin@2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - mini-css-extract-plugin@2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + mini-css-extract-plugin@2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) minimalistic-assert@1.0.1: {} @@ -34170,19 +34591,25 @@ snapshots: dependencies: '@segment/isodate': 1.0.3 - next-auth@5.0.0-beta.30(next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.30(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.41.0 - next: 14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next-auth@5.0.0-beta.30(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.30(next@15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@auth/core': 0.41.0 - next: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-auth@5.0.0-beta.30(next@15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106): + dependencies: + '@auth/core': 0.41.0 + next: 15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) + react: 19.0.0-rc-66855b96-20241106 + + next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.25 '@swc/helpers': 0.5.5 @@ -34192,7 +34619,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.10)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.25 '@next/swc-darwin-x64': 14.2.25 @@ -34234,6 +34661,52 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 15.5.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001760 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106): + dependencies: + '@next/env': 15.5.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001760 + postcss: 8.4.31 + react: 19.0.0-rc-66855b96-20241106 + react-dom: 18.3.1(react@19.0.0-rc-66855b96-20241106) + styled-jsx: 5.1.6(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@19.0.0-rc-66855b96-20241106) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 @@ -34434,10 +34907,10 @@ snapshots: nwsapi@2.2.7: {} - nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)): + nx@19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 - '@nrwl/tao': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.13)) + '@nrwl/tao': 19.7.3(@swc-node/register@1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2))(@swc/core@1.9.3(@swc/helpers@0.5.15)) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.7 @@ -34482,8 +34955,8 @@ snapshots: '@nx/nx-linux-x64-musl': 19.7.3 '@nx/nx-win32-arm64-msvc': 19.7.3 '@nx/nx-win32-x64-msvc': 19.7.3 - '@swc-node/register': 1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.6.2) - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc-node/register': 1.10.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(@swc/types@0.1.25)(typescript@5.6.2) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) transitivePeerDependencies: - debug @@ -34788,19 +35261,19 @@ snapshots: dot-case: 3.0.4 tslib: 2.7.0 - parcel@2.16.3(@swc/helpers@0.5.13): + parcel@2.16.3(@swc/helpers@0.5.15): dependencies: - '@parcel/config-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))(@swc/helpers@0.5.13) - '@parcel/core': 2.16.3(@swc/helpers@0.5.13) + '@parcel/config-default': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/core': 2.16.3(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.16.3 '@parcel/events': 2.16.3 '@parcel/feature-flags': 2.16.3 - '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/fs': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/logger': 2.16.3 - '@parcel/package-manager': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13))(@swc/helpers@0.5.13) - '@parcel/reporter-cli': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/reporter-dev-server': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) - '@parcel/reporter-tracer': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.13)) + '@parcel/package-manager': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/reporter-cli': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/reporter-dev-server': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) + '@parcel/reporter-tracer': 2.16.3(@parcel/core@2.16.3(@swc/helpers@0.5.15)) '@parcel/utils': 2.16.3 chalk: 4.1.2 commander: 12.1.0 @@ -35226,29 +35699,29 @@ snapshots: postcss: 8.4.49 postcss-value-parser: 4.2.0 - postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: lilconfig: 2.1.0 yaml: 2.5.0 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)): + postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: lilconfig: 2.1.0 yaml: 2.5.0 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) - postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: lilconfig: 2.1.0 yaml: 2.5.0 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) postcss-load-config@6.0.1(jiti@1.21.0)(postcss@8.4.49)(yaml@2.5.0): dependencies: @@ -35258,21 +35731,21 @@ snapshots: postcss: 8.4.49 yaml: 2.5.0 - postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.49 semver: 7.7.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.49 semver: 7.7.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) postcss-logical@5.0.4(postcss@8.4.49): dependencies: @@ -35844,7 +36317,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/code-frame': 7.26.2 address: 1.2.2 @@ -35855,7 +36328,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -35870,7 +36343,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -35878,7 +36351,7 @@ snapshots: - supports-color - vue-template-compiler - react-dev-utils@12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + react-dev-utils@12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/code-frame': 7.26.2 address: 1.2.2 @@ -35889,7 +36362,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -35904,7 +36377,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -35926,6 +36399,12 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106): + dependencies: + loose-envify: 1.4.0 + react: 19.0.0-rc-66855b96-20241106 + scheduler: 0.23.2 + react-error-overlay@6.0.11: {} react-i18next@13.5.0(i18next@23.11.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -36030,56 +36509,56 @@ snapshots: '@remix-run/router': 1.7.2 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.23.3 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss: 8.4.49 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) postcss-preset-env: 7.8.3(postcss@8.4.49) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) optionalDependencies: fsevents: 2.3.3 typescript: 5.6.2 @@ -36116,56 +36595,56 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.23.3 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss: 8.4.49 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) postcss-preset-env: 7.8.3(postcss@8.4.49) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) optionalDependencies: fsevents: 2.3.3 typescript: 5.6.2 @@ -36202,56 +36681,56 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.23.3 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss: 8.4.49 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) postcss-preset-env: 7.8.3(postcss@8.4.49) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) optionalDependencies: fsevents: 2.3.3 typescript: 5.6.2 @@ -36693,17 +37172,17 @@ snapshots: sanitize.css@13.0.0: {} - sass-loader@12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + sass-loader@12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - sass-loader@12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + sass-loader@12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) sax@1.2.4: {} @@ -36792,13 +37271,13 @@ snapshots: seaport-types@1.6.3: {} - seaport@https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): + seaport@https://codeload.github.com/immutable/seaport/tar.gz/8345d291c69b7777a77bd81996ce46b28183586c(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': 4.9.6 ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers-eip712: 0.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) merkletreejs: 0.3.11 seaport-core: 1.6.5 seaport-sol: 1.6.0 @@ -36812,13 +37291,13 @@ snapshots: - typescript - utf-8-validate - seaport@https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): + seaport@https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': 4.9.6 ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers-eip712: 0.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) merkletreejs: 0.3.11 seaport-core: https://codeload.github.com/immutable/seaport-core/tar.gz/0633350ec34f21fcede657ff812f11cf7d19144e seaport-sol: 1.6.0 @@ -36832,13 +37311,13 @@ snapshots: - typescript - utf-8-validate - seaport@https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): + seaport@https://codeload.github.com/immutable/seaport/tar.gz/ae061dc008105dd8d05937df9ad9a676f878cbf9(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@openzeppelin/contracts': 4.9.6 ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers-eip712: 0.2.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) merkletreejs: 0.3.11 seaport-core: https://codeload.github.com/immutable/seaport-core/tar.gz/0633350ec34f21fcede657ff812f11cf7d19144e seaport-sol: 1.6.0 @@ -36889,6 +37368,9 @@ snapshots: semver@7.7.1: {} + semver@7.7.3: + optional: true + send@0.18.0: dependencies: debug: 2.6.9 @@ -36985,6 +37467,38 @@ snapshots: dependencies: kind-of: 6.0.3 + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -37151,7 +37665,7 @@ snapshots: ds-test: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 forge-std: 1.1.2 - solidity-coverage@0.8.12(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.12(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 @@ -37162,7 +37676,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.7.0 @@ -37194,19 +37708,19 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + source-map-loader@3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - source-map-loader@3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + source-map-loader@3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) source-map-resolve@0.5.3: dependencies: @@ -37555,21 +38069,20 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.1.0 - style-loader@3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + style-loader@3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - style-loader@3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + style-loader@3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - styled-jsx@5.1.1(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.26.10)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 optionalDependencies: '@babel/core': 7.26.10 - babel-plugin-macros: 3.1.0 styled-jsx@5.1.1(@babel/core@7.26.9)(react@18.3.1): dependencies: @@ -37578,6 +38091,22 @@ snapshots: optionalDependencies: '@babel/core': 7.26.9 + styled-jsx@5.1.6(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.10 + babel-plugin-macros: 3.1.0 + + styled-jsx@5.1.6(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react@19.0.0-rc-66855b96-20241106): + dependencies: + client-only: 0.0.1 + react: 19.0.0-rc-66855b96-20241106 + optionalDependencies: + '@babel/core': 7.26.10 + babel-plugin-macros: 3.1.0 + stylehacks@5.1.1(postcss@8.4.49): dependencies: browserslist: 4.24.4 @@ -37719,7 +38248,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + tailwindcss@3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -37738,7 +38267,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) postcss-nested: 6.0.1(postcss@8.4.49) postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 @@ -37747,7 +38276,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -37766,7 +38295,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) postcss-nested: 6.0.1(postcss@8.4.49) postcss-selector-parser: 6.0.13 resolve: 1.22.8 @@ -37774,7 +38303,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)): + tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -37793,7 +38322,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) postcss-nested: 6.0.1(postcss@8.4.49) postcss-selector-parser: 6.0.13 resolve: 1.22.8 @@ -37801,7 +38330,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)): + tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -37820,7 +38349,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) postcss-nested: 6.0.1(postcss@8.4.49) postcss-selector-parser: 6.0.13 resolve: 1.22.8 @@ -37890,28 +38419,28 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + terser-webpack-plugin@5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) esbuild: 0.23.1 - terser-webpack-plugin@5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + terser-webpack-plugin@5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) esbuild: 0.23.1 terser@5.34.1: @@ -38109,12 +38638,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38149,12 +38678,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38169,12 +38698,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38193,7 +38722,7 @@ snapshots: dependencies: lodash: 4.17.21 - ts-node-dev@2.0.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(node-notifier@8.0.2)(typescript@4.9.5): + ts-node-dev@2.0.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(node-notifier@8.0.2)(typescript@4.9.5): dependencies: chokidar: 3.6.0 dynamic-dedupe: 0.3.0 @@ -38203,7 +38732,7 @@ snapshots: rimraf: 2.6.3 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@4.9.5) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@4.9.5) tsconfig: 7.0.0 typescript: 4.9.5 optionalDependencies: @@ -38213,14 +38742,14 @@ snapshots: - '@swc/wasm' - '@types/node' - ts-node@10.9.1(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2): + ts-node@10.9.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.5 + '@types/node': 22.19.7 acorn: 8.14.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -38231,9 +38760,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@4.9.5): + ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -38251,9 +38780,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -38271,9 +38800,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@20.14.13)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -38291,16 +38820,16 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.5 + '@types/node': 22.19.7 acorn: 8.14.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -38311,9 +38840,9 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@18.15.13)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -38331,16 +38860,16 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(@types/node@22.7.5)(typescript@5.6.2): + ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.5 + '@types/node': 22.19.7 acorn: 8.14.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -38351,7 +38880,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) ts-toolbelt@9.6.0: {} @@ -38387,9 +38916,11 @@ snapshots: tslib@2.7.0: {} + tslib@2.8.1: {} + tsort@0.0.1: {} - tsup@8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): + tsup@8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) cac: 6.7.14 @@ -38408,7 +38939,7 @@ snapshots: tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.13) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) postcss: 8.4.49 typescript: 5.6.2 transitivePeerDependencies: @@ -38417,7 +38948,7 @@ snapshots: - tsx - yaml - tsup@8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.13))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): + tsup@8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) cac: 6.7.14 @@ -38436,7 +38967,7 @@ snapshots: tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) postcss: 8.4.49 typescript: 5.6.2 transitivePeerDependencies: @@ -38610,6 +39141,8 @@ snapshots: undici-types@6.19.8: {} + undici-types@6.21.0: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -38670,10 +39203,10 @@ snapshots: unpipe@1.0.0: {} - unplugin-swc@1.5.1(@swc/core@1.9.3(@swc/helpers@0.5.13))(rollup@4.28.0): + unplugin-swc@1.5.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(rollup@4.28.0): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.28.0) - '@swc/core': 1.9.3(@swc/helpers@0.5.13) + '@swc/core': 1.9.3(@swc/helpers@0.5.15) load-tsconfig: 0.2.5 unplugin: 1.16.1 transitivePeerDependencies: @@ -39003,25 +39536,25 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-dev-middleware@5.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + webpack-dev-middleware@5.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - webpack-dev-middleware@5.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + webpack-dev-middleware@5.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.5.0 @@ -39051,17 +39584,17 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-dev-middleware: 5.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.5.0 @@ -39091,26 +39624,26 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + webpack-dev-middleware: 5.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-manifest-plugin@4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + webpack-manifest-plugin@4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) webpack-sources: 2.3.1 - webpack-manifest-plugin@4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + webpack-manifest-plugin@4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) webpack-sources: 2.3.1 webpack-sources@1.4.3: @@ -39127,7 +39660,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1): + webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1): dependencies: '@types/eslint-scope': 3.7.4 '@types/estree': 1.0.6 @@ -39150,7 +39683,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -39158,7 +39691,7 @@ snapshots: - esbuild - uglify-js - webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1): + webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1): dependencies: '@types/eslint-scope': 3.7.4 '@types/estree': 1.0.6 @@ -39181,7 +39714,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)) + terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -39406,24 +39939,24 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: - '@types/babel__core' - supports-color - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1)): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.13))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 84cdcb072f..b3fbf7a592 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,7 +1,8 @@ packages: - "sdk" - "packages/auth" - - "packages/auth-nextjs" + - "packages/auth-next-server" + - "packages/auth-next-client" - "packages/wallet" - "packages/config" - "packages/x-client" diff --git a/sdk/package.json b/sdk/package.json index 92d3ea2b4b..ebf538c4e1 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -6,7 +6,8 @@ "bugs": "https://github.com/immutable/ts-immutable-sdk/issues", "dependencies": { "@imtbl/auth": "workspace:*", - "@imtbl/auth-nextjs": "workspace:*", + "@imtbl/auth-next-client": "workspace:*", + "@imtbl/auth-next-server": "workspace:*", "@imtbl/blockchain-data": "workspace:*", "@imtbl/checkout-sdk": "workspace:*", "@imtbl/config": "workspace:*", @@ -194,18 +195,6 @@ "default": "./dist/wallet.js" } }, - "./auth_nextjs": { - "development": { - "types": "./src/auth_nextjs.ts", - "require": "./dist/auth_nextjs.cjs", - "default": "./dist/auth_nextjs.js" - }, - "default": { - "types": "./dist/auth_nextjs.d.ts", - "require": "./dist/auth_nextjs.cjs", - "default": "./dist/auth_nextjs.js" - } - }, "./auth_nextjs/client": { "development": { "types": "./src/auth_nextjs_client.ts", diff --git a/sdk/src/auth_nextjs.ts b/sdk/src/auth_nextjs.ts deleted file mode 100644 index 4151b2b137..0000000000 --- a/sdk/src/auth_nextjs.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@imtbl/auth-nextjs'; diff --git a/sdk/src/auth_nextjs_client.ts b/sdk/src/auth_nextjs_client.ts index b5f1cd4265..1ef616ef64 100644 --- a/sdk/src/auth_nextjs_client.ts +++ b/sdk/src/auth_nextjs_client.ts @@ -1 +1 @@ -export * from '@imtbl/auth-nextjs/client'; +export * from '@imtbl/auth-next-client'; diff --git a/sdk/src/auth_nextjs_server.ts b/sdk/src/auth_nextjs_server.ts index 6bd4d6fd8c..a8ff3c5f09 100644 --- a/sdk/src/auth_nextjs_server.ts +++ b/sdk/src/auth_nextjs_server.ts @@ -1 +1 @@ -export * from '@imtbl/auth-nextjs/server'; +export * from '@imtbl/auth-next-server'; diff --git a/sdk/src/index.ts b/sdk/src/index.ts index b958894de4..d6e905777e 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -8,4 +8,3 @@ export * as webhook from './webhook'; export * as mintingBackend from './minting_backend'; export * as auth from './auth'; export * as wallet from './wallet'; -export * as authNextjs from './auth_nextjs'; From 4b7bb4a95fae92b21620536a6f5353c15b851276 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 11:36:27 +1100 Subject: [PATCH 83/88] split packages cleanup --- packages/auth/src/Auth.ts | 4 ++-- .../sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts | 2 +- .../sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts | 2 +- .../app/api/auth/sandbox/[...nextauth]/route.ts | 2 +- .../passport/sdk-sample-app/src/context/ImmutableProvider.tsx | 4 ++-- .../src/lib/{auth-nextjs.ts => immutable-auth.ts} | 2 +- packages/passport/sdk-sample-app/src/pages/callback.page.tsx | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) rename packages/passport/sdk-sample-app/src/lib/{auth-nextjs.ts => immutable-auth.ts} (97%) diff --git a/packages/auth/src/Auth.ts b/packages/auth/src/Auth.ts index 2a9175a0e3..939743d984 100644 --- a/packages/auth/src/Auth.ts +++ b/packages/auth/src/Auth.ts @@ -766,7 +766,7 @@ export class Auth { const newOidcUser = await this.userManager.signinSilent(); if (newOidcUser) { const user = Auth.mapOidcUserToDomainModel(newOidcUser); - // Emit TOKEN_REFRESHED event so consumers (e.g., auth-nextjs) can sync + // Emit TOKEN_REFRESHED event so consumers (e.g., auth-next-client) can sync // the new tokens to their session. This is critical for refresh token // rotation - without this, the server-side session may have stale tokens. this.eventEmitter.emit(AuthEvents.TOKEN_REFRESHED, user); @@ -824,7 +824,7 @@ export class Auth { if (removeUser) { // Emit USER_REMOVED event BEFORE removing user so consumers can react - // (e.g., auth-nextjs can clear the NextAuth session) + // (e.g., auth-next-client can clear the NextAuth session) this.eventEmitter.emit(AuthEvents.USER_REMOVED, { reason: removeReason, error: errorMessage, diff --git a/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts index 10676ea7ce..d7777fbc69 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/dev/[...nextauth]/route.ts @@ -1,3 +1,3 @@ -import { devAuth } from "@/lib/auth-nextjs"; +import { devAuth } from "@/lib/immutable-auth"; export const { GET, POST } = devAuth.handlers; diff --git a/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts index 1d58f8e2ee..7763d8a256 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/prod/[...nextauth]/route.ts @@ -1,3 +1,3 @@ -import { prodAuth } from "@/lib/auth-nextjs"; +import { prodAuth } from "@/lib/immutable-auth"; export const { GET, POST } = prodAuth.handlers; diff --git a/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts b/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts index 4494056efc..b7cff1921c 100644 --- a/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts +++ b/packages/passport/sdk-sample-app/app/api/auth/sandbox/[...nextauth]/route.ts @@ -1,3 +1,3 @@ -import { sandboxAuth } from "@/lib/auth-nextjs"; +import { sandboxAuth } from "@/lib/immutable-auth"; export const { GET, POST } = sandboxAuth.handlers; diff --git a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx index 145c2e6a0a..08439efbb2 100644 --- a/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx +++ b/packages/passport/sdk-sample-app/src/context/ImmutableProvider.tsx @@ -26,7 +26,7 @@ import { EnvironmentNames } from '@/types'; import useLocalStorage from '@/hooks/useLocalStorage'; import { ImxApiClients, createConfig } from '@imtbl/generated-clients'; import { BlockchainData, BlockchainDataModuleConfiguration } from '@imtbl/blockchain-data'; -import { getAuthConfig } from '@/lib/auth-nextjs'; +import { getAuthConfig } from '@/lib/immutable-auth'; const getSdkConfig = (environment: EnvironmentNames): ImxModuleConfiguration => { switch (environment) { @@ -245,7 +245,7 @@ export function ImmutableProvider({ setEnvironment, }), [sdkClient, orderbookClient, passportClient, blockchainData, environment, setEnvironment]); - // Get auth-nextjs config based on current environment + // Get auth config based on current environment const authConfig = useMemo(() => getAuthConfig(environment), [environment]); // Get the NextAuth base path for the current environment diff --git a/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts b/packages/passport/sdk-sample-app/src/lib/immutable-auth.ts similarity index 97% rename from packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts rename to packages/passport/sdk-sample-app/src/lib/immutable-auth.ts index 8308ac5bda..9f1e5deb20 100644 --- a/packages/passport/sdk-sample-app/src/lib/auth-nextjs.ts +++ b/packages/passport/sdk-sample-app/src/lib/immutable-auth.ts @@ -16,7 +16,7 @@ const AUTH_DOMAINS: Record = { [EnvironmentNames.DEV]: "https://auth.dev.immutable.com", }; -// Get auth-nextjs config for a specific environment +// Get auth config for a specific environment export function getAuthConfig(environment: EnvironmentNames): ImmutableAuthConfig { const baseUrl = typeof window !== "undefined" ? window.location.origin : "http://localhost:3000"; diff --git a/packages/passport/sdk-sample-app/src/pages/callback.page.tsx b/packages/passport/sdk-sample-app/src/pages/callback.page.tsx index cf5ac667fe..f6f1782e08 100644 --- a/packages/passport/sdk-sample-app/src/pages/callback.page.tsx +++ b/packages/passport/sdk-sample-app/src/pages/callback.page.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { CallbackPage, type ImmutableAuthConfig } from "@imtbl/auth-next-client"; -import { getAuthConfig } from "@/lib/auth-nextjs"; +import { getAuthConfig } from "@/lib/immutable-auth"; import { EnvironmentNames } from "@/types"; import { Container, Spinner } from "react-bootstrap"; From 5ea601d0dac195d6815d355f2621578738eb04dc Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 13:14:16 +1100 Subject: [PATCH 84/88] lock file --- packages/auth-next-client/package.json | 8 +- packages/auth-next-server/package.json | 6 +- packages/auth/package.json | 6 +- packages/blockchain-data/sdk/package.json | 6 +- packages/checkout/sdk-sample-app/package.json | 4 +- packages/checkout/sdk/package.json | 8 +- packages/checkout/widgets-lib/package.json | 8 +- .../checkout/widgets-sample-app/package.json | 4 +- packages/config/package.json | 8 +- packages/game-bridge/package.json | 2 +- .../bridge/bridge-sample-app/package.json | 4 +- packages/internal/bridge/sdk/package.json | 6 +- packages/internal/cryptofiat/package.json | 8 +- .../internal/dex/sdk-sample-app/package.json | 6 +- packages/internal/dex/sdk/package.json | 8 +- .../internal/generated-clients/package.json | 6 +- packages/internal/metrics/package.json | 8 +- packages/internal/toolkit/package.json | 8 +- packages/minting-backend/sdk/package.json | 6 +- packages/orderbook/package.json | 6 +- packages/passport/sdk-sample-app/package.json | 8 +- packages/passport/sdk/package.json | 6 +- packages/wallet/package.json | 6 +- packages/webhook/sdk/package.json | 6 +- packages/x-client/package.json | 6 +- packages/x-provider/package.json | 8 +- .../x-provider/src/sample-app/package.json | 2 +- pnpm-lock.yaml | 1623 ++++------------- sdk/package.json | 2 +- 29 files changed, 422 insertions(+), 1371 deletions(-) diff --git a/packages/auth-next-client/package.json b/packages/auth-next-client/package.json index b1b2d53a5d..c73a2846c8 100644 --- a/packages/auth-next-client/package.json +++ b/packages/auth-next-client/package.json @@ -28,7 +28,7 @@ "build:types": "tsc --project tsconfig.types.json", "clean": "rm -rf dist", "lint": "eslint src/**/*.{ts,tsx} --max-warnings=0", - "test": "jest" + "test": "jest --passWithNoTests" }, "dependencies": { "@imtbl/auth": "workspace:*", @@ -41,16 +41,16 @@ }, "devDependencies": { "@swc/core": "^1.4.2", - "@swc/jest": "^0.2.36", + "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", "@types/node": "^22.10.7", - "@types/react": "^18.2.0", + "@types/react": "^18.3.5", "eslint": "^8.56.0", "jest": "^29.7.0", "next": "^15.1.6", "next-auth": "^5.0.0-beta.30", "react": "^18.2.0", - "tsup": "^8.0.2", + "tsup": "^8.3.0", "typescript": "^5.6.2" } } diff --git a/packages/auth-next-server/package.json b/packages/auth-next-server/package.json index 152888f81c..b9887e9d92 100644 --- a/packages/auth-next-server/package.json +++ b/packages/auth-next-server/package.json @@ -28,7 +28,7 @@ "build:types": "tsc --project tsconfig.types.json", "clean": "rm -rf dist", "lint": "eslint src/**/*.ts --max-warnings=0", - "test": "jest" + "test": "jest --passWithNoTests" }, "peerDependencies": { "next": "^14.2.0 || ^15.0.0", @@ -36,14 +36,14 @@ }, "devDependencies": { "@swc/core": "^1.4.2", - "@swc/jest": "^0.2.36", + "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", "@types/node": "^22.10.7", "eslint": "^8.56.0", "jest": "^29.7.0", "next": "^15.1.6", "next-auth": "^5.0.0-beta.30", - "tsup": "^8.0.2", + "tsup": "^8.3.0", "typescript": "^5.6.2" } } diff --git a/packages/auth/package.json b/packages/auth/package.json index 5807300a5f..c67e3bfcaf 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -40,12 +40,12 @@ "oidc-client-ts": "3.4.1" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@jest/test-sequencer": "^29.7.0", - "jest": "^29.4.3", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "ts-node": "^10.9.1", "tsup": "^8.3.0", diff --git a/packages/blockchain-data/sdk/package.json b/packages/blockchain-data/sdk/package.json index c238d5f312..688396b084 100644 --- a/packages/blockchain-data/sdk/package.json +++ b/packages/blockchain-data/sdk/package.json @@ -10,11 +10,11 @@ "axios": "^1.6.5" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "tsup": "^8.3.0", "typescript": "^5.6.2" diff --git a/packages/checkout/sdk-sample-app/package.json b/packages/checkout/sdk-sample-app/package.json index 85ad9548f2..bf3f032e1f 100644 --- a/packages/checkout/sdk-sample-app/package.json +++ b/packages/checkout/sdk-sample-app/package.json @@ -34,11 +34,11 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@typescript-eslint/parser": "^5.57.1", - "jest": "^29.4.3", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "react-scripts": "5.0.1", "typescript": "^5.6.2", diff --git a/packages/checkout/sdk/package.json b/packages/checkout/sdk/package.json index 347f3cef1f..962fcaa731 100644 --- a/packages/checkout/sdk/package.json +++ b/packages/checkout/sdk/package.json @@ -20,15 +20,15 @@ "uuid": "^9.0.1" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/semver": "^7.5.8", "@types/uuid": "^8.3.4", "esbuild-plugin-replace": "^1.4.0", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "text-encoding": "^0.7.0", "tsup": "^8.3.0", diff --git a/packages/checkout/widgets-lib/package.json b/packages/checkout/widgets-lib/package.json index 09008ae958..31cb821bc0 100644 --- a/packages/checkout/widgets-lib/package.json +++ b/packages/checkout/widgets-lib/package.json @@ -53,19 +53,19 @@ "@rollup/plugin-typescript": "^11.1.6", "@segment/analytics-next": "^1.53.2", "@svgr/webpack": "^8.0.1", - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@types/jest": "^29.5.12", "@types/lodash.debounce": "^4.0.9", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@types/uuid": "^8.3.4", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "react-scripts": "5.0.1", "rimraf": "^6.0.1", diff --git a/packages/checkout/widgets-sample-app/package.json b/packages/checkout/widgets-sample-app/package.json index 66c099798e..16ad70c2bc 100644 --- a/packages/checkout/widgets-sample-app/package.json +++ b/packages/checkout/widgets-sample-app/package.json @@ -30,12 +30,12 @@ "react-router-dom": "^6.11.0" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.2.0", diff --git a/packages/config/package.json b/packages/config/package.json index 8856159bfe..c2c9595328 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -8,14 +8,14 @@ "@imtbl/metrics": "workspace:*" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "prettier": "^2.8.7", "ts-node": "^10.9.1", diff --git a/packages/game-bridge/package.json b/packages/game-bridge/package.json index 1f42651bd0..6faf9eff55 100644 --- a/packages/game-bridge/package.json +++ b/packages/game-bridge/package.json @@ -10,7 +10,7 @@ "ethers": "^6.13.4" }, "devDependencies": { - "eslint": "^8.40.0", + "eslint": "^8.56.0", "parcel": "^2.13.3" }, "scripts": { diff --git a/packages/internal/bridge/bridge-sample-app/package.json b/packages/internal/bridge/bridge-sample-app/package.json index 0b87f936a9..db0a023b7a 100644 --- a/packages/internal/bridge/bridge-sample-app/package.json +++ b/packages/internal/bridge/bridge-sample-app/package.json @@ -8,9 +8,9 @@ "ethers": "^6.13.4" }, "devDependencies": { - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "autoprefixer": "10.4.14", - "eslint": "^8.40.0", + "eslint": "^8.56.0", "eslint-config-next": "13.3.1", "ts-node": "^10.9.1", "typescript": "^5.6.2" diff --git a/packages/internal/bridge/sdk/package.json b/packages/internal/bridge/sdk/package.json index c247cf1dfa..23a23100cf 100644 --- a/packages/internal/bridge/sdk/package.json +++ b/packages/internal/bridge/sdk/package.json @@ -11,12 +11,12 @@ "ethers": "^6.13.4" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@typechain/ethers-v6": "^0.5.1", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", - "jest": "^29.4.3", + "@types/node": "^22.10.7", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "ts-node": "^10.9.1", "tsup": "^8.3.0", diff --git a/packages/internal/cryptofiat/package.json b/packages/internal/cryptofiat/package.json index 31ad99b64c..5b843648c5 100644 --- a/packages/internal/cryptofiat/package.json +++ b/packages/internal/cryptofiat/package.json @@ -10,16 +10,16 @@ }, "devDependencies": { "@jest/globals": "^29.5.0", - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "prettier": "^2.8.7", "ts-node": "^10.9.1", diff --git a/packages/internal/dex/sdk-sample-app/package.json b/packages/internal/dex/sdk-sample-app/package.json index 7faf1e07bb..40afbd2c05 100644 --- a/packages/internal/dex/sdk-sample-app/package.json +++ b/packages/internal/dex/sdk-sample-app/package.json @@ -3,14 +3,14 @@ "version": "0.1.0", "devDependencies": { "@imtbl/dex-sdk": "workspace:*", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "autoprefixer": "10.4.14", "concurrently": "^8.2.2", - "eslint": "^8.40.0", + "eslint": "^8.56.0", "ethers": "^6.13.4", - "next": "14.2.25", + "next": "^15.1.6", "postcss": "8.4.31", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/internal/dex/sdk/package.json b/packages/internal/dex/sdk/package.json index ea95fc3863..fc7a3e4bee 100644 --- a/packages/internal/dex/sdk/package.json +++ b/packages/internal/dex/sdk/package.json @@ -12,13 +12,13 @@ "ethers": "^6.13.4" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@typechain/ethers-v6": "^0.5.1", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "@types/node": "^22.10.7", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "ts-node": "^10.9.1", "tsup": "^8.3.0", diff --git a/packages/internal/generated-clients/package.json b/packages/internal/generated-clients/package.json index 4468e3cc23..180039e015 100644 --- a/packages/internal/generated-clients/package.json +++ b/packages/internal/generated-clients/package.json @@ -9,10 +9,10 @@ }, "devDependencies": { "@openapitools/openapi-generator-cli": "^2.13.4", - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", - "jest": "^29.4.3", + "@types/node": "^22.10.7", + "jest": "^29.7.0", "rimraf": "^6.0.1", "tsup": "^8.3.0", "typescript": "^5.6.2" diff --git a/packages/internal/metrics/package.json b/packages/internal/metrics/package.json index 9ae13b9f23..3f2863e37c 100644 --- a/packages/internal/metrics/package.json +++ b/packages/internal/metrics/package.json @@ -9,12 +9,12 @@ "lru-memorise": "0.3.0" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "@types/node": "^22.10.7", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "ts-jest": "^29.1.0", "tsup": "^8.3.0", diff --git a/packages/internal/toolkit/package.json b/packages/internal/toolkit/package.json index a1df58f0c8..fb1d631221 100644 --- a/packages/internal/toolkit/package.json +++ b/packages/internal/toolkit/package.json @@ -14,18 +14,18 @@ "oidc-client-ts": "3.4.1" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/axios": "^0.14.0", "@types/bn.js": "^5.1.6", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "prettier": "^2.8.7", "ts-node": "^10.9.1", diff --git a/packages/minting-backend/sdk/package.json b/packages/minting-backend/sdk/package.json index e2a2b229a9..63bb16a28a 100644 --- a/packages/minting-backend/sdk/package.json +++ b/packages/minting-backend/sdk/package.json @@ -13,14 +13,14 @@ "uuid": "^9.0.1" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@testcontainers/postgresql": "^10.9.0", "@types/jest": "^29.5.12", "@types/pg": "^8.11.5", "@types/uuid": "^8.3.4", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "testcontainers": "^10.9.0", "typescript": "^5.6.2", diff --git a/packages/orderbook/package.json b/packages/orderbook/package.json index 2315b7975b..ff05dfc24a 100644 --- a/packages/orderbook/package.json +++ b/packages/orderbook/package.json @@ -13,13 +13,13 @@ "merkletreejs": "^0.3.11" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@typechain/ethers-v6": "^0.5.1", "@types/jest": "^29.5.12", "dotenv": "^16.0.3", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "ts-mockito": "^2.6.1", "tsup": "^8.3.0", diff --git a/packages/passport/sdk-sample-app/package.json b/packages/passport/sdk-sample-app/package.json index 62644da2e7..fb3d4a3a58 100644 --- a/packages/passport/sdk-sample-app/package.json +++ b/packages/passport/sdk-sample-app/package.json @@ -21,7 +21,7 @@ "enc-utils": "^3.0.0", "ethers": "^6.13.4", "motion": "^11.17.0", - "next": "14.2.25", + "next": "^15.1.6", "next-auth": "^5.0.0-beta.30", "react": "^18.2.0", "react-bootstrap": "^2.7.2", @@ -29,14 +29,14 @@ }, "devDependencies": { "@next/eslint-plugin-next": "^13.4.7", - "@swc/core": "^1.3.36", - "@types/node": "^18.14.2", + "@swc/core": "^1.4.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", "concurrently": "^8.2.2", - "eslint": "^8.40.0", + "eslint": "^8.56.0", "eslint-config-next": "13.3.1", "typescript": "^5.6.2" }, diff --git a/packages/passport/sdk/package.json b/packages/passport/sdk/package.json index 61994bbe76..f94fa7258c 100644 --- a/packages/passport/sdk/package.json +++ b/packages/passport/sdk/package.json @@ -18,7 +18,7 @@ "oidc-client-ts": "3.4.1" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", "@types/jwt-encode": "^1.0.1", @@ -27,8 +27,8 @@ "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", "cross-fetch": "^3.1.6", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "jwt-encode": "^1.0.1", "msw": "^1.2.2", diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 20a2cc692d..0a08a9d9c2 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -40,12 +40,12 @@ "viem": "~2.18.0" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@jest/test-sequencer": "^29.7.0", - "jest": "^29.4.3", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "ts-node": "^10.9.1", "tsup": "^8.3.0", diff --git a/packages/webhook/sdk/package.json b/packages/webhook/sdk/package.json index 16c9edea38..e907d1ab5e 100644 --- a/packages/webhook/sdk/package.json +++ b/packages/webhook/sdk/package.json @@ -10,12 +10,12 @@ "sns-validator": "^0.3.5" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/jest": "^29.5.12", "@types/sns-validator": "^0.3.3", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "tsup": "^8.3.0", "typescript": "^5.6.2" diff --git a/packages/x-client/package.json b/packages/x-client/package.json index ed0da35318..244f210dcd 100644 --- a/packages/x-client/package.json +++ b/packages/x-client/package.json @@ -16,13 +16,13 @@ "hash.js": "^1.1.7" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/bn.js": "^5.1.6", "@types/jest": "^29.5.12", "crypto": "^1.0.1", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "tsup": "^8.3.0", "typescript": "^5.6.2" diff --git a/packages/x-provider/package.json b/packages/x-provider/package.json index b090ce9e38..7c36d54143 100644 --- a/packages/x-provider/package.json +++ b/packages/x-provider/package.json @@ -16,17 +16,17 @@ "oidc-client-ts": "3.4.1" }, "devDependencies": { - "@swc/core": "^1.3.36", + "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", "@types/axios": "^0.14.0", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", - "eslint": "^8.40.0", - "jest": "^29.4.3", + "eslint": "^8.56.0", + "jest": "^29.7.0", "jest-environment-jsdom": "^29.4.3", "prettier": "^2.8.7", "ts-node": "^10.9.1", diff --git a/packages/x-provider/src/sample-app/package.json b/packages/x-provider/src/sample-app/package.json index 1d9a033130..5ab8536202 100644 --- a/packages/x-provider/src/sample-app/package.json +++ b/packages/x-provider/src/sample-app/package.json @@ -20,7 +20,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@types/jest": "^29.5.12", - "@types/node": "^18.14.2", + "@types/node": "^22.10.7", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", "react": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d1bfdc862..365bfc4670 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1016,29 +1016,29 @@ importers: specifier: ^29.7.0 version: 29.7.0 '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1056,7 +1056,7 @@ importers: specifier: ^1.4.2 version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': - specifier: ^0.2.36 + specifier: ^0.2.37 version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 @@ -1065,7 +1065,7 @@ importers: specifier: ^22.10.7 version: 22.19.7 '@types/react': - specifier: ^18.2.0 + specifier: ^18.3.5 version: 18.3.12 eslint: specifier: ^8.56.0 @@ -1083,7 +1083,7 @@ importers: specifier: ^18.2.0 version: 18.3.1 tsup: - specifier: ^8.0.2 + specifier: ^8.3.0 version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 @@ -1095,7 +1095,7 @@ importers: specifier: ^1.4.2 version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': - specifier: ^0.2.36 + specifier: ^0.2.37 version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 @@ -1116,7 +1116,7 @@ importers: specifier: ^5.0.0-beta.30 version: 5.0.0-beta.30(next@15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) tsup: - specifier: ^8.0.2 + specifier: ^8.3.0 version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 @@ -1135,26 +1135,26 @@ importers: version: 1.7.7 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 + specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1202,17 +1202,17 @@ importers: version: 9.0.1 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -1223,11 +1223,11 @@ importers: specifier: ^1.4.0 version: 1.4.0 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1236,7 +1236,7 @@ importers: version: 0.7.0 tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typedoc: specifier: ^0.26.5 version: 0.26.5(typescript@5.6.2) @@ -1305,8 +1305,8 @@ importers: specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -1317,14 +1317,14 @@ importers: specifier: ^5.57.1 version: 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1447,11 +1447,11 @@ importers: specifier: ^8.0.1 version: 8.0.1(typescript@5.6.2) '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.17.0 @@ -1468,8 +1468,8 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -1480,17 +1480,17 @@ importers: specifier: ^8.3.4 version: 8.3.4 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1502,13 +1502,13 @@ importers: version: 0.13.0(rollup@4.28.0) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)))(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 unplugin-swc: specifier: ^1.5.1 - version: 1.5.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(rollup@4.28.0) + version: 1.5.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(rollup@4.28.0) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -1559,8 +1559,8 @@ importers: version: 6.14.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.17.0 @@ -1574,8 +1574,8 @@ importers: specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -1584,16 +1584,16 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.2.0 - version: 4.2.0(vite@5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1)) + version: 4.2.0(vite@5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1)) typescript: specifier: ^5.6.2 version: 5.6.2 vite: specifier: ^5.2.14 - version: 5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1) + version: 5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1) vite-plugin-node-polyfills: specifier: ^0.16.0 - version: 0.16.0(rollup@4.28.0)(vite@5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1)) + version: 0.16.0(rollup@4.28.0)(vite@5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1)) web-vitals: specifier: ^2.1.4 version: 2.1.4 @@ -1605,17 +1605,17 @@ importers: version: link:../internal/metrics devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@typescript-eslint/eslint-plugin': specifier: ^5.57.1 version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) @@ -1623,11 +1623,11 @@ importers: specifier: ^5.57.1 version: 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1636,10 +1636,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1666,7 +1666,7 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) devDependencies: eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 parcel: specifier: ^2.13.3 @@ -1688,20 +1688,20 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) devDependencies: '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 autoprefixer: specifier: 10.4.14 version: 10.4.14(postcss@8.4.49) eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 eslint-config-next: specifier: 13.3.1 version: 13.3.1(eslint@8.57.0)(typescript@5.6.2) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1722,11 +1722,11 @@ importers: version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@typechain/ethers-v6': specifier: ^0.5.1 version: 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) @@ -1734,20 +1734,20 @@ importers: specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typechain: specifier: ^8.1.1 version: 8.3.0(typescript@5.6.2) @@ -1768,17 +1768,17 @@ importers: specifier: ^29.5.0 version: 29.7.0 '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -1792,11 +1792,11 @@ importers: specifier: ^5.57.1 version: 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -1805,10 +1805,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1823,20 +1823,20 @@ importers: version: 3.2.3 '@uniswap/swap-router-contracts': specifier: ^1.3.1 - version: 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@uniswap/v3-sdk': specifier: ^3.9.0 - version: 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: specifier: ^6.13.4 version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@typechain/ethers-v6': specifier: ^0.5.1 version: 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) @@ -1844,23 +1844,23 @@ importers: specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typechain: specifier: ^8.1.1 version: 8.3.0(typescript@5.6.2) @@ -1874,8 +1874,8 @@ importers: specifier: workspace:* version: link:../sdk '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -1889,14 +1889,14 @@ importers: specifier: ^8.2.2 version: 8.2.2 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 ethers: specifier: ^6.13.4 version: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) next: - specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.1.6 + version: 15.5.9(@babel/core@7.26.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) postcss: specifier: 8.4.31 version: 8.4.31 @@ -1908,7 +1908,7 @@ importers: version: 18.3.1(react@18.3.1) tailwindcss: specifier: 3.3.2 - version: 3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + version: 3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1923,23 +1923,23 @@ importers: specifier: ^2.13.4 version: 2.13.4(encoding@0.1.13) '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) rimraf: specifier: ^6.0.1 version: 6.0.1 tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -1954,32 +1954,32 @@ importers: version: 0.3.0 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-jest: specifier: ^29.1.0 - version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2) + version: 29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2009,11 +2009,11 @@ importers: version: 3.4.1 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/axios': specifier: ^0.14.0 version: 0.14.0 @@ -2024,8 +2024,8 @@ importers: specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -2039,11 +2039,11 @@ importers: specifier: ^5.57.1 version: 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2052,10 +2052,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2089,11 +2089,11 @@ importers: version: 5.20.0 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@testcontainers/postgresql': specifier: ^10.9.0 version: 10.9.0(encoding@0.1.13) @@ -2107,10 +2107,10 @@ importers: specifier: ^8.3.4 version: 8.3.4 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 + specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 @@ -2120,7 +2120,7 @@ importers: version: 10.9.0(encoding@0.1.13) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2150,11 +2150,11 @@ importers: version: 0.3.11 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@typechain/ethers-v6': specifier: ^0.5.1 version: 0.5.1(ethers@6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.0(typescript@5.6.2))(typescript@5.6.2) @@ -2165,10 +2165,10 @@ importers: specifier: ^16.0.3 version: 16.4.5 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 + specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 @@ -2178,7 +2178,7 @@ importers: version: 2.6.1 tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typechain: specifier: ^8.1.1 version: 8.3.0(typescript@5.6.2) @@ -2226,11 +2226,11 @@ importers: specifier: ^29.7.0 version: 29.7.0 '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -2253,11 +2253,11 @@ importers: specifier: ^3.1.6 version: 3.1.8(encoding@0.1.13) eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2272,10 +2272,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2340,11 +2340,11 @@ importers: specifier: ^11.17.0 version: 11.18.2(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: - specifier: 14.2.25 - version: 14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.1.6 + version: 15.5.9(@babel/core@7.26.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-auth: specifier: ^5.0.0-beta.30 - version: 5.0.0-beta.30(next@14.2.25(@babel/core@7.26.9)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.30(next@15.5.9(@babel/core@7.26.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -2359,11 +2359,11 @@ importers: specifier: ^13.4.7 version: 13.4.9 '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -2380,7 +2380,7 @@ importers: specifier: ^8.2.2 version: 8.2.2 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 eslint-config-next: specifier: 13.3.1 @@ -2408,29 +2408,29 @@ importers: specifier: ^29.7.0 version: 29.7.0 '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2448,11 +2448,11 @@ importers: version: 0.3.5 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/jest': specifier: ^29.5.12 version: 29.5.14 @@ -2460,17 +2460,17 @@ importers: specifier: ^0.3.3 version: 0.3.3 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 + specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2506,11 +2506,11 @@ importers: version: 1.1.7 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/bn.js': specifier: ^5.1.6 version: 5.1.6 @@ -2521,17 +2521,17 @@ importers: specifier: ^1.0.1 version: 1.0.1 eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 + specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2567,11 +2567,11 @@ importers: version: 3.4.1 devDependencies: '@swc/core': - specifier: ^1.3.36 - version: 1.9.3(@swc/helpers@0.5.15) + specifier: ^1.4.2 + version: 1.15.3(@swc/helpers@0.5.15) '@swc/jest': specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15)) + version: 0.2.37(@swc/core@1.15.3(@swc/helpers@0.5.15)) '@types/axios': specifier: ^0.14.0 version: 0.14.0 @@ -2579,8 +2579,8 @@ importers: specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -2594,11 +2594,11 @@ importers: specifier: ^5.57.1 version: 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 jest: - specifier: ^29.4.3 - version: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-environment-jsdom: specifier: ^29.4.3 version: 29.6.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -2607,10 +2607,10 @@ importers: version: 2.8.8 ts-node: specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + version: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) tsup: specifier: ^8.3.0 - version: 8.3.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) + version: 8.3.0(@swc/core@1.15.3(@swc/helpers@0.5.15))(jiti@1.21.0)(postcss@8.4.49)(typescript@5.6.2)(yaml@2.5.0) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2636,8 +2636,8 @@ importers: specifier: ^29.5.12 version: 29.5.14 '@types/node': - specifier: ^18.14.2 - version: 18.15.13 + specifier: ^22.10.7 + version: 22.19.7 '@types/react': specifier: ^18.3.5 version: 18.3.12 @@ -2652,7 +2652,7 @@ importers: version: 18.3.1(react@18.3.1) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -2716,7 +2716,7 @@ importers: version: 18.3.1 devDependencies: eslint: - specifier: ^8.40.0 + specifier: ^8.56.0 version: 8.57.0 tsup: specifier: ^8.3.0 @@ -20877,8 +20877,8 @@ snapshots: dependencies: '@imtbl/config': 2.12.3 '@uniswap/sdk-core': 3.2.3 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) - '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/v3-sdk': 3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) ethers: 6.13.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -21138,46 +21138,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': - dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1(node-notifier@8.0.2) - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 20.14.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 27.5.1 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 - micromatch: 4.0.5 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - - '@jest/core@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/core@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1(node-notifier@8.0.2) @@ -21191,7 +21152,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -21216,43 +21177,6 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0(node-notifier@8.0.2) - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))': dependencies: '@jest/console': 29.7.0 @@ -21327,80 +21251,6 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0(node-notifier@8.0.2) - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0(node-notifier@8.0.2) - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.14.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/create-cache-key-function@29.7.0': dependencies: '@jest/types': 29.6.3 @@ -21986,7 +21836,7 @@ snapshots: '@ethereumjs/tx': 4.2.0 '@types/debug': 4.1.8 debug: 4.3.7(supports-color@8.1.1) - semver: 7.7.1 + semver: 7.7.3 superstruct: 1.0.4 transitivePeerDependencies: - supports-color @@ -23351,23 +23201,6 @@ snapshots: type-fest: 2.19.0 webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - '@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1))': - dependencies: - ansi-html-community: 0.0.8 - common-path-prefix: 3.0.0 - core-js-pure: 3.31.1 - error-stack-parser: 2.1.4 - find-up: 5.0.0 - html-entities: 2.4.0 - loader-utils: 2.0.4 - react-refresh: 0.11.0 - schema-utils: 3.3.0 - source-map: 0.7.4 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - optionalDependencies: - type-fest: 2.19.0 - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - '@popperjs/core@2.11.8': {} '@prisma/debug@5.20.0': @@ -23464,7 +23297,7 @@ snapshots: execa: 5.1.1 node-stream-zip: 1.15.0 ora: 5.4.1 - semver: 7.7.1 + semver: 7.7.3 strip-ansi: 5.2.0 wcwidth: 1.0.1 yaml: 2.5.0 @@ -23518,7 +23351,7 @@ snapshots: mime: 2.6.0 open: 6.4.0 ora: 5.4.1 - semver: 7.7.1 + semver: 7.7.3 shell-quote: 1.8.1 sudo-prompt: 9.2.1 @@ -23543,7 +23376,7 @@ snapshots: fs-extra: 8.1.0 graceful-fs: 4.2.11 prompts: 2.4.2 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - bufferutil - supports-color @@ -25107,13 +24940,6 @@ snapshots: '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 - '@swc/jest@0.2.37(@swc/core@1.9.3(@swc/helpers@0.5.15))': - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.9.3(@swc/helpers@0.5.15) - '@swc/counter': 0.1.3 - jsonc-parser: 3.3.1 - '@swc/types@0.1.17': dependencies: '@swc/counter': 0.1.3 @@ -25797,14 +25623,14 @@ snapshots: tiny-invariant: 1.3.1 toformat: 2.0.0 - '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@uniswap/swap-router-contracts@1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@openzeppelin/contracts': 3.4.2 '@uniswap/v2-core': 1.0.1 '@uniswap/v3-core': 1.0.0 '@uniswap/v3-periphery': 1.4.4 dotenv: 14.3.2 - hardhat-watcher: 2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + hardhat-watcher: 2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) transitivePeerDependencies: - hardhat @@ -25828,12 +25654,12 @@ snapshots: '@uniswap/v3-core': 1.0.0 base64-sol: 1.0.1 - '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@uniswap/v3-sdk@3.10.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/solidity': 5.7.0 '@uniswap/sdk-core': 4.0.6 - '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@uniswap/swap-router-contracts': 1.3.1(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) '@uniswap/v3-periphery': 1.4.3 '@uniswap/v3-staker': 1.0.0 tiny-invariant: 1.3.1 @@ -25847,14 +25673,14 @@ snapshots: '@uniswap/v3-core': 1.0.0 '@uniswap/v3-periphery': 1.4.3 - '@vitejs/plugin-react@4.2.0(vite@5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1))': + '@vitejs/plugin-react@4.2.0(vite@5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1))': dependencies: '@babel/core': 7.26.9 '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.26.9) '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.26.9) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1) + vite: 5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1) transitivePeerDependencies: - supports-color @@ -26685,7 +26511,7 @@ snapshots: ast-types@0.15.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 astral-regex@1.0.0: {} @@ -26697,7 +26523,7 @@ snapshots: async-mutex@0.2.6: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 async@1.5.2: {} @@ -26852,15 +26678,6 @@ snapshots: schema-utils: 2.7.1 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - babel-loader@8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - '@babel/core': 7.26.9 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - babel-plugin-const-enum@1.2.0(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 @@ -27997,36 +27814,6 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@jest/types': 29.6.3 @@ -28057,21 +27844,6 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-require@1.1.1: {} cross-fetch@3.1.8(encoding@0.1.13): @@ -28156,18 +27928,6 @@ snapshots: semver: 7.7.1 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - css-loader@6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.49) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.49) - postcss-modules-scope: 3.0.0(postcss@8.4.49) - postcss-modules-values: 4.0.0(postcss@8.4.49) - postcss-value-parser: 4.2.0 - semver: 7.7.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - css-minimizer-webpack-plugin@3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: cssnano: 5.1.15(postcss@8.4.49) @@ -28180,18 +27940,6 @@ snapshots: optionalDependencies: esbuild: 0.23.1 - css-minimizer-webpack-plugin@3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - cssnano: 5.1.15(postcss@8.4.49) - jest-worker: 27.5.1 - postcss: 8.4.49 - schema-utils: 4.2.0 - serialize-javascript: 6.0.2 - source-map: 0.6.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - optionalDependencies: - esbuild: 0.23.1 - css-prefers-color-scheme@6.0.3(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -29156,7 +28904,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@8.57.0) @@ -29168,7 +28916,7 @@ snapshots: eslint: 8.57.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -29183,7 +28931,7 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) @@ -29195,7 +28943,7 @@ snapshots: eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) @@ -29210,7 +28958,7 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.26.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.26.9)(eslint@9.16.0(jiti@1.21.0)) @@ -29222,7 +28970,7 @@ snapshots: eslint: 9.16.0(jiti@1.21.0) eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0)) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react: 7.35.0(eslint@9.16.0(jiti@1.21.0)) eslint-plugin-react-hooks: 4.6.0(eslint@9.16.0(jiti@1.21.0)) @@ -29428,35 +29176,35 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.6.2) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) eslint: 9.16.0(jiti@1.21.0) optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) eslint: 9.16.0(jiti@1.21.0) optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript @@ -29614,7 +29362,7 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): + eslint-webpack-plugin@3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/eslint': 8.44.0 eslint: 8.57.0 @@ -29622,7 +29370,7 @@ snapshots: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) eslint-webpack-plugin@3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: @@ -30287,12 +30035,6 @@ snapshots: schema-utils: 3.3.0 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - file-loader@6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - file-type@17.1.6: dependencies: readable-web-to-node-stream: 3.0.2 @@ -30431,7 +30173,7 @@ snapshots: forge-std@1.1.2: {} - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/code-frame': 7.26.2 '@types/json-schema': 7.0.15 @@ -30447,7 +30189,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.6.2 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: eslint: 8.57.0 @@ -30875,10 +30617,10 @@ snapshots: - debug - utf-8-validate - hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): + hardhat-watcher@2.5.0(hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): dependencies: chokidar: 3.6.0 - hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat: 2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: @@ -30988,60 +30730,6 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.22.6(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.4.2 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.2 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.6 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chalk: 2.4.2 - chokidar: 3.6.0 - ci-info: 2.0.0 - debug: 4.3.7(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 2.1.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - glob: 7.2.0 - immutable: 4.3.7 - io-ts: 1.10.4 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.7.0 - p-map: 4.0.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.8.26(debug@4.3.7) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - tsort: 0.0.1 - undici: 5.28.4 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - typescript: 5.6.2 - transitivePeerDependencies: - - bufferutil - - c-kzg - - supports-color - - utf-8-validate - harmony-reflect@1.6.2: {} has-bigints@1.0.2: {} @@ -31189,15 +30877,6 @@ snapshots: tapable: 2.2.1 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - html-webpack-plugin@5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -31901,16 +31580,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-cli@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -31924,92 +31603,6 @@ snapshots: - ts-node - utf-8-validate - jest-cli@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): - dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-util: 27.5.1 - jest-validate: 27.5.1 - prompts: 2.4.2 - yargs: 16.2.0 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-cli@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-cli@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) @@ -32033,7 +31626,7 @@ snapshots: jest-cli@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 @@ -32073,27 +31666,6 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-config@26.6.3(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 @@ -32122,7 +31694,7 @@ snapshots: - supports-color - utf-8-validate - jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 27.5.1 @@ -32149,140 +31721,13 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.15.13 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.15.13 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 @@ -32345,68 +31790,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.14.13 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@babel/core': 7.26.10 @@ -32438,37 +31821,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.19.7 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-cucumber@3.0.2(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@cucumber/gherkin': 17.0.2 @@ -33222,22 +32574,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)): - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - jest-regex-util: 28.0.2 - jest-watcher: 28.1.3 - slash: 4.0.0 - string-length: 5.0.1 - strip-ansi: 7.1.0 - - jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)): + jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10)): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -33323,11 +32664,11 @@ snapshots: - ts-node - utf-8-validate - jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): + jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) import-local: 3.1.0 - jest-cli: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-cli: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) optionalDependencies: node-notifier: 8.0.2 transitivePeerDependencies: @@ -33337,62 +32678,6 @@ snapshots: - ts-node - utf-8-validate - jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10): - dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - import-local: 3.1.0 - jest-cli: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) @@ -33409,7 +32694,7 @@ snapshots: jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) '@jest/types': 29.6.3 import-local: 3.1.0 jest-cli: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) @@ -33435,20 +32720,6 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) - optionalDependencies: - node-notifier: 8.0.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jiti@1.21.0: {} joi@17.13.3: @@ -34347,11 +33618,6 @@ snapshots: schema-utils: 4.2.0 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - mini-css-extract-plugin@2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -34609,6 +33875,12 @@ snapshots: next: 15.5.9(@babel/core@7.26.10)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106) react: 19.0.0-rc-66855b96-20241106 + next-auth@5.0.0-beta.30(next@15.5.9(@babel/core@7.26.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + dependencies: + '@auth/core': 0.41.0 + next: 15.5.9(@babel/core@7.26.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + next@14.2.25(@babel/core@7.26.10)(@playwright/test@1.45.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.25 @@ -34707,6 +33979,29 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.5.9(@babel/core@7.26.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 15.5.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001760 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(@babel/core@7.26.9)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-napi@1.0.2: dependencies: node-addon-api: 3.2.1 @@ -35699,14 +34994,6 @@ snapshots: postcss: 8.4.49 postcss-value-parser: 4.2.0 - postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - lilconfig: 2.1.0 - yaml: 2.5.0 - optionalDependencies: - postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) - postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: lilconfig: 2.1.0 @@ -35715,13 +35002,13 @@ snapshots: postcss: 8.4.49 ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2) - postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): + postcss-load-config@4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: lilconfig: 2.1.0 yaml: 2.5.0 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2) postcss-load-config@6.0.1(jiti@1.21.0)(postcss@8.4.49)(yaml@2.5.0): dependencies: @@ -35739,14 +35026,6 @@ snapshots: semver: 7.7.1 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - postcss-loader@6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - cosmiconfig: 7.1.0 - klona: 2.0.6 - postcss: 8.4.49 - semver: 7.7.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - postcss-logical@5.0.4(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -36317,7 +35596,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): + react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@babel/code-frame': 7.26.2 address: 1.2.2 @@ -36328,7 +35607,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -36343,7 +35622,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) optionalDependencies: typescript: 5.6.2 transitivePeerDependencies: @@ -36473,7 +35752,7 @@ snapshots: react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 - semver: 7.7.1 + semver: 7.7.3 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.16 ws: 6.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -36509,7 +35788,7 @@ snapshots: '@remix-run/router': 1.7.2 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) @@ -36526,16 +35805,16 @@ snapshots: css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + eslint: 8.57.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10)) mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss: 8.4.49 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) @@ -36545,7 +35824,7 @@ snapshots: prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 @@ -36553,7 +35832,7 @@ snapshots: semver: 7.6.3 source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) @@ -36595,56 +35874,56 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@8.57.0)(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.26.9) - babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + babel-loader: 8.3.0(@babel/core@7.26.9)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.9) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.23.3 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + css-loader: 6.8.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) dotenv: 10.0.0 dotenv-expand: 5.1.0 - eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.0)(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + eslint: 9.16.0(jiti@1.21.0) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss: 8.4.49 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) - postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + postcss-loader: 6.2.1(postcss@8.4.49)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss-normalize: 10.0.1(browserslist@4.23.3)(postcss@8.4.49) postcss-preset-env: 7.8.3(postcss@8.4.49) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + react-dev-utils: 12.0.1(eslint@9.16.0(jiti@1.21.0))(typescript@5.6.2)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + sass-loader: 12.6.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) + terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) + webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) optionalDependencies: fsevents: 2.3.3 typescript: 5.6.2 @@ -36681,7 +35960,7 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(esbuild@0.23.1)(eslint@9.16.0(jiti@1.21.0))(node-notifier@8.0.2)(react@18.3.1)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.9 '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) @@ -36699,15 +35978,15 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 9.16.0(jiti@1.21.0) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@9.16.0(jiti@1.21.0))(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-webpack-plugin: 3.2.0(eslint@9.16.0(jiti@1.21.0))(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) file-loader: 6.2.0(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) fs-extra: 10.1.0 html-webpack-plugin: 5.5.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2))(utf-8-validate@5.0.10)) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2))(utf-8-validate@5.0.10)) mini-css-extract-plugin: 2.7.6(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) postcss: 8.4.49 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.49) @@ -36725,7 +36004,7 @@ snapshots: semver: 7.6.3 source-map-loader: 3.0.2(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) style-loader: 3.3.3(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + tailwindcss: 3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) terser-webpack-plugin: 5.3.9(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) webpack-dev-server: 4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) @@ -36853,7 +36132,7 @@ snapshots: ast-types: 0.15.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.7.0 + tslib: 2.8.1 rechoir@0.6.2: dependencies: @@ -37178,12 +36457,6 @@ snapshots: neo-async: 2.6.2 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - sass-loader@12.6.0(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - klona: 2.0.6 - neo-async: 2.6.2 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - sax@1.2.4: {} saxes@5.0.1: @@ -37368,8 +36641,7 @@ snapshots: semver@7.7.1: {} - semver@7.7.3: - optional: true + semver@7.7.3: {} send@0.18.0: dependencies: @@ -37715,13 +36987,6 @@ snapshots: source-map-js: 1.2.1 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - source-map-loader@3.0.2(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - abab: 2.0.6 - iconv-lite: 0.6.3 - source-map-js: 1.2.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - source-map-resolve@0.5.3: dependencies: atob: 2.1.2 @@ -38073,10 +37338,6 @@ snapshots: dependencies: webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - style-loader@3.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - styled-jsx@5.1.1(@babel/core@7.26.10)(react@18.3.1): dependencies: client-only: 0.0.1 @@ -38107,6 +37368,13 @@ snapshots: '@babel/core': 7.26.10 babel-plugin-macros: 3.1.0 + styled-jsx@5.1.6(@babel/core@7.26.9)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.9 + stylehacks@5.1.1(postcss@8.4.49): dependencies: browserslist: 4.24.4 @@ -38248,7 +37516,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): + tailwindcss@3.3.2(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -38267,7 +37535,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) postcss-nested: 6.0.1(postcss@8.4.49) postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 @@ -38276,33 +37544,6 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - postcss-nested: 6.0.1(postcss@8.4.49) - postcss-selector-parser: 6.0.13 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -38330,7 +37571,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)): + tailwindcss@3.4.7(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -38349,7 +37590,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) + postcss-load-config: 4.0.1(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) postcss-nested: 6.0.1(postcss@8.4.49) postcss-selector-parser: 6.0.13 resolve: 1.22.8 @@ -38431,18 +37672,6 @@ snapshots: '@swc/core': 1.15.3(@swc/helpers@0.5.15) esbuild: 0.23.1 - terser-webpack-plugin@5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.34.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.15) - esbuild: 0.23.1 - terser@5.34.1: dependencies: '@jridgewell/source-map': 0.3.5 @@ -38638,32 +37867,12 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)))(typescript@5.6.2): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2)) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.6.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.26.10 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - esbuild: 0.23.1 - - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.15.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) + jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38678,12 +37887,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.13)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38698,12 +37907,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.10) esbuild: 0.23.1 - ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)))(typescript@5.6.2): + ts-jest@29.2.5(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2))(typescript@5.6.2): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2)) + jest: 29.7.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(node-notifier@8.0.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -38782,26 +37991,6 @@ snapshots: optionalDependencies: '@swc/core': 1.15.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.15.13 - acorn: 8.14.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(@types/node@20.14.13)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -38842,46 +38031,6 @@ snapshots: optionalDependencies: '@swc/core': 1.15.3(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@18.15.13)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.15.13 - acorn: 8.14.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.15) - - ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.19.7)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.7 - acorn: 8.14.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.15) - ts-toolbelt@9.6.0: {} ts.cryptojs256@1.0.1: {} @@ -39203,10 +38352,10 @@ snapshots: unpipe@1.0.0: {} - unplugin-swc@1.5.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(rollup@4.28.0): + unplugin-swc@1.5.1(@swc/core@1.15.3(@swc/helpers@0.5.15))(rollup@4.28.0): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.28.0) - '@swc/core': 1.9.3(@swc/helpers@0.5.15) + '@swc/core': 1.15.3(@swc/helpers@0.5.15) load-tsconfig: 0.2.5 unplugin: 1.16.1 transitivePeerDependencies: @@ -39401,23 +38550,23 @@ snapshots: - utf-8-validate - zod - vite-plugin-node-polyfills@0.16.0(rollup@4.28.0)(vite@5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1)): + vite-plugin-node-polyfills@0.16.0(rollup@4.28.0)(vite@5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.28.0) buffer-polyfill: buffer@6.0.3 node-stdlib-browser: 1.2.0 process: 0.11.10 - vite: 5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1) + vite: 5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1) transitivePeerDependencies: - rollup - vite@5.4.7(@types/node@18.15.13)(lightningcss@1.30.2)(terser@5.34.1): + vite@5.4.7(@types/node@22.19.7)(lightningcss@1.30.2)(terser@5.34.1): dependencies: esbuild: 0.21.5 postcss: 8.4.49 rollup: 4.28.0 optionalDependencies: - '@types/node': 18.15.13 + '@types/node': 22.19.7 fsevents: 2.3.3 lightningcss: 1.30.2 terser: 5.34.1 @@ -39545,15 +38694,6 @@ snapshots: schema-utils: 4.2.0 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - webpack-dev-middleware@5.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: '@types/bonjour': 3.5.10 @@ -39594,58 +38734,12 @@ snapshots: - supports-color - utf-8-validate - webpack-dev-server@4.15.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - '@types/bonjour': 3.5.10 - '@types/connect-history-api-fallback': 1.5.0 - '@types/express': 4.17.17 - '@types/serve-index': 1.9.1 - '@types/serve-static': 1.15.2 - '@types/sockjs': 0.3.33 - '@types/ws': 8.5.5 - ansi-html-community: 0.0.8 - bonjour-service: 1.1.1 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.7.4 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.18.2 - graceful-fs: 4.2.11 - html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.17) - ipaddr.js: 2.1.0 - launch-editor: 2.6.0 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 5.3.3(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - webpack-manifest-plugin@4.1.1(webpack@5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): dependencies: tapable: 2.2.1 webpack: 5.88.2(@swc/core@1.15.3(@swc/helpers@0.5.15))(esbuild@0.23.1) webpack-sources: 2.3.1 - webpack-manifest-plugin@4.1.1(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - webpack-sources: 2.3.1 - webpack-sources@1.4.3: dependencies: source-list-map: 2.0.1 @@ -39691,37 +38785,6 @@ snapshots: - esbuild - uglify-js - webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1): - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.14.0 - acorn-import-assertions: 1.9.0(acorn@8.14.0) - browserslist: 4.23.3 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - websocket-driver@0.7.4: dependencies: http-parser-js: 0.5.8 @@ -39951,18 +39014,6 @@ snapshots: - '@types/babel__core' - supports-color - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1)): - dependencies: - fast-json-stable-stringify: 2.1.0 - pretty-bytes: 5.6.0 - upath: 1.2.0 - webpack: 5.88.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.23.1) - webpack-sources: 1.4.3 - workbox-build: 6.6.0(@types/babel__core@7.20.5) - transitivePeerDependencies: - - '@types/babel__core' - - supports-color - workbox-window@6.6.0: dependencies: '@types/trusted-types': 2.0.3 diff --git a/sdk/package.json b/sdk/package.json index ebf538c4e1..98871aa64b 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -20,7 +20,7 @@ "@imtbl/x-provider": "workspace:*" }, "devDependencies": { - "eslint": "^8.40.0", + "eslint": "^8.56.0", "tsup": "^8.3.0", "typescript": "^5.6.2" }, From 140c00f900e2005112ca99429b64ebdfa190fd6b Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 13:46:25 +1100 Subject: [PATCH 85/88] versions --- packages/auth-next-client/package.json | 2 +- packages/auth-next-client/src/provider.tsx | 16 ++++++++-------- packages/auth-next-server/package.json | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/auth-next-client/package.json b/packages/auth-next-client/package.json index c73a2846c8..d79dfcb394 100644 --- a/packages/auth-next-client/package.json +++ b/packages/auth-next-client/package.json @@ -1,6 +1,6 @@ { "name": "@imtbl/auth-next-client", - "version": "0.0.1", + "version": "0.0.0", "description": "Immutable Auth.js v5 integration for Next.js - Client-side components", "author": "Immutable", "license": "Apache-2.0", diff --git a/packages/auth-next-client/src/provider.tsx b/packages/auth-next-client/src/provider.tsx index ea6a08cf2b..7c8dfe1033 100644 --- a/packages/auth-next-client/src/provider.tsx +++ b/packages/auth-next-client/src/provider.tsx @@ -163,7 +163,7 @@ function ImmutableAuthInner({ await signOut({ redirect: false }); }; - // Handle explicit logout from Auth SDK (e.g., if user calls auth.logout() directly) + // Handle explicit logout from Auth SDK (e.g., via auth.logout() or auth.getLogoutUrl()) // This ensures NextAuth session is always in sync with Auth SDK state const handleLoggedOut = async () => { // Sign out from NextAuth to clear the session cookie @@ -311,20 +311,20 @@ export function useImmutableAuth(): UseImmutableAuthReturn { // Sign out from both NextAuth and Immutable const handleSignOut = useCallback(async () => { - // Sign out from NextAuth first (clears session cookie) - await signOut({ redirect: false }); - - // Clear local Auth state without doing a full OIDC logout redirect - // We use getLogoutUrl() which clears local storage but returns URL instead of redirecting if (auth) { try { - // This removes the user from local storage without redirecting + // Clear local Auth state - this emits LOGGED_OUT event which triggers + // handleLoggedOut listener to call signOut() from NextAuth await auth.getLogoutUrl(); } catch (error) { - // Ignore errors (user may already be logged out) + // If getLogoutUrl fails, fall back to direct signOut // eslint-disable-next-line no-console console.warn('[auth-next-client] Logout cleanup error:', error); + await signOut({ redirect: false }); } + } else { + // No auth instance, just sign out from NextAuth directly + await signOut({ redirect: false }); } }, [auth]); diff --git a/packages/auth-next-server/package.json b/packages/auth-next-server/package.json index b9887e9d92..efaf2f3d7b 100644 --- a/packages/auth-next-server/package.json +++ b/packages/auth-next-server/package.json @@ -1,6 +1,6 @@ { "name": "@imtbl/auth-next-server", - "version": "0.0.1", + "version": "0.0.0", "description": "Immutable Auth.js v5 integration for Next.js - Server-side utilities", "author": "Immutable", "license": "Apache-2.0", From 1e2b06a68e72c2dddfdce533ac0728ca901c7242 Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 14:11:26 +1100 Subject: [PATCH 86/88] fix --- packages/auth-next-client/package.json | 14 ++++++++++++++ packages/auth-next-server/package.json | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/packages/auth-next-client/package.json b/packages/auth-next-client/package.json index d79dfcb394..b54566e046 100644 --- a/packages/auth-next-client/package.json +++ b/packages/auth-next-client/package.json @@ -5,6 +5,9 @@ "author": "Immutable", "license": "Apache-2.0", "repository": "immutable/ts-immutable-sdk.git", + "publishConfig": { + "access": "public" + }, "type": "module", "main": "./dist/node/index.cjs", "module": "./dist/node/index.js", @@ -39,6 +42,17 @@ "next-auth": "^5.0.0-beta.25", "react": "^18.2.0 || ^19.0.0" }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "next-auth": { + "optional": true + }, + "react": { + "optional": true + } + }, "devDependencies": { "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", diff --git a/packages/auth-next-server/package.json b/packages/auth-next-server/package.json index efaf2f3d7b..50bf2f4d55 100644 --- a/packages/auth-next-server/package.json +++ b/packages/auth-next-server/package.json @@ -5,6 +5,9 @@ "author": "Immutable", "license": "Apache-2.0", "repository": "immutable/ts-immutable-sdk.git", + "publishConfig": { + "access": "public" + }, "type": "module", "main": "./dist/node/index.cjs", "module": "./dist/node/index.js", @@ -34,6 +37,14 @@ "next": "^14.2.0 || ^15.0.0", "next-auth": "^5.0.0-beta.25" }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "next-auth": { + "optional": true + } + }, "devDependencies": { "@swc/core": "^1.4.2", "@swc/jest": "^0.2.37", From f824b5dc6b8ac1083985e017de56a917d368be3f Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 14:42:03 +1100 Subject: [PATCH 87/88] package definitions --- packages/auth-next-client/package.json | 8 +++++--- packages/auth-next-server/package.json | 10 +++++---- sdk/package.json | 28 +++++++++++++------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/packages/auth-next-client/package.json b/packages/auth-next-client/package.json index b54566e046..562be9a2a4 100644 --- a/packages/auth-next-client/package.json +++ b/packages/auth-next-client/package.json @@ -28,9 +28,11 @@ }, "scripts": { "build": "tsup && pnpm build:types", - "build:types": "tsc --project tsconfig.types.json", - "clean": "rm -rf dist", - "lint": "eslint src/**/*.{ts,tsx} --max-warnings=0", + "transpile": "tsup src/index.ts --config ../../tsup.config.js", + "typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types", + "pack:root": "pnpm pack --pack-destination $(dirname $(pnpm root -w))", + "lint": "eslint ./src --ext .ts,.jsx,.tsx --max-warnings=0", + "typecheck": "tsc --customConditions default --noEmit --jsx preserve", "test": "jest --passWithNoTests" }, "dependencies": { diff --git a/packages/auth-next-server/package.json b/packages/auth-next-server/package.json index 50bf2f4d55..bbf443bf09 100644 --- a/packages/auth-next-server/package.json +++ b/packages/auth-next-server/package.json @@ -27,10 +27,12 @@ } }, "scripts": { - "build": "tsup && pnpm build:types", - "build:types": "tsc --project tsconfig.types.json", - "clean": "rm -rf dist", - "lint": "eslint src/**/*.ts --max-warnings=0", + "build": "pnpm transpile && pnpm typegen", + "transpile": "tsup src/index.ts --config ../../tsup.config.js", + "typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types", + "pack:root": "pnpm pack --pack-destination $(dirname $(pnpm root -w))", + "lint": "eslint ./src --ext .ts,.jsx,.tsx --max-warnings=0", + "typecheck": "tsc --customConditions default --noEmit --jsx preserve", "test": "jest --passWithNoTests" }, "peerDependencies": { diff --git a/sdk/package.json b/sdk/package.json index 98871aa64b..5affcaabd0 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -195,28 +195,28 @@ "default": "./dist/wallet.js" } }, - "./auth_nextjs/client": { + "./auth-next-client": { "development": { - "types": "./src/auth_nextjs_client.ts", - "require": "./dist/auth_nextjs_client.cjs", - "default": "./dist/auth_nextjs_client.js" + "types": "./src/auth-next-client.ts", + "require": "./dist/auth-next-client.cjs", + "default": "./dist/auth-next-client.js" }, "default": { - "types": "./dist/auth_nextjs_client.d.ts", - "require": "./dist/auth_nextjs_client.cjs", - "default": "./dist/auth_nextjs_client.js" + "types": "./dist/auth-next-client.d.ts", + "require": "./dist/auth-next-client.cjs", + "default": "./dist/auth-next-client.js" } }, - "./auth_nextjs/server": { + "./auth-next-server": { "development": { - "types": "./src/auth_nextjs_server.ts", - "require": "./dist/auth_nextjs_server.cjs", - "default": "./dist/auth_nextjs_server.js" + "types": "./src/auth-next-server.ts", + "require": "./dist/auth-next-server.cjs", + "default": "./dist/auth-next-server.js" }, "default": { - "types": "./dist/auth_nextjs_server.d.ts", - "require": "./dist/auth_nextjs_server.cjs", - "default": "./dist/auth_nextjs_server.js" + "types": "./dist/auth-next-server.d.ts", + "require": "./dist/auth-next-server.cjs", + "default": "./dist/auth-next-server.js" } } }, From bd230a1a8b5581e657e7f60450904c2181d141ed Mon Sep 17 00:00:00 2001 From: Shine Li Date: Fri, 16 Jan 2026 14:50:56 +1100 Subject: [PATCH 88/88] package json fix --- packages/auth-next-client/package.json | 6 +++--- packages/auth-next-server/package.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/auth-next-client/package.json b/packages/auth-next-client/package.json index 562be9a2a4..9626b29a41 100644 --- a/packages/auth-next-client/package.json +++ b/packages/auth-next-client/package.json @@ -11,7 +11,7 @@ "type": "module", "main": "./dist/node/index.cjs", "module": "./dist/node/index.js", - "types": "./dist/node/index.d.ts", + "types": "./dist/types/index.d.ts", "exports": { ".": { "development": { @@ -20,14 +20,14 @@ "default": "./dist/node/index.js" }, "default": { - "types": "./dist/node/index.d.ts", + "types": "./dist/types/index.d.ts", "require": "./dist/node/index.cjs", "default": "./dist/node/index.js" } } }, "scripts": { - "build": "tsup && pnpm build:types", + "build": "pnpm transpile && pnpm typegen", "transpile": "tsup src/index.ts --config ../../tsup.config.js", "typegen": "tsc --customConditions default --emitDeclarationOnly --outDir dist/types", "pack:root": "pnpm pack --pack-destination $(dirname $(pnpm root -w))", diff --git a/packages/auth-next-server/package.json b/packages/auth-next-server/package.json index bbf443bf09..307610bb3d 100644 --- a/packages/auth-next-server/package.json +++ b/packages/auth-next-server/package.json @@ -11,7 +11,7 @@ "type": "module", "main": "./dist/node/index.cjs", "module": "./dist/node/index.js", - "types": "./dist/node/index.d.ts", + "types": "./dist/types/index.d.ts", "exports": { ".": { "development": { @@ -20,7 +20,7 @@ "default": "./dist/node/index.js" }, "default": { - "types": "./dist/node/index.d.ts", + "types": "./dist/types/index.d.ts", "require": "./dist/node/index.cjs", "default": "./dist/node/index.js" }