{"version":3,"file":"index.cjs.ts","sources":["../src/SanctumContext.tsx","../src/Sanctum.tsx","../src/withSanctum.tsx","../src/useSanctum.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport interface ContextProps {\n  user: null | any;\n  authenticated: null | boolean;\n  signIn: (\n    username: string,\n    password: string,\n    remember?: boolean\n  ) => Promise<{ twoFactor: boolean; signedIn: boolean }>;\n  signOut: () => Promise<void>;\n  twoFactorChallenge: (code: string, recovery?: boolean) => Promise<{}>;\n  setUser: (user: object, authenticated?: boolean) => void;\n  checkAuthentication: () => Promise<boolean>;\n}\n\nconst SanctumContext = React.createContext<ContextProps | undefined>(undefined);\n\nexport default SanctumContext;\n","import React, { useEffect, useState, useMemo } from \"react\";\nimport axios, { AxiosInstance } from \"axios\";\nimport SanctumContext from \"./SanctumContext\";\n\naxios.defaults.withCredentials = true;\n\nexport interface ConfigProps {\n  apiUrl: string;\n  csrfCookieRoute: string;\n  signInRoute: string;\n  signOutRoute: string;\n  userObjectRoute: string;\n  twoFactorChallengeRoute?: string;\n  axiosInstance?: AxiosInstance;\n  usernameKey?: string;\n}\n\ninterface Props {\n  config: ConfigProps;\n  checkOnInit?: boolean;\n  children: React.ReactNode;\n}\n\nconst Sanctum: React.FC<Props> = ({ checkOnInit = true, config, children }) => {\n  const localAxiosInstance = useMemo(\n    () => config.axiosInstance || axios.create(),\n    [config.axiosInstance]\n  );\n\n  const [sanctumState, setSanctumState] = useState<{\n    user: null | {};\n    authenticated: null | boolean;\n  }>({ user: null, authenticated: null });\n  const user = sanctumState.user;\n  const authenticated = sanctumState.authenticated;\n\n  useEffect(() => {\n    if (checkOnInit) {\n      checkAuthentication();\n    }\n  }, [checkOnInit]);\n\n  const csrf = () => {\n    const { apiUrl, csrfCookieRoute } = config;\n    return localAxiosInstance.get(`${apiUrl}/${csrfCookieRoute}`);\n  };\n\n  const signIn = (\n    username: string,\n    password: string,\n    remember: boolean = false\n  ): Promise<{ twoFactor: boolean; signedIn: boolean; user?: {} }> => {\n    const { apiUrl, signInRoute, usernameKey } = config;\n\n    return new Promise(async (resolve, reject) => {\n      try {\n        // Get CSRF cookie.\n        await csrf();\n\n        // Sign in.\n        const { data: signInData } = await localAxiosInstance.post(\n          `${apiUrl}/${signInRoute}`,\n          {\n            [usernameKey || \"email\"]: username,\n            password,\n            remember: remember ? true : null,\n          },\n          {\n            maxRedirects: 0,\n            withCredentials: true,\n          }\n        );\n\n        // Handle two factor.\n        if (typeof signInData === \"object\" && signInData.two_factor === true) {\n          return resolve({ twoFactor: true, signedIn: false });\n        }\n\n        // Fetch user.\n        const user = await revalidate();\n\n        return resolve({ twoFactor: false, signedIn: true, user });\n      } catch (error) {\n        return reject(error);\n      }\n    });\n  };\n\n  const twoFactorChallenge = (\n    code: string,\n    recovery: boolean = false\n  ): Promise<{}> => {\n    const { apiUrl, twoFactorChallengeRoute } = config;\n\n    return new Promise(async (resolve, reject) => {\n      try {\n        // The user can either use their OTP token or use a recovery code.\n        const formData = recovery ? { recovery_code: code } : { code };\n\n        await localAxiosInstance.post(\n          `${apiUrl}/${twoFactorChallengeRoute}`,\n          formData,\n          {\n            withCredentials: true,\n          }\n        );\n\n        // Fetch user.\n        const user = await revalidate();\n\n        return resolve(user);\n      } catch (error) {\n        return reject(error);\n      }\n    });\n  };\n\n  const signOut = () => {\n    const { apiUrl, signOutRoute } = config;\n\n    return new Promise<void>(async (resolve, reject) => {\n      try {\n        await localAxiosInstance.post(`${apiUrl}/${signOutRoute}`, null, {\n          withCredentials: true,\n        });\n        // Only sign out after the server has successfully responded.\n        setSanctumState({ user: null, authenticated: false });\n        resolve();\n      } catch (error) {\n        return reject(error);\n      }\n    });\n  };\n\n  const setUser = (user: object, authenticated: boolean = true) => {\n    setSanctumState({ user, authenticated });\n  };\n\n  const revalidate = (): Promise<boolean | { user: {} }> => {\n    const { apiUrl, userObjectRoute } = config;\n\n    return new Promise(async (resolve, reject) => {\n      try {\n        const { data } = await localAxiosInstance.get(\n          `${apiUrl}/${userObjectRoute}`,\n          {\n            maxRedirects: 0,\n          }\n        );\n\n        setUser(data);\n\n        resolve(data);\n      } catch (error) {\n        if (axios.isAxiosError(error)) {\n          if (error.response && error.response.status === 401) {\n            // If there's a 401 error the user is not signed in.\n            setSanctumState({ user: null, authenticated: false });\n            return resolve(false);\n          } else {\n            // If there's any other error, something has gone wrong.\n            return reject(error);\n          }\n        } else {\n          return reject(error);\n        }\n      }\n    });\n  };\n\n  const checkAuthentication = (): Promise<boolean> => {\n    return new Promise(async (resolve, reject) => {\n      if (authenticated === null) {\n        // The status is null if we haven't checked it, so we have to make a request.\n        try {\n          await revalidate();\n          return resolve(true);\n        } catch (error) {\n          if (axios.isAxiosError(error)) {\n            if (error.response && error.response.status === 401) {\n              // If there's a 401 error the user is not signed in.\n              setSanctumState({ user: null, authenticated: false });\n              return resolve(false);\n            } else {\n              // If there's any other error, something has gone wrong.\n              return reject(error);\n            }\n          } else {\n            return reject(error);\n          }\n        }\n      } else {\n        // If it has been checked with the server before, we can just return the state.\n        return resolve(authenticated);\n      }\n    });\n  };\n\n  return (\n    <SanctumContext.Provider\n      children={children || null}\n      value={{\n        user,\n        authenticated,\n        signIn,\n        twoFactorChallenge,\n        signOut,\n        setUser,\n        checkAuthentication,\n      }}\n    />\n  );\n};\n\nexport default Sanctum;\n","import * as React from \"react\";\n\nimport SanctumContext from \"./SanctumContext\";\n\nconst withSanctum = (Component: React.ComponentType<any>) => {\n  const displayName = `withSanctum(${Component.displayName || Component.name})`;\n\n  const C = (props: any) => {\n    return (\n      <SanctumContext.Consumer>\n        {(context) => {\n          if (!context)\n            throw new Error(\n              `<${displayName} /> should only be used inside <Sanctum />`\n            );\n          return <Component {...props} {...context} />;\n        }}\n      </SanctumContext.Consumer>\n    );\n  };\n\n  C.displayName = displayName;\n\n  return C;\n};\n\nexport default withSanctum;\n","import * as React from \"react\";\n\nimport SanctumContext, { ContextProps } from \"./SanctumContext\";\n\ninterface useSanctumReturn<T> extends ContextProps {\n  user: T;\n}\n\nexport default function useSanctum<T = null | any>(): useSanctumReturn<T> {\n  const context = React.useContext(SanctumContext);\n  if (!context)\n    throw new Error(\"useSanctum should only be used inside <Sanctum />\");\n  return context;\n};\n\n"],"names":["React","axios","useMemo","useState","useEffect"],"mappings":"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"}