@tern-secure/react 1.2.0-canary.v20251023005301 → 1.2.0-canary.v20251028151628

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.
Files changed (39) hide show
  1. package/dist/ctx/AuthProvider.d.mts +2 -2
  2. package/dist/ctx/AuthProvider.d.ts +2 -2
  3. package/dist/ctx/IsomorphicTernSecureCtx.d.mts +2 -2
  4. package/dist/ctx/IsomorphicTernSecureCtx.d.ts +2 -2
  5. package/dist/ctx/SignInCtx.d.mts +12 -10
  6. package/dist/ctx/SignInCtx.d.ts +12 -10
  7. package/dist/ctx/SignInCtx.js +1 -1
  8. package/dist/ctx/SignInCtx.js.map +1 -1
  9. package/dist/ctx/SignInCtx.mjs +1 -1
  10. package/dist/ctx/SignInCtx.mjs.map +1 -1
  11. package/dist/ctx/SignUpCtx.d.mts +22 -0
  12. package/dist/ctx/SignUpCtx.d.ts +22 -0
  13. package/dist/ctx/SignUpCtx.js +2 -0
  14. package/dist/ctx/SignUpCtx.js.map +1 -0
  15. package/dist/ctx/SignUpCtx.mjs +2 -0
  16. package/dist/ctx/SignUpCtx.mjs.map +1 -0
  17. package/dist/ctx/TernSecureCtxProvider.d.mts +2 -2
  18. package/dist/ctx/TernSecureCtxProvider.d.ts +2 -2
  19. package/dist/ctx/TernSecureProvider.d.mts +2 -2
  20. package/dist/ctx/TernSecureProvider.d.ts +2 -2
  21. package/dist/hooks/useSignUp.d.mts +5 -0
  22. package/dist/hooks/useSignUp.d.ts +5 -0
  23. package/dist/hooks/useSignUp.js +2 -0
  24. package/dist/hooks/useSignUp.js.map +1 -0
  25. package/dist/hooks/useSignUp.mjs +2 -0
  26. package/dist/hooks/useSignUp.mjs.map +1 -0
  27. package/dist/index.d.mts +2 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.js +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +1 -1
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/lib/isoTernSecureAuth.d.mts +1 -0
  34. package/dist/lib/isoTernSecureAuth.d.ts +1 -0
  35. package/dist/lib/isoTernSecureAuth.js +1 -1
  36. package/dist/lib/isoTernSecureAuth.js.map +1 -1
  37. package/dist/lib/isoTernSecureAuth.mjs +1 -1
  38. package/dist/lib/isoTernSecureAuth.mjs.map +1 -1
  39. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import * as React from 'react';
1
+ import * as react from 'react';
2
2
  import { DecodedIdToken, TernSecureUser } from '@tern-secure/types';
3
3
 
4
4
  type AuthProviderCtxValue = {
@@ -6,7 +6,7 @@ type AuthProviderCtxValue = {
6
6
  sessionClaims: DecodedIdToken | null | undefined;
7
7
  user: TernSecureUser | null | undefined;
8
8
  };
9
- declare const AuthProviderCtx: React.Context<{
9
+ declare const AuthProviderCtx: react.Context<{
10
10
  value: AuthProviderCtxValue;
11
11
  } | undefined>;
12
12
  declare const useAuthProviderCtx: () => AuthProviderCtxValue;
@@ -1,4 +1,4 @@
1
- import * as React from 'react';
1
+ import * as react from 'react';
2
2
  import { DecodedIdToken, TernSecureUser } from '@tern-secure/types';
3
3
 
4
4
  type AuthProviderCtxValue = {
@@ -6,7 +6,7 @@ type AuthProviderCtxValue = {
6
6
  sessionClaims: DecodedIdToken | null | undefined;
7
7
  user: TernSecureUser | null | undefined;
8
8
  };
9
- declare const AuthProviderCtx: React.Context<{
9
+ declare const AuthProviderCtx: react.Context<{
10
10
  value: AuthProviderCtxValue;
11
11
  } | undefined>;
12
12
  declare const useAuthProviderCtx: () => AuthProviderCtxValue;
@@ -1,9 +1,9 @@
1
- import * as React from 'react';
1
+ import * as react from 'react';
2
2
  import * as _tern_secure_types from '@tern-secure/types';
3
3
  import { IsoTernSecureAuth } from '../lib/isoTernSecureAuth.mjs';
4
4
  import '../types.mjs';
5
5
 
6
- declare const IsoTernSecureAuthCtx: React.Context<{
6
+ declare const IsoTernSecureAuthCtx: react.Context<{
7
7
  value: _tern_secure_types.TernSecureAuth;
8
8
  } | undefined>;
9
9
  declare const useIsoTernSecureAuthCtx: () => IsoTernSecureAuth;
@@ -1,9 +1,9 @@
1
- import * as React from 'react';
1
+ import * as react from 'react';
2
2
  import * as _tern_secure_types from '@tern-secure/types';
3
3
  import { IsoTernSecureAuth } from '../lib/isoTernSecureAuth.js';
4
4
  import '../types.js';
5
5
 
6
- declare const IsoTernSecureAuthCtx: React.Context<{
6
+ declare const IsoTernSecureAuthCtx: react.Context<{
7
7
  value: _tern_secure_types.TernSecureAuth;
8
8
  } | undefined>;
9
9
  declare const useIsoTernSecureAuthCtx: () => IsoTernSecureAuth;
@@ -1,25 +1,27 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { SignInProps, SignInForceRedirectUrl, SignUpForceRedirectUrl, TernSecureUser, AuthErrorTree } from '@tern-secure/auth';
3
- export { useTernSecure } from '@tern-secure/shared/react';
2
+ import * as react from 'react';
4
3
  import { ReactNode } from 'react';
4
+ import { SignInProps, SignInForceRedirectUrl, SignInFallbackRedirectUrl, TernSecureUser, AuthErrorTree } from '@tern-secure/auth';
5
+ export { useTernSecure } from '@tern-secure/shared/react';
5
6
 
6
- type SignInCtx = SignInProps & SignInForceRedirectUrl & SignUpForceRedirectUrl;
7
- interface SignInContextType extends Omit<SignInCtx, 'forceRedirectUrl'> {
8
- handleSignInSuccess: (user?: TernSecureUser | null, options?: {
9
- skipRedirect?: boolean;
7
+ type SignInCtx = SignInProps & SignInForceRedirectUrl & SignInFallbackRedirectUrl;
8
+ type SignInContextType = Omit<SignInCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {
9
+ onSignInSuccess: (user: TernSecureUser, options?: {
10
+ onPreRedirect?: () => Promise<boolean>;
10
11
  }) => void;
11
12
  handleSignInError: (error: AuthErrorTree) => void;
12
- redirectAfterSignIn: () => void;
13
+ redirectAfterSignIn: () => any;
13
14
  signInUrl: string;
14
15
  signUpUrl: string;
15
16
  afterSignUpUrl: string;
16
17
  afterSignInUrl: string;
17
18
  checkRedirectResult: () => Promise<void>;
18
- }
19
+ };
20
+ declare const SignInContext: react.Context<SignInCtx | null>;
19
21
  declare const useSignInContext: () => SignInContextType;
20
22
  interface SignInProviderProps extends Partial<SignInCtx> {
21
23
  children: ReactNode;
22
24
  }
23
- declare function SignInProvider({ children, onSuccess, forceRedirectUrl, signInForceRedirectUrl, signUpForceRedirectUrl, ...ctxProps }: SignInProviderProps): react_jsx_runtime.JSX.Element;
25
+ declare function SignInProvider({ children, ...ctxProps }: SignInProviderProps): react_jsx_runtime.JSX.Element;
24
26
 
25
- export { type SignInCtx, SignInProvider, useSignInContext };
27
+ export { SignInContext, type SignInContextType, type SignInCtx, SignInProvider, useSignInContext };
@@ -1,25 +1,27 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { SignInProps, SignInForceRedirectUrl, SignUpForceRedirectUrl, TernSecureUser, AuthErrorTree } from '@tern-secure/auth';
3
- export { useTernSecure } from '@tern-secure/shared/react';
2
+ import * as react from 'react';
4
3
  import { ReactNode } from 'react';
4
+ import { SignInProps, SignInForceRedirectUrl, SignInFallbackRedirectUrl, TernSecureUser, AuthErrorTree } from '@tern-secure/auth';
5
+ export { useTernSecure } from '@tern-secure/shared/react';
5
6
 
6
- type SignInCtx = SignInProps & SignInForceRedirectUrl & SignUpForceRedirectUrl;
7
- interface SignInContextType extends Omit<SignInCtx, 'forceRedirectUrl'> {
8
- handleSignInSuccess: (user?: TernSecureUser | null, options?: {
9
- skipRedirect?: boolean;
7
+ type SignInCtx = SignInProps & SignInForceRedirectUrl & SignInFallbackRedirectUrl;
8
+ type SignInContextType = Omit<SignInCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {
9
+ onSignInSuccess: (user: TernSecureUser, options?: {
10
+ onPreRedirect?: () => Promise<boolean>;
10
11
  }) => void;
11
12
  handleSignInError: (error: AuthErrorTree) => void;
12
- redirectAfterSignIn: () => void;
13
+ redirectAfterSignIn: () => any;
13
14
  signInUrl: string;
14
15
  signUpUrl: string;
15
16
  afterSignUpUrl: string;
16
17
  afterSignInUrl: string;
17
18
  checkRedirectResult: () => Promise<void>;
18
- }
19
+ };
20
+ declare const SignInContext: react.Context<SignInCtx | null>;
19
21
  declare const useSignInContext: () => SignInContextType;
20
22
  interface SignInProviderProps extends Partial<SignInCtx> {
21
23
  children: ReactNode;
22
24
  }
23
- declare function SignInProvider({ children, onSuccess, forceRedirectUrl, signInForceRedirectUrl, signUpForceRedirectUrl, ...ctxProps }: SignInProviderProps): react_jsx_runtime.JSX.Element;
25
+ declare function SignInProvider({ children, ...ctxProps }: SignInProviderProps): react_jsx_runtime.JSX.Element;
24
26
 
25
- export { type SignInCtx, SignInProvider, useSignInContext };
27
+ export { SignInContext, type SignInContextType, type SignInCtx, SignInProvider, useSignInContext };
@@ -1,2 +1,2 @@
1
- "use strict";"use client";var f=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var K=(t,e)=>{for(var s in e)f(t,s,{get:e[s],enumerable:!0})},M=(t,e,s,U)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of W(e))!H.call(t,c)&&c!==s&&f(t,c,{get:()=>e[c],enumerable:!(U=N(e,c))||U.enumerable});return t};var V=t=>M(f({},"__esModule",{value:!0}),t);var z={};K(z,{SignInProvider:()=>q,useSignInContext:()=>y,useTernSecure:()=>S.useTernSecure});module.exports=V(z);var F=require("react/jsx-runtime"),g=require("@tern-secure/auth"),S=require("@tern-secure/shared/react"),n=require("react");const v=(0,n.createContext)({handleSignInSuccess:()=>{},handleSignInError:()=>{},redirectAfterSignIn:()=>{},checkRedirectResult:async()=>{},signInUrl:"",signUpUrl:"",afterSignUpUrl:"",afterSignInUrl:""}),y=()=>(0,n.useContext)(v);function q({children:t,onSuccess:e,forceRedirectUrl:s,signInForceRedirectUrl:U,signUpForceRedirectUrl:c,...w}){const b=y(),i=(0,S.useTernSecure)(),I=i._internal_getAllOptions(),p=(0,n.useMemo)(()=>typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams,[]),h=(0,n.useCallback)((r,o,D="AuthError",O)=>{const u=new Error(r);return u.name=D,u.code=o,u.response=O,u},[]),l=(0,n.useCallback)(()=>{i.redirectAfterSignIn()},[i]),d=(0,n.useCallback)((r,o)=>{e?.(r||null),o?.skipRedirect||l()},[e,l]),a=(0,n.useCallback)(r=>{console.error(r)},[]),E=(0,n.useCallback)(async()=>{try{const r=await i.getRedirectResult();if(r&&r.success)d(r.user);else if(r&&!r.success){const o=h(r.message||"Redirect sign-in failed",r.error||"REDIRECT_FAILED","RedirectError",r);a(o)}}catch(r){const o=h(r instanceof Error?r.message:"Failed to check redirect result","REDIRECT_CHECK_FAILED","RedirectError",r);a(o)}},[i,d,a,h]),{...m}=b,R=new g.RedirectUrls(I,{...m,signInForceRedirectUrl:m.signInForceRedirectUrl||s},p),P=i.constructUrlWithAuthRedirect(R.getAfterSignInUrl()),x=i.constructUrlWithAuthRedirect(R.getAfterSignUpUrl()),A=R.getPreservedSearchParams(),k=w.path||I.signInUrl,L=I.signUpUrl,C=(0,g.buildURL)({base:k,hashSearchParams:[p,A]},{stringify:!0}),T=(0,g.buildURL)({base:L,hashSearchParams:[p,A]},{stringify:!0}),_=(0,n.useMemo)(()=>({handleSignInSuccess:d,handleSignInError:a,redirectAfterSignIn:l,checkRedirectResult:E,signInUrl:C,signUpUrl:T,afterSignUpUrl:x,afterSignInUrl:P,onSuccess:e}),[d,a,l,E,C,T,x,P,e]);return(0,F.jsx)(v.Provider,{value:_,children:t})}0&&(module.exports={SignInProvider,useSignInContext,useTernSecure});
1
+ "use strict";"use client";var p=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var k=(t,r)=>{for(var o in r)p(t,o,{get:r[o],enumerable:!0})},_=(t,r,o,l)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of T(r))!F.call(t,n)&&n!==o&&p(t,n,{get:()=>r[n],enumerable:!(l=b(r,n))||l.enumerable});return t};var D=t=>_(p({},"__esModule",{value:!0}),t);var N={};k(N,{SignInContext:()=>E,SignInProvider:()=>O,useSignInContext:()=>L,useTernSecure:()=>R.useTernSecure});module.exports=D(N);var m=require("react/jsx-runtime"),u=require("@tern-secure/auth"),R=require("@tern-secure/shared/react"),i=require("react");const E=(0,i.createContext)(null),L=()=>{const t=(0,i.useContext)(E),r=(0,R.useTernSecure)(),o=r._internal_getAllOptions(),l=(0,i.useMemo)(()=>typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams,[]);if(t===null)throw new Error("useSignInContext must be used within a SignInProvider. Please wrap your component tree with SignInProvider.");const{...n}=t,d=(0,i.useCallback)((e,s,c="AuthError",g)=>{const I=new Error(e);return I.name=c,I.code=s,I.response=g,I},[]),a=(0,i.useCallback)(e=>{console.error(e)},[]),U=new u.RedirectUrls(o,{...n,signInForceRedirectUrl:n.signInForceRedirectUrl||n.forceRedirectUrl,signInFallbackRedirectUrl:n.signInFallbackRedirectUrl||n.fallbackRedirectUrl},l),f=r.constructUrlWithAuthRedirect(U.getAfterSignInUrl()),x=r.constructUrlWithAuthRedirect(U.getAfterSignUpUrl()),S=()=>r.navigate(f),P=U.getPreservedSearchParams(),C=n.path||o.signInUrl,A=o.signUpUrl,v=(0,u.buildURL)({base:C,hashSearchParams:[l,P]},{stringify:!0}),w=(0,u.buildURL)({base:A,hashSearchParams:[l,P]},{stringify:!0}),h=(0,i.useCallback)(async(e,s)=>{try{if(await r.createActiveSession({session:e}),s?.onPreRedirect)try{await s.onPreRedirect()&&S()}catch(c){const g=d("Pre-redirect validation failed","PRE_REDIRECT_FAILED","PreRedirectError",c);a(g)}else S()}catch(c){const g=d(c instanceof Error?c.message:"Failed to create session","SESSION_CREATION_FAILED","SessionError",c);a(g)}},[r,d,a,S]),y=(0,i.useCallback)(async()=>{try{const e=await r.getRedirectResult();if(e&&e.success)await h(e.user);else if(e&&!e.success){const s=d(e.message||"Redirect sign-in failed",e.error||"REDIRECT_FAILED","RedirectError",e);a(s)}}catch(e){const s=d(e instanceof Error?e.message:"Failed to check redirect result","REDIRECT_CHECK_FAILED","RedirectError",e);a(s)}},[r,h,a,d]);return{...n,afterSignInUrl:f,afterSignUpUrl:x,signInUrl:v,signUpUrl:w,checkRedirectResult:y,onSignInSuccess:h,handleSignInError:a,redirectAfterSignIn:S}};function O({children:t,...r}){const o=r;return(0,m.jsx)(E.Provider,{value:o,children:t})}0&&(module.exports={SignInContext,SignInProvider,useSignInContext,useTernSecure});
2
2
  //# sourceMappingURL=SignInCtx.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ctx/SignInCtx.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AuthErrorTree,\n SignInForceRedirectUrl,\n SignInProps,\n SignUpForceRedirectUrl,\n TernSecureUser,\n} from '@tern-secure/auth';\nimport { buildURL, RedirectUrls } from '@tern-secure/auth';\nimport { useTernSecure } from '@tern-secure/shared/react';\nimport type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useMemo } from 'react';\n\nexport type SignInCtx = SignInProps & SignInForceRedirectUrl & SignUpForceRedirectUrl;\n\ninterface SignInContextType extends Omit<SignInCtx, 'forceRedirectUrl'> {\n handleSignInSuccess: (user?: TernSecureUser | null, options?: { skipRedirect?: boolean }) => void;\n handleSignInError: (error: AuthErrorTree) => void;\n redirectAfterSignIn: () => void;\n signInUrl: string;\n signUpUrl: string;\n afterSignUpUrl: string;\n afterSignInUrl: string;\n checkRedirectResult: () => Promise<void>;\n}\n\nconst SignInContext = createContext<SignInContextType>({\n handleSignInSuccess: () => {},\n handleSignInError: () => {},\n redirectAfterSignIn: () => {},\n checkRedirectResult: async () => {},\n signInUrl: '',\n signUpUrl: '',\n afterSignUpUrl: '',\n afterSignInUrl: '',\n});\n\nexport const useSignInContext = () => useContext(SignInContext);\n\ninterface SignInProviderProps extends Partial<SignInCtx> {\n children: ReactNode;\n}\n\nexport function SignInProvider({\n children,\n onSuccess,\n forceRedirectUrl,\n signInForceRedirectUrl,\n signUpForceRedirectUrl,\n ...ctxProps\n}: SignInProviderProps) {\n const context = useSignInContext();\n const ternSecure = useTernSecure();\n const ternSecureOptions = ternSecure._internal_getAllOptions();\n const currentParams = useMemo(() => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n return new URLSearchParams();\n }, []);\n\n const createAuthError = useCallback(\n (message: string, code: string, name: string = 'AuthError', response?: any): AuthErrorTree => {\n const authError = new Error(message) as AuthErrorTree;\n authError.name = name;\n authError.code = code;\n authError.response = response;\n return authError;\n },\n [],\n );\n\n const redirectAfterSignIn = useCallback(() => {\n ternSecure.redirectAfterSignIn();\n }, [ternSecure]);\n\n const handleSignInSuccess = useCallback(\n (user?: TernSecureUser | null, options?: { skipRedirect?: boolean }) => {\n onSuccess?.(user || null);\n if (!options?.skipRedirect) {\n redirectAfterSignIn();\n }\n },\n [onSuccess, redirectAfterSignIn],\n );\n\n const handleSignInError = useCallback((authError: AuthErrorTree) => {\n console.error(authError);\n }, []);\n\n const checkRedirectResult = useCallback(async (): Promise<void> => {\n try {\n const result = await ternSecure.getRedirectResult();\n if (result && result.success) {\n handleSignInSuccess(result.user);\n } else if (result && !result.success) {\n const authError = createAuthError(\n result.message || 'Redirect sign-in failed',\n result.error || 'REDIRECT_FAILED',\n 'RedirectError',\n result,\n );\n handleSignInError(authError);\n }\n } catch (error) {\n const authError = createAuthError(\n error instanceof Error ? error.message : 'Failed to check redirect result',\n 'REDIRECT_CHECK_FAILED',\n 'RedirectError',\n error,\n );\n handleSignInError(authError);\n }\n }, [ternSecure, handleSignInSuccess, handleSignInError, createAuthError]);\n\n const { ...ctx } = context;\n\n const redirectUrls = new RedirectUrls(\n ternSecureOptions,\n {\n ...ctx,\n signInForceRedirectUrl: ctx.signInForceRedirectUrl || forceRedirectUrl,\n },\n currentParams,\n );\n\n const afterSignInUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignInUrl());\n const afterSignUpUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignUpUrl());\n\n const preservedParams = redirectUrls.getPreservedSearchParams();\n const baseSignInUrl = ctxProps.path || ternSecureOptions.signInUrl;\n const baseSignUpUrl = ternSecureOptions.signUpUrl;\n\n const signInUrl = buildURL(\n {\n base: baseSignInUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const signUpUrl = buildURL(\n {\n base: baseSignUpUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const contextValue: SignInContextType = useMemo(\n () => ({\n handleSignInSuccess,\n handleSignInError,\n redirectAfterSignIn,\n checkRedirectResult,\n signInUrl,\n signUpUrl,\n afterSignUpUrl,\n afterSignInUrl,\n onSuccess,\n }),\n [\n handleSignInSuccess,\n handleSignInError,\n redirectAfterSignIn,\n checkRedirectResult,\n signInUrl,\n signUpUrl,\n afterSignUpUrl,\n afterSignInUrl,\n onSuccess,\n ],\n );\n\n return <SignInContext.Provider value={contextValue}>{children}</SignInContext.Provider>;\n}\n\nexport { useTernSecure };\n"],"mappings":"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","names":["SignInCtx_exports","__export","SignInProvider","useSignInContext","__toCommonJS","import_jsx_runtime","import_auth","import_react","SignInContext","children","onSuccess","forceRedirectUrl","signInForceRedirectUrl","signUpForceRedirectUrl","ctxProps","context","ternSecure","ternSecureOptions","currentParams","createAuthError","message","code","name","response","authError","redirectAfterSignIn","handleSignInSuccess","user","options","handleSignInError","checkRedirectResult","result","error","ctx","redirectUrls","afterSignInUrl","afterSignUpUrl","preservedParams","baseSignInUrl","baseSignUpUrl","signInUrl","signUpUrl","contextValue"]}
1
+ {"version":3,"sources":["../../src/ctx/SignInCtx.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AuthErrorTree,\n SignInFallbackRedirectUrl,\n SignInForceRedirectUrl,\n SignInProps,\n TernSecureUser,\n} from '@tern-secure/auth';\nimport { buildURL, RedirectUrls } from '@tern-secure/auth';\nimport { useTernSecure } from '@tern-secure/shared/react';\nimport type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useMemo } from 'react';\n\nexport type SignInCtx = SignInProps & SignInForceRedirectUrl & SignInFallbackRedirectUrl;\n\nexport type SignInContextType = Omit<SignInCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {\n onSignInSuccess: (\n user: TernSecureUser,\n options?: { onPreRedirect?: () => Promise<boolean> },\n ) => void;\n handleSignInError: (error: AuthErrorTree) => void;\n redirectAfterSignIn: () => any;\n signInUrl: string;\n signUpUrl: string;\n afterSignUpUrl: string;\n afterSignInUrl: string;\n checkRedirectResult: () => Promise<void>;\n};\n\nexport const SignInContext = createContext<SignInCtx | null>(null);\n\nexport const useSignInContext = (): SignInContextType => {\n const context = useContext(SignInContext);\n const ternSecure = useTernSecure();\n const ternSecureOptions = ternSecure._internal_getAllOptions();\n const currentParams = useMemo(() => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n return new URLSearchParams();\n }, []);\n\n if (context === null) {\n throw new Error(\n 'useSignInContext must be used within a SignInProvider. Please wrap your component tree with SignInProvider.',\n );\n }\n\n const { ...ctx } = context;\n\n const createAuthError = useCallback(\n (message: string, code: string, name: string = 'AuthError', response?: any): AuthErrorTree => {\n const authError = new Error(message) as AuthErrorTree;\n authError.name = name;\n authError.code = code;\n authError.response = response;\n return authError;\n },\n [],\n );\n\n const handleSignInError = useCallback((authError: AuthErrorTree) => {\n console.error(authError);\n }, []);\n\n const redirectUrls = new RedirectUrls(\n ternSecureOptions,\n {\n ...ctx,\n signInForceRedirectUrl: ctx.signInForceRedirectUrl || ctx.forceRedirectUrl,\n signInFallbackRedirectUrl: ctx.signInFallbackRedirectUrl || ctx.fallbackRedirectUrl,\n },\n currentParams,\n );\n\n const afterSignInUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignInUrl());\n const afterSignUpUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignUpUrl());\n\n const redirectAfterSignIn = () => ternSecure.navigate(afterSignInUrl);\n\n const preservedParams = redirectUrls.getPreservedSearchParams();\n const baseSignInUrl = ctx.path || ternSecureOptions.signInUrl;\n const baseSignUpUrl = ternSecureOptions.signUpUrl;\n\n const signInUrl = buildURL(\n {\n base: baseSignInUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const signUpUrl = buildURL(\n {\n base: baseSignUpUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n /**\n *\n * This function separates session creation from redirection, allowing consumers\n * to perform custom logic between authentication and redirect.\n *\n * Use cases:\n * 1. Check if user exists in external database (e.g., FreeSWITCH VoIP user table)\n * 2. Validate user permissions or roles\n * 3. Perform additional setup or initialization\n * 4. Custom redirect logic based on user data\n * Example:\n * await onSignInSuccess(user, {\n * onPreRedirect: async () => {\n * // user is accessible here via closure\n * const exists = await checkUser(user.email);\n * return exists;\n * }\n * });\n *\n * @param user - The authenticated TernSecureUser\n * @param options - Configuration options\n * @param options.onPreRedirect - Optional async callback executed before redirect.\n * Return false to prevent redirection, true to proceed.\n * This is where you can perform DB checks, role validation, etc.\n * The user object is accessible via closure.\n * If not provided, automatically redirects after session creation.\n */\n const onSignInSuccess = useCallback(\n async (\n user: TernSecureUser,\n options?: {\n onPreRedirect?: () => Promise<boolean>;\n },\n ) => {\n try {\n await ternSecure.createActiveSession({ session: user });\n\n if (options?.onPreRedirect) {\n try {\n const shouldRedirect = await options.onPreRedirect();\n\n if (shouldRedirect) {\n redirectAfterSignIn();\n }\n // If shouldRedirect is false, consumer handles redirect manually\n } catch (error) {\n const authError = createAuthError(\n 'Pre-redirect validation failed',\n 'PRE_REDIRECT_FAILED',\n 'PreRedirectError',\n error,\n );\n handleSignInError(authError);\n }\n } else {\n redirectAfterSignIn();\n }\n } catch (error) {\n const authError = createAuthError(\n error instanceof Error ? error.message : 'Failed to create session',\n 'SESSION_CREATION_FAILED',\n 'SessionError',\n error,\n );\n handleSignInError(authError);\n }\n },\n [ternSecure, createAuthError, handleSignInError, redirectAfterSignIn],\n );\n\n const checkRedirectResult = useCallback(async (): Promise<void> => {\n try {\n const result = await ternSecure.getRedirectResult();\n if (result && result.success) {\n await onSignInSuccess(result.user);\n } else if (result && !result.success) {\n const authError = createAuthError(\n result.message || 'Redirect sign-in failed',\n result.error || 'REDIRECT_FAILED',\n 'RedirectError',\n result,\n );\n handleSignInError(authError);\n }\n } catch (error) {\n const authError = createAuthError(\n error instanceof Error ? error.message : 'Failed to check redirect result',\n 'REDIRECT_CHECK_FAILED',\n 'RedirectError',\n error,\n );\n handleSignInError(authError);\n }\n }, [ternSecure, onSignInSuccess, handleSignInError, createAuthError]);\n\n return {\n ...(ctx as SignInCtx),\n afterSignInUrl,\n afterSignUpUrl,\n signInUrl,\n signUpUrl,\n checkRedirectResult,\n onSignInSuccess,\n handleSignInError,\n redirectAfterSignIn,\n };\n};\n\ninterface SignInProviderProps extends Partial<SignInCtx> {\n children: ReactNode;\n}\n\nexport function SignInProvider({ children, ...ctxProps }: SignInProviderProps) {\n const contextValue = ctxProps as SignInCtx;\n return <SignInContext.Provider value={contextValue}>{children}</SignInContext.Provider>;\n}\n\nexport { useTernSecure };\n"],"mappings":"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","names":["SignInCtx_exports","__export","SignInContext","SignInProvider","useSignInContext","__toCommonJS","import_jsx_runtime","import_auth","import_react","context","ternSecure","ternSecureOptions","currentParams","ctx","createAuthError","message","code","name","response","authError","handleSignInError","redirectUrls","afterSignInUrl","afterSignUpUrl","redirectAfterSignIn","preservedParams","baseSignInUrl","baseSignUpUrl","signInUrl","signUpUrl","onSignInSuccess","user","options","error","checkRedirectResult","result","children","ctxProps","contextValue"]}
@@ -1,2 +1,2 @@
1
- "use client";import{jsx as N}from"react/jsx-runtime";import{buildURL as E,RedirectUrls as L}from"@tern-secure/auth";import{useTernSecure as m}from"@tern-secure/shared/react";import{createContext as _,useCallback as i,useContext as D,useMemo as P}from"react";const x=_({handleSignInSuccess:()=>{},handleSignInError:()=>{},redirectAfterSignIn:()=>{},checkRedirectResult:async()=>{},signInUrl:"",signUpUrl:"",afterSignUpUrl:"",afterSignInUrl:""}),O=()=>D(x);function q({children:A,onSuccess:o,forceRedirectUrl:C,signInForceRedirectUrl:W,signUpForceRedirectUrl:H,...T}){const v=O(),e=m(),g=e._internal_getAllOptions(),l=P(()=>typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams,[]),d=i((r,n,b="AuthError",k)=>{const a=new Error(r);return a.name=b,a.code=n,a.response=k,a},[]),s=i(()=>{e.redirectAfterSignIn()},[e]),c=i((r,n)=>{o?.(r||null),n?.skipRedirect||s()},[o,s]),t=i(r=>{console.error(r)},[]),S=i(async()=>{try{const r=await e.getRedirectResult();if(r&&r.success)c(r.user);else if(r&&!r.success){const n=d(r.message||"Redirect sign-in failed",r.error||"REDIRECT_FAILED","RedirectError",r);t(n)}}catch(r){const n=d(r instanceof Error?r.message:"Failed to check redirect result","REDIRECT_CHECK_FAILED","RedirectError",r);t(n)}},[e,c,t,d]),{...U}=v,u=new L(g,{...U,signInForceRedirectUrl:U.signInForceRedirectUrl||C},l),I=e.constructUrlWithAuthRedirect(u.getAfterSignInUrl()),p=e.constructUrlWithAuthRedirect(u.getAfterSignUpUrl()),h=u.getPreservedSearchParams(),y=T.path||g.signInUrl,F=g.signUpUrl,R=E({base:y,hashSearchParams:[l,h]},{stringify:!0}),f=E({base:F,hashSearchParams:[l,h]},{stringify:!0}),w=P(()=>({handleSignInSuccess:c,handleSignInError:t,redirectAfterSignIn:s,checkRedirectResult:S,signInUrl:R,signUpUrl:f,afterSignUpUrl:p,afterSignInUrl:I,onSuccess:o}),[c,t,s,S,R,f,p,I,o]);return N(x.Provider,{value:w,children:A})}export{q as SignInProvider,O as useSignInContext,m as useTernSecure};
1
+ "use client";import{jsx as F}from"react/jsx-runtime";import{buildURL as p,RedirectUrls as w}from"@tern-secure/auth";import{useTernSecure as E}from"@tern-secure/shared/react";import{createContext as y,useCallback as u,useContext as b,useMemo as T}from"react";const f=y(null),L=()=>{const l=b(f),e=E(),c=e._internal_getAllOptions(),S=T(()=>typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams,[]);if(l===null)throw new Error("useSignInContext must be used within a SignInProvider. Please wrap your component tree with SignInProvider.");const{...i}=l,s=u((r,n,t="AuthError",a)=>{const g=new Error(r);return g.name=t,g.code=n,g.response=a,g},[]),o=u(r=>{console.error(r)},[]),I=new w(c,{...i,signInForceRedirectUrl:i.signInForceRedirectUrl||i.forceRedirectUrl,signInFallbackRedirectUrl:i.signInFallbackRedirectUrl||i.fallbackRedirectUrl},S),U=e.constructUrlWithAuthRedirect(I.getAfterSignInUrl()),P=e.constructUrlWithAuthRedirect(I.getAfterSignUpUrl()),d=()=>e.navigate(U),h=I.getPreservedSearchParams(),m=i.path||c.signInUrl,x=c.signUpUrl,C=p({base:m,hashSearchParams:[S,h]},{stringify:!0}),A=p({base:x,hashSearchParams:[S,h]},{stringify:!0}),R=u(async(r,n)=>{try{if(await e.createActiveSession({session:r}),n?.onPreRedirect)try{await n.onPreRedirect()&&d()}catch(t){const a=s("Pre-redirect validation failed","PRE_REDIRECT_FAILED","PreRedirectError",t);o(a)}else d()}catch(t){const a=s(t instanceof Error?t.message:"Failed to create session","SESSION_CREATION_FAILED","SessionError",t);o(a)}},[e,s,o,d]),v=u(async()=>{try{const r=await e.getRedirectResult();if(r&&r.success)await R(r.user);else if(r&&!r.success){const n=s(r.message||"Redirect sign-in failed",r.error||"REDIRECT_FAILED","RedirectError",r);o(n)}}catch(r){const n=s(r instanceof Error?r.message:"Failed to check redirect result","REDIRECT_CHECK_FAILED","RedirectError",r);o(n)}},[e,R,o,s]);return{...i,afterSignInUrl:U,afterSignUpUrl:P,signInUrl:C,signUpUrl:A,checkRedirectResult:v,onSignInSuccess:R,handleSignInError:o,redirectAfterSignIn:d}};function O({children:l,...e}){const c=e;return F(f.Provider,{value:c,children:l})}export{f as SignInContext,O as SignInProvider,L as useSignInContext,E as useTernSecure};
2
2
  //# sourceMappingURL=SignInCtx.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ctx/SignInCtx.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AuthErrorTree,\n SignInForceRedirectUrl,\n SignInProps,\n SignUpForceRedirectUrl,\n TernSecureUser,\n} from '@tern-secure/auth';\nimport { buildURL, RedirectUrls } from '@tern-secure/auth';\nimport { useTernSecure } from '@tern-secure/shared/react';\nimport type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useMemo } from 'react';\n\nexport type SignInCtx = SignInProps & SignInForceRedirectUrl & SignUpForceRedirectUrl;\n\ninterface SignInContextType extends Omit<SignInCtx, 'forceRedirectUrl'> {\n handleSignInSuccess: (user?: TernSecureUser | null, options?: { skipRedirect?: boolean }) => void;\n handleSignInError: (error: AuthErrorTree) => void;\n redirectAfterSignIn: () => void;\n signInUrl: string;\n signUpUrl: string;\n afterSignUpUrl: string;\n afterSignInUrl: string;\n checkRedirectResult: () => Promise<void>;\n}\n\nconst SignInContext = createContext<SignInContextType>({\n handleSignInSuccess: () => {},\n handleSignInError: () => {},\n redirectAfterSignIn: () => {},\n checkRedirectResult: async () => {},\n signInUrl: '',\n signUpUrl: '',\n afterSignUpUrl: '',\n afterSignInUrl: '',\n});\n\nexport const useSignInContext = () => useContext(SignInContext);\n\ninterface SignInProviderProps extends Partial<SignInCtx> {\n children: ReactNode;\n}\n\nexport function SignInProvider({\n children,\n onSuccess,\n forceRedirectUrl,\n signInForceRedirectUrl,\n signUpForceRedirectUrl,\n ...ctxProps\n}: SignInProviderProps) {\n const context = useSignInContext();\n const ternSecure = useTernSecure();\n const ternSecureOptions = ternSecure._internal_getAllOptions();\n const currentParams = useMemo(() => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n return new URLSearchParams();\n }, []);\n\n const createAuthError = useCallback(\n (message: string, code: string, name: string = 'AuthError', response?: any): AuthErrorTree => {\n const authError = new Error(message) as AuthErrorTree;\n authError.name = name;\n authError.code = code;\n authError.response = response;\n return authError;\n },\n [],\n );\n\n const redirectAfterSignIn = useCallback(() => {\n ternSecure.redirectAfterSignIn();\n }, [ternSecure]);\n\n const handleSignInSuccess = useCallback(\n (user?: TernSecureUser | null, options?: { skipRedirect?: boolean }) => {\n onSuccess?.(user || null);\n if (!options?.skipRedirect) {\n redirectAfterSignIn();\n }\n },\n [onSuccess, redirectAfterSignIn],\n );\n\n const handleSignInError = useCallback((authError: AuthErrorTree) => {\n console.error(authError);\n }, []);\n\n const checkRedirectResult = useCallback(async (): Promise<void> => {\n try {\n const result = await ternSecure.getRedirectResult();\n if (result && result.success) {\n handleSignInSuccess(result.user);\n } else if (result && !result.success) {\n const authError = createAuthError(\n result.message || 'Redirect sign-in failed',\n result.error || 'REDIRECT_FAILED',\n 'RedirectError',\n result,\n );\n handleSignInError(authError);\n }\n } catch (error) {\n const authError = createAuthError(\n error instanceof Error ? error.message : 'Failed to check redirect result',\n 'REDIRECT_CHECK_FAILED',\n 'RedirectError',\n error,\n );\n handleSignInError(authError);\n }\n }, [ternSecure, handleSignInSuccess, handleSignInError, createAuthError]);\n\n const { ...ctx } = context;\n\n const redirectUrls = new RedirectUrls(\n ternSecureOptions,\n {\n ...ctx,\n signInForceRedirectUrl: ctx.signInForceRedirectUrl || forceRedirectUrl,\n },\n currentParams,\n );\n\n const afterSignInUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignInUrl());\n const afterSignUpUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignUpUrl());\n\n const preservedParams = redirectUrls.getPreservedSearchParams();\n const baseSignInUrl = ctxProps.path || ternSecureOptions.signInUrl;\n const baseSignUpUrl = ternSecureOptions.signUpUrl;\n\n const signInUrl = buildURL(\n {\n base: baseSignInUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const signUpUrl = buildURL(\n {\n base: baseSignUpUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const contextValue: SignInContextType = useMemo(\n () => ({\n handleSignInSuccess,\n handleSignInError,\n redirectAfterSignIn,\n checkRedirectResult,\n signInUrl,\n signUpUrl,\n afterSignUpUrl,\n afterSignInUrl,\n onSuccess,\n }),\n [\n handleSignInSuccess,\n handleSignInError,\n redirectAfterSignIn,\n checkRedirectResult,\n signInUrl,\n signUpUrl,\n afterSignUpUrl,\n afterSignInUrl,\n onSuccess,\n ],\n );\n\n return <SignInContext.Provider value={contextValue}>{children}</SignInContext.Provider>;\n}\n\nexport { useTernSecure };\n"],"mappings":"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","names":["jsx","buildURL","RedirectUrls","useTernSecure","createContext","useCallback","useContext","useMemo","SignInContext","useSignInContext","SignInProvider","children","onSuccess","forceRedirectUrl","signInForceRedirectUrl","signUpForceRedirectUrl","ctxProps","context","ternSecure","ternSecureOptions","currentParams","createAuthError","message","code","name","response","authError","redirectAfterSignIn","handleSignInSuccess","user","options","handleSignInError","checkRedirectResult","result","error","ctx","redirectUrls","afterSignInUrl","afterSignUpUrl","preservedParams","baseSignInUrl","baseSignUpUrl","signInUrl","signUpUrl","contextValue"]}
1
+ {"version":3,"sources":["../../src/ctx/SignInCtx.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AuthErrorTree,\n SignInFallbackRedirectUrl,\n SignInForceRedirectUrl,\n SignInProps,\n TernSecureUser,\n} from '@tern-secure/auth';\nimport { buildURL, RedirectUrls } from '@tern-secure/auth';\nimport { useTernSecure } from '@tern-secure/shared/react';\nimport type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useMemo } from 'react';\n\nexport type SignInCtx = SignInProps & SignInForceRedirectUrl & SignInFallbackRedirectUrl;\n\nexport type SignInContextType = Omit<SignInCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {\n onSignInSuccess: (\n user: TernSecureUser,\n options?: { onPreRedirect?: () => Promise<boolean> },\n ) => void;\n handleSignInError: (error: AuthErrorTree) => void;\n redirectAfterSignIn: () => any;\n signInUrl: string;\n signUpUrl: string;\n afterSignUpUrl: string;\n afterSignInUrl: string;\n checkRedirectResult: () => Promise<void>;\n};\n\nexport const SignInContext = createContext<SignInCtx | null>(null);\n\nexport const useSignInContext = (): SignInContextType => {\n const context = useContext(SignInContext);\n const ternSecure = useTernSecure();\n const ternSecureOptions = ternSecure._internal_getAllOptions();\n const currentParams = useMemo(() => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n return new URLSearchParams();\n }, []);\n\n if (context === null) {\n throw new Error(\n 'useSignInContext must be used within a SignInProvider. Please wrap your component tree with SignInProvider.',\n );\n }\n\n const { ...ctx } = context;\n\n const createAuthError = useCallback(\n (message: string, code: string, name: string = 'AuthError', response?: any): AuthErrorTree => {\n const authError = new Error(message) as AuthErrorTree;\n authError.name = name;\n authError.code = code;\n authError.response = response;\n return authError;\n },\n [],\n );\n\n const handleSignInError = useCallback((authError: AuthErrorTree) => {\n console.error(authError);\n }, []);\n\n const redirectUrls = new RedirectUrls(\n ternSecureOptions,\n {\n ...ctx,\n signInForceRedirectUrl: ctx.signInForceRedirectUrl || ctx.forceRedirectUrl,\n signInFallbackRedirectUrl: ctx.signInFallbackRedirectUrl || ctx.fallbackRedirectUrl,\n },\n currentParams,\n );\n\n const afterSignInUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignInUrl());\n const afterSignUpUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignUpUrl());\n\n const redirectAfterSignIn = () => ternSecure.navigate(afterSignInUrl);\n\n const preservedParams = redirectUrls.getPreservedSearchParams();\n const baseSignInUrl = ctx.path || ternSecureOptions.signInUrl;\n const baseSignUpUrl = ternSecureOptions.signUpUrl;\n\n const signInUrl = buildURL(\n {\n base: baseSignInUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const signUpUrl = buildURL(\n {\n base: baseSignUpUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n /**\n *\n * This function separates session creation from redirection, allowing consumers\n * to perform custom logic between authentication and redirect.\n *\n * Use cases:\n * 1. Check if user exists in external database (e.g., FreeSWITCH VoIP user table)\n * 2. Validate user permissions or roles\n * 3. Perform additional setup or initialization\n * 4. Custom redirect logic based on user data\n * Example:\n * await onSignInSuccess(user, {\n * onPreRedirect: async () => {\n * // user is accessible here via closure\n * const exists = await checkUser(user.email);\n * return exists;\n * }\n * });\n *\n * @param user - The authenticated TernSecureUser\n * @param options - Configuration options\n * @param options.onPreRedirect - Optional async callback executed before redirect.\n * Return false to prevent redirection, true to proceed.\n * This is where you can perform DB checks, role validation, etc.\n * The user object is accessible via closure.\n * If not provided, automatically redirects after session creation.\n */\n const onSignInSuccess = useCallback(\n async (\n user: TernSecureUser,\n options?: {\n onPreRedirect?: () => Promise<boolean>;\n },\n ) => {\n try {\n await ternSecure.createActiveSession({ session: user });\n\n if (options?.onPreRedirect) {\n try {\n const shouldRedirect = await options.onPreRedirect();\n\n if (shouldRedirect) {\n redirectAfterSignIn();\n }\n // If shouldRedirect is false, consumer handles redirect manually\n } catch (error) {\n const authError = createAuthError(\n 'Pre-redirect validation failed',\n 'PRE_REDIRECT_FAILED',\n 'PreRedirectError',\n error,\n );\n handleSignInError(authError);\n }\n } else {\n redirectAfterSignIn();\n }\n } catch (error) {\n const authError = createAuthError(\n error instanceof Error ? error.message : 'Failed to create session',\n 'SESSION_CREATION_FAILED',\n 'SessionError',\n error,\n );\n handleSignInError(authError);\n }\n },\n [ternSecure, createAuthError, handleSignInError, redirectAfterSignIn],\n );\n\n const checkRedirectResult = useCallback(async (): Promise<void> => {\n try {\n const result = await ternSecure.getRedirectResult();\n if (result && result.success) {\n await onSignInSuccess(result.user);\n } else if (result && !result.success) {\n const authError = createAuthError(\n result.message || 'Redirect sign-in failed',\n result.error || 'REDIRECT_FAILED',\n 'RedirectError',\n result,\n );\n handleSignInError(authError);\n }\n } catch (error) {\n const authError = createAuthError(\n error instanceof Error ? error.message : 'Failed to check redirect result',\n 'REDIRECT_CHECK_FAILED',\n 'RedirectError',\n error,\n );\n handleSignInError(authError);\n }\n }, [ternSecure, onSignInSuccess, handleSignInError, createAuthError]);\n\n return {\n ...(ctx as SignInCtx),\n afterSignInUrl,\n afterSignUpUrl,\n signInUrl,\n signUpUrl,\n checkRedirectResult,\n onSignInSuccess,\n handleSignInError,\n redirectAfterSignIn,\n };\n};\n\ninterface SignInProviderProps extends Partial<SignInCtx> {\n children: ReactNode;\n}\n\nexport function SignInProvider({ children, ...ctxProps }: SignInProviderProps) {\n const contextValue = ctxProps as SignInCtx;\n return <SignInContext.Provider value={contextValue}>{children}</SignInContext.Provider>;\n}\n\nexport { useTernSecure };\n"],"mappings":"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","names":["jsx","buildURL","RedirectUrls","useTernSecure","createContext","useCallback","useContext","useMemo","SignInContext","useSignInContext","context","ternSecure","ternSecureOptions","currentParams","ctx","createAuthError","message","code","name","response","authError","handleSignInError","redirectUrls","afterSignInUrl","afterSignUpUrl","redirectAfterSignIn","preservedParams","baseSignInUrl","baseSignUpUrl","signInUrl","signUpUrl","onSignInSuccess","user","options","error","checkRedirectResult","result","SignInProvider","children","ctxProps","contextValue"]}
@@ -0,0 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { ReactNode } from 'react';
4
+ import { SignUpProps, SignUpForceRedirectUrl, SignUpFallbackRedirectUrl, AuthErrorTree } from '@tern-secure/auth';
5
+
6
+ type SignUpCtx = SignUpProps & SignUpForceRedirectUrl & SignUpFallbackRedirectUrl;
7
+ type SignUpContextType = Omit<SignUpCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {
8
+ handleSignUpError: (error: AuthErrorTree) => void;
9
+ redirectAfterSignUp: () => any;
10
+ signInUrl: string;
11
+ signUpUrl: string;
12
+ afterSignUpUrl: string;
13
+ afterSignInUrl: string;
14
+ };
15
+ declare const SignInContext: react.Context<SignUpCtx | null>;
16
+ declare const useSignUpContext: () => SignUpContextType;
17
+ interface SignUpProviderProps extends Partial<SignUpCtx> {
18
+ children: ReactNode;
19
+ }
20
+ declare function SignUpProvider({ children, ...ctxProps }: SignUpProviderProps): react_jsx_runtime.JSX.Element;
21
+
22
+ export { SignInContext, type SignUpContextType, type SignUpCtx, SignUpProvider, useSignUpContext };
@@ -0,0 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { ReactNode } from 'react';
4
+ import { SignUpProps, SignUpForceRedirectUrl, SignUpFallbackRedirectUrl, AuthErrorTree } from '@tern-secure/auth';
5
+
6
+ type SignUpCtx = SignUpProps & SignUpForceRedirectUrl & SignUpFallbackRedirectUrl;
7
+ type SignUpContextType = Omit<SignUpCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {
8
+ handleSignUpError: (error: AuthErrorTree) => void;
9
+ redirectAfterSignUp: () => any;
10
+ signInUrl: string;
11
+ signUpUrl: string;
12
+ afterSignUpUrl: string;
13
+ afterSignInUrl: string;
14
+ };
15
+ declare const SignInContext: react.Context<SignUpCtx | null>;
16
+ declare const useSignUpContext: () => SignUpContextType;
17
+ interface SignUpProviderProps extends Partial<SignUpCtx> {
18
+ children: ReactNode;
19
+ }
20
+ declare function SignUpProvider({ children, ...ctxProps }: SignUpProviderProps): react_jsx_runtime.JSX.Element;
21
+
22
+ export { SignInContext, type SignUpContextType, type SignUpCtx, SignUpProvider, useSignUpContext };
@@ -0,0 +1,2 @@
1
+ "use strict";"use client";var l=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var I=(e,r)=>{for(var n in r)l(e,n,{get:r[n],enumerable:!0})},F=(e,r,n,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of y(r))!E.call(e,t)&&t!==n&&l(e,t,{get:()=>r[t],enumerable:!(o=v(r,t))||o.enumerable});return e};var T=e=>F(l({},"__esModule",{value:!0}),e);var O={};I(O,{SignInContext:()=>p,SignUpProvider:()=>L,useSignUpContext:()=>k});module.exports=T(O);var d=require("react/jsx-runtime"),c=require("@tern-secure/auth"),S=require("@tern-secure/shared/react"),i=require("react");const p=(0,i.createContext)(null),k=()=>{const e=(0,i.useContext)(p),r=(0,S.useTernSecure)(),n=r._internal_getAllOptions(),o=(0,i.useMemo)(()=>typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams,[]);if(e===null)throw new Error("useSignUpContext must be used within a SignUpProvider. Please wrap your component tree with SignUpProvider.");const{...t}=e,N=(0,i.useCallback)((U,C,b="AuthError",w)=>{const s=new Error(U);return s.name=b,s.code=C,s.response=w,s},[]),h=(0,i.useCallback)(U=>{console.error(U)},[]),a=new c.RedirectUrls(n,{...t,signUpForceRedirectUrl:t.signUpForceRedirectUrl||t.forceRedirectUrl,signUpFallbackRedirectUrl:t.signUpFallbackRedirectUrl||t.fallbackRedirectUrl},o),g=r.constructUrlWithAuthRedirect(a.getAfterSignUpUrl()),f=r.constructUrlWithAuthRedirect(a.getAfterSignInUrl()),m=()=>r.navigate(g),u=a.getPreservedSearchParams(),x=n.signUpUrl,P=n.signInUrl,R=(0,c.buildURL)({base:P,hashSearchParams:[o,u]},{stringify:!0}),A=(0,c.buildURL)({base:x,hashSearchParams:[o,u]},{stringify:!0});return{...t,afterSignInUrl:f,afterSignUpUrl:g,signInUrl:R,signUpUrl:A,handleSignUpError:h,redirectAfterSignUp:m}};function L({children:e,...r}){const n=r;return(0,d.jsx)(p.Provider,{value:n,children:e})}0&&(module.exports={SignInContext,SignUpProvider,useSignUpContext});
2
+ //# sourceMappingURL=SignUpCtx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ctx/SignUpCtx.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AuthErrorTree,\n SignUpFallbackRedirectUrl,\n SignUpForceRedirectUrl,\n SignUpProps,\n} from '@tern-secure/auth';\nimport { buildURL, RedirectUrls } from '@tern-secure/auth';\nimport { useTernSecure } from '@tern-secure/shared/react';\nimport type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useMemo } from 'react';\n\nexport type SignUpCtx = SignUpProps & SignUpForceRedirectUrl & SignUpFallbackRedirectUrl;\n\nexport type SignUpContextType = Omit<SignUpCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {\n handleSignUpError: (error: AuthErrorTree) => void;\n redirectAfterSignUp: () => any;\n signInUrl: string;\n signUpUrl: string;\n afterSignUpUrl: string;\n afterSignInUrl: string;\n};\n\nexport const SignInContext = createContext<SignUpCtx | null>(null);\n\nexport const useSignUpContext = (): SignUpContextType => {\n const context = useContext(SignInContext);\n const ternSecure = useTernSecure();\n const ternSecureOptions = ternSecure._internal_getAllOptions();\n const currentParams = useMemo(() => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n return new URLSearchParams();\n }, []);\n\n if (context === null) {\n throw new Error(\n 'useSignUpContext must be used within a SignUpProvider. Please wrap your component tree with SignUpProvider.',\n );\n }\n\n const { ...ctx } = context;\n\n const createAuthError = useCallback(\n (message: string, code: string, name: string = 'AuthError', response?: any): AuthErrorTree => {\n const authError = new Error(message) as AuthErrorTree;\n authError.name = name;\n authError.code = code;\n authError.response = response;\n return authError;\n },\n [],\n );\n\n const handleSignUpError = useCallback((authError: AuthErrorTree) => {\n console.error(authError);\n }, []);\n\n const redirectUrls = new RedirectUrls(\n ternSecureOptions,\n {\n ...ctx,\n signUpForceRedirectUrl: ctx.signUpForceRedirectUrl || ctx.forceRedirectUrl,\n signUpFallbackRedirectUrl: ctx.signUpFallbackRedirectUrl || ctx.fallbackRedirectUrl,\n },\n currentParams,\n );\n\n const afterSignUpUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignUpUrl());\n const afterSignInUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignInUrl());\n\n const redirectAfterSignUp = () => ternSecure.navigate(afterSignUpUrl);\n\n const preservedParams = redirectUrls.getPreservedSearchParams();\n const baseSignUpUrl = ternSecureOptions.signUpUrl;\n const baseSignInUrl = ternSecureOptions.signInUrl;\n\n const signInUrl = buildURL(\n {\n base: baseSignInUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const signUpUrl = buildURL(\n {\n base: baseSignUpUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n return {\n ...ctx,\n afterSignInUrl,\n afterSignUpUrl,\n signInUrl,\n signUpUrl,\n handleSignUpError,\n redirectAfterSignUp,\n };\n};\n\ninterface SignUpProviderProps extends Partial<SignUpCtx> {\n children: ReactNode;\n}\n\nexport function SignUpProvider({ children, ...ctxProps }: SignUpProviderProps) {\n const contextValue = ctxProps as SignUpCtx;\n return <SignInContext.Provider value={contextValue}>{children}</SignInContext.Provider>;\n}\n"],"mappings":"sbAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,mBAAAC,EAAA,qBAAAC,IAAA,eAAAC,EAAAL,GAgHS,IAAAM,EAAA,6BAxGTC,EAAuC,6BACvCC,EAA8B,qCAE9BA,EAAgE,iBAazD,MAAMN,KAAgB,iBAAgC,IAAI,EAEpDE,EAAmB,IAAyB,CACvD,MAAMK,KAAU,cAAWP,CAAa,EAClCQ,KAAa,iBAAc,EAC3BC,EAAoBD,EAAW,wBAAwB,EACvDE,KAAgB,WAAQ,IACxB,OAAO,OAAW,IACb,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAE5C,IAAI,gBACV,CAAC,CAAC,EAEL,GAAIH,IAAY,KACd,MAAM,IAAI,MACR,6GACF,EAGF,KAAM,CAAE,GAAGI,CAAI,EAAIJ,EAEbK,KAAkB,eACtB,CAACC,EAAiBC,EAAcC,EAAe,YAAaC,IAAkC,CAC5F,MAAMC,EAAY,IAAI,MAAMJ,CAAO,EACnC,OAAAI,EAAU,KAAOF,EACjBE,EAAU,KAAOH,EACjBG,EAAU,SAAWD,EACdC,CACT,EACA,CAAC,CACH,EAEMC,KAAoB,eAAaD,GAA6B,CAClE,QAAQ,MAAMA,CAAS,CACzB,EAAG,CAAC,CAAC,EAECE,EAAe,IAAI,eACvBV,EACA,CACE,GAAGE,EACH,uBAAwBA,EAAI,wBAA0BA,EAAI,iBAC1D,0BAA2BA,EAAI,2BAA6BA,EAAI,mBAClE,EACAD,CACF,EAEMU,EAAiBZ,EAAW,6BAA6BW,EAAa,kBAAkB,CAAC,EACzFE,EAAiBb,EAAW,6BAA6BW,EAAa,kBAAkB,CAAC,EAEzFG,EAAsB,IAAMd,EAAW,SAASY,CAAc,EAE9DG,EAAkBJ,EAAa,yBAAyB,EACxDK,EAAgBf,EAAkB,UAClCgB,EAAgBhB,EAAkB,UAElCiB,KAAY,YAChB,CACE,KAAMD,EACN,iBAAkB,CAACf,EAAea,CAAe,CACnD,EACA,CAAE,UAAW,EAAK,CACpB,EAEMI,KAAY,YAChB,CACE,KAAMH,EACN,iBAAkB,CAACd,EAAea,CAAe,CACnD,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MAAO,CACL,GAAGZ,EACH,eAAAU,EACA,eAAAD,EACA,UAAAM,EACA,UAAAC,EACA,kBAAAT,EACA,oBAAAI,CACF,CACF,EAMO,SAASrB,EAAe,CAAE,SAAA2B,EAAU,GAAGC,CAAS,EAAwB,CAC7E,MAAMC,EAAeD,EACrB,SAAO,OAAC7B,EAAc,SAAd,CAAuB,MAAO8B,EAAe,SAAAF,EAAS,CAChE","names":["SignUpCtx_exports","__export","SignInContext","SignUpProvider","useSignUpContext","__toCommonJS","import_jsx_runtime","import_auth","import_react","context","ternSecure","ternSecureOptions","currentParams","ctx","createAuthError","message","code","name","response","authError","handleSignUpError","redirectUrls","afterSignUpUrl","afterSignInUrl","redirectAfterSignUp","preservedParams","baseSignUpUrl","baseSignInUrl","signInUrl","signUpUrl","children","ctxProps","contextValue"]}
@@ -0,0 +1,2 @@
1
+ "use client";import{jsx as E}from"react/jsx-runtime";import{buildURL as l,RedirectUrls as C}from"@tern-secure/auth";import{useTernSecure as b}from"@tern-secure/shared/react";import{createContext as w,useCallback as p,useContext as v,useMemo as y}from"react";const g=w(null),L=()=>{const n=v(g),r=b(),t=r._internal_getAllOptions(),o=y(()=>typeof window<"u"?new URLSearchParams(window.location.search):new URLSearchParams,[]);if(n===null)throw new Error("useSignUpContext must be used within a SignUpProvider. Please wrap your component tree with SignUpProvider.");const{...e}=n,I=p((s,P,R="AuthError",A)=>{const i=new Error(s);return i.name=R,i.code=P,i.response=A,i},[]),u=p(s=>{console.error(s)},[]),c=new C(t,{...e,signUpForceRedirectUrl:e.signUpForceRedirectUrl||e.forceRedirectUrl,signUpFallbackRedirectUrl:e.signUpFallbackRedirectUrl||e.fallbackRedirectUrl},o),a=r.constructUrlWithAuthRedirect(c.getAfterSignUpUrl()),S=r.constructUrlWithAuthRedirect(c.getAfterSignInUrl()),d=()=>r.navigate(a),U=c.getPreservedSearchParams(),h=t.signUpUrl,f=t.signInUrl,m=l({base:f,hashSearchParams:[o,U]},{stringify:!0}),x=l({base:h,hashSearchParams:[o,U]},{stringify:!0});return{...e,afterSignInUrl:S,afterSignUpUrl:a,signInUrl:m,signUpUrl:x,handleSignUpError:u,redirectAfterSignUp:d}};function O({children:n,...r}){const t=r;return E(g.Provider,{value:t,children:n})}export{g as SignInContext,O as SignUpProvider,L as useSignUpContext};
2
+ //# sourceMappingURL=SignUpCtx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ctx/SignUpCtx.tsx"],"sourcesContent":["'use client';\n\nimport type {\n AuthErrorTree,\n SignUpFallbackRedirectUrl,\n SignUpForceRedirectUrl,\n SignUpProps,\n} from '@tern-secure/auth';\nimport { buildURL, RedirectUrls } from '@tern-secure/auth';\nimport { useTernSecure } from '@tern-secure/shared/react';\nimport type { ReactNode } from 'react';\nimport { createContext, useCallback, useContext, useMemo } from 'react';\n\nexport type SignUpCtx = SignUpProps & SignUpForceRedirectUrl & SignUpFallbackRedirectUrl;\n\nexport type SignUpContextType = Omit<SignUpCtx, 'fallbackRedirectUrl' | 'forceRedirectUrl'> & {\n handleSignUpError: (error: AuthErrorTree) => void;\n redirectAfterSignUp: () => any;\n signInUrl: string;\n signUpUrl: string;\n afterSignUpUrl: string;\n afterSignInUrl: string;\n};\n\nexport const SignInContext = createContext<SignUpCtx | null>(null);\n\nexport const useSignUpContext = (): SignUpContextType => {\n const context = useContext(SignInContext);\n const ternSecure = useTernSecure();\n const ternSecureOptions = ternSecure._internal_getAllOptions();\n const currentParams = useMemo(() => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n return new URLSearchParams();\n }, []);\n\n if (context === null) {\n throw new Error(\n 'useSignUpContext must be used within a SignUpProvider. Please wrap your component tree with SignUpProvider.',\n );\n }\n\n const { ...ctx } = context;\n\n const createAuthError = useCallback(\n (message: string, code: string, name: string = 'AuthError', response?: any): AuthErrorTree => {\n const authError = new Error(message) as AuthErrorTree;\n authError.name = name;\n authError.code = code;\n authError.response = response;\n return authError;\n },\n [],\n );\n\n const handleSignUpError = useCallback((authError: AuthErrorTree) => {\n console.error(authError);\n }, []);\n\n const redirectUrls = new RedirectUrls(\n ternSecureOptions,\n {\n ...ctx,\n signUpForceRedirectUrl: ctx.signUpForceRedirectUrl || ctx.forceRedirectUrl,\n signUpFallbackRedirectUrl: ctx.signUpFallbackRedirectUrl || ctx.fallbackRedirectUrl,\n },\n currentParams,\n );\n\n const afterSignUpUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignUpUrl());\n const afterSignInUrl = ternSecure.constructUrlWithAuthRedirect(redirectUrls.getAfterSignInUrl());\n\n const redirectAfterSignUp = () => ternSecure.navigate(afterSignUpUrl);\n\n const preservedParams = redirectUrls.getPreservedSearchParams();\n const baseSignUpUrl = ternSecureOptions.signUpUrl;\n const baseSignInUrl = ternSecureOptions.signInUrl;\n\n const signInUrl = buildURL(\n {\n base: baseSignInUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n const signUpUrl = buildURL(\n {\n base: baseSignUpUrl,\n hashSearchParams: [currentParams, preservedParams],\n },\n { stringify: true },\n );\n\n return {\n ...ctx,\n afterSignInUrl,\n afterSignUpUrl,\n signInUrl,\n signUpUrl,\n handleSignUpError,\n redirectAfterSignUp,\n };\n};\n\ninterface SignUpProviderProps extends Partial<SignUpCtx> {\n children: ReactNode;\n}\n\nexport function SignUpProvider({ children, ...ctxProps }: SignUpProviderProps) {\n const contextValue = ctxProps as SignUpCtx;\n return <SignInContext.Provider value={contextValue}>{children}</SignInContext.Provider>;\n}\n"],"mappings":"aAgHS,cAAAA,MAAA,oBAxGT,OAAS,YAAAC,EAAU,gBAAAC,MAAoB,oBACvC,OAAS,iBAAAC,MAAqB,4BAE9B,OAAS,iBAAAC,EAAe,eAAAC,EAAa,cAAAC,EAAY,WAAAC,MAAe,QAazD,MAAMC,EAAgBJ,EAAgC,IAAI,EAEpDK,EAAmB,IAAyB,CACvD,MAAMC,EAAUJ,EAAWE,CAAa,EAClCG,EAAaR,EAAc,EAC3BS,EAAoBD,EAAW,wBAAwB,EACvDE,EAAgBN,EAAQ,IACxB,OAAO,OAAW,IACb,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAE5C,IAAI,gBACV,CAAC,CAAC,EAEL,GAAIG,IAAY,KACd,MAAM,IAAI,MACR,6GACF,EAGF,KAAM,CAAE,GAAGI,CAAI,EAAIJ,EAEbK,EAAkBV,EACtB,CAACW,EAAiBC,EAAcC,EAAe,YAAaC,IAAkC,CAC5F,MAAMC,EAAY,IAAI,MAAMJ,CAAO,EACnC,OAAAI,EAAU,KAAOF,EACjBE,EAAU,KAAOH,EACjBG,EAAU,SAAWD,EACdC,CACT,EACA,CAAC,CACH,EAEMC,EAAoBhB,EAAae,GAA6B,CAClE,QAAQ,MAAMA,CAAS,CACzB,EAAG,CAAC,CAAC,EAECE,EAAe,IAAIpB,EACvBU,EACA,CACE,GAAGE,EACH,uBAAwBA,EAAI,wBAA0BA,EAAI,iBAC1D,0BAA2BA,EAAI,2BAA6BA,EAAI,mBAClE,EACAD,CACF,EAEMU,EAAiBZ,EAAW,6BAA6BW,EAAa,kBAAkB,CAAC,EACzFE,EAAiBb,EAAW,6BAA6BW,EAAa,kBAAkB,CAAC,EAEzFG,EAAsB,IAAMd,EAAW,SAASY,CAAc,EAE9DG,EAAkBJ,EAAa,yBAAyB,EACxDK,EAAgBf,EAAkB,UAClCgB,EAAgBhB,EAAkB,UAElCiB,EAAY5B,EAChB,CACE,KAAM2B,EACN,iBAAkB,CAACf,EAAea,CAAe,CACnD,EACA,CAAE,UAAW,EAAK,CACpB,EAEMI,EAAY7B,EAChB,CACE,KAAM0B,EACN,iBAAkB,CAACd,EAAea,CAAe,CACnD,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,MAAO,CACL,GAAGZ,EACH,eAAAU,EACA,eAAAD,EACA,UAAAM,EACA,UAAAC,EACA,kBAAAT,EACA,oBAAAI,CACF,CACF,EAMO,SAASM,EAAe,CAAE,SAAAC,EAAU,GAAGC,CAAS,EAAwB,CAC7E,MAAMC,EAAeD,EACrB,OAAOjC,EAACQ,EAAc,SAAd,CAAuB,MAAO0B,EAAe,SAAAF,EAAS,CAChE","names":["jsx","buildURL","RedirectUrls","useTernSecure","createContext","useCallback","useContext","useMemo","SignInContext","useSignUpContext","context","ternSecure","ternSecureOptions","currentParams","ctx","createAuthError","message","code","name","response","authError","handleSignUpError","redirectUrls","afterSignUpUrl","afterSignInUrl","redirectAfterSignUp","preservedParams","baseSignUpUrl","baseSignInUrl","signInUrl","signUpUrl","SignUpProvider","children","ctxProps","contextValue"]}
@@ -1,10 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { TernSecureStateExtended, TernSecureResources } from '@tern-secure/types';
3
- import React__default from 'react';
3
+ import react__default from 'react';
4
4
  import { IsoTernSecureAuthOptions } from '../types.mjs';
5
5
 
6
6
  type TernSecureCtxProviderProps = {
7
- children: React__default.ReactNode;
7
+ children: react__default.ReactNode;
8
8
  instanceOptions: IsoTernSecureAuthOptions;
9
9
  initialState: TernSecureStateExtended | undefined;
10
10
  };
@@ -1,10 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { TernSecureStateExtended, TernSecureResources } from '@tern-secure/types';
3
- import React__default from 'react';
3
+ import react__default from 'react';
4
4
  import { IsoTernSecureAuthOptions } from '../types.js';
5
5
 
6
6
  type TernSecureCtxProviderProps = {
7
- children: React__default.ReactNode;
7
+ children: react__default.ReactNode;
8
8
  instanceOptions: IsoTernSecureAuthOptions;
9
9
  initialState: TernSecureStateExtended | undefined;
10
10
  };
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React__default from 'react';
2
+ import react__default from 'react';
3
3
  import { TernSecureProviderProps } from '../types.mjs';
4
4
  import '@tern-secure/types';
5
5
 
6
6
  declare function TernSecureProviderBase(props: TernSecureProviderProps): react_jsx_runtime.JSX.Element;
7
- declare const TernSecureProvider: React__default.MemoExoticComponent<typeof TernSecureProviderBase>;
7
+ declare const TernSecureProvider: react__default.MemoExoticComponent<typeof TernSecureProviderBase>;
8
8
 
9
9
  export { TernSecureProvider };
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React__default from 'react';
2
+ import react__default from 'react';
3
3
  import { TernSecureProviderProps } from '../types.js';
4
4
  import '@tern-secure/types';
5
5
 
6
6
  declare function TernSecureProviderBase(props: TernSecureProviderProps): react_jsx_runtime.JSX.Element;
7
- declare const TernSecureProvider: React__default.MemoExoticComponent<typeof TernSecureProviderBase>;
7
+ declare const TernSecureProvider: react__default.MemoExoticComponent<typeof TernSecureProviderBase>;
8
8
 
9
9
  export { TernSecureProvider };
@@ -0,0 +1,5 @@
1
+ import { UseSignUpReturn } from '@tern-secure/types';
2
+
3
+ declare const useSignUp: () => UseSignUpReturn;
4
+
5
+ export { useSignUp };
@@ -0,0 +1,5 @@
1
+ import { UseSignUpReturn } from '@tern-secure/types';
2
+
3
+ declare const useSignUp: () => UseSignUpReturn;
4
+
5
+ export { useSignUp };
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(e,r)=>{for(var n in r)s(e,n,{get:r[n],enumerable:!0})},f=(e,r,n,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of U(r))!d.call(e,t)&&t!==n&&s(e,t,{get:()=>r[t],enumerable:!(i=o(r,t))||i.enumerable});return e};var m=e=>f(s({},"__esModule",{value:!0}),e);var a={};g(a,{useSignUp:()=>S});module.exports=m(a);var p=require("../ctx/TernSecureAuthResourcesCtx"),u=require("./useAssertWrappedTernSecureProvider");const S=()=>{(0,u.useAssertWrappedByTernSecureAuthProvider)("useSignUp");const e=(0,p.useAuthSignUpCtx)();return e?{isLoaded:!0,signUp:e}:{isLoaded:!1,signUp:void 0}};0&&(module.exports={useSignUp});
2
+ //# sourceMappingURL=useSignUp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useSignUp.ts"],"sourcesContent":["import type { UseSignUpReturn } from '@tern-secure/types';\n\nimport { useAuthSignUpCtx } from '../ctx/TernSecureAuthResourcesCtx';\nimport { useAssertWrappedByTernSecureAuthProvider } from './useAssertWrappedTernSecureProvider';\n\nexport const useSignUp = (): UseSignUpReturn => {\n useAssertWrappedByTernSecureAuthProvider('useSignUp');\n const auth = useAuthSignUpCtx();\n\n if (!auth) {\n return {\n isLoaded: false,\n signUp: undefined,\n };\n }\n\n return {\n isLoaded: true,\n signUp: auth,\n };\n};\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GAEA,IAAAI,EAAiC,6CACjCC,EAAyD,gDAElD,MAAMH,EAAY,IAAuB,IAC9C,4CAAyC,WAAW,EACpD,MAAMI,KAAO,oBAAiB,EAE9B,OAAKA,EAOE,CACL,SAAU,GACV,OAAQA,CACV,EATS,CACL,SAAU,GACV,OAAQ,MACV,CAOJ","names":["useSignUp_exports","__export","useSignUp","__toCommonJS","import_TernSecureAuthResourcesCtx","import_useAssertWrappedTernSecureProvider","auth"]}
@@ -0,0 +1,2 @@
1
+ import{useAuthSignUpCtx as r}from"../ctx/TernSecureAuthResourcesCtx";import{useAssertWrappedByTernSecureAuthProvider as t}from"./useAssertWrappedTernSecureProvider";const i=()=>{t("useSignUp");const e=r();return e?{isLoaded:!0,signUp:e}:{isLoaded:!1,signUp:void 0}};export{i as useSignUp};
2
+ //# sourceMappingURL=useSignUp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useSignUp.ts"],"sourcesContent":["import type { UseSignUpReturn } from '@tern-secure/types';\n\nimport { useAuthSignUpCtx } from '../ctx/TernSecureAuthResourcesCtx';\nimport { useAssertWrappedByTernSecureAuthProvider } from './useAssertWrappedTernSecureProvider';\n\nexport const useSignUp = (): UseSignUpReturn => {\n useAssertWrappedByTernSecureAuthProvider('useSignUp');\n const auth = useAuthSignUpCtx();\n\n if (!auth) {\n return {\n isLoaded: false,\n signUp: undefined,\n };\n }\n\n return {\n isLoaded: true,\n signUp: auth,\n };\n};\n"],"mappings":"AAEA,OAAS,oBAAAA,MAAwB,oCACjC,OAAS,4CAAAC,MAAgD,uCAElD,MAAMC,EAAY,IAAuB,CAC9CD,EAAyC,WAAW,EACpD,MAAME,EAAOH,EAAiB,EAE9B,OAAKG,EAOE,CACL,SAAU,GACV,OAAQA,CACV,EATS,CACL,SAAU,GACV,OAAQ,MACV,CAOJ","names":["useAuthSignUpCtx","useAssertWrappedByTernSecureAuthProvider","useSignUp","auth"]}
package/dist/index.d.mts CHANGED
@@ -2,9 +2,11 @@ export { useAuth, useDeriveAuth } from './hooks/useAuth.mjs';
2
2
  export { useIdToken } from './hooks/useIdToken.mjs';
3
3
  export { useSession } from './hooks/useSession.mjs';
4
4
  export { signIn, useSignIn } from './hooks/useSignIn.mjs';
5
+ export { useSignUp } from './hooks/useSignUp.mjs';
5
6
  export { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider.mjs';
6
7
  export { TernSecureProvider } from './ctx/TernSecureProvider.mjs';
7
8
  export { SignInProvider, useSignInContext } from './ctx/SignInCtx.mjs';
9
+ export { SignUpProvider, useSignUpContext } from './ctx/SignUpCtx.mjs';
8
10
  export { handleInternalRoute, isAuthRoute, isBaseAuthRoute, isInternalRoute } from './route-handler/internal-route.mjs';
9
11
  export { cn } from './lib/utils.mjs';
10
12
  export { Browser, IsoTernSecureAuthOptions, IsomorphicTernSecureOptions, TernSecureProviderProps } from './types.mjs';
package/dist/index.d.ts CHANGED
@@ -2,9 +2,11 @@ export { useAuth, useDeriveAuth } from './hooks/useAuth.js';
2
2
  export { useIdToken } from './hooks/useIdToken.js';
3
3
  export { useSession } from './hooks/useSession.js';
4
4
  export { signIn, useSignIn } from './hooks/useSignIn.js';
5
+ export { useSignUp } from './hooks/useSignUp.js';
5
6
  export { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider.js';
6
7
  export { TernSecureProvider } from './ctx/TernSecureProvider.js';
7
8
  export { SignInProvider, useSignInContext } from './ctx/SignInCtx.js';
9
+ export { SignUpProvider, useSignUpContext } from './ctx/SignUpCtx.js';
8
10
  export { handleInternalRoute, isAuthRoute, isBaseAuthRoute, isInternalRoute } from './route-handler/internal-route.js';
9
11
  export { cn } from './lib/utils.js';
10
12
  export { Browser, IsoTernSecureAuthOptions, IsomorphicTernSecureOptions, TernSecureProviderProps } from './types.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var v=(o,e)=>{for(var u in e)p(o,u,{get:e[u],enumerable:!0})},A=(o,e,u,x)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of T(e))!d.call(o,n)&&n!==u&&p(o,n,{get:()=>e[n],enumerable:!(x=h(e,n))||x.enumerable});return o};var P=o=>A(p({},"__esModule",{value:!0}),o);var a={};v(a,{SignInProvider:()=>t.SignInProvider,TernSecureCtxProvider:()=>S.TernSecureCtxProvider,TernSecureProvider:()=>I.TernSecureProvider,cn:()=>c.cn,handleInternalRoute:()=>r.handleInternalRoute,isAuthRoute:()=>r.isAuthRoute,isBaseAuthRoute:()=>r.isBaseAuthRoute,isInternalRoute:()=>r.isInternalRoute,signIn:()=>i.signIn,useAuth:()=>s.useAuth,useDeriveAuth:()=>s.useDeriveAuth,useIdToken:()=>m.useIdToken,useSession:()=>f.useSession,useSignIn:()=>i.useSignIn,useSignInContext:()=>t.useSignInContext,useTernSecure:()=>t.useTernSecure});module.exports=P(a);var s=require("./hooks/useAuth"),m=require("./hooks/useIdToken"),f=require("./hooks/useSession"),i=require("./hooks/useSignIn"),S=require("./ctx/TernSecureCtxProvider"),I=require("./ctx/TernSecureProvider"),t=require("./ctx/SignInCtx"),r=require("./route-handler/internal-route"),c=require("./lib/utils");0&&(module.exports={SignInProvider,TernSecureCtxProvider,TernSecureProvider,cn,handleInternalRoute,isAuthRoute,isBaseAuthRoute,isInternalRoute,signIn,useAuth,useDeriveAuth,useIdToken,useSession,useSignIn,useSignInContext,useTernSecure});
1
+ "use strict";var x=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var P=(o,e)=>{for(var u in e)x(o,u,{get:e[u],enumerable:!0})},A=(o,e,u,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of T(e))!v.call(o,n)&&n!==u&&x(o,n,{get:()=>e[n],enumerable:!(m=h(e,n))||m.enumerable});return o};var a=o=>A(x({},"__esModule",{value:!0}),o);var R={};P(R,{SignInProvider:()=>t.SignInProvider,SignUpProvider:()=>i.SignUpProvider,TernSecureCtxProvider:()=>c.TernSecureCtxProvider,TernSecureProvider:()=>d.TernSecureProvider,cn:()=>g.cn,handleInternalRoute:()=>r.handleInternalRoute,isAuthRoute:()=>r.isAuthRoute,isBaseAuthRoute:()=>r.isBaseAuthRoute,isInternalRoute:()=>r.isInternalRoute,signIn:()=>p.signIn,useAuth:()=>s.useAuth,useDeriveAuth:()=>s.useDeriveAuth,useIdToken:()=>S.useIdToken,useSession:()=>f.useSession,useSignIn:()=>p.useSignIn,useSignInContext:()=>t.useSignInContext,useSignUp:()=>I.useSignUp,useSignUpContext:()=>i.useSignUpContext,useTernSecure:()=>t.useTernSecure});module.exports=a(R);var s=require("./hooks/useAuth"),S=require("./hooks/useIdToken"),f=require("./hooks/useSession"),p=require("./hooks/useSignIn"),I=require("./hooks/useSignUp"),c=require("./ctx/TernSecureCtxProvider"),d=require("./ctx/TernSecureProvider"),t=require("./ctx/SignInCtx"),i=require("./ctx/SignUpCtx"),r=require("./route-handler/internal-route"),g=require("./lib/utils");0&&(module.exports={SignInProvider,SignUpProvider,TernSecureCtxProvider,TernSecureProvider,cn,handleInternalRoute,isAuthRoute,isBaseAuthRoute,isInternalRoute,signIn,useAuth,useDeriveAuth,useIdToken,useSession,useSignIn,useSignInContext,useSignUp,useSignUpContext,useTernSecure});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\nexport { useSignInContext, SignInProvider, useTernSecure } from './ctx/SignInCtx';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsomorphicTernSecureOptions,\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,giBAAAE,EAAAF,GAAA,IAAAG,EAAsC,2BACtCC,EAA2B,8BAC3BC,EAA2B,8BAC3BC,EAAkC,6BAClCC,EAAsC,uCACtCC,EAAmC,oCACnCC,EAAgE,2BAEhEC,EAKO,0CAEPC,EAAmB","names":["index_exports","__export","__toCommonJS","import_useAuth","import_useIdToken","import_useSession","import_useSignIn","import_TernSecureCtxProvider","import_TernSecureProvider","import_SignInCtx","import_internal_route","import_utils"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { useSignUp } from './hooks/useSignUp';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\nexport { useSignInContext, SignInProvider, useTernSecure } from './ctx/SignInCtx';\nexport { useSignUpContext, SignUpProvider } from './ctx/SignUpCtx';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsomorphicTernSecureOptions,\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,soBAAAE,EAAAF,GAAA,IAAAG,EAAsC,2BACtCC,EAA2B,8BAC3BC,EAA2B,8BAC3BC,EAAkC,6BAClCC,EAA0B,6BAC1BC,EAAsC,uCACtCC,EAAmC,oCACnCC,EAAgE,2BAChEC,EAAiD,2BAEjDC,EAKO,0CAEPC,EAAmB","names":["index_exports","__export","__toCommonJS","import_useAuth","import_useIdToken","import_useSession","import_useSignIn","import_useSignUp","import_TernSecureCtxProvider","import_TernSecureProvider","import_SignInCtx","import_SignUpCtx","import_internal_route","import_utils"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{useAuth as o,useDeriveAuth as t}from"./hooks/useAuth";import{useIdToken as u}from"./hooks/useIdToken";import{useSession as i}from"./hooks/useSession";import{useSignIn as x,signIn as m}from"./hooks/useSignIn";import{TernSecureCtxProvider as S}from"./ctx/TernSecureCtxProvider";import{TernSecureProvider as c}from"./ctx/TernSecureProvider";import{useSignInContext as T,SignInProvider as d,useTernSecure as v}from"./ctx/SignInCtx";import{isAuthRoute as P,isBaseAuthRoute as a,isInternalRoute as g,handleInternalRoute as R}from"./route-handler/internal-route";import{cn as y}from"./lib/utils";export{d as SignInProvider,S as TernSecureCtxProvider,c as TernSecureProvider,y as cn,R as handleInternalRoute,P as isAuthRoute,a as isBaseAuthRoute,g as isInternalRoute,m as signIn,o as useAuth,t as useDeriveAuth,u as useIdToken,i as useSession,x as useSignIn,T as useSignInContext,v as useTernSecure};
1
+ import{useAuth as o,useDeriveAuth as t}from"./hooks/useAuth";import{useIdToken as u}from"./hooks/useIdToken";import{useSession as p}from"./hooks/useSession";import{useSignIn as x,signIn as m}from"./hooks/useSignIn";import{useSignUp as f}from"./hooks/useSignUp";import{TernSecureCtxProvider as c}from"./ctx/TernSecureCtxProvider";import{TernSecureProvider as g}from"./ctx/TernSecureProvider";import{useSignInContext as T,SignInProvider as v,useTernSecure as P}from"./ctx/SignInCtx";import{useSignUpContext as a,SignUpProvider as R}from"./ctx/SignUpCtx";import{isAuthRoute as C,isBaseAuthRoute as U,isInternalRoute as y,handleInternalRoute as B}from"./route-handler/internal-route";import{cn as k}from"./lib/utils";export{v as SignInProvider,R as SignUpProvider,c as TernSecureCtxProvider,g as TernSecureProvider,k as cn,B as handleInternalRoute,C as isAuthRoute,U as isBaseAuthRoute,y as isInternalRoute,m as signIn,o as useAuth,t as useDeriveAuth,u as useIdToken,p as useSession,x as useSignIn,T as useSignInContext,f as useSignUp,a as useSignUpContext,P as useTernSecure};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\nexport { useSignInContext, SignInProvider, useTernSecure } from './ctx/SignInCtx';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsomorphicTernSecureOptions,\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n"],"mappings":"AAAA,OAAS,WAAAA,EAAS,iBAAAC,MAAoB,kBACtC,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,aAAAC,EAAW,UAAAC,MAAc,oBAClC,OAAS,yBAAAC,MAA6B,8BACtC,OAAS,sBAAAC,MAA0B,2BACnC,OAAS,oBAAAC,EAAkB,kBAAAC,EAAgB,iBAAAC,MAAqB,kBAEhE,OACE,eAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,uBAAAC,MACK,iCAEP,OAAS,MAAAC,MAAU","names":["useAuth","useDeriveAuth","useIdToken","useSession","useSignIn","signIn","TernSecureCtxProvider","TernSecureProvider","useSignInContext","SignInProvider","useTernSecure","isAuthRoute","isBaseAuthRoute","isInternalRoute","handleInternalRoute","cn"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAuth, useDeriveAuth} from './hooks/useAuth';\nexport { useIdToken } from './hooks/useIdToken';\nexport { useSession } from './hooks/useSession';\nexport { useSignIn, signIn } from './hooks/useSignIn';\nexport { useSignUp } from './hooks/useSignUp';\nexport { TernSecureCtxProvider } from './ctx/TernSecureCtxProvider';\nexport { TernSecureProvider } from './ctx/TernSecureProvider';\nexport { useSignInContext, SignInProvider, useTernSecure } from './ctx/SignInCtx';\nexport { useSignUpContext, SignUpProvider } from './ctx/SignUpCtx';\n\nexport {\n isAuthRoute,\n isBaseAuthRoute,\n isInternalRoute,\n handleInternalRoute,\n} from './route-handler/internal-route';\n\nexport { cn } from './lib/utils';\n\nexport type {\n IsomorphicTernSecureOptions,\n IsoTernSecureAuthOptions,\n Browser,\n TernSecureProviderProps,\n} from './types';\n"],"mappings":"AAAA,OAAS,WAAAA,EAAS,iBAAAC,MAAoB,kBACtC,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,cAAAC,MAAkB,qBAC3B,OAAS,aAAAC,EAAW,UAAAC,MAAc,oBAClC,OAAS,aAAAC,MAAiB,oBAC1B,OAAS,yBAAAC,MAA6B,8BACtC,OAAS,sBAAAC,MAA0B,2BACnC,OAAS,oBAAAC,EAAkB,kBAAAC,EAAgB,iBAAAC,MAAqB,kBAChE,OAAS,oBAAAC,EAAkB,kBAAAC,MAAsB,kBAEjD,OACE,eAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,uBAAAC,MACK,iCAEP,OAAS,MAAAC,MAAU","names":["useAuth","useDeriveAuth","useIdToken","useSession","useSignIn","signIn","useSignUp","TernSecureCtxProvider","TernSecureProvider","useSignInContext","SignInProvider","useTernSecure","useSignUpContext","SignUpProvider","isAuthRoute","isBaseAuthRoute","isInternalRoute","handleInternalRoute","cn"]}
@@ -51,6 +51,7 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
51
51
  onAuthStateChanged(callback: (user: any) => void): () => void;
52
52
  getRedirectResult: () => Promise<any>;
53
53
  constructUrlWithAuthRedirect: (to: string) => string;
54
+ navigate: (to: string) => void;
54
55
  redirectToSignIn: (options?: SignInRedirectOptions) => Promise<void>;
55
56
  redirectToSignUp: (options?: SignUpRedirectOptions) => Promise<void>;
56
57
  redirectAfterSignIn: (redirectUrl?: string) => void;
@@ -51,6 +51,7 @@ declare class IsoTernSecureAuth implements TernSecureAuth {
51
51
  onAuthStateChanged(callback: (user: any) => void): () => void;
52
52
  getRedirectResult: () => Promise<any>;
53
53
  constructUrlWithAuthRedirect: (to: string) => string;
54
+ navigate: (to: string) => void;
54
55
  redirectToSignIn: (options?: SignInRedirectOptions) => Promise<void>;
55
56
  redirectToSignUp: (options?: SignUpRedirectOptions) => Promise<void>;
56
57
  redirectAfterSignIn: (redirectUrl?: string) => void;
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var f=(r,e)=>{for(var t in e)u(r,t,{get:e[t],enumerable:!0})},S=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of l(e))!p.call(r,i)&&i!==t&&u(r,i,{get:()=>e[i],enumerable:!(n=d(e,i))||n.enumerable});return r};var A=r=>S(u({},"__esModule",{value:!0}),r);var T={};f(T,{IsoTernSecureAuth:()=>a,inBrowser:()=>h});module.exports=A(T);var c=require("@tern-secure/auth"),s=require("@tern-secure/shared/ternStatusEvent"),o=require("@tern-secure/shared/utils");const g={name:"@tern-secure/react",version:"1.2.0-canary.v20251023005301",environment:process.env.NODE_ENV};function h(){return typeof window<"u"}class a{_mode;options;TernSecureAuth;ternauth=null;preAddListener=new Map;#i="loading";#s;#t;#n;#r=(0,s.createTernAuthEventBus)();static#e;get status(){return this.ternauth?this.ternauth.status||(this.ternauth.isReady?"ready":"loading"):this.#i}get isReady(){return this.ternauth?.isReady||!1}get isLoading(){return this.ternauth?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternauth)return this.ternauth.signIn||void 0}get signUp(){if(this.ternauth)return this.ternauth.signUp||void 0}get user(){return this.ternauth?this.ternauth.user:null}static getOrCreateInstance(e){return(!h()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new a(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternauth=null,this.#e=null)}static clearInstance(){this.#e=null}get domain(){if(typeof window<"u"&&window.location)return(0,o.handleValueOrFn)(this.#t,new URL(window.location.href),"");if(typeof this.#t=="function")throw new Error("Unsupported customDomain type: function");return this.#t||""}get proxyUrl(){if(typeof window<"u"&&window.location)return(0,o.handleValueOrFn)(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternauth?._internal_getOption?this.ternauth?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null}=e||{};this.#t=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=h()?"browser":"server",this.#s=this.options.apiUrl,this.TernSecureAuth=t,this.options.sdkMetadata||(this.options.sdkMetadata=g)}get sdkMetadata(){return this.ternauth?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternauth?.version}get instanceType(){return this.ternauth?.instanceType}get apiUrl(){return this.#s||""}initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=c.TernSecureAuth.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,n)=>{t.unsubscribe=e.addListener(n)}),this.#r.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#i="ready",this.#r.emit(s.ternEvents.Status,"ready")),this.ternauth};on=(...e)=>this.ternauth?.on?this.ternauth.on(...e):this.#r.on(...e);off=(...e)=>this.ternauth?.off?this.ternauth.off(...e):this.#r.off(...e);addListener=e=>{if(this.ternauth)return this.ternauth.addListener(e);{const t=()=>{const n=this.preAddListener.get(e);n&&(n.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternauth?this.ternauth.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternauth)throw new Error("TernSecureAuth not initialized");await this.ternauth.signOut()};get currentSession(){return this.ternauth?this.ternauth.currentSession:null}onAuthStateChanged(e){return this.ternauth?this.ternauth.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternauth?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternauth.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternauth&&this.isReady?this.ternauth.constructUrlWithAuthRedirect(e):"";redirectToSignIn=async e=>{this.ternauth?.redirectToSignIn&&this.ternauth.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternauth?.redirectToSignUp&&this.ternauth.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternauth?.redirectAfterSignIn&&this.ternauth.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternauth?.redirectAfterSignUp&&this.ternauth.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initialize=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}0&&(module.exports={IsoTernSecureAuth,inBrowser});
1
+ "use strict";var u=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var f=(r,e)=>{for(var t in e)u(r,t,{get:e[t],enumerable:!0})},S=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of l(e))!p.call(r,i)&&i!==t&&u(r,i,{get:()=>e[i],enumerable:!(n=d(e,i))||n.enumerable});return r};var g=r=>S(u({},"__esModule",{value:!0}),r);var T={};f(T,{IsoTernSecureAuth:()=>h,inBrowser:()=>a});module.exports=g(T);var c=require("@tern-secure/auth"),s=require("@tern-secure/shared/ternStatusEvent"),o=require("@tern-secure/shared/utils");const A={name:"@tern-secure/react",version:"1.2.0-canary.v20251028151628",environment:process.env.NODE_ENV};function a(){return typeof window<"u"}class h{_mode;options;TernSecureAuth;ternauth=null;preAddListener=new Map;#i="loading";#s;#t;#n;#r=(0,s.createTernAuthEventBus)();static#e;get status(){return this.ternauth?this.ternauth.status||(this.ternauth.isReady?"ready":"loading"):this.#i}get isReady(){return this.ternauth?.isReady||!1}get isLoading(){return this.ternauth?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternauth)return this.ternauth.signIn||void 0}get signUp(){if(this.ternauth)return this.ternauth.signUp||void 0}get user(){return this.ternauth?this.ternauth.user:null}static getOrCreateInstance(e){return(!a()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new h(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternauth=null,this.#e=null)}static clearInstance(){this.#e=null}get domain(){if(typeof window<"u"&&window.location)return(0,o.handleValueOrFn)(this.#t,new URL(window.location.href),"");if(typeof this.#t=="function")throw new Error("Unsupported customDomain type: function");return this.#t||""}get proxyUrl(){if(typeof window<"u"&&window.location)return(0,o.handleValueOrFn)(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternauth?._internal_getOption?this.ternauth?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null}=e||{};this.#t=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=a()?"browser":"server",this.#s=this.options.apiUrl,this.TernSecureAuth=t,this.options.sdkMetadata||(this.options.sdkMetadata=A)}get sdkMetadata(){return this.ternauth?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternauth?.version}get instanceType(){return this.ternauth?.instanceType}get apiUrl(){return this.#s||""}initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=c.TernSecureAuth.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,n)=>{t.unsubscribe=e.addListener(n)}),this.#r.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#i="ready",this.#r.emit(s.ternEvents.Status,"ready")),this.ternauth};on=(...e)=>this.ternauth?.on?this.ternauth.on(...e):this.#r.on(...e);off=(...e)=>this.ternauth?.off?this.ternauth.off(...e):this.#r.off(...e);addListener=e=>{if(this.ternauth)return this.ternauth.addListener(e);{const t=()=>{const n=this.preAddListener.get(e);n&&(n.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternauth?this.ternauth.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternauth)throw new Error("TernSecureAuth not initialized");await this.ternauth.signOut()};get currentSession(){return this.ternauth?this.ternauth.currentSession:null}onAuthStateChanged(e){return this.ternauth?this.ternauth.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternauth?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternauth.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternauth&&this.isReady?this.ternauth.constructUrlWithAuthRedirect(e):"";navigate=e=>{this.ternauth&&this.isReady&&this.ternauth.navigate(e)};redirectToSignIn=async e=>{this.ternauth?.redirectToSignIn&&this.ternauth.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternauth?.redirectToSignUp&&this.ternauth.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternauth?.redirectAfterSignIn&&this.ternauth.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternauth?.redirectAfterSignUp&&this.ternauth.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initialize=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}0&&(module.exports={IsoTernSecureAuth,inBrowser});
2
2
  //# sourceMappingURL=isoTernSecureAuth.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/isoTernSecureAuth.ts"],"sourcesContent":["import { TernSecureAuth as TernSecureAuthImpl } from '@tern-secure/auth';\nimport { createTernAuthEventBus, ternEvents } from '@tern-secure/shared/ternStatusEvent';\nimport { handleValueOrFn } from '@tern-secure/shared/utils';\nimport type {\n CreateActiveSessionParams,\n DomainOrProxyUrl,\n ListenerCallback,\n SignedInSession,\n SignInRedirectOptions,\n SignInResource,\n SignOutOptions,\n SignUpRedirectOptions,\n SignUpResource,\n TernSecureAuth,\n TernSecureAuthOptions,\n TernSecureAuthStatus,\n UnsubscribeCallback,\n} from '@tern-secure/types';\n\nimport type { IsoTernSecureAuthOptions, TernSecureAuthProps } from '../types';\n\nconst SDK_METADATA = {\n name: __PACKAGE_NAME__,\n version: __PACKAGE_VERSION__,\n environment: process.env.NODE_ENV,\n};\n\nexport function inBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * IsomorphicTernSecure class manages the auth state and UI rendering\n * in both browser and server environments, acting as a proxy for TernSecureAuth\n */\nexport class IsoTernSecureAuth implements TernSecureAuth {\n private readonly _mode: 'browser' | 'server';\n private readonly options: IsoTernSecureAuthOptions;\n private readonly TernSecureAuth: TernSecureAuthProps;\n private ternauth: TernSecureAuthProps | null = null;\n private preAddListener = new Map<ListenerCallback, { unsubscribe: UnsubscribeCallback }>();\n\n #status: TernSecureAuthStatus = 'loading';\n #apiUrl: string | undefined;\n #domain: DomainOrProxyUrl['domain'];\n #proxyUrl: DomainOrProxyUrl['proxyUrl'];\n #eventBus = createTernAuthEventBus();\n\n static #instance: IsoTernSecureAuth | null | undefined;\n\n get status(): TernSecureAuthStatus {\n if (!this.ternauth) {\n return this.#status;\n }\n return this.ternauth.status || (this.ternauth.isReady ? 'ready' : 'loading');\n }\n\n get isReady(): boolean {\n return this.ternauth?.isReady || false;\n }\n\n get isLoading(): boolean {\n return this.ternauth?.isLoading || false;\n }\n\n get requiresVerification(): boolean {\n return this.options.requiresVerification ?? true;\n }\n\n get signIn(): SignInResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signIn || undefined;\n }\n return undefined;\n }\n\n get signUp(): SignUpResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signUp || undefined;\n }\n return undefined;\n }\n\n get user() {\n if (this.ternauth) {\n return this.ternauth.user;\n }\n return null;\n }\n\n static getOrCreateInstance(options: IsoTernSecureAuthOptions) {\n if (\n !inBrowser() ||\n !this.#instance ||\n (options.TernSecureAuth && this.#instance.TernSecureAuth !== options.TernSecureAuth)\n ) {\n this.#instance = new IsoTernSecureAuth(options);\n }\n return this.#instance;\n }\n\n static clearInstances() {\n if (this.#instance) {\n this.#instance.ternauth = null;\n this.#instance = null;\n }\n }\n\n static clearInstance() {\n this.#instance = null;\n }\n\n get domain(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#domain, new URL(window.location.href), '');\n }\n if (typeof this.#domain === 'function') {\n throw new Error('Unsupported customDomain type: function');\n }\n return this.#domain || '';\n }\n\n get proxyUrl(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#proxyUrl, new URL(window.location.href), '');\n }\n if (typeof this.#proxyUrl === 'function') {\n throw new Error('Unsupported customProxyUrl type: function');\n }\n return this.#proxyUrl || '';\n }\n\n get mode(): 'browser' | 'server' {\n return this._mode;\n }\n\n /**\n * @internal\n */\n public _internal_getOption<K extends keyof TernSecureAuthOptions>(\n key: K,\n ): TernSecureAuthOptions[K] | undefined {\n return this.ternauth?._internal_getOption\n ? this.ternauth?._internal_getOption(key)\n : this.options[key];\n }\n\n /**\n * @internal\n */\n public _internal_getAllOptions(): Readonly<TernSecureAuthOptions> {\n return Object.freeze({ ...this.options });\n }\n\n constructor(options: IsoTernSecureAuthOptions) {\n const { TernSecureAuth = null } = options || {};\n this.#domain = options.ternSecureConfig?.authDomain;\n this.options = { ...options };\n this._mode = inBrowser() ? 'browser' : 'server';\n this.#apiUrl = this.options.apiUrl;\n this.TernSecureAuth = TernSecureAuth;\n\n if (!this.options.sdkMetadata) {\n this.options.sdkMetadata = SDK_METADATA;\n }\n }\n\n get sdkMetadata() {\n return this.ternauth?.sdkMetadata || this.options.sdkMetadata;\n }\n\n get version() {\n return this.ternauth?.version;\n }\n\n get instanceType() {\n return this.ternauth?.instanceType;\n }\n\n get apiUrl() {\n return this.#apiUrl || '';\n }\n\n initTernSecureAuth() {\n if (this._mode !== 'browser' || this.isReady) {\n return;\n }\n\n const tern = TernSecureAuthImpl.initialize(this.options);\n this.loadTernSecureAuth(tern);\n }\n\n private loadTernSecureAuth = (ternauth: TernSecureAuthProps | undefined) => {\n if (!ternauth) {\n throw new Error('TernAuth instance is not initialized');\n }\n\n this.ternauth = ternauth;\n this.preAddListener.forEach((listenerHandlers, listener) => {\n listenerHandlers.unsubscribe = ternauth.addListener(listener);\n });\n\n this.#eventBus.getListeners('status').forEach(listener => {\n this.on('status', listener, { notify: true });\n });\n\n if (typeof this.ternauth.status === 'undefined') {\n console.log(\n '[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready',\n );\n this.#status = 'ready';\n this.#eventBus.emit(ternEvents.Status, 'ready');\n }\n\n return this.ternauth;\n };\n\n public on: TernSecureAuth['on'] = (...args) => {\n if (this.ternauth?.on) {\n return this.ternauth.on(...args);\n } else {\n return this.#eventBus.on(...args);\n }\n };\n\n public off: TernSecureAuth['off'] = (...args) => {\n if (this.ternauth?.off) {\n return this.ternauth.off(...args);\n } else {\n return this.#eventBus.off(...args);\n }\n };\n\n addListener = (listener: ListenerCallback): UnsubscribeCallback => {\n if (this.ternauth) {\n return this.ternauth.addListener(listener);\n } else {\n const unsubscribe = () => {\n const listenerHandlers = this.preAddListener.get(listener);\n if (listenerHandlers) {\n listenerHandlers.unsubscribe();\n this.preAddListener.delete(listener);\n }\n };\n this.preAddListener.set(listener, { unsubscribe });\n return unsubscribe;\n }\n };\n\n createActiveSession = (params: CreateActiveSessionParams): Promise<void> => {\n if (this.ternauth) {\n return this.ternauth.createActiveSession(params);\n } else {\n return Promise.reject(new Error('TernSecureAuth not initialized'));\n }\n };\n\n signOut = async (options?: SignOutOptions): Promise<void> => {\n if (!this.ternauth) {\n throw new Error('TernSecureAuth not initialized');\n }\n await this.ternauth.signOut();\n };\n\n get currentSession(): SignedInSession | null {\n if (!this.ternauth) {\n return null;\n }\n return this.ternauth.currentSession;\n }\n\n onAuthStateChanged(callback: (user: any) => void): () => void {\n if (!this.ternauth) {\n console.warn(\n '[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener',\n );\n return () => {};\n }\n return this.ternauth.onAuthStateChanged(callback);\n }\n\n getRedirectResult = async (): Promise<any> => {\n if (!this.ternauth?.getRedirectResult) {\n throw new Error('TernSecure instance not initialized');\n }\n return this.ternauth.getRedirectResult();\n };\n\n constructUrlWithAuthRedirect = (to: string): string => {\n if (this.ternauth && this.isReady) {\n return this.ternauth.constructUrlWithAuthRedirect(to);\n }\n return '';\n };\n\n redirectToSignIn = async (options?: SignInRedirectOptions) => {\n if (this.ternauth?.redirectToSignIn) {\n this.ternauth.redirectToSignIn(options);\n }\n };\n\n redirectToSignUp = async (options?: SignUpRedirectOptions) => {\n if (this.ternauth?.redirectToSignUp) {\n this.ternauth.redirectToSignUp();\n }\n };\n\n redirectAfterSignIn = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignIn) {\n this.ternauth.redirectAfterSignIn();\n }\n };\n\n redirectAfterSignUp = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignUp) {\n this.ternauth.redirectAfterSignUp();\n }\n };\n\n #awaitForTernSecureAuth(): Promise<TernSecureAuthProps> {\n return new Promise<TernSecureAuthProps>(resolve => {\n resolve(this.ternauth);\n });\n }\n\n initialize = async (): Promise<void> => {\n this.initTernSecureAuth();\n try {\n await this.#awaitForTernSecureAuth();\n } catch (error) {\n console.error('[IsomorphicTernSecure] Failed to initialize TernSecureAuth:', error);\n throw error;\n }\n };\n}\n"],"mappings":"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","names":["isoTernSecureAuth_exports","__export","IsoTernSecureAuth","inBrowser","__toCommonJS","import_auth","import_ternStatusEvent","import_utils","SDK_METADATA","#status","#apiUrl","#domain","#proxyUrl","#eventBus","#instance","options","key","TernSecureAuth","tern","TernSecureAuthImpl","ternauth","listenerHandlers","listener","args","unsubscribe","params","callback","to","redirectUrl","#awaitForTernSecureAuth","resolve","error"]}
1
+ {"version":3,"sources":["../../src/lib/isoTernSecureAuth.ts"],"sourcesContent":["import { TernSecureAuth as TernSecureAuthImpl } from '@tern-secure/auth';\nimport { createTernAuthEventBus, ternEvents } from '@tern-secure/shared/ternStatusEvent';\nimport { handleValueOrFn } from '@tern-secure/shared/utils';\nimport type {\n CreateActiveSessionParams,\n DomainOrProxyUrl,\n ListenerCallback,\n SignedInSession,\n SignInRedirectOptions,\n SignInResource,\n SignOutOptions,\n SignUpRedirectOptions,\n SignUpResource,\n TernSecureAuth,\n TernSecureAuthOptions,\n TernSecureAuthStatus,\n UnsubscribeCallback,\n} from '@tern-secure/types';\n\nimport type { IsoTernSecureAuthOptions, TernSecureAuthProps } from '../types';\n\nconst SDK_METADATA = {\n name: __PACKAGE_NAME__,\n version: __PACKAGE_VERSION__,\n environment: process.env.NODE_ENV,\n};\n\nexport function inBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * IsomorphicTernSecure class manages the auth state and UI rendering\n * in both browser and server environments, acting as a proxy for TernSecureAuth\n */\nexport class IsoTernSecureAuth implements TernSecureAuth {\n private readonly _mode: 'browser' | 'server';\n private readonly options: IsoTernSecureAuthOptions;\n private readonly TernSecureAuth: TernSecureAuthProps;\n private ternauth: TernSecureAuthProps | null = null;\n private preAddListener = new Map<ListenerCallback, { unsubscribe: UnsubscribeCallback }>();\n\n #status: TernSecureAuthStatus = 'loading';\n #apiUrl: string | undefined;\n #domain: DomainOrProxyUrl['domain'];\n #proxyUrl: DomainOrProxyUrl['proxyUrl'];\n #eventBus = createTernAuthEventBus();\n\n static #instance: IsoTernSecureAuth | null | undefined;\n\n get status(): TernSecureAuthStatus {\n if (!this.ternauth) {\n return this.#status;\n }\n return this.ternauth.status || (this.ternauth.isReady ? 'ready' : 'loading');\n }\n\n get isReady(): boolean {\n return this.ternauth?.isReady || false;\n }\n\n get isLoading(): boolean {\n return this.ternauth?.isLoading || false;\n }\n\n get requiresVerification(): boolean {\n return this.options.requiresVerification ?? true;\n }\n\n get signIn(): SignInResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signIn || undefined;\n }\n return undefined;\n }\n\n get signUp(): SignUpResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signUp || undefined;\n }\n return undefined;\n }\n\n get user() {\n if (this.ternauth) {\n return this.ternauth.user;\n }\n return null;\n }\n\n static getOrCreateInstance(options: IsoTernSecureAuthOptions) {\n if (\n !inBrowser() ||\n !this.#instance ||\n (options.TernSecureAuth && this.#instance.TernSecureAuth !== options.TernSecureAuth)\n ) {\n this.#instance = new IsoTernSecureAuth(options);\n }\n return this.#instance;\n }\n\n static clearInstances() {\n if (this.#instance) {\n this.#instance.ternauth = null;\n this.#instance = null;\n }\n }\n\n static clearInstance() {\n this.#instance = null;\n }\n\n get domain(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#domain, new URL(window.location.href), '');\n }\n if (typeof this.#domain === 'function') {\n throw new Error('Unsupported customDomain type: function');\n }\n return this.#domain || '';\n }\n\n get proxyUrl(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#proxyUrl, new URL(window.location.href), '');\n }\n if (typeof this.#proxyUrl === 'function') {\n throw new Error('Unsupported customProxyUrl type: function');\n }\n return this.#proxyUrl || '';\n }\n\n get mode(): 'browser' | 'server' {\n return this._mode;\n }\n\n /**\n * @internal\n */\n public _internal_getOption<K extends keyof TernSecureAuthOptions>(\n key: K,\n ): TernSecureAuthOptions[K] | undefined {\n return this.ternauth?._internal_getOption\n ? this.ternauth?._internal_getOption(key)\n : this.options[key];\n }\n\n /**\n * @internal\n */\n public _internal_getAllOptions(): Readonly<TernSecureAuthOptions> {\n return Object.freeze({ ...this.options });\n }\n\n constructor(options: IsoTernSecureAuthOptions) {\n const { TernSecureAuth = null } = options || {};\n this.#domain = options.ternSecureConfig?.authDomain;\n this.options = { ...options };\n this._mode = inBrowser() ? 'browser' : 'server';\n this.#apiUrl = this.options.apiUrl;\n this.TernSecureAuth = TernSecureAuth;\n\n if (!this.options.sdkMetadata) {\n this.options.sdkMetadata = SDK_METADATA;\n }\n }\n\n get sdkMetadata() {\n return this.ternauth?.sdkMetadata || this.options.sdkMetadata;\n }\n\n get version() {\n return this.ternauth?.version;\n }\n\n get instanceType() {\n return this.ternauth?.instanceType;\n }\n\n get apiUrl() {\n return this.#apiUrl || '';\n }\n\n initTernSecureAuth() {\n if (this._mode !== 'browser' || this.isReady) {\n return;\n }\n\n const tern = TernSecureAuthImpl.initialize(this.options);\n this.loadTernSecureAuth(tern);\n }\n\n private loadTernSecureAuth = (ternauth: TernSecureAuthProps | undefined) => {\n if (!ternauth) {\n throw new Error('TernAuth instance is not initialized');\n }\n\n this.ternauth = ternauth;\n this.preAddListener.forEach((listenerHandlers, listener) => {\n listenerHandlers.unsubscribe = ternauth.addListener(listener);\n });\n\n this.#eventBus.getListeners('status').forEach(listener => {\n this.on('status', listener, { notify: true });\n });\n\n if (typeof this.ternauth.status === 'undefined') {\n console.log(\n '[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready',\n );\n this.#status = 'ready';\n this.#eventBus.emit(ternEvents.Status, 'ready');\n }\n\n return this.ternauth;\n };\n\n public on: TernSecureAuth['on'] = (...args) => {\n if (this.ternauth?.on) {\n return this.ternauth.on(...args);\n } else {\n return this.#eventBus.on(...args);\n }\n };\n\n public off: TernSecureAuth['off'] = (...args) => {\n if (this.ternauth?.off) {\n return this.ternauth.off(...args);\n } else {\n return this.#eventBus.off(...args);\n }\n };\n\n addListener = (listener: ListenerCallback): UnsubscribeCallback => {\n if (this.ternauth) {\n return this.ternauth.addListener(listener);\n } else {\n const unsubscribe = () => {\n const listenerHandlers = this.preAddListener.get(listener);\n if (listenerHandlers) {\n listenerHandlers.unsubscribe();\n this.preAddListener.delete(listener);\n }\n };\n this.preAddListener.set(listener, { unsubscribe });\n return unsubscribe;\n }\n };\n\n createActiveSession = (params: CreateActiveSessionParams): Promise<void> => {\n if (this.ternauth) {\n return this.ternauth.createActiveSession(params);\n } else {\n return Promise.reject(new Error('TernSecureAuth not initialized'));\n }\n };\n\n signOut = async (options?: SignOutOptions): Promise<void> => {\n if (!this.ternauth) {\n throw new Error('TernSecureAuth not initialized');\n }\n await this.ternauth.signOut();\n };\n\n get currentSession(): SignedInSession | null {\n if (!this.ternauth) {\n return null;\n }\n return this.ternauth.currentSession;\n }\n\n onAuthStateChanged(callback: (user: any) => void): () => void {\n if (!this.ternauth) {\n console.warn(\n '[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener',\n );\n return () => {};\n }\n return this.ternauth.onAuthStateChanged(callback);\n }\n\n getRedirectResult = async (): Promise<any> => {\n if (!this.ternauth?.getRedirectResult) {\n throw new Error('TernSecure instance not initialized');\n }\n return this.ternauth.getRedirectResult();\n };\n\n constructUrlWithAuthRedirect = (to: string): string => {\n if (this.ternauth && this.isReady) {\n return this.ternauth.constructUrlWithAuthRedirect(to);\n }\n return '';\n };\n\n navigate = (to: string) => {\n if (this.ternauth && this.isReady) {\n this.ternauth.navigate(to);\n }\n };\n\n redirectToSignIn = async (options?: SignInRedirectOptions) => {\n if (this.ternauth?.redirectToSignIn) {\n this.ternauth.redirectToSignIn(options);\n }\n };\n\n redirectToSignUp = async (options?: SignUpRedirectOptions) => {\n if (this.ternauth?.redirectToSignUp) {\n this.ternauth.redirectToSignUp();\n }\n };\n\n redirectAfterSignIn = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignIn) {\n this.ternauth.redirectAfterSignIn();\n }\n };\n\n redirectAfterSignUp = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignUp) {\n this.ternauth.redirectAfterSignUp();\n }\n };\n\n #awaitForTernSecureAuth(): Promise<TernSecureAuthProps> {\n return new Promise<TernSecureAuthProps>(resolve => {\n resolve(this.ternauth);\n });\n }\n\n initialize = async (): Promise<void> => {\n this.initTernSecureAuth();\n try {\n await this.#awaitForTernSecureAuth();\n } catch (error) {\n console.error('[IsomorphicTernSecure] Failed to initialize TernSecureAuth:', error);\n throw error;\n }\n };\n}\n"],"mappings":"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","names":["isoTernSecureAuth_exports","__export","IsoTernSecureAuth","inBrowser","__toCommonJS","import_auth","import_ternStatusEvent","import_utils","SDK_METADATA","#status","#apiUrl","#domain","#proxyUrl","#eventBus","#instance","options","key","TernSecureAuth","tern","TernSecureAuthImpl","ternauth","listenerHandlers","listener","args","unsubscribe","params","callback","to","redirectUrl","#awaitForTernSecureAuth","resolve","error"]}
@@ -1,2 +1,2 @@
1
- import{TernSecureAuth as u}from"@tern-secure/auth";import{createTernAuthEventBus as o,ternEvents as h}from"@tern-secure/shared/ternStatusEvent";import{handleValueOrFn as n}from"@tern-secure/shared/utils";const a={name:"@tern-secure/react",version:"1.2.0-canary.v20251023005301",environment:process.env.NODE_ENV};function i(){return typeof window<"u"}class s{_mode;options;TernSecureAuth;ternauth=null;preAddListener=new Map;#i="loading";#s;#t;#n;#r=o();static#e;get status(){return this.ternauth?this.ternauth.status||(this.ternauth.isReady?"ready":"loading"):this.#i}get isReady(){return this.ternauth?.isReady||!1}get isLoading(){return this.ternauth?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternauth)return this.ternauth.signIn||void 0}get signUp(){if(this.ternauth)return this.ternauth.signUp||void 0}get user(){return this.ternauth?this.ternauth.user:null}static getOrCreateInstance(e){return(!i()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new s(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternauth=null,this.#e=null)}static clearInstance(){this.#e=null}get domain(){if(typeof window<"u"&&window.location)return n(this.#t,new URL(window.location.href),"");if(typeof this.#t=="function")throw new Error("Unsupported customDomain type: function");return this.#t||""}get proxyUrl(){if(typeof window<"u"&&window.location)return n(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternauth?._internal_getOption?this.ternauth?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null}=e||{};this.#t=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=i()?"browser":"server",this.#s=this.options.apiUrl,this.TernSecureAuth=t,this.options.sdkMetadata||(this.options.sdkMetadata=a)}get sdkMetadata(){return this.ternauth?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternauth?.version}get instanceType(){return this.ternauth?.instanceType}get apiUrl(){return this.#s||""}initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=u.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,r)=>{t.unsubscribe=e.addListener(r)}),this.#r.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#i="ready",this.#r.emit(h.Status,"ready")),this.ternauth};on=(...e)=>this.ternauth?.on?this.ternauth.on(...e):this.#r.on(...e);off=(...e)=>this.ternauth?.off?this.ternauth.off(...e):this.#r.off(...e);addListener=e=>{if(this.ternauth)return this.ternauth.addListener(e);{const t=()=>{const r=this.preAddListener.get(e);r&&(r.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternauth?this.ternauth.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternauth)throw new Error("TernSecureAuth not initialized");await this.ternauth.signOut()};get currentSession(){return this.ternauth?this.ternauth.currentSession:null}onAuthStateChanged(e){return this.ternauth?this.ternauth.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternauth?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternauth.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternauth&&this.isReady?this.ternauth.constructUrlWithAuthRedirect(e):"";redirectToSignIn=async e=>{this.ternauth?.redirectToSignIn&&this.ternauth.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternauth?.redirectToSignUp&&this.ternauth.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternauth?.redirectAfterSignIn&&this.ternauth.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternauth?.redirectAfterSignUp&&this.ternauth.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initialize=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}export{s as IsoTernSecureAuth,i as inBrowser};
1
+ import{TernSecureAuth as u}from"@tern-secure/auth";import{createTernAuthEventBus as o,ternEvents as a}from"@tern-secure/shared/ternStatusEvent";import{handleValueOrFn as n}from"@tern-secure/shared/utils";const h={name:"@tern-secure/react",version:"1.2.0-canary.v20251028151628",environment:process.env.NODE_ENV};function i(){return typeof window<"u"}class s{_mode;options;TernSecureAuth;ternauth=null;preAddListener=new Map;#i="loading";#s;#t;#n;#r=o();static#e;get status(){return this.ternauth?this.ternauth.status||(this.ternauth.isReady?"ready":"loading"):this.#i}get isReady(){return this.ternauth?.isReady||!1}get isLoading(){return this.ternauth?.isLoading||!1}get requiresVerification(){return this.options.requiresVerification??!0}get signIn(){if(this.ternauth)return this.ternauth.signIn||void 0}get signUp(){if(this.ternauth)return this.ternauth.signUp||void 0}get user(){return this.ternauth?this.ternauth.user:null}static getOrCreateInstance(e){return(!i()||!this.#e||e.TernSecureAuth&&this.#e.TernSecureAuth!==e.TernSecureAuth)&&(this.#e=new s(e)),this.#e}static clearInstances(){this.#e&&(this.#e.ternauth=null,this.#e=null)}static clearInstance(){this.#e=null}get domain(){if(typeof window<"u"&&window.location)return n(this.#t,new URL(window.location.href),"");if(typeof this.#t=="function")throw new Error("Unsupported customDomain type: function");return this.#t||""}get proxyUrl(){if(typeof window<"u"&&window.location)return n(this.#n,new URL(window.location.href),"");if(typeof this.#n=="function")throw new Error("Unsupported customProxyUrl type: function");return this.#n||""}get mode(){return this._mode}_internal_getOption(e){return this.ternauth?._internal_getOption?this.ternauth?._internal_getOption(e):this.options[e]}_internal_getAllOptions(){return Object.freeze({...this.options})}constructor(e){const{TernSecureAuth:t=null}=e||{};this.#t=e.ternSecureConfig?.authDomain,this.options={...e},this._mode=i()?"browser":"server",this.#s=this.options.apiUrl,this.TernSecureAuth=t,this.options.sdkMetadata||(this.options.sdkMetadata=h)}get sdkMetadata(){return this.ternauth?.sdkMetadata||this.options.sdkMetadata}get version(){return this.ternauth?.version}get instanceType(){return this.ternauth?.instanceType}get apiUrl(){return this.#s||""}initTernSecureAuth(){if(this._mode!=="browser"||this.isReady)return;const e=u.initialize(this.options);this.loadTernSecureAuth(e)}loadTernSecureAuth=e=>{if(!e)throw new Error("TernAuth instance is not initialized");return this.ternauth=e,this.preAddListener.forEach((t,r)=>{t.unsubscribe=e.addListener(r)}),this.#r.getListeners("status").forEach(t=>{this.on("status",t,{notify:!0})}),typeof this.ternauth.status>"u"&&(console.log("[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready"),this.#i="ready",this.#r.emit(a.Status,"ready")),this.ternauth};on=(...e)=>this.ternauth?.on?this.ternauth.on(...e):this.#r.on(...e);off=(...e)=>this.ternauth?.off?this.ternauth.off(...e):this.#r.off(...e);addListener=e=>{if(this.ternauth)return this.ternauth.addListener(e);{const t=()=>{const r=this.preAddListener.get(e);r&&(r.unsubscribe(),this.preAddListener.delete(e))};return this.preAddListener.set(e,{unsubscribe:t}),t}};createActiveSession=e=>this.ternauth?this.ternauth.createActiveSession(e):Promise.reject(new Error("TernSecureAuth not initialized"));signOut=async e=>{if(!this.ternauth)throw new Error("TernSecureAuth not initialized");await this.ternauth.signOut()};get currentSession(){return this.ternauth?this.ternauth.currentSession:null}onAuthStateChanged(e){return this.ternauth?this.ternauth.onAuthStateChanged(e):(console.warn("[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener"),()=>{})}getRedirectResult=async()=>{if(!this.ternauth?.getRedirectResult)throw new Error("TernSecure instance not initialized");return this.ternauth.getRedirectResult()};constructUrlWithAuthRedirect=e=>this.ternauth&&this.isReady?this.ternauth.constructUrlWithAuthRedirect(e):"";navigate=e=>{this.ternauth&&this.isReady&&this.ternauth.navigate(e)};redirectToSignIn=async e=>{this.ternauth?.redirectToSignIn&&this.ternauth.redirectToSignIn(e)};redirectToSignUp=async e=>{this.ternauth?.redirectToSignUp&&this.ternauth.redirectToSignUp()};redirectAfterSignIn=e=>{this.ternauth?.redirectAfterSignIn&&this.ternauth.redirectAfterSignIn()};redirectAfterSignUp=e=>{this.ternauth?.redirectAfterSignUp&&this.ternauth.redirectAfterSignUp()};#u(){return new Promise(e=>{e(this.ternauth)})}initialize=async()=>{this.initTernSecureAuth();try{await this.#u()}catch(e){throw console.error("[IsomorphicTernSecure] Failed to initialize TernSecureAuth:",e),e}}}export{s as IsoTernSecureAuth,i as inBrowser};
2
2
  //# sourceMappingURL=isoTernSecureAuth.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/isoTernSecureAuth.ts"],"sourcesContent":["import { TernSecureAuth as TernSecureAuthImpl } from '@tern-secure/auth';\nimport { createTernAuthEventBus, ternEvents } from '@tern-secure/shared/ternStatusEvent';\nimport { handleValueOrFn } from '@tern-secure/shared/utils';\nimport type {\n CreateActiveSessionParams,\n DomainOrProxyUrl,\n ListenerCallback,\n SignedInSession,\n SignInRedirectOptions,\n SignInResource,\n SignOutOptions,\n SignUpRedirectOptions,\n SignUpResource,\n TernSecureAuth,\n TernSecureAuthOptions,\n TernSecureAuthStatus,\n UnsubscribeCallback,\n} from '@tern-secure/types';\n\nimport type { IsoTernSecureAuthOptions, TernSecureAuthProps } from '../types';\n\nconst SDK_METADATA = {\n name: __PACKAGE_NAME__,\n version: __PACKAGE_VERSION__,\n environment: process.env.NODE_ENV,\n};\n\nexport function inBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * IsomorphicTernSecure class manages the auth state and UI rendering\n * in both browser and server environments, acting as a proxy for TernSecureAuth\n */\nexport class IsoTernSecureAuth implements TernSecureAuth {\n private readonly _mode: 'browser' | 'server';\n private readonly options: IsoTernSecureAuthOptions;\n private readonly TernSecureAuth: TernSecureAuthProps;\n private ternauth: TernSecureAuthProps | null = null;\n private preAddListener = new Map<ListenerCallback, { unsubscribe: UnsubscribeCallback }>();\n\n #status: TernSecureAuthStatus = 'loading';\n #apiUrl: string | undefined;\n #domain: DomainOrProxyUrl['domain'];\n #proxyUrl: DomainOrProxyUrl['proxyUrl'];\n #eventBus = createTernAuthEventBus();\n\n static #instance: IsoTernSecureAuth | null | undefined;\n\n get status(): TernSecureAuthStatus {\n if (!this.ternauth) {\n return this.#status;\n }\n return this.ternauth.status || (this.ternauth.isReady ? 'ready' : 'loading');\n }\n\n get isReady(): boolean {\n return this.ternauth?.isReady || false;\n }\n\n get isLoading(): boolean {\n return this.ternauth?.isLoading || false;\n }\n\n get requiresVerification(): boolean {\n return this.options.requiresVerification ?? true;\n }\n\n get signIn(): SignInResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signIn || undefined;\n }\n return undefined;\n }\n\n get signUp(): SignUpResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signUp || undefined;\n }\n return undefined;\n }\n\n get user() {\n if (this.ternauth) {\n return this.ternauth.user;\n }\n return null;\n }\n\n static getOrCreateInstance(options: IsoTernSecureAuthOptions) {\n if (\n !inBrowser() ||\n !this.#instance ||\n (options.TernSecureAuth && this.#instance.TernSecureAuth !== options.TernSecureAuth)\n ) {\n this.#instance = new IsoTernSecureAuth(options);\n }\n return this.#instance;\n }\n\n static clearInstances() {\n if (this.#instance) {\n this.#instance.ternauth = null;\n this.#instance = null;\n }\n }\n\n static clearInstance() {\n this.#instance = null;\n }\n\n get domain(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#domain, new URL(window.location.href), '');\n }\n if (typeof this.#domain === 'function') {\n throw new Error('Unsupported customDomain type: function');\n }\n return this.#domain || '';\n }\n\n get proxyUrl(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#proxyUrl, new URL(window.location.href), '');\n }\n if (typeof this.#proxyUrl === 'function') {\n throw new Error('Unsupported customProxyUrl type: function');\n }\n return this.#proxyUrl || '';\n }\n\n get mode(): 'browser' | 'server' {\n return this._mode;\n }\n\n /**\n * @internal\n */\n public _internal_getOption<K extends keyof TernSecureAuthOptions>(\n key: K,\n ): TernSecureAuthOptions[K] | undefined {\n return this.ternauth?._internal_getOption\n ? this.ternauth?._internal_getOption(key)\n : this.options[key];\n }\n\n /**\n * @internal\n */\n public _internal_getAllOptions(): Readonly<TernSecureAuthOptions> {\n return Object.freeze({ ...this.options });\n }\n\n constructor(options: IsoTernSecureAuthOptions) {\n const { TernSecureAuth = null } = options || {};\n this.#domain = options.ternSecureConfig?.authDomain;\n this.options = { ...options };\n this._mode = inBrowser() ? 'browser' : 'server';\n this.#apiUrl = this.options.apiUrl;\n this.TernSecureAuth = TernSecureAuth;\n\n if (!this.options.sdkMetadata) {\n this.options.sdkMetadata = SDK_METADATA;\n }\n }\n\n get sdkMetadata() {\n return this.ternauth?.sdkMetadata || this.options.sdkMetadata;\n }\n\n get version() {\n return this.ternauth?.version;\n }\n\n get instanceType() {\n return this.ternauth?.instanceType;\n }\n\n get apiUrl() {\n return this.#apiUrl || '';\n }\n\n initTernSecureAuth() {\n if (this._mode !== 'browser' || this.isReady) {\n return;\n }\n\n const tern = TernSecureAuthImpl.initialize(this.options);\n this.loadTernSecureAuth(tern);\n }\n\n private loadTernSecureAuth = (ternauth: TernSecureAuthProps | undefined) => {\n if (!ternauth) {\n throw new Error('TernAuth instance is not initialized');\n }\n\n this.ternauth = ternauth;\n this.preAddListener.forEach((listenerHandlers, listener) => {\n listenerHandlers.unsubscribe = ternauth.addListener(listener);\n });\n\n this.#eventBus.getListeners('status').forEach(listener => {\n this.on('status', listener, { notify: true });\n });\n\n if (typeof this.ternauth.status === 'undefined') {\n console.log(\n '[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready',\n );\n this.#status = 'ready';\n this.#eventBus.emit(ternEvents.Status, 'ready');\n }\n\n return this.ternauth;\n };\n\n public on: TernSecureAuth['on'] = (...args) => {\n if (this.ternauth?.on) {\n return this.ternauth.on(...args);\n } else {\n return this.#eventBus.on(...args);\n }\n };\n\n public off: TernSecureAuth['off'] = (...args) => {\n if (this.ternauth?.off) {\n return this.ternauth.off(...args);\n } else {\n return this.#eventBus.off(...args);\n }\n };\n\n addListener = (listener: ListenerCallback): UnsubscribeCallback => {\n if (this.ternauth) {\n return this.ternauth.addListener(listener);\n } else {\n const unsubscribe = () => {\n const listenerHandlers = this.preAddListener.get(listener);\n if (listenerHandlers) {\n listenerHandlers.unsubscribe();\n this.preAddListener.delete(listener);\n }\n };\n this.preAddListener.set(listener, { unsubscribe });\n return unsubscribe;\n }\n };\n\n createActiveSession = (params: CreateActiveSessionParams): Promise<void> => {\n if (this.ternauth) {\n return this.ternauth.createActiveSession(params);\n } else {\n return Promise.reject(new Error('TernSecureAuth not initialized'));\n }\n };\n\n signOut = async (options?: SignOutOptions): Promise<void> => {\n if (!this.ternauth) {\n throw new Error('TernSecureAuth not initialized');\n }\n await this.ternauth.signOut();\n };\n\n get currentSession(): SignedInSession | null {\n if (!this.ternauth) {\n return null;\n }\n return this.ternauth.currentSession;\n }\n\n onAuthStateChanged(callback: (user: any) => void): () => void {\n if (!this.ternauth) {\n console.warn(\n '[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener',\n );\n return () => {};\n }\n return this.ternauth.onAuthStateChanged(callback);\n }\n\n getRedirectResult = async (): Promise<any> => {\n if (!this.ternauth?.getRedirectResult) {\n throw new Error('TernSecure instance not initialized');\n }\n return this.ternauth.getRedirectResult();\n };\n\n constructUrlWithAuthRedirect = (to: string): string => {\n if (this.ternauth && this.isReady) {\n return this.ternauth.constructUrlWithAuthRedirect(to);\n }\n return '';\n };\n\n redirectToSignIn = async (options?: SignInRedirectOptions) => {\n if (this.ternauth?.redirectToSignIn) {\n this.ternauth.redirectToSignIn(options);\n }\n };\n\n redirectToSignUp = async (options?: SignUpRedirectOptions) => {\n if (this.ternauth?.redirectToSignUp) {\n this.ternauth.redirectToSignUp();\n }\n };\n\n redirectAfterSignIn = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignIn) {\n this.ternauth.redirectAfterSignIn();\n }\n };\n\n redirectAfterSignUp = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignUp) {\n this.ternauth.redirectAfterSignUp();\n }\n };\n\n #awaitForTernSecureAuth(): Promise<TernSecureAuthProps> {\n return new Promise<TernSecureAuthProps>(resolve => {\n resolve(this.ternauth);\n });\n }\n\n initialize = async (): Promise<void> => {\n this.initTernSecureAuth();\n try {\n await this.#awaitForTernSecureAuth();\n } catch (error) {\n console.error('[IsomorphicTernSecure] Failed to initialize TernSecureAuth:', error);\n throw error;\n }\n };\n}\n"],"mappings":"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","names":["TernSecureAuthImpl","createTernAuthEventBus","ternEvents","handleValueOrFn","SDK_METADATA","inBrowser","IsoTernSecureAuth","#status","#apiUrl","#domain","#proxyUrl","#eventBus","#instance","options","key","TernSecureAuth","tern","ternauth","listenerHandlers","listener","args","unsubscribe","params","callback","to","redirectUrl","#awaitForTernSecureAuth","resolve","error"]}
1
+ {"version":3,"sources":["../../src/lib/isoTernSecureAuth.ts"],"sourcesContent":["import { TernSecureAuth as TernSecureAuthImpl } from '@tern-secure/auth';\nimport { createTernAuthEventBus, ternEvents } from '@tern-secure/shared/ternStatusEvent';\nimport { handleValueOrFn } from '@tern-secure/shared/utils';\nimport type {\n CreateActiveSessionParams,\n DomainOrProxyUrl,\n ListenerCallback,\n SignedInSession,\n SignInRedirectOptions,\n SignInResource,\n SignOutOptions,\n SignUpRedirectOptions,\n SignUpResource,\n TernSecureAuth,\n TernSecureAuthOptions,\n TernSecureAuthStatus,\n UnsubscribeCallback,\n} from '@tern-secure/types';\n\nimport type { IsoTernSecureAuthOptions, TernSecureAuthProps } from '../types';\n\nconst SDK_METADATA = {\n name: __PACKAGE_NAME__,\n version: __PACKAGE_VERSION__,\n environment: process.env.NODE_ENV,\n};\n\nexport function inBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * IsomorphicTernSecure class manages the auth state and UI rendering\n * in both browser and server environments, acting as a proxy for TernSecureAuth\n */\nexport class IsoTernSecureAuth implements TernSecureAuth {\n private readonly _mode: 'browser' | 'server';\n private readonly options: IsoTernSecureAuthOptions;\n private readonly TernSecureAuth: TernSecureAuthProps;\n private ternauth: TernSecureAuthProps | null = null;\n private preAddListener = new Map<ListenerCallback, { unsubscribe: UnsubscribeCallback }>();\n\n #status: TernSecureAuthStatus = 'loading';\n #apiUrl: string | undefined;\n #domain: DomainOrProxyUrl['domain'];\n #proxyUrl: DomainOrProxyUrl['proxyUrl'];\n #eventBus = createTernAuthEventBus();\n\n static #instance: IsoTernSecureAuth | null | undefined;\n\n get status(): TernSecureAuthStatus {\n if (!this.ternauth) {\n return this.#status;\n }\n return this.ternauth.status || (this.ternauth.isReady ? 'ready' : 'loading');\n }\n\n get isReady(): boolean {\n return this.ternauth?.isReady || false;\n }\n\n get isLoading(): boolean {\n return this.ternauth?.isLoading || false;\n }\n\n get requiresVerification(): boolean {\n return this.options.requiresVerification ?? true;\n }\n\n get signIn(): SignInResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signIn || undefined;\n }\n return undefined;\n }\n\n get signUp(): SignUpResource | undefined {\n if (this.ternauth) {\n return this.ternauth.signUp || undefined;\n }\n return undefined;\n }\n\n get user() {\n if (this.ternauth) {\n return this.ternauth.user;\n }\n return null;\n }\n\n static getOrCreateInstance(options: IsoTernSecureAuthOptions) {\n if (\n !inBrowser() ||\n !this.#instance ||\n (options.TernSecureAuth && this.#instance.TernSecureAuth !== options.TernSecureAuth)\n ) {\n this.#instance = new IsoTernSecureAuth(options);\n }\n return this.#instance;\n }\n\n static clearInstances() {\n if (this.#instance) {\n this.#instance.ternauth = null;\n this.#instance = null;\n }\n }\n\n static clearInstance() {\n this.#instance = null;\n }\n\n get domain(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#domain, new URL(window.location.href), '');\n }\n if (typeof this.#domain === 'function') {\n throw new Error('Unsupported customDomain type: function');\n }\n return this.#domain || '';\n }\n\n get proxyUrl(): string {\n if (typeof window !== 'undefined' && window.location) {\n return handleValueOrFn(this.#proxyUrl, new URL(window.location.href), '');\n }\n if (typeof this.#proxyUrl === 'function') {\n throw new Error('Unsupported customProxyUrl type: function');\n }\n return this.#proxyUrl || '';\n }\n\n get mode(): 'browser' | 'server' {\n return this._mode;\n }\n\n /**\n * @internal\n */\n public _internal_getOption<K extends keyof TernSecureAuthOptions>(\n key: K,\n ): TernSecureAuthOptions[K] | undefined {\n return this.ternauth?._internal_getOption\n ? this.ternauth?._internal_getOption(key)\n : this.options[key];\n }\n\n /**\n * @internal\n */\n public _internal_getAllOptions(): Readonly<TernSecureAuthOptions> {\n return Object.freeze({ ...this.options });\n }\n\n constructor(options: IsoTernSecureAuthOptions) {\n const { TernSecureAuth = null } = options || {};\n this.#domain = options.ternSecureConfig?.authDomain;\n this.options = { ...options };\n this._mode = inBrowser() ? 'browser' : 'server';\n this.#apiUrl = this.options.apiUrl;\n this.TernSecureAuth = TernSecureAuth;\n\n if (!this.options.sdkMetadata) {\n this.options.sdkMetadata = SDK_METADATA;\n }\n }\n\n get sdkMetadata() {\n return this.ternauth?.sdkMetadata || this.options.sdkMetadata;\n }\n\n get version() {\n return this.ternauth?.version;\n }\n\n get instanceType() {\n return this.ternauth?.instanceType;\n }\n\n get apiUrl() {\n return this.#apiUrl || '';\n }\n\n initTernSecureAuth() {\n if (this._mode !== 'browser' || this.isReady) {\n return;\n }\n\n const tern = TernSecureAuthImpl.initialize(this.options);\n this.loadTernSecureAuth(tern);\n }\n\n private loadTernSecureAuth = (ternauth: TernSecureAuthProps | undefined) => {\n if (!ternauth) {\n throw new Error('TernAuth instance is not initialized');\n }\n\n this.ternauth = ternauth;\n this.preAddListener.forEach((listenerHandlers, listener) => {\n listenerHandlers.unsubscribe = ternauth.addListener(listener);\n });\n\n this.#eventBus.getListeners('status').forEach(listener => {\n this.on('status', listener, { notify: true });\n });\n\n if (typeof this.ternauth.status === 'undefined') {\n console.log(\n '[IsoTernSecureAuth] TernSecureAuth has no status, setting internal status to ready',\n );\n this.#status = 'ready';\n this.#eventBus.emit(ternEvents.Status, 'ready');\n }\n\n return this.ternauth;\n };\n\n public on: TernSecureAuth['on'] = (...args) => {\n if (this.ternauth?.on) {\n return this.ternauth.on(...args);\n } else {\n return this.#eventBus.on(...args);\n }\n };\n\n public off: TernSecureAuth['off'] = (...args) => {\n if (this.ternauth?.off) {\n return this.ternauth.off(...args);\n } else {\n return this.#eventBus.off(...args);\n }\n };\n\n addListener = (listener: ListenerCallback): UnsubscribeCallback => {\n if (this.ternauth) {\n return this.ternauth.addListener(listener);\n } else {\n const unsubscribe = () => {\n const listenerHandlers = this.preAddListener.get(listener);\n if (listenerHandlers) {\n listenerHandlers.unsubscribe();\n this.preAddListener.delete(listener);\n }\n };\n this.preAddListener.set(listener, { unsubscribe });\n return unsubscribe;\n }\n };\n\n createActiveSession = (params: CreateActiveSessionParams): Promise<void> => {\n if (this.ternauth) {\n return this.ternauth.createActiveSession(params);\n } else {\n return Promise.reject(new Error('TernSecureAuth not initialized'));\n }\n };\n\n signOut = async (options?: SignOutOptions): Promise<void> => {\n if (!this.ternauth) {\n throw new Error('TernSecureAuth not initialized');\n }\n await this.ternauth.signOut();\n };\n\n get currentSession(): SignedInSession | null {\n if (!this.ternauth) {\n return null;\n }\n return this.ternauth.currentSession;\n }\n\n onAuthStateChanged(callback: (user: any) => void): () => void {\n if (!this.ternauth) {\n console.warn(\n '[IsoTernSecureAuth] TernAuth not initialized, cannot set up auth state listener',\n );\n return () => {};\n }\n return this.ternauth.onAuthStateChanged(callback);\n }\n\n getRedirectResult = async (): Promise<any> => {\n if (!this.ternauth?.getRedirectResult) {\n throw new Error('TernSecure instance not initialized');\n }\n return this.ternauth.getRedirectResult();\n };\n\n constructUrlWithAuthRedirect = (to: string): string => {\n if (this.ternauth && this.isReady) {\n return this.ternauth.constructUrlWithAuthRedirect(to);\n }\n return '';\n };\n\n navigate = (to: string) => {\n if (this.ternauth && this.isReady) {\n this.ternauth.navigate(to);\n }\n };\n\n redirectToSignIn = async (options?: SignInRedirectOptions) => {\n if (this.ternauth?.redirectToSignIn) {\n this.ternauth.redirectToSignIn(options);\n }\n };\n\n redirectToSignUp = async (options?: SignUpRedirectOptions) => {\n if (this.ternauth?.redirectToSignUp) {\n this.ternauth.redirectToSignUp();\n }\n };\n\n redirectAfterSignIn = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignIn) {\n this.ternauth.redirectAfterSignIn();\n }\n };\n\n redirectAfterSignUp = (redirectUrl?: string): void => {\n if (this.ternauth?.redirectAfterSignUp) {\n this.ternauth.redirectAfterSignUp();\n }\n };\n\n #awaitForTernSecureAuth(): Promise<TernSecureAuthProps> {\n return new Promise<TernSecureAuthProps>(resolve => {\n resolve(this.ternauth);\n });\n }\n\n initialize = async (): Promise<void> => {\n this.initTernSecureAuth();\n try {\n await this.#awaitForTernSecureAuth();\n } catch (error) {\n console.error('[IsomorphicTernSecure] Failed to initialize TernSecureAuth:', error);\n throw error;\n }\n };\n}\n"],"mappings":"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","names":["TernSecureAuthImpl","createTernAuthEventBus","ternEvents","handleValueOrFn","SDK_METADATA","inBrowser","IsoTernSecureAuth","#status","#apiUrl","#domain","#proxyUrl","#eventBus","#instance","options","key","TernSecureAuth","tern","ternauth","listenerHandlers","listener","args","unsubscribe","params","callback","to","redirectUrl","#awaitForTernSecureAuth","resolve","error"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tern-secure/react",
3
- "version": "1.2.0-canary.v20251023005301",
3
+ "version": "1.2.0-canary.v20251028151628",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/TernSecure/auth.git",
@@ -36,9 +36,9 @@
36
36
  "tailwind-merge": "^2.5.5",
37
37
  "tailwindcss-animate": "^1.0.7",
38
38
  "tslib": "2.4.1",
39
- "@tern-secure/auth": "1.1.0-canary.v20251023005301",
40
- "@tern-secure/shared": "1.3.0-canary.v20251023005301",
41
- "@tern-secure/types": "1.1.0-canary.v20251023005301"
39
+ "@tern-secure/auth": "1.1.0-canary.v20251028151628",
40
+ "@tern-secure/shared": "1.3.0-canary.v20251028151628",
41
+ "@tern-secure/types": "1.1.0-canary.v20251028151628"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@tailwindcss/cli": "^4.1.6",