@incorta/auth 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/context.tsx","../../src/react/components.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { IncortaUser } from \"../core/config.js\";\n\nexport interface SignInOptions {\n /** Where to land after login. Defaults to the current URL. */\n redirectTo?: string;\n}\n\nexport interface SignOutOptions {\n /** Navigate here after the session is cleared. Defaults to staying put. */\n redirectTo?: string;\n}\n\nexport interface IncortaAuthContextValue {\n /** False until the first session check completes. */\n isLoaded: boolean;\n isSignedIn: boolean;\n user: IncortaUser | null;\n /** Epoch millis when the session expires, when signed in. */\n sessionExpiresAt: number | null;\n /** Sends the browser through Incorta login and back. */\n signIn: (options?: SignInOptions) => void;\n signOut: (options?: SignOutOptions) => Promise<void>;\n /** Re-checks the session against the backend. */\n refresh: () => Promise<void>;\n /**\n * Fetches the raw Incorta access token (requires `exposeAccessToken: true`\n * on the server). Returns null when signed out or not exposed.\n */\n getToken: () => Promise<string | null>;\n}\n\nconst IncortaAuthContext = createContext<IncortaAuthContextValue | null>(null);\n\ninterface SessionResponse {\n user: IncortaUser | null;\n session?: { expiresAt: number; accessTokenExpiresAt: number };\n}\n\nexport interface IncortaAuthProviderProps {\n children: ReactNode;\n /** Must match the backend's basePath. @default \"/auth\" */\n basePath?: string;\n /**\n * Re-check the session every N milliseconds so long-lived tabs keep their\n * Incorta access token fresh (the backend refreshes it server-side).\n * Set 0 to disable. @default 300000 (5 minutes)\n */\n refetchInterval?: number;\n}\n\nexport function IncortaAuthProvider({\n children,\n basePath = \"/auth\",\n refetchInterval = 5 * 60 * 1000,\n}: IncortaAuthProviderProps) {\n const [isLoaded, setIsLoaded] = useState(false);\n const [user, setUser] = useState<IncortaUser | null>(null);\n const [sessionExpiresAt, setSessionExpiresAt] = useState<number | null>(null);\n const mounted = useRef(true);\n\n const refresh = useCallback(async () => {\n try {\n const response = await fetch(`${basePath}/session`, {\n headers: { accept: \"application/json\" },\n });\n const body = (await response.json()) as SessionResponse;\n if (!mounted.current) return;\n setUser(body.user ?? null);\n setSessionExpiresAt(body.session?.expiresAt ?? null);\n } catch {\n if (!mounted.current) return;\n setUser(null);\n setSessionExpiresAt(null);\n } finally {\n if (mounted.current) setIsLoaded(true);\n }\n }, [basePath]);\n\n useEffect(() => {\n mounted.current = true;\n void refresh();\n return () => {\n mounted.current = false;\n };\n }, [refresh]);\n\n useEffect(() => {\n if (!refetchInterval) return;\n const id = setInterval(() => void refresh(), refetchInterval);\n return () => clearInterval(id);\n }, [refetchInterval, refresh]);\n\n const signIn = useCallback(\n (options?: SignInOptions) => {\n if (typeof window === \"undefined\") return;\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n const redirectTo = options?.redirectTo ?? current;\n window.location.assign(\n `${basePath}/login?redirect_to=${encodeURIComponent(redirectTo)}`,\n );\n },\n [basePath],\n );\n\n const signOut = useCallback(\n async (options?: SignOutOptions) => {\n try {\n await fetch(`${basePath}/logout`, { method: \"POST\" });\n } finally {\n setUser(null);\n setSessionExpiresAt(null);\n if (options?.redirectTo && typeof window !== \"undefined\") {\n window.location.assign(options.redirectTo);\n }\n }\n },\n [basePath],\n );\n\n const getToken = useCallback(async () => {\n try {\n const response = await fetch(`${basePath}/token`, {\n headers: { accept: \"application/json\" },\n });\n if (!response.ok) return null;\n const body = (await response.json()) as { accessToken?: string };\n return body.accessToken ?? null;\n } catch {\n return null;\n }\n }, [basePath]);\n\n const value = useMemo<IncortaAuthContextValue>(\n () => ({\n isLoaded,\n isSignedIn: user !== null,\n user,\n sessionExpiresAt,\n signIn,\n signOut,\n refresh,\n getToken,\n }),\n [isLoaded, user, sessionExpiresAt, signIn, signOut, refresh, getToken],\n );\n\n return <IncortaAuthContext.Provider value={value}>{children}</IncortaAuthContext.Provider>;\n}\n\nexport function useIncortaAuth(): IncortaAuthContextValue {\n const context = useContext(IncortaAuthContext);\n if (!context) {\n throw new Error(\"[incorta-auth] useIncortaAuth must be used inside <IncortaAuthProvider>.\");\n }\n return context;\n}\n\n/** Clerk-style alias of {@link useIncortaAuth}. */\nexport const useAuth = useIncortaAuth;\n\n/** The signed-in user, or null. */\nexport function useUser(): IncortaUser | null {\n return useIncortaAuth().user;\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { useIncortaAuth } from \"./context.js\";\n\n/** Renders children only when the user is signed in (after the initial load). */\nexport function SignedIn({ children }: { children: ReactNode }) {\n const { isLoaded, isSignedIn } = useIncortaAuth();\n return isLoaded && isSignedIn ? <>{children}</> : null;\n}\n\n/** Renders children only when the user is signed out (after the initial load). */\nexport function SignedOut({ children }: { children: ReactNode }) {\n const { isLoaded, isSignedIn } = useIncortaAuth();\n return isLoaded && !isSignedIn ? <>{children}</> : null;\n}\n\n/**\n * Immediately sends the browser through Incorta login. Render it for signed-out\n * users on protected pages:\n *\n * ```tsx\n * <SignedOut><RedirectToLogin /></SignedOut>\n * ```\n */\nexport function RedirectToLogin({ redirectTo }: { redirectTo?: string }) {\n const { signIn } = useIncortaAuth();\n useEffect(() => {\n signIn(redirectTo ? { redirectTo } : undefined);\n }, [signIn, redirectTo]);\n return null;\n}\n\n/**\n * Gates children behind authentication: shows `loading` during the initial\n * check, redirects signed-out users through Incorta login (or renders\n * `fallback` when provided).\n */\nexport function Protect({\n children,\n fallback,\n loading = null,\n}: {\n children: ReactNode;\n /** Rendered for signed-out users instead of redirecting. */\n fallback?: ReactNode;\n loading?: ReactNode;\n}) {\n const { isLoaded, isSignedIn } = useIncortaAuth();\n if (!isLoaded) return <>{loading}</>;\n if (!isSignedIn) return fallback !== undefined ? <>{fallback}</> : <RedirectToLogin />;\n return <>{children}</>;\n}\n"],"mappings":"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","names":["useEffect","jsx","useEffect"]}
1
+ {"version":3,"sources":["../../src/react/context.tsx","../../src/react/components.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { IncortaUser } from \"../core/config.js\";\n\nexport interface SignInOptions {\n /** Where to land after login. Defaults to the current URL. */\n redirectTo?: string;\n}\n\nexport interface SignOutOptions {\n /**\n * Where to navigate after the session is cleared. Defaults to the SDK's\n * ungated `{basePath}/signed-out` page — in an SSO-gated app, landing on a\n * gated page immediately re-runs the login flow and (while the Incorta\n * session lives) signs the user straight back in, making sign-out look\n * broken. Pass `false` to stay put (SPA state only).\n */\n redirectTo?: string | false;\n}\n\nexport interface IncortaAuthContextValue {\n /** False until the first session check completes. */\n isLoaded: boolean;\n isSignedIn: boolean;\n user: IncortaUser | null;\n /** Epoch millis when the session expires, when signed in. */\n sessionExpiresAt: number | null;\n /** Sends the browser through Incorta login and back. */\n signIn: (options?: SignInOptions) => void;\n signOut: (options?: SignOutOptions) => Promise<void>;\n /** Re-checks the session against the backend. */\n refresh: () => Promise<void>;\n /**\n * Fetches the raw Incorta access token (requires `exposeAccessToken: true`\n * on the server). Returns null when signed out or not exposed.\n */\n getToken: () => Promise<string | null>;\n}\n\nconst IncortaAuthContext = createContext<IncortaAuthContextValue | null>(null);\n\ninterface SessionResponse {\n user: IncortaUser | null;\n session?: { expiresAt: number; accessTokenExpiresAt: number };\n}\n\nexport interface IncortaAuthProviderProps {\n children: ReactNode;\n /** Must match the backend's basePath. @default \"/auth\" */\n basePath?: string;\n /**\n * Re-check the session every N milliseconds so long-lived tabs keep their\n * Incorta access token fresh (the backend refreshes it server-side).\n * Set 0 to disable. @default 300000 (5 minutes)\n */\n refetchInterval?: number;\n}\n\nexport function IncortaAuthProvider({\n children,\n basePath = \"/auth\",\n refetchInterval = 5 * 60 * 1000,\n}: IncortaAuthProviderProps) {\n const [isLoaded, setIsLoaded] = useState(false);\n const [user, setUser] = useState<IncortaUser | null>(null);\n const [sessionExpiresAt, setSessionExpiresAt] = useState<number | null>(null);\n const mounted = useRef(true);\n\n const refresh = useCallback(async () => {\n try {\n const response = await fetch(`${basePath}/session`, {\n headers: { accept: \"application/json\" },\n });\n const body = (await response.json()) as SessionResponse;\n if (!mounted.current) return;\n setUser(body.user ?? null);\n setSessionExpiresAt(body.session?.expiresAt ?? null);\n } catch {\n if (!mounted.current) return;\n setUser(null);\n setSessionExpiresAt(null);\n } finally {\n if (mounted.current) setIsLoaded(true);\n }\n }, [basePath]);\n\n useEffect(() => {\n mounted.current = true;\n void refresh();\n return () => {\n mounted.current = false;\n };\n }, [refresh]);\n\n useEffect(() => {\n if (!refetchInterval) return;\n const id = setInterval(() => void refresh(), refetchInterval);\n return () => clearInterval(id);\n }, [refetchInterval, refresh]);\n\n const signIn = useCallback(\n (options?: SignInOptions) => {\n if (typeof window === \"undefined\") return;\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n const redirectTo = options?.redirectTo ?? current;\n window.location.assign(\n `${basePath}/login?redirect_to=${encodeURIComponent(redirectTo)}`,\n );\n },\n [basePath],\n );\n\n const signOut = useCallback(\n async (options?: SignOutOptions) => {\n try {\n await fetch(`${basePath}/logout`, { method: \"POST\" });\n } finally {\n setUser(null);\n setSessionExpiresAt(null);\n const redirectTo = options?.redirectTo ?? `${basePath}/signed-out`;\n if (redirectTo !== false && typeof window !== \"undefined\") {\n window.location.assign(redirectTo);\n }\n }\n },\n [basePath],\n );\n\n const getToken = useCallback(async () => {\n try {\n const response = await fetch(`${basePath}/token`, {\n headers: { accept: \"application/json\" },\n });\n if (!response.ok) return null;\n const body = (await response.json()) as { accessToken?: string };\n return body.accessToken ?? null;\n } catch {\n return null;\n }\n }, [basePath]);\n\n const value = useMemo<IncortaAuthContextValue>(\n () => ({\n isLoaded,\n isSignedIn: user !== null,\n user,\n sessionExpiresAt,\n signIn,\n signOut,\n refresh,\n getToken,\n }),\n [isLoaded, user, sessionExpiresAt, signIn, signOut, refresh, getToken],\n );\n\n return <IncortaAuthContext.Provider value={value}>{children}</IncortaAuthContext.Provider>;\n}\n\nexport function useIncortaAuth(): IncortaAuthContextValue {\n const context = useContext(IncortaAuthContext);\n if (!context) {\n throw new Error(\"[incorta-auth] useIncortaAuth must be used inside <IncortaAuthProvider>.\");\n }\n return context;\n}\n\n/** Clerk-style alias of {@link useIncortaAuth}. */\nexport const useAuth = useIncortaAuth;\n\n/** The signed-in user, or null. */\nexport function useUser(): IncortaUser | null {\n return useIncortaAuth().user;\n}\n","import { useEffect, type ReactNode } from \"react\";\nimport { useIncortaAuth } from \"./context.js\";\n\n/** Renders children only when the user is signed in (after the initial load). */\nexport function SignedIn({ children }: { children: ReactNode }) {\n const { isLoaded, isSignedIn } = useIncortaAuth();\n return isLoaded && isSignedIn ? <>{children}</> : null;\n}\n\n/** Renders children only when the user is signed out (after the initial load). */\nexport function SignedOut({ children }: { children: ReactNode }) {\n const { isLoaded, isSignedIn } = useIncortaAuth();\n return isLoaded && !isSignedIn ? <>{children}</> : null;\n}\n\n/**\n * Immediately sends the browser through Incorta login. Render it for signed-out\n * users on protected pages:\n *\n * ```tsx\n * <SignedOut><RedirectToLogin /></SignedOut>\n * ```\n */\nexport function RedirectToLogin({ redirectTo }: { redirectTo?: string }) {\n const { signIn } = useIncortaAuth();\n useEffect(() => {\n signIn(redirectTo ? { redirectTo } : undefined);\n }, [signIn, redirectTo]);\n return null;\n}\n\n/**\n * Gates children behind authentication: shows `loading` during the initial\n * check, redirects signed-out users through Incorta login (or renders\n * `fallback` when provided).\n */\nexport function Protect({\n children,\n fallback,\n loading = null,\n}: {\n children: ReactNode;\n /** Rendered for signed-out users instead of redirecting. */\n fallback?: ReactNode;\n loading?: ReactNode;\n}) {\n const { isLoaded, isSignedIn } = useIncortaAuth();\n if (!isLoaded) return <>{loading}</>;\n if (!isSignedIn) return fallback !== undefined ? <>{fallback}</> : <RedirectToLogin />;\n return <>{children}</>;\n}\n"],"mappings":"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","names":["useEffect","jsx","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@incorta/auth",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "description": "Authenticate Incorta users in any Node.js app — OAuth 2.0/OIDC against Incorta's built-in authorization server, with a React provider and Express/TanStack Start integrations.",
5
5
  "license": "MIT",
6
6
  "repository": {