@descope/react-sdk 1.0.1 → 1.0.3

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.
package/README.md CHANGED
@@ -106,7 +106,7 @@ const App = () => {
106
106
  // and will throw an exception if this requirement is not met
107
107
  const { isAuthenticated, isSessionLoading } = useSession()
108
108
  const { user, isUserLoading } = useUser()
109
- const { logout } = useDescope()
109
+ const sdk = useDescope()
110
110
 
111
111
  if(isSessionLoading || isUserLoading){
112
112
  return <p>Loading...</p>
@@ -115,7 +115,7 @@ const App = () => {
115
115
  if(isAuthenticated){
116
116
  return (
117
117
  <p>Hello ${user.name}</p>
118
- <button onClick={logout}>Logout</div>
118
+ <button onClick={sdk.logout}>Logout</div>
119
119
  )
120
120
  }
121
121
 
@@ -123,6 +123,8 @@ const App = () => {
123
123
  }
124
124
  ```
125
125
 
126
+ **For more SDK usage examples refer to [docs](https://docs.descope.com/build/guides/client_sdks/)**
127
+
126
128
  #### Session token server validation (pass session token to server API)
127
129
 
128
130
  When developing a full-stack application, it is common to have private server API which requires a valid session token:
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@descope/web-js-sdk");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(s){if("default"!==s){var o=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,o.get?o:{enumerable:!0,get:function(){return e[s]}})}})),t.default=e,Object.freeze(t)}var r=s(e),n=s(t);const u=r.default.createContext(void 0),i=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},a=e=>(...t)=>{let s;try{s=e(...t)}catch(e){console.error(e)}return s},l={"x-descope-sdk-name":"react","x-descope-sdk-version":"1.0.1"},c="undefined"!=typeof window;let d;const f=e=>{const t=n.default({...e,persistTokens:c,autoRefresh:c});return d=t,t};d=f({projectId:"temp pid"});const p=()=>c?d?.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),g=()=>c?d?.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),h=a(((e=p(),t)=>d?.getJwtPermissions(e,t))),k=a(((e=p(),t)=>d?.getJwtRoles(e,t)));const m=({projectId:t,baseUrl:s,sessionTokenViaCookie:o,children:n})=>{const[a,c]=e.useState(),[d,p]=e.useState(),[g,h]=e.useState(!1),[k,m]=e.useState(!1),b=(({projectId:t,baseUrl:s,sessionTokenViaCookie:o})=>e.useMemo((()=>{if(t)return f({projectId:t,baseUrl:s,sessionTokenViaCookie:o,baseHeaders:l,persistToken:!0,autoRefresh:!0})}),[t,s,o]))({projectId:t,baseUrl:s,sessionTokenViaCookie:o});e.useEffect((()=>{if(b){const e=b.onSessionTokenChange(p),t=b.onUserChange(c);return()=>{e(),t()}}}),[b]);const w=e.useCallback((()=>{m(!0),i(b?.refresh)().then((()=>{m(!1)}))}),[b]),S=e.useCallback((()=>{h(!0),i(b.me)().then((()=>{h(!1)}))}),[b]),v=e.useCallback(i(b?.logoutAll),[b]),U=e.useCallback(i(b?.logout),[b]),y=e.useMemo((()=>({fetchUser:S,user:a,isUserLoading:g,fetchSession:w,session:d,isSessionLoading:k,logout:U,logoutAll:v,projectId:t,baseUrl:s,setUser:c,setSession:p,sdk:b})),[S,a,g,w,d,k,U,v,t,s,c,p,b]);return r.default.createElement(u.Provider,{value:y},n)};m.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const b=e.lazy((async()=>((await Promise.resolve().then((function(){return o(require("@descope/web-component"))}))).default.sdkConfigOverrides={baseHeaders:l},{default:({projectId:e,flowId:t,baseUrl:s,innerRef:o,tenant:n,theme:u,debug:i,telemetryKey:a,redirectUrl:l,autoFocus:c})=>r.default.createElement("descope-wc",{"project-id":e,"flow-id":t,"base-url":s,ref:o,tenant:n,theme:u,debug:i,telemetryKey:a,"redirect-url":l,"auto-focus":c})}))),w=r.default.forwardRef((({flowId:t,onSuccess:s,onError:o,tenant:n,theme:i,debug:a,telemetryKey:l,redirectUrl:c,autoFocus:d},f)=>{const[p,g]=e.useState(null);e.useImperativeHandle(f,(()=>p));const{projectId:h,baseUrl:k,setUser:m,setSession:w,sdk:S}=r.default.useContext(u),v=e.useCallback((async e=>{m(e.detail?.user);const t=e.detail?.sessionJwt;w(t),await S.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),s&&s(e)}),[m,w,s]);return e.useEffect((()=>{const e=p;return e?.addEventListener("success",v),o&&e?.addEventListener("error",o),()=>{o&&e?.removeEventListener("error",o),e?.removeEventListener("success",v)}}),[p,o,v]),r.default.createElement("form",null,r.default.createElement(e.Suspense,{fallback:null},r.default.createElement(b,{projectId:h,flowId:t,baseUrl:k,innerRef:g,tenant:n,theme:i,debug:a,telemetryKey:l,redirectUrl:c,autoFocus:d})))}));w.defaultProps={onError:void 0,onSuccess:void 0};var S=()=>{const t=e.useContext(u);if(!t)throw Error("You can only use this hook in the context of <AuthProvider />");return t};exports.AuthProvider=m,exports.Descope=w,exports.SignInFlow=e=>r.default.createElement(w,{...e,flowId:"sign-in"}),exports.SignUpFlow=e=>r.default.createElement(w,{...e,flowId:"sign-up"}),exports.SignUpOrInFlow=e=>r.default.createElement(w,{...e,flowId:"sign-up-or-in"}),exports.getJwtPermissions=h,exports.getJwtRoles=k,exports.getRefreshToken=g,exports.getSessionToken=p,exports.refresh=(e=g())=>d?.refresh(e),exports.useDescope=()=>{const{logout:t,logoutAll:s}=S();return e.useMemo((()=>({logoutAll:s,logout:t})),[s,t])},exports.useSession=()=>{const{session:t,isSessionLoading:s,fetchSession:o}=S(),r=e.useRef(s);return e.useMemo((()=>{r.current=s}),[s]),e.useMemo((()=>{t||s||(r.current=!0)}),[o]),e.useEffect((()=>{t||s||o()}),[o]),{isSessionLoading:r.current,sessionToken:t,isAuthenticated:!!t}},exports.useUser=()=>{const{user:t,fetchUser:s,isUserLoading:o,session:r}=S(),[n,u]=e.useState(!1),i=e.useRef(o),a=e.useMemo((()=>!t&&!o&&r&&!n),[s,r,n]);return e.useMemo((()=>{i.current=o}),[o]),e.useMemo((()=>{a&&(i.current=!0)}),[a]),e.useEffect((()=>{a&&(u(!0),s())}),[a]),{isUserLoading:i.current,user:t}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@descope/web-js-sdk");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var o=r(e),n=r(t);const u=o.default.createContext(void 0),i=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},a=e=>(...t)=>{let r;try{r=e(...t)}catch(e){console.error(e)}return r},c={"x-descope-sdk-name":"react","x-descope-sdk-version":"1.0.3"},d="undefined"!=typeof window;let l;const f=e=>{const t=n.default({...e,persistTokens:d,autoRefresh:d});return l=t,t};l=f({projectId:"temp pid"});const p=()=>d?l?.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),h=()=>d?l?.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),m=a(((e=p(),t)=>l?.getJwtPermissions(e,t))),k=a(((e=p(),t)=>l?.getJwtRoles(e,t)));const b=({projectId:t,baseUrl:r,sessionTokenViaCookie:s,children:n})=>{const[a,d]=e.useState(),[l,p]=e.useState(),[h,m]=e.useState(!1),[k,b]=e.useState(!1),g=(({projectId:t,baseUrl:r,sessionTokenViaCookie:s})=>e.useMemo((()=>{if(t)return f({projectId:t,baseUrl:r,sessionTokenViaCookie:s,baseHeaders:c,persistToken:!0,autoRefresh:!0})}),[t,r,s]))({projectId:t,baseUrl:r,sessionTokenViaCookie:s});e.useEffect((()=>{if(g){const e=g.onSessionTokenChange(p),t=g.onUserChange(d);return()=>{e(),t()}}}),[g]);const w=e.useCallback((()=>{b(!0),i(g?.refresh)().then((()=>{b(!1)}))}),[g]),y=e.useCallback((()=>{m(!0),i(g.me)().then((()=>{m(!1)}))}),[g]),S=e.useMemo((()=>({fetchUser:y,user:a,isUserLoading:h,fetchSession:w,session:l,isSessionLoading:k,projectId:t,baseUrl:r,setUser:d,setSession:p,sdk:g})),[y,a,h,w,l,k,t,r,d,p,g]);return o.default.createElement(u.Provider,{value:S},n)};b.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const g=e.lazy((async()=>((await Promise.resolve().then((function(){return s(require("@descope/web-component"))}))).default.sdkConfigOverrides={baseHeaders:c},{default:({projectId:e,flowId:t,baseUrl:r,innerRef:s,tenant:n,theme:u,debug:i,telemetryKey:a,redirectUrl:c,autoFocus:d})=>o.default.createElement("descope-wc",{"project-id":e,"flow-id":t,"base-url":r,ref:s,tenant:n,theme:u,debug:i,telemetryKey:a,"redirect-url":c,"auto-focus":d})}))),w=o.default.forwardRef((({flowId:t,onSuccess:r,onError:s,tenant:n,theme:i,debug:a,telemetryKey:c,redirectUrl:d,autoFocus:l},f)=>{const[p,h]=e.useState(null);e.useImperativeHandle(f,(()=>p));const{projectId:m,baseUrl:k,sdk:b}=o.default.useContext(u),w=e.useCallback((async e=>{await b.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),r&&r(e)}),[r]);return e.useEffect((()=>{const e=p;return e?.addEventListener("success",w),s&&e?.addEventListener("error",s),()=>{s&&e?.removeEventListener("error",s),e?.removeEventListener("success",w)}}),[p,s,w]),o.default.createElement("form",null,o.default.createElement(e.Suspense,{fallback:null},o.default.createElement(g,{projectId:m,flowId:t,baseUrl:k,innerRef:h,tenant:n,theme:i,debug:a,telemetryKey:c,redirectUrl:d,autoFocus:l})))}));w.defaultProps={onError:void 0,onSuccess:void 0};var y=()=>{const t=e.useContext(u);if(!t)throw Error("You can only use this hook in the context of <AuthProvider />");return t};const S=e=>`You can only use this ${e} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`,v={get(e,t){if("object"==typeof e[t]&&null!==e[t])return new Proxy(e[t],v);if("function"==typeof e[t])return()=>{throw Error(S("function"))};throw Error(S("attribute"))}};exports.AuthProvider=b,exports.Descope=w,exports.SignInFlow=e=>o.default.createElement(w,{...e,flowId:"sign-in"}),exports.SignUpFlow=e=>o.default.createElement(w,{...e,flowId:"sign-up"}),exports.SignUpOrInFlow=e=>o.default.createElement(w,{...e,flowId:"sign-up-or-in"}),exports.getJwtPermissions=m,exports.getJwtRoles=k,exports.getRefreshToken=h,exports.getSessionToken=p,exports.refresh=(e=h())=>l?.refresh(e),exports.useDescope=()=>{const{sdk:t}=y();return e.useMemo((()=>t||new Proxy(f({projectId:"dummy"}),v)),[t])},exports.useSession=()=>{const{session:t,isSessionLoading:r,fetchSession:s}=y(),o=e.useRef(r);return e.useMemo((()=>{o.current=r}),[r]),e.useMemo((()=>{t||r||(o.current=!0)}),[s]),e.useEffect((()=>{t||r||s()}),[s]),{isSessionLoading:o.current,sessionToken:t,isAuthenticated:!!t}},exports.useUser=()=>{const{user:t,fetchUser:r,isUserLoading:s,session:o}=y(),[n,u]=e.useState(!1),i=e.useRef(s),a=e.useMemo((()=>!t&&!s&&o&&!n),[r,o,n]);return e.useMemo((()=>{i.current=s}),[s]),e.useMemo((()=>{a&&(i.current=!0)}),[a]),e.useEffect((()=>{a&&(u(!0),r())}),[a]),{isUserLoading:i.current,user:t}};
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/hooks/Context.ts","../../src/utils.ts","../../src/constants.ts","../../src/sdk.ts","../../src/components/AuthProvider/AuthProvider.tsx","../../src/components/AuthProvider/useSdk.ts","../../src/components/Descope.tsx","../../src/hooks/useContext.ts","../../src/components/DefaultFlows.tsx","../../src/hooks/useDescope.ts","../../src/hooks/useSession.ts","../../src/hooks/useUser.ts"],"sourcesContent":["import React from 'react';\nimport { IContext } from '../types';\n\nconst Context = React.createContext<IContext>(undefined);\n\nexport default Context;\n","/**\n * Wrap a function with a validation that it exists\n * @param fn The function to wrap with the validation\n * @throws if function does not exist, an error with the relevant message will be thrown\n */\nexport const withValidation =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tif (!fn) {\n\t\t\tthrow Error(\n\t\t\t\t`You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`\n\t\t\t);\n\t\t}\n\t\treturn fn(...args);\n\t};\n\nexport const wrapInTry =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tlet res: U;\n\t\ttry {\n\t\t\tres = fn(...args);\n\t\t} catch (err) {\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t}\n\t\treturn res;\n\t};\n","declare const BUILD_VERSION: string;\n\n// eslint-disable-next-line import/prefer-default-export\nexport const baseHeaders = {\n\t'x-descope-sdk-name': 'react',\n\t'x-descope-sdk-version': BUILD_VERSION\n};\n\n// This sdk can be used in SSR apps\nexport const IS_BROWSER = typeof window !== 'undefined';\n","import createSdk from '@descope/web-js-sdk';\nimport { IS_BROWSER } from './constants';\nimport { wrapInTry } from './utils';\n\ntype Sdk = ReturnType<typeof createSdkWrapper>;\nlet sdkInstance: Sdk;\n\nconst createSdkWrapper = <P extends Parameters<typeof createSdk>[0]>(\n\tconfig: P\n) => {\n\tconst sdk = createSdk({\n\t\t...config,\n\t\tpersistTokens: IS_BROWSER as true,\n\t\tautoRefresh: IS_BROWSER as true\n\t});\n\tsdkInstance = sdk;\n\n\treturn sdk;\n};\n\n/**\n * We want to make sure the getSessionToken fn is used only when persistTokens is on\n *\n * So we are keeping the SDK init in a single place,\n * and we are creating a temp instance in order to export the getSessionToken\n * even before the SDK was init\n */\nsdkInstance = createSdkWrapper({ projectId: 'temp pid' });\n\nexport const getSessionToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getSessionToken();\n\t}\n\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get session token is not supported in SSR');\n\treturn '';\n};\n\nexport const getRefreshToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getRefreshToken();\n\t}\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get refresh token is not supported in SSR');\n\treturn '';\n};\n\nexport const getJwtPermissions = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtPermissions(token, tenant)\n);\n\nexport const getJwtRoles = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtRoles(token, tenant)\n);\n\nexport const refresh = (token = getRefreshToken()) =>\n\tsdkInstance?.refresh(token);\n\nexport default createSdkWrapper;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport Context from '../../hooks/Context';\nimport { IContext, User } from '../../types';\nimport { withValidation } from '../../utils';\nimport useSdk from './useSdk';\n\ninterface IAuthProviderProps {\n\tprojectId: string;\n\tbaseUrl?: string;\n\t// If true, session token (jwt) will be stored on cookie. Otherwise, the session token will be\n\t// stored on local storage and can accessed with getSessionToken function\n\t// Use this option if session token will stay small (less than 1k)\n\t// NOTE: Session token can grow, especially in cases of using authorization, or adding custom claims\n\tsessionTokenViaCookie?: boolean;\n\tchildren?: JSX.Element;\n}\n\nconst AuthProvider: FC<IAuthProviderProps> = ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie,\n\tchildren\n}) => {\n\tconst [user, setUser] = useState<User>();\n\tconst [session, setSession] = useState<string>();\n\n\tconst [isUserLoading, setIsUserLoading] = useState(false);\n\tconst [isSessionLoading, setIsSessionLoading] = useState(false);\n\n\tconst sdk = useSdk({ projectId, baseUrl, sessionTokenViaCookie });\n\n\tuseEffect(() => {\n\t\tif (sdk) {\n\t\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSession);\n\t\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\n\t\t\treturn () => {\n\t\t\t\tunsubscribeSessionToken();\n\t\t\t\tunsubscribeUser();\n\t\t\t};\n\t\t}\n\t\treturn undefined;\n\t}, [sdk]);\n\n\tconst fetchSession = useCallback(() => {\n\t\tsetIsSessionLoading(true);\n\t\twithValidation(sdk?.refresh)().then(() => {\n\t\t\tsetIsSessionLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst fetchUser = useCallback(() => {\n\t\tsetIsUserLoading(true);\n\t\twithValidation(sdk.me)().then(() => {\n\t\t\tsetIsUserLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst logoutAll = useCallback(withValidation(sdk?.logoutAll), [sdk]);\n\n\tconst logout = useCallback(withValidation(sdk?.logout), [sdk]);\n\n\tconst value = useMemo<IContext>(\n\t\t() => ({\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tlogout,\n\t\t\tlogoutAll,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t}),\n\t\t[\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tlogout,\n\t\t\tlogoutAll,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t]\n\t);\n\treturn <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined,\n\tsessionTokenViaCookie: false\n};\n\nexport default AuthProvider;\n","import { useMemo } from 'react';\nimport { baseHeaders } from '../../constants';\nimport createSdk from '../../sdk';\n\ntype Config = Pick<\n\tParameters<typeof createSdk>[0],\n\t'projectId' | 'baseUrl' | 'sessionTokenViaCookie'\n>;\n\nexport default ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie\n}: Config): ReturnType<typeof createSdk> =>\n\tuseMemo(() => {\n\t\tif (!projectId) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn createSdk({\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsessionTokenViaCookie,\n\t\t\tbaseHeaders,\n\t\t\tpersistToken: true,\n\t\t\tautoRefresh: true\n\t\t});\n\t}, [projectId, baseUrl, sessionTokenViaCookie]);\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n\tconst module = await import('@descope/web-component');\n\t// we want to override the web-component base headers so we can tell that is was used via the React SDK\n\tmodule.default.sdkConfigOverrides = { baseHeaders };\n\n\treturn {\n\t\tdefault: ({\n\t\t\tprojectId,\n\t\t\tflowId,\n\t\t\tbaseUrl,\n\t\t\tinnerRef,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t}) => (\n\t\t\t<descope-wc\n\t\t\t\tproject-id={projectId}\n\t\t\t\tflow-id={flowId}\n\t\t\t\tbase-url={baseUrl}\n\t\t\t\tref={innerRef}\n\t\t\t\ttenant={tenant}\n\t\t\t\ttheme={theme}\n\t\t\t\tdebug={debug}\n\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\tredirect-url={redirectUrl}\n\t\t\t\tauto-focus={autoFocus}\n\t\t\t/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t(\n\t\t{\n\t\t\tflowId,\n\t\t\tonSuccess,\n\t\t\tonError,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t},\n\t\tref\n\t) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, setUser, setSession, sdk } =\n\t\t\tReact.useContext(Context);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\tasync (e: CustomEvent) => {\n\t\t\t\tsetUser(e.detail?.user);\n\t\t\t\tconst sessionJwt = e.detail?.sessionJwt;\n\t\t\t\tsetSession(sessionJwt);\n\t\t\t\t// In order to make sure all the after-hooks are running with the success response\n\t\t\t\t// we are generating a fake response with the success data and calling the http client after hook fn with it\n\t\t\t\tawait sdk.httpClient.hooks.afterRequest(\n\t\t\t\t\t{} as any,\n\t\t\t\t\tnew Response(JSON.stringify(e.detail))\n\t\t\t\t);\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tonSuccess(e);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[setUser, setSession, onSuccess]\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst ele = innerRef;\n\t\t\tele?.addEventListener('success', handleSuccess);\n\t\t\tif (onError) ele?.addEventListener('error', onError);\n\n\t\t\treturn () => {\n\t\t\t\tif (onError) ele?.removeEventListener('error', onError);\n\n\t\t\t\tele?.removeEventListener('success', handleSuccess);\n\t\t\t};\n\t\t}, [innerRef, onError, handleSuccess]);\n\n\t\treturn (\n\t\t\t/**\n\t\t\t * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n\t\t\t * this workaround is done in order to support webauthn passkeys\n\t\t\t * it can be removed once this issue will be solved\n\t\t\t * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n\t\t\t */\n\t\t\t<form>\n\t\t\t\t<Suspense fallback={null}>\n\t\t\t\t\t<DescopeWC\n\t\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\t\tflowId={flowId}\n\t\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\t\ttenant={tenant}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tdebug={debug}\n\t\t\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\t\t\tredirectUrl={redirectUrl}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t/>\n\t\t\t\t</Suspense>\n\t\t\t</form>\n\t\t);\n\t}\n);\n\nDescope.defaultProps = {\n\tonError: undefined,\n\tonSuccess: undefined\n};\n\nexport default Descope;\n","import { useContext } from 'react';\nimport Context from './Context';\n\nexport default () => {\n\tconst ctx = useContext(Context);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use this hook in the context of <AuthProvider />`\n\t\t);\n\t}\n\n\treturn ctx;\n};\n","import React from 'react';\nimport { DefaultFlowProps } from '../types';\nimport Descope from './Descope';\n\nexport const SignInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-in\" />\n);\n\nexport const SignUpFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up\" />\n);\n\nexport const SignUpOrInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up-or-in\" />\n);\n","import { useMemo } from 'react';\nimport { IAuth } from '../types';\nimport useContext from './useContext';\n\nconst useDescope = (): IAuth => {\n\tconst { logout, logoutAll } = useContext();\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tlogoutAll,\n\t\t\tlogout\n\t\t}),\n\t\t[logoutAll, logout]\n\t);\n};\n\nexport default useDescope;\n","import { useEffect, useMemo, useRef } from 'react';\nimport useContext from './useContext';\n\nconst useSession = () => {\n\tconst { session, isSessionLoading, fetchSession } = useContext();\n\n\t// when session should be received, we want the return value of \"isSessionLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isSessionLoading);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isSessionLoading;\n\t}, [isSessionLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [fetchSession]);\n\n\tuseEffect(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tfetchSession();\n\t\t}\n\t}, [fetchSession]);\n\n\treturn {\n\t\tisSessionLoading: isLoading.current,\n\t\tsessionToken: session,\n\t\tisAuthenticated: !!session\n\t};\n};\n\nexport default useSession;\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport useContext from './useContext';\n\nconst useUser = () => {\n\tconst { user, fetchUser, isUserLoading, session } = useContext();\n\tconst [isInit, setIsInit] = useState(false); // we want to get the user only in the first time we got a session\n\n\t// when session should be received, we want the return value of \"isUserLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isUserLoading);\n\n\tconst shouldFetchUser = useMemo(\n\t\t() => !user && !isUserLoading && session && !isInit,\n\t\t[fetchUser, session, isInit]\n\t);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isUserLoading;\n\t}, [isUserLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [shouldFetchUser]);\n\n\tuseEffect(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tsetIsInit(true);\n\t\t\tfetchUser();\n\t\t}\n\t}, [shouldFetchUser]);\n\n\treturn { isUserLoading: isLoading.current, user };\n};\n\nexport default useUser;\n"],"names":["Context","React","createContext","undefined","withValidation","fn","args","Error","wrapInTry","res","err","console","error","baseHeaders","IS_BROWSER","window","sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","warn","getRefreshToken","getJwtPermissions","token","tenant","getJwtRoles","AuthProvider","baseUrl","sessionTokenViaCookie","children","user","setUser","useState","session","setSession","isUserLoading","setIsUserLoading","isSessionLoading","setIsSessionLoading","useMemo","persistToken","useSdk","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","fetchSession","useCallback","refresh","then","fetchUser","me","logoutAll","logout","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","Promise","resolve","_interopNamespace","require","default","sdkConfigOverrides","flowId","innerRef","theme","debug","telemetryKey","redirectUrl","autoFocus","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","e","detail","sessionJwt","httpClient","hooks","afterRequest","Response","JSON","stringify","ele","addEventListener","removeEventListener","Suspense","fallback","ctx","props","isLoading","useRef","current","sessionToken","isAuthenticated","isInit","setIsInit","shouldFetchUser"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/hooks/Context.ts","../../src/utils.ts","../../src/constants.ts","../../src/sdk.ts","../../src/components/AuthProvider/AuthProvider.tsx","../../src/components/AuthProvider/useSdk.ts","../../src/components/Descope.tsx","../../src/hooks/useContext.ts","../../src/hooks/useDescope.ts","../../src/components/DefaultFlows.tsx","../../src/hooks/useSession.ts","../../src/hooks/useUser.ts"],"sourcesContent":["import React from 'react';\nimport { IContext } from '../types';\n\nconst Context = React.createContext<IContext>(undefined);\n\nexport default Context;\n","/**\n * Wrap a function with a validation that it exists\n * @param fn The function to wrap with the validation\n * @throws if function does not exist, an error with the relevant message will be thrown\n */\nexport const withValidation =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tif (!fn) {\n\t\t\tthrow Error(\n\t\t\t\t`You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`\n\t\t\t);\n\t\t}\n\t\treturn fn(...args);\n\t};\n\nexport const wrapInTry =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tlet res: U;\n\t\ttry {\n\t\t\tres = fn(...args);\n\t\t} catch (err) {\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t}\n\t\treturn res;\n\t};\n","declare const BUILD_VERSION: string;\n\n// eslint-disable-next-line import/prefer-default-export\nexport const baseHeaders = {\n\t'x-descope-sdk-name': 'react',\n\t'x-descope-sdk-version': BUILD_VERSION\n};\n\n// This sdk can be used in SSR apps\nexport const IS_BROWSER = typeof window !== 'undefined';\n","import createSdk from '@descope/web-js-sdk';\nimport { IS_BROWSER } from './constants';\nimport { wrapInTry } from './utils';\n\ntype Sdk = ReturnType<typeof createSdkWrapper>;\nlet sdkInstance: Sdk;\n\nconst createSdkWrapper = <P extends Parameters<typeof createSdk>[0]>(\n\tconfig: P\n) => {\n\tconst sdk = createSdk({\n\t\t...config,\n\t\tpersistTokens: IS_BROWSER as true,\n\t\tautoRefresh: IS_BROWSER as true\n\t});\n\tsdkInstance = sdk;\n\n\treturn sdk;\n};\n\n/**\n * We want to make sure the getSessionToken fn is used only when persistTokens is on\n *\n * So we are keeping the SDK init in a single place,\n * and we are creating a temp instance in order to export the getSessionToken\n * even before the SDK was init\n */\nsdkInstance = createSdkWrapper({ projectId: 'temp pid' });\n\nexport const getSessionToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getSessionToken();\n\t}\n\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get session token is not supported in SSR');\n\treturn '';\n};\n\nexport const getRefreshToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getRefreshToken();\n\t}\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get refresh token is not supported in SSR');\n\treturn '';\n};\n\nexport const getJwtPermissions = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtPermissions(token, tenant)\n);\n\nexport const getJwtRoles = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtRoles(token, tenant)\n);\n\nexport const refresh = (token = getRefreshToken()) =>\n\tsdkInstance?.refresh(token);\n\nexport default createSdkWrapper;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport Context from '../../hooks/Context';\nimport { IContext, User } from '../../types';\nimport { withValidation } from '../../utils';\nimport useSdk from './useSdk';\n\ninterface IAuthProviderProps {\n\tprojectId: string;\n\tbaseUrl?: string;\n\t// If true, session token (jwt) will be stored on cookie. Otherwise, the session token will be\n\t// stored on local storage and can accessed with getSessionToken function\n\t// Use this option if session token will stay small (less than 1k)\n\t// NOTE: Session token can grow, especially in cases of using authorization, or adding custom claims\n\tsessionTokenViaCookie?: boolean;\n\tchildren?: JSX.Element;\n}\n\nconst AuthProvider: FC<IAuthProviderProps> = ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie,\n\tchildren\n}) => {\n\tconst [user, setUser] = useState<User>();\n\tconst [session, setSession] = useState<string>();\n\n\tconst [isUserLoading, setIsUserLoading] = useState(false);\n\tconst [isSessionLoading, setIsSessionLoading] = useState(false);\n\n\tconst sdk = useSdk({ projectId, baseUrl, sessionTokenViaCookie });\n\n\tuseEffect(() => {\n\t\tif (sdk) {\n\t\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSession);\n\t\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\n\t\t\treturn () => {\n\t\t\t\tunsubscribeSessionToken();\n\t\t\t\tunsubscribeUser();\n\t\t\t};\n\t\t}\n\t\treturn undefined;\n\t}, [sdk]);\n\n\tconst fetchSession = useCallback(() => {\n\t\tsetIsSessionLoading(true);\n\t\twithValidation(sdk?.refresh)().then(() => {\n\t\t\tsetIsSessionLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst fetchUser = useCallback(() => {\n\t\tsetIsUserLoading(true);\n\t\twithValidation(sdk.me)().then(() => {\n\t\t\tsetIsUserLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst value = useMemo<IContext>(\n\t\t() => ({\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t}),\n\t\t[\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t]\n\t);\n\treturn <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined,\n\tsessionTokenViaCookie: false\n};\n\nexport default AuthProvider;\n","import { useMemo } from 'react';\nimport { baseHeaders } from '../../constants';\nimport createSdk from '../../sdk';\n\ntype Config = Pick<\n\tParameters<typeof createSdk>[0],\n\t'projectId' | 'baseUrl' | 'sessionTokenViaCookie'\n>;\n\nexport default ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie\n}: Config): ReturnType<typeof createSdk> =>\n\tuseMemo(() => {\n\t\tif (!projectId) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn createSdk({\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsessionTokenViaCookie,\n\t\t\tbaseHeaders,\n\t\t\tpersistToken: true,\n\t\t\tautoRefresh: true\n\t\t});\n\t}, [projectId, baseUrl, sessionTokenViaCookie]);\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n\tconst module = await import('@descope/web-component');\n\t// we want to override the web-component base headers so we can tell that is was used via the React SDK\n\tmodule.default.sdkConfigOverrides = { baseHeaders };\n\n\treturn {\n\t\tdefault: ({\n\t\t\tprojectId,\n\t\t\tflowId,\n\t\t\tbaseUrl,\n\t\t\tinnerRef,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t}) => (\n\t\t\t<descope-wc\n\t\t\t\tproject-id={projectId}\n\t\t\t\tflow-id={flowId}\n\t\t\t\tbase-url={baseUrl}\n\t\t\t\tref={innerRef}\n\t\t\t\ttenant={tenant}\n\t\t\t\ttheme={theme}\n\t\t\t\tdebug={debug}\n\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\tredirect-url={redirectUrl}\n\t\t\t\tauto-focus={autoFocus}\n\t\t\t/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t(\n\t\t{\n\t\t\tflowId,\n\t\t\tonSuccess,\n\t\t\tonError,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t},\n\t\tref\n\t) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, sdk } = React.useContext(Context);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\tasync (e: CustomEvent) => {\n\t\t\t\t// In order to make sure all the after-hooks are running with the success response\n\t\t\t\t// we are generating a fake response with the success data and calling the http client after hook fn with it\n\t\t\t\tawait sdk.httpClient.hooks.afterRequest(\n\t\t\t\t\t{} as any,\n\t\t\t\t\tnew Response(JSON.stringify(e.detail))\n\t\t\t\t);\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tonSuccess(e);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[onSuccess]\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst ele = innerRef;\n\t\t\tele?.addEventListener('success', handleSuccess);\n\t\t\tif (onError) ele?.addEventListener('error', onError);\n\n\t\t\treturn () => {\n\t\t\t\tif (onError) ele?.removeEventListener('error', onError);\n\n\t\t\t\tele?.removeEventListener('success', handleSuccess);\n\t\t\t};\n\t\t}, [innerRef, onError, handleSuccess]);\n\n\t\treturn (\n\t\t\t/**\n\t\t\t * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n\t\t\t * this workaround is done in order to support webauthn passkeys\n\t\t\t * it can be removed once this issue will be solved\n\t\t\t * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n\t\t\t */\n\t\t\t<form>\n\t\t\t\t<Suspense fallback={null}>\n\t\t\t\t\t<DescopeWC\n\t\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\t\tflowId={flowId}\n\t\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\t\ttenant={tenant}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tdebug={debug}\n\t\t\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\t\t\tredirectUrl={redirectUrl}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t/>\n\t\t\t\t</Suspense>\n\t\t\t</form>\n\t\t);\n\t}\n);\n\nDescope.defaultProps = {\n\tonError: undefined,\n\tonSuccess: undefined\n};\n\nexport default Descope;\n","import { useContext } from 'react';\nimport Context from './Context';\n\nexport default () => {\n\tconst ctx = useContext(Context);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use this hook in the context of <AuthProvider />`\n\t\t);\n\t}\n\n\treturn ctx;\n};\n","import { useMemo } from 'react';\nimport { Sdk } from '../types';\nimport useContext from './useContext';\nimport createSdk from '../sdk';\n\nconst generateErrorMsg = (entryType: string) =>\n\t`You can only use this ${entryType} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`;\n\n// handler which throw an error for every SDK function\nconst proxyThrowHandler = {\n\t// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\n\tget(target: Record<string, any>, key: string) {\n\t\tif (typeof target[key] === 'object' && target[key] !== null) {\n\t\t\treturn new Proxy(target[key], proxyThrowHandler);\n\t\t}\n\n\t\tif (typeof target[key] === 'function') {\n\t\t\treturn () => {\n\t\t\t\tthrow Error(generateErrorMsg('function'));\n\t\t\t};\n\t\t}\n\n\t\tthrow Error(generateErrorMsg('attribute'));\n\t}\n};\n\nconst useDescope = (): Sdk => {\n\tconst { sdk } = useContext();\n\n\treturn useMemo(() => {\n\t\tif (!sdk) {\n\t\t\t// In case the SDK is not initialized, we want to throw an error when the SDK functions are called\n\t\t\treturn new Proxy(\n\t\t\t\tcreateSdk({ projectId: 'dummy' }),\n\t\t\t\tproxyThrowHandler\n\t\t\t) as Sdk;\n\t\t}\n\n\t\treturn sdk;\n\t}, [sdk]);\n};\n\nexport default useDescope;\n","import React from 'react';\nimport { DefaultFlowProps } from '../types';\nimport Descope from './Descope';\n\nexport const SignInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-in\" />\n);\n\nexport const SignUpFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up\" />\n);\n\nexport const SignUpOrInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up-or-in\" />\n);\n","import { useEffect, useMemo, useRef } from 'react';\nimport useContext from './useContext';\n\nconst useSession = () => {\n\tconst { session, isSessionLoading, fetchSession } = useContext();\n\n\t// when session should be received, we want the return value of \"isSessionLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isSessionLoading);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isSessionLoading;\n\t}, [isSessionLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [fetchSession]);\n\n\tuseEffect(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tfetchSession();\n\t\t}\n\t}, [fetchSession]);\n\n\treturn {\n\t\tisSessionLoading: isLoading.current,\n\t\tsessionToken: session,\n\t\tisAuthenticated: !!session\n\t};\n};\n\nexport default useSession;\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport useContext from './useContext';\n\nconst useUser = () => {\n\tconst { user, fetchUser, isUserLoading, session } = useContext();\n\tconst [isInit, setIsInit] = useState(false); // we want to get the user only in the first time we got a session\n\n\t// when session should be received, we want the return value of \"isUserLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isUserLoading);\n\n\tconst shouldFetchUser = useMemo(\n\t\t() => !user && !isUserLoading && session && !isInit,\n\t\t[fetchUser, session, isInit]\n\t);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isUserLoading;\n\t}, [isUserLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [shouldFetchUser]);\n\n\tuseEffect(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tsetIsInit(true);\n\t\t\tfetchUser();\n\t\t}\n\t}, [shouldFetchUser]);\n\n\treturn { isUserLoading: isLoading.current, user };\n};\n\nexport default useUser;\n"],"names":["Context","React","createContext","undefined","withValidation","fn","args","Error","wrapInTry","res","err","console","error","baseHeaders","IS_BROWSER","window","sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","warn","getRefreshToken","getJwtPermissions","token","tenant","getJwtRoles","AuthProvider","baseUrl","sessionTokenViaCookie","children","user","setUser","useState","session","setSession","isUserLoading","setIsUserLoading","isSessionLoading","setIsSessionLoading","useMemo","persistToken","useSdk","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","fetchSession","useCallback","refresh","then","fetchUser","me","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","Promise","resolve","_interopNamespace","require","default","sdkConfigOverrides","flowId","innerRef","theme","debug","telemetryKey","redirectUrl","autoFocus","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","e","httpClient","hooks","afterRequest","Response","JSON","stringify","detail","ele","addEventListener","removeEventListener","Suspense","fallback","ctx","generateErrorMsg","entryType","proxyThrowHandler","get","target","key","Proxy","props","isLoading","useRef","current","sessionToken","isAuthenticated","isInit","setIsInit","shouldFetchUser"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -133,76 +133,126 @@ declare const createSdkWrapper: <P extends Omit<{
133
133
  whatsapp: (loginId: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
134
134
  };
135
135
  signIn: {
136
- email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
137
- sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
138
- whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
136
+ email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
137
+ maskedEmail: string;
138
+ }>>;
139
+ sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
140
+ maskedPhone: string;
141
+ }>>;
142
+ whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
143
+ maskedPhone: string;
144
+ }>>;
139
145
  };
140
146
  signUp: {
141
147
  email: (loginId: string, user?: {
142
148
  email?: string;
143
149
  name?: string;
144
150
  phone?: string;
145
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
151
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
152
+ maskedEmail: string;
153
+ }>>;
146
154
  sms: (loginId: string, user?: {
147
155
  email?: string;
148
156
  name?: string;
149
157
  phone?: string;
150
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
158
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
159
+ maskedPhone: string;
160
+ }>>;
151
161
  whatsapp: (loginId: string, user?: {
152
162
  email?: string;
153
163
  name?: string;
154
164
  phone?: string;
155
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
165
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
166
+ maskedPhone: string;
167
+ }>>;
156
168
  };
157
169
  signUpOrIn: {
158
- email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
159
- sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
160
- whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
170
+ email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
171
+ maskedEmail: string;
172
+ }>>;
173
+ sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
174
+ maskedPhone: string;
175
+ }>>;
176
+ whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
177
+ maskedPhone: string;
178
+ }>>;
161
179
  };
162
180
  update: {
163
- email: (loginId: string, email: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
181
+ email: (loginId: string, email: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<{
182
+ maskedEmail: string;
183
+ }>>;
164
184
  phone: {
165
- email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
166
- sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
167
- whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
185
+ email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
186
+ maskedPhone: string;
187
+ }>>;
188
+ sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
189
+ maskedPhone: string;
190
+ }>>;
191
+ whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
192
+ maskedPhone: string;
193
+ }>>;
168
194
  };
169
195
  };
170
196
  };
171
197
  magicLink: {
172
198
  verify: (token: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
173
199
  signIn: {
174
- email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
175
- sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
176
- whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
200
+ email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
201
+ maskedEmail: string;
202
+ }>>;
203
+ sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
204
+ maskedPhone: string;
205
+ }>>;
206
+ whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
207
+ maskedPhone: string;
208
+ }>>;
177
209
  };
178
210
  signUp: {
179
211
  email: (loginId: string, uri: string, user?: {
180
212
  email?: string;
181
213
  name?: string;
182
214
  phone?: string;
183
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
215
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
216
+ maskedEmail: string;
217
+ }>>;
184
218
  sms: (loginId: string, uri: string, user?: {
185
219
  email?: string;
186
220
  name?: string;
187
221
  phone?: string;
188
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
222
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
223
+ maskedPhone: string;
224
+ }>>;
189
225
  whatsapp: (loginId: string, uri: string, user?: {
190
226
  email?: string;
191
227
  name?: string;
192
228
  phone?: string;
193
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
229
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
230
+ maskedPhone: string;
231
+ }>>;
194
232
  };
195
233
  signUpOrIn: {
196
- email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
197
- sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
198
- whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
234
+ email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
235
+ maskedEmail: string;
236
+ }>>;
237
+ sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
238
+ maskedPhone: string;
239
+ }>>;
240
+ whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
241
+ maskedPhone: string;
242
+ }>>;
199
243
  };
200
244
  update: {
201
245
  email: (loginId: string, email: string, URI?: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
202
246
  phone: {
203
- email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
204
- sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
205
- whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
247
+ email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
248
+ maskedPhone: string;
249
+ }>>;
250
+ sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
251
+ maskedPhone: string;
252
+ }>>;
253
+ whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
254
+ maskedPhone: string;
255
+ }>>;
206
256
  };
207
257
  };
208
258
  };
@@ -289,6 +339,29 @@ declare const createSdkWrapper: <P extends Omit<{
289
339
  }, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
290
340
  update: (loginId: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.TOTPResponse>>;
291
341
  };
342
+ password: {
343
+ signUp: (loginId: string, password: string, user?: {
344
+ email?: string;
345
+ name?: string;
346
+ phone?: string;
347
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
348
+ signIn: (loginId: string, password: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
349
+ sendReset: (loginId: string, redirectUrl?: string) => Promise<_descope_core_js_sdk.SdkResponse<{
350
+ resetMethod: string;
351
+ pendingRef?: string;
352
+ linkId?: string;
353
+ maskedEmail: string;
354
+ }>>;
355
+ update: (loginId: string, newPassword: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
356
+ replace: (loginId: string, oldPassword: string, newPassword: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
357
+ policy: () => Promise<_descope_core_js_sdk.SdkResponse<{
358
+ minLength: number;
359
+ lowercase: boolean;
360
+ uppercase: boolean;
361
+ number: boolean;
362
+ nonAlphanumeric: boolean;
363
+ }>>;
364
+ };
292
365
  refresh: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
293
366
  logout: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
294
367
  logoutAll: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
@@ -411,76 +484,126 @@ declare const createSdkWrapper: <P extends Omit<{
411
484
  whatsapp: (loginId: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
412
485
  };
413
486
  signIn: {
414
- email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
415
- sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
416
- whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
487
+ email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
488
+ maskedEmail: string;
489
+ }>>;
490
+ sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
491
+ maskedPhone: string;
492
+ }>>;
493
+ whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
494
+ maskedPhone: string;
495
+ }>>;
417
496
  };
418
497
  signUp: {
419
498
  email: (loginId: string, user?: {
420
499
  email?: string;
421
500
  name?: string;
422
501
  phone?: string;
423
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
502
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
503
+ maskedEmail: string;
504
+ }>>;
424
505
  sms: (loginId: string, user?: {
425
506
  email?: string;
426
507
  name?: string;
427
508
  phone?: string;
428
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
509
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
510
+ maskedPhone: string;
511
+ }>>;
429
512
  whatsapp: (loginId: string, user?: {
430
513
  email?: string;
431
514
  name?: string;
432
515
  phone?: string;
433
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
516
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
517
+ maskedPhone: string;
518
+ }>>;
434
519
  };
435
520
  signUpOrIn: {
436
- email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
437
- sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
438
- whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
521
+ email: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
522
+ maskedEmail: string;
523
+ }>>;
524
+ sms: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
525
+ maskedPhone: string;
526
+ }>>;
527
+ whatsapp: (loginId: string) => Promise<_descope_core_js_sdk.SdkResponse<{
528
+ maskedPhone: string;
529
+ }>>;
439
530
  };
440
531
  update: {
441
- email: (loginId: string, email: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
532
+ email: (loginId: string, email: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<{
533
+ maskedEmail: string;
534
+ }>>;
442
535
  phone: {
443
- email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
444
- sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
445
- whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
536
+ email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
537
+ maskedPhone: string;
538
+ }>>;
539
+ sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
540
+ maskedPhone: string;
541
+ }>>;
542
+ whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
543
+ maskedPhone: string;
544
+ }>>;
446
545
  };
447
546
  };
448
547
  };
449
548
  magicLink: {
450
549
  verify: (token: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
451
550
  signIn: {
452
- email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
453
- sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
454
- whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
551
+ email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
552
+ maskedEmail: string;
553
+ }>>;
554
+ sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
555
+ maskedPhone: string;
556
+ }>>;
557
+ whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
558
+ maskedPhone: string;
559
+ }>>;
455
560
  };
456
561
  signUp: {
457
562
  email: (loginId: string, uri: string, user?: {
458
563
  email?: string;
459
564
  name?: string;
460
565
  phone?: string;
461
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
566
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
567
+ maskedEmail: string;
568
+ }>>;
462
569
  sms: (loginId: string, uri: string, user?: {
463
570
  email?: string;
464
571
  name?: string;
465
572
  phone?: string;
466
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
573
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
574
+ maskedPhone: string;
575
+ }>>;
467
576
  whatsapp: (loginId: string, uri: string, user?: {
468
577
  email?: string;
469
578
  name?: string;
470
579
  phone?: string;
471
- }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
580
+ }) => Promise<_descope_core_js_sdk.SdkResponse<{
581
+ maskedPhone: string;
582
+ }>>;
472
583
  };
473
584
  signUpOrIn: {
474
- email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
475
- sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
476
- whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
585
+ email: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
586
+ maskedEmail: string;
587
+ }>>;
588
+ sms: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
589
+ maskedPhone: string;
590
+ }>>;
591
+ whatsapp: (loginId: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<{
592
+ maskedPhone: string;
593
+ }>>;
477
594
  };
478
595
  update: {
479
596
  email: (loginId: string, email: string, URI?: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
480
597
  phone: {
481
- email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
482
- sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
483
- whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
598
+ email: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
599
+ maskedPhone: string;
600
+ }>>;
601
+ sms: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
602
+ maskedPhone: string;
603
+ }>>;
604
+ whatsapp: (loginId: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<{
605
+ maskedPhone: string;
606
+ }>>;
484
607
  };
485
608
  };
486
609
  };
@@ -567,6 +690,29 @@ declare const createSdkWrapper: <P extends Omit<{
567
690
  }, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
568
691
  update: (loginId: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.TOTPResponse>>;
569
692
  };
693
+ password: {
694
+ signUp: (loginId: string, password: string, user?: {
695
+ email?: string;
696
+ name?: string;
697
+ phone?: string;
698
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
699
+ signIn: (loginId: string, password: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
700
+ sendReset: (loginId: string, redirectUrl?: string) => Promise<_descope_core_js_sdk.SdkResponse<{
701
+ resetMethod: string;
702
+ pendingRef?: string;
703
+ linkId?: string;
704
+ maskedEmail: string;
705
+ }>>;
706
+ update: (loginId: string, newPassword: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
707
+ replace: (loginId: string, oldPassword: string, newPassword: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
708
+ policy: () => Promise<_descope_core_js_sdk.SdkResponse<{
709
+ minLength: number;
710
+ lowercase: boolean;
711
+ uppercase: boolean;
712
+ number: boolean;
713
+ nonAlphanumeric: boolean;
714
+ }>>;
715
+ };
570
716
  refresh: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
571
717
  logout: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
572
718
  logoutAll: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
@@ -640,10 +786,6 @@ type CustomElement<T, K extends string = ''> = Partial<T & DOMAttributes<T> & {
640
786
  ref: React.Ref<HTMLElement>;
641
787
  } & CustomEvents<`on${K}`>>;
642
788
  type DescopeCustomElement = CustomElement<DescopeWc, 'success' | 'error'>;
643
- interface IAuth {
644
- logoutAll: Sdk['logoutAll'];
645
- logout: Sdk['logout'];
646
- }
647
789
  interface DescopeProps {
648
790
  flowId: string;
649
791
  onSuccess?: DescopeCustomElement['onsuccess'];
@@ -663,7 +805,7 @@ declare const SignUpOrInFlow: (props: DefaultFlowProps) => JSX.Element;
663
805
 
664
806
  declare const Descope: React.ForwardRefExoticComponent<DescopeProps & React.RefAttributes<HTMLElement>>;
665
807
 
666
- declare const useDescope: () => IAuth;
808
+ declare const useDescope: () => Sdk;
667
809
 
668
810
  declare const useSession: () => {
669
811
  isSessionLoading: boolean;
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import e,{useMemo as t,useState as o,useEffect as s,useCallback as r,lazy as n,useImperativeHandle as i,Suspense as c,useContext as a,useRef as l}from"react";import u from"@descope/web-js-sdk";const d=e.createContext(void 0),f=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},p=e=>(...t)=>{let o;try{o=e(...t)}catch(e){console.error(e)}return o},h={"x-descope-sdk-name":"react","x-descope-sdk-version":"1.0.1"},m="undefined"!=typeof window;let g;const k=e=>{const t=u({...e,persistTokens:m,autoRefresh:m});return g=t,t};g=k({projectId:"temp pid"});const w=()=>m?g?.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),U=()=>m?g?.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),b=p(((e=w(),t)=>g?.getJwtPermissions(e,t))),v=p(((e=w(),t)=>g?.getJwtRoles(e,t))),y=(e=U())=>g?.refresh(e);const E=({projectId:n,baseUrl:i,sessionTokenViaCookie:c,children:a})=>{const[l,u]=o(),[p,m]=o(),[g,w]=o(!1),[U,b]=o(!1),v=(({projectId:e,baseUrl:o,sessionTokenViaCookie:s})=>t((()=>{if(e)return k({projectId:e,baseUrl:o,sessionTokenViaCookie:s,baseHeaders:h,persistToken:!0,autoRefresh:!0})}),[e,o,s]))({projectId:n,baseUrl:i,sessionTokenViaCookie:c});s((()=>{if(v){const e=v.onSessionTokenChange(m),t=v.onUserChange(u);return()=>{e(),t()}}}),[v]);const y=r((()=>{b(!0),f(v?.refresh)().then((()=>{b(!1)}))}),[v]),E=r((()=>{w(!0),f(v.me)().then((()=>{w(!1)}))}),[v]),I=r(f(v?.logoutAll),[v]),S=r(f(v?.logout),[v]),j=t((()=>({fetchUser:E,user:l,isUserLoading:g,fetchSession:y,session:p,isSessionLoading:U,logout:S,logoutAll:I,projectId:n,baseUrl:i,setUser:u,setSession:m,sdk:v})),[E,l,g,y,p,U,S,I,n,i,u,m,v]);return e.createElement(d.Provider,{value:j},a)};E.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const I=n((async()=>((await import("@descope/web-component")).default.sdkConfigOverrides={baseHeaders:h},{default:({projectId:t,flowId:o,baseUrl:s,innerRef:r,tenant:n,theme:i,debug:c,telemetryKey:a,redirectUrl:l,autoFocus:u})=>e.createElement("descope-wc",{"project-id":t,"flow-id":o,"base-url":s,ref:r,tenant:n,theme:i,debug:c,telemetryKey:a,"redirect-url":l,"auto-focus":u})}))),S=e.forwardRef((({flowId:t,onSuccess:n,onError:a,tenant:l,theme:u,debug:f,telemetryKey:p,redirectUrl:h,autoFocus:m},g)=>{const[k,w]=o(null);i(g,(()=>k));const{projectId:U,baseUrl:b,setUser:v,setSession:y,sdk:E}=e.useContext(d),S=r((async e=>{v(e.detail?.user);const t=e.detail?.sessionJwt;y(t),await E.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),n&&n(e)}),[v,y,n]);return s((()=>{const e=k;return e?.addEventListener("success",S),a&&e?.addEventListener("error",a),()=>{a&&e?.removeEventListener("error",a),e?.removeEventListener("success",S)}}),[k,a,S]),e.createElement("form",null,e.createElement(c,{fallback:null},e.createElement(I,{projectId:U,flowId:t,baseUrl:b,innerRef:w,tenant:l,theme:u,debug:f,telemetryKey:p,redirectUrl:h,autoFocus:m})))}));S.defaultProps={onError:void 0,onSuccess:void 0};const j=t=>e.createElement(S,{...t,flowId:"sign-in"}),C=t=>e.createElement(S,{...t,flowId:"sign-up"}),R=t=>e.createElement(S,{...t,flowId:"sign-up-or-in"});var T=()=>{const e=a(d);if(!e)throw Error("You can only use this hook in the context of <AuthProvider />");return e};const L=()=>{const{logout:e,logoutAll:o}=T();return t((()=>({logoutAll:o,logout:e})),[o,e])},x=()=>{const{session:e,isSessionLoading:o,fetchSession:r}=T(),n=l(o);return t((()=>{n.current=o}),[o]),t((()=>{e||o||(n.current=!0)}),[r]),s((()=>{e||o||r()}),[r]),{isSessionLoading:n.current,sessionToken:e,isAuthenticated:!!e}},A=()=>{const{user:e,fetchUser:r,isUserLoading:n,session:i}=T(),[c,a]=o(!1),u=l(n),d=t((()=>!e&&!n&&i&&!c),[r,i,c]);return t((()=>{u.current=n}),[n]),t((()=>{d&&(u.current=!0)}),[d]),s((()=>{d&&(a(!0),r())}),[d]),{isUserLoading:u.current,user:e}};export{E as AuthProvider,S as Descope,j as SignInFlow,C as SignUpFlow,R as SignUpOrInFlow,b as getJwtPermissions,v as getJwtRoles,U as getRefreshToken,w as getSessionToken,y as refresh,L as useDescope,x as useSession,A as useUser};
1
+ import e,{useMemo as t,useState as r,useEffect as o,useCallback as s,lazy as n,useImperativeHandle as i,Suspense as c,useContext as a,useRef as d}from"react";import u from"@descope/web-js-sdk";const l=e.createContext(void 0),f=e=>(...t)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...t)},p=e=>(...t)=>{let r;try{r=e(...t)}catch(e){console.error(e)}return r},h={"x-descope-sdk-name":"react","x-descope-sdk-version":"1.0.3"},m="undefined"!=typeof window;let k;const w=e=>{const t=u({...e,persistTokens:m,autoRefresh:m});return k=t,t};k=w({projectId:"temp pid"});const y=()=>m?k?.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),g=()=>m?k?.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),b=p(((e=y(),t)=>k?.getJwtPermissions(e,t))),U=p(((e=y(),t)=>k?.getJwtRoles(e,t))),v=(e=g())=>k?.refresh(e);const E=({projectId:n,baseUrl:i,sessionTokenViaCookie:c,children:a})=>{const[d,u]=r(),[p,m]=r(),[k,y]=r(!1),[g,b]=r(!1),U=(({projectId:e,baseUrl:r,sessionTokenViaCookie:o})=>t((()=>{if(e)return w({projectId:e,baseUrl:r,sessionTokenViaCookie:o,baseHeaders:h,persistToken:!0,autoRefresh:!0})}),[e,r,o]))({projectId:n,baseUrl:i,sessionTokenViaCookie:c});o((()=>{if(U){const e=U.onSessionTokenChange(m),t=U.onUserChange(u);return()=>{e(),t()}}}),[U]);const v=s((()=>{b(!0),f(U?.refresh)().then((()=>{b(!1)}))}),[U]),E=s((()=>{y(!0),f(U.me)().then((()=>{y(!1)}))}),[U]),I=t((()=>({fetchUser:E,user:d,isUserLoading:k,fetchSession:v,session:p,isSessionLoading:g,projectId:n,baseUrl:i,setUser:u,setSession:m,sdk:U})),[E,d,k,v,p,g,n,i,u,m,U]);return e.createElement(l.Provider,{value:I},a)};E.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const I=n((async()=>((await import("@descope/web-component")).default.sdkConfigOverrides={baseHeaders:h},{default:({projectId:t,flowId:r,baseUrl:o,innerRef:s,tenant:n,theme:i,debug:c,telemetryKey:a,redirectUrl:d,autoFocus:u})=>e.createElement("descope-wc",{"project-id":t,"flow-id":r,"base-url":o,ref:s,tenant:n,theme:i,debug:c,telemetryKey:a,"redirect-url":d,"auto-focus":u})}))),j=e.forwardRef((({flowId:t,onSuccess:n,onError:a,tenant:d,theme:u,debug:f,telemetryKey:p,redirectUrl:h,autoFocus:m},k)=>{const[w,y]=r(null);i(k,(()=>w));const{projectId:g,baseUrl:b,sdk:U}=e.useContext(l),v=s((async e=>{await U.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),n&&n(e)}),[n]);return o((()=>{const e=w;return e?.addEventListener("success",v),a&&e?.addEventListener("error",a),()=>{a&&e?.removeEventListener("error",a),e?.removeEventListener("success",v)}}),[w,a,v]),e.createElement("form",null,e.createElement(c,{fallback:null},e.createElement(I,{projectId:g,flowId:t,baseUrl:b,innerRef:y,tenant:d,theme:u,debug:f,telemetryKey:p,redirectUrl:h,autoFocus:m})))}));j.defaultProps={onError:void 0,onSuccess:void 0};const S=t=>e.createElement(j,{...t,flowId:"sign-in"}),C=t=>e.createElement(j,{...t,flowId:"sign-up"}),R=t=>e.createElement(j,{...t,flowId:"sign-up-or-in"});var T=()=>{const e=a(l);if(!e)throw Error("You can only use this hook in the context of <AuthProvider />");return e};const L=e=>`You can only use this ${e} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`,x={get(e,t){if("object"==typeof e[t]&&null!==e[t])return new Proxy(e[t],x);if("function"==typeof e[t])return()=>{throw Error(L("function"))};throw Error(L("attribute"))}},P=()=>{const{sdk:e}=T();return t((()=>e||new Proxy(w({projectId:"dummy"}),x)),[e])},V=()=>{const{session:e,isSessionLoading:r,fetchSession:s}=T(),n=d(r);return t((()=>{n.current=r}),[r]),t((()=>{e||r||(n.current=!0)}),[s]),o((()=>{e||r||s()}),[s]),{isSessionLoading:n.current,sessionToken:e,isAuthenticated:!!e}},A=()=>{const{user:e,fetchUser:s,isUserLoading:n,session:i}=T(),[c,a]=r(!1),u=d(n),l=t((()=>!e&&!n&&i&&!c),[s,i,c]);return t((()=>{u.current=n}),[n]),t((()=>{l&&(u.current=!0)}),[l]),o((()=>{l&&(a(!0),s())}),[l]),{isUserLoading:u.current,user:e}};export{E as AuthProvider,j as Descope,S as SignInFlow,C as SignUpFlow,R as SignUpOrInFlow,b as getJwtPermissions,U as getJwtRoles,g as getRefreshToken,y as getSessionToken,v as refresh,P as useDescope,V as useSession,A as useUser};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/hooks/Context.ts","../src/utils.ts","../src/constants.ts","../src/sdk.ts","../src/components/AuthProvider/AuthProvider.tsx","../src/components/AuthProvider/useSdk.ts","../src/components/Descope.tsx","../src/components/DefaultFlows.tsx","../src/hooks/useContext.ts","../src/hooks/useDescope.ts","../src/hooks/useSession.ts","../src/hooks/useUser.ts"],"sourcesContent":["import React from 'react';\nimport { IContext } from '../types';\n\nconst Context = React.createContext<IContext>(undefined);\n\nexport default Context;\n","/**\n * Wrap a function with a validation that it exists\n * @param fn The function to wrap with the validation\n * @throws if function does not exist, an error with the relevant message will be thrown\n */\nexport const withValidation =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tif (!fn) {\n\t\t\tthrow Error(\n\t\t\t\t`You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`\n\t\t\t);\n\t\t}\n\t\treturn fn(...args);\n\t};\n\nexport const wrapInTry =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tlet res: U;\n\t\ttry {\n\t\t\tres = fn(...args);\n\t\t} catch (err) {\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t}\n\t\treturn res;\n\t};\n","declare const BUILD_VERSION: string;\n\n// eslint-disable-next-line import/prefer-default-export\nexport const baseHeaders = {\n\t'x-descope-sdk-name': 'react',\n\t'x-descope-sdk-version': BUILD_VERSION\n};\n\n// This sdk can be used in SSR apps\nexport const IS_BROWSER = typeof window !== 'undefined';\n","import createSdk from '@descope/web-js-sdk';\nimport { IS_BROWSER } from './constants';\nimport { wrapInTry } from './utils';\n\ntype Sdk = ReturnType<typeof createSdkWrapper>;\nlet sdkInstance: Sdk;\n\nconst createSdkWrapper = <P extends Parameters<typeof createSdk>[0]>(\n\tconfig: P\n) => {\n\tconst sdk = createSdk({\n\t\t...config,\n\t\tpersistTokens: IS_BROWSER as true,\n\t\tautoRefresh: IS_BROWSER as true\n\t});\n\tsdkInstance = sdk;\n\n\treturn sdk;\n};\n\n/**\n * We want to make sure the getSessionToken fn is used only when persistTokens is on\n *\n * So we are keeping the SDK init in a single place,\n * and we are creating a temp instance in order to export the getSessionToken\n * even before the SDK was init\n */\nsdkInstance = createSdkWrapper({ projectId: 'temp pid' });\n\nexport const getSessionToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getSessionToken();\n\t}\n\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get session token is not supported in SSR');\n\treturn '';\n};\n\nexport const getRefreshToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getRefreshToken();\n\t}\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get refresh token is not supported in SSR');\n\treturn '';\n};\n\nexport const getJwtPermissions = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtPermissions(token, tenant)\n);\n\nexport const getJwtRoles = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtRoles(token, tenant)\n);\n\nexport const refresh = (token = getRefreshToken()) =>\n\tsdkInstance?.refresh(token);\n\nexport default createSdkWrapper;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport Context from '../../hooks/Context';\nimport { IContext, User } from '../../types';\nimport { withValidation } from '../../utils';\nimport useSdk from './useSdk';\n\ninterface IAuthProviderProps {\n\tprojectId: string;\n\tbaseUrl?: string;\n\t// If true, session token (jwt) will be stored on cookie. Otherwise, the session token will be\n\t// stored on local storage and can accessed with getSessionToken function\n\t// Use this option if session token will stay small (less than 1k)\n\t// NOTE: Session token can grow, especially in cases of using authorization, or adding custom claims\n\tsessionTokenViaCookie?: boolean;\n\tchildren?: JSX.Element;\n}\n\nconst AuthProvider: FC<IAuthProviderProps> = ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie,\n\tchildren\n}) => {\n\tconst [user, setUser] = useState<User>();\n\tconst [session, setSession] = useState<string>();\n\n\tconst [isUserLoading, setIsUserLoading] = useState(false);\n\tconst [isSessionLoading, setIsSessionLoading] = useState(false);\n\n\tconst sdk = useSdk({ projectId, baseUrl, sessionTokenViaCookie });\n\n\tuseEffect(() => {\n\t\tif (sdk) {\n\t\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSession);\n\t\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\n\t\t\treturn () => {\n\t\t\t\tunsubscribeSessionToken();\n\t\t\t\tunsubscribeUser();\n\t\t\t};\n\t\t}\n\t\treturn undefined;\n\t}, [sdk]);\n\n\tconst fetchSession = useCallback(() => {\n\t\tsetIsSessionLoading(true);\n\t\twithValidation(sdk?.refresh)().then(() => {\n\t\t\tsetIsSessionLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst fetchUser = useCallback(() => {\n\t\tsetIsUserLoading(true);\n\t\twithValidation(sdk.me)().then(() => {\n\t\t\tsetIsUserLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst logoutAll = useCallback(withValidation(sdk?.logoutAll), [sdk]);\n\n\tconst logout = useCallback(withValidation(sdk?.logout), [sdk]);\n\n\tconst value = useMemo<IContext>(\n\t\t() => ({\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tlogout,\n\t\t\tlogoutAll,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t}),\n\t\t[\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tlogout,\n\t\t\tlogoutAll,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t]\n\t);\n\treturn <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined,\n\tsessionTokenViaCookie: false\n};\n\nexport default AuthProvider;\n","import { useMemo } from 'react';\nimport { baseHeaders } from '../../constants';\nimport createSdk from '../../sdk';\n\ntype Config = Pick<\n\tParameters<typeof createSdk>[0],\n\t'projectId' | 'baseUrl' | 'sessionTokenViaCookie'\n>;\n\nexport default ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie\n}: Config): ReturnType<typeof createSdk> =>\n\tuseMemo(() => {\n\t\tif (!projectId) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn createSdk({\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsessionTokenViaCookie,\n\t\t\tbaseHeaders,\n\t\t\tpersistToken: true,\n\t\t\tautoRefresh: true\n\t\t});\n\t}, [projectId, baseUrl, sessionTokenViaCookie]);\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n\tconst module = await import('@descope/web-component');\n\t// we want to override the web-component base headers so we can tell that is was used via the React SDK\n\tmodule.default.sdkConfigOverrides = { baseHeaders };\n\n\treturn {\n\t\tdefault: ({\n\t\t\tprojectId,\n\t\t\tflowId,\n\t\t\tbaseUrl,\n\t\t\tinnerRef,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t}) => (\n\t\t\t<descope-wc\n\t\t\t\tproject-id={projectId}\n\t\t\t\tflow-id={flowId}\n\t\t\t\tbase-url={baseUrl}\n\t\t\t\tref={innerRef}\n\t\t\t\ttenant={tenant}\n\t\t\t\ttheme={theme}\n\t\t\t\tdebug={debug}\n\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\tredirect-url={redirectUrl}\n\t\t\t\tauto-focus={autoFocus}\n\t\t\t/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t(\n\t\t{\n\t\t\tflowId,\n\t\t\tonSuccess,\n\t\t\tonError,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t},\n\t\tref\n\t) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, setUser, setSession, sdk } =\n\t\t\tReact.useContext(Context);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\tasync (e: CustomEvent) => {\n\t\t\t\tsetUser(e.detail?.user);\n\t\t\t\tconst sessionJwt = e.detail?.sessionJwt;\n\t\t\t\tsetSession(sessionJwt);\n\t\t\t\t// In order to make sure all the after-hooks are running with the success response\n\t\t\t\t// we are generating a fake response with the success data and calling the http client after hook fn with it\n\t\t\t\tawait sdk.httpClient.hooks.afterRequest(\n\t\t\t\t\t{} as any,\n\t\t\t\t\tnew Response(JSON.stringify(e.detail))\n\t\t\t\t);\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tonSuccess(e);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[setUser, setSession, onSuccess]\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst ele = innerRef;\n\t\t\tele?.addEventListener('success', handleSuccess);\n\t\t\tif (onError) ele?.addEventListener('error', onError);\n\n\t\t\treturn () => {\n\t\t\t\tif (onError) ele?.removeEventListener('error', onError);\n\n\t\t\t\tele?.removeEventListener('success', handleSuccess);\n\t\t\t};\n\t\t}, [innerRef, onError, handleSuccess]);\n\n\t\treturn (\n\t\t\t/**\n\t\t\t * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n\t\t\t * this workaround is done in order to support webauthn passkeys\n\t\t\t * it can be removed once this issue will be solved\n\t\t\t * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n\t\t\t */\n\t\t\t<form>\n\t\t\t\t<Suspense fallback={null}>\n\t\t\t\t\t<DescopeWC\n\t\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\t\tflowId={flowId}\n\t\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\t\ttenant={tenant}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tdebug={debug}\n\t\t\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\t\t\tredirectUrl={redirectUrl}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t/>\n\t\t\t\t</Suspense>\n\t\t\t</form>\n\t\t);\n\t}\n);\n\nDescope.defaultProps = {\n\tonError: undefined,\n\tonSuccess: undefined\n};\n\nexport default Descope;\n","import React from 'react';\nimport { DefaultFlowProps } from '../types';\nimport Descope from './Descope';\n\nexport const SignInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-in\" />\n);\n\nexport const SignUpFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up\" />\n);\n\nexport const SignUpOrInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up-or-in\" />\n);\n","import { useContext } from 'react';\nimport Context from './Context';\n\nexport default () => {\n\tconst ctx = useContext(Context);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use this hook in the context of <AuthProvider />`\n\t\t);\n\t}\n\n\treturn ctx;\n};\n","import { useMemo } from 'react';\nimport { IAuth } from '../types';\nimport useContext from './useContext';\n\nconst useDescope = (): IAuth => {\n\tconst { logout, logoutAll } = useContext();\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tlogoutAll,\n\t\t\tlogout\n\t\t}),\n\t\t[logoutAll, logout]\n\t);\n};\n\nexport default useDescope;\n","import { useEffect, useMemo, useRef } from 'react';\nimport useContext from './useContext';\n\nconst useSession = () => {\n\tconst { session, isSessionLoading, fetchSession } = useContext();\n\n\t// when session should be received, we want the return value of \"isSessionLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isSessionLoading);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isSessionLoading;\n\t}, [isSessionLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [fetchSession]);\n\n\tuseEffect(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tfetchSession();\n\t\t}\n\t}, [fetchSession]);\n\n\treturn {\n\t\tisSessionLoading: isLoading.current,\n\t\tsessionToken: session,\n\t\tisAuthenticated: !!session\n\t};\n};\n\nexport default useSession;\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport useContext from './useContext';\n\nconst useUser = () => {\n\tconst { user, fetchUser, isUserLoading, session } = useContext();\n\tconst [isInit, setIsInit] = useState(false); // we want to get the user only in the first time we got a session\n\n\t// when session should be received, we want the return value of \"isUserLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isUserLoading);\n\n\tconst shouldFetchUser = useMemo(\n\t\t() => !user && !isUserLoading && session && !isInit,\n\t\t[fetchUser, session, isInit]\n\t);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isUserLoading;\n\t}, [isUserLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [shouldFetchUser]);\n\n\tuseEffect(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tsetIsInit(true);\n\t\t\tfetchUser();\n\t\t}\n\t}, [shouldFetchUser]);\n\n\treturn { isUserLoading: isLoading.current, user };\n};\n\nexport default useUser;\n"],"names":["Context","React","createContext","undefined","withValidation","fn","args","Error","wrapInTry","res","err","console","error","baseHeaders","IS_BROWSER","window","sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","warn","getRefreshToken","getJwtPermissions","token","tenant","getJwtRoles","refresh","AuthProvider","baseUrl","sessionTokenViaCookie","children","user","setUser","useState","session","setSession","isUserLoading","setIsUserLoading","isSessionLoading","setIsSessionLoading","useMemo","persistToken","useSdk","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","fetchSession","useCallback","then","fetchUser","me","logoutAll","logout","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","import","default","sdkConfigOverrides","flowId","innerRef","theme","debug","telemetryKey","redirectUrl","autoFocus","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","e","detail","sessionJwt","httpClient","hooks","afterRequest","Response","JSON","stringify","ele","addEventListener","removeEventListener","Suspense","fallback","SignInFlow","props","SignUpFlow","SignUpOrInFlow","ctx","useDescope","useSession","isLoading","useRef","current","sessionToken","isAuthenticated","useUser","isInit","setIsInit","shouldFetchUser"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/hooks/Context.ts","../src/utils.ts","../src/constants.ts","../src/sdk.ts","../src/components/AuthProvider/AuthProvider.tsx","../src/components/AuthProvider/useSdk.ts","../src/components/Descope.tsx","../src/components/DefaultFlows.tsx","../src/hooks/useContext.ts","../src/hooks/useDescope.ts","../src/hooks/useSession.ts","../src/hooks/useUser.ts"],"sourcesContent":["import React from 'react';\nimport { IContext } from '../types';\n\nconst Context = React.createContext<IContext>(undefined);\n\nexport default Context;\n","/**\n * Wrap a function with a validation that it exists\n * @param fn The function to wrap with the validation\n * @throws if function does not exist, an error with the relevant message will be thrown\n */\nexport const withValidation =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tif (!fn) {\n\t\t\tthrow Error(\n\t\t\t\t`You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`\n\t\t\t);\n\t\t}\n\t\treturn fn(...args);\n\t};\n\nexport const wrapInTry =\n\t<T extends Array<any>, U>(fn: (...args: T) => U) =>\n\t(...args: T): U => {\n\t\tlet res: U;\n\t\ttry {\n\t\t\tres = fn(...args);\n\t\t} catch (err) {\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t}\n\t\treturn res;\n\t};\n","declare const BUILD_VERSION: string;\n\n// eslint-disable-next-line import/prefer-default-export\nexport const baseHeaders = {\n\t'x-descope-sdk-name': 'react',\n\t'x-descope-sdk-version': BUILD_VERSION\n};\n\n// This sdk can be used in SSR apps\nexport const IS_BROWSER = typeof window !== 'undefined';\n","import createSdk from '@descope/web-js-sdk';\nimport { IS_BROWSER } from './constants';\nimport { wrapInTry } from './utils';\n\ntype Sdk = ReturnType<typeof createSdkWrapper>;\nlet sdkInstance: Sdk;\n\nconst createSdkWrapper = <P extends Parameters<typeof createSdk>[0]>(\n\tconfig: P\n) => {\n\tconst sdk = createSdk({\n\t\t...config,\n\t\tpersistTokens: IS_BROWSER as true,\n\t\tautoRefresh: IS_BROWSER as true\n\t});\n\tsdkInstance = sdk;\n\n\treturn sdk;\n};\n\n/**\n * We want to make sure the getSessionToken fn is used only when persistTokens is on\n *\n * So we are keeping the SDK init in a single place,\n * and we are creating a temp instance in order to export the getSessionToken\n * even before the SDK was init\n */\nsdkInstance = createSdkWrapper({ projectId: 'temp pid' });\n\nexport const getSessionToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getSessionToken();\n\t}\n\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get session token is not supported in SSR');\n\treturn '';\n};\n\nexport const getRefreshToken = () => {\n\tif (IS_BROWSER) {\n\t\treturn sdkInstance?.getRefreshToken();\n\t}\n\t// eslint-disable-next-line no-console\n\tconsole.warn('Get refresh token is not supported in SSR');\n\treturn '';\n};\n\nexport const getJwtPermissions = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtPermissions(token, tenant)\n);\n\nexport const getJwtRoles = wrapInTry(\n\t(token = getSessionToken(), tenant?: string) =>\n\t\tsdkInstance?.getJwtRoles(token, tenant)\n);\n\nexport const refresh = (token = getRefreshToken()) =>\n\tsdkInstance?.refresh(token);\n\nexport default createSdkWrapper;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport Context from '../../hooks/Context';\nimport { IContext, User } from '../../types';\nimport { withValidation } from '../../utils';\nimport useSdk from './useSdk';\n\ninterface IAuthProviderProps {\n\tprojectId: string;\n\tbaseUrl?: string;\n\t// If true, session token (jwt) will be stored on cookie. Otherwise, the session token will be\n\t// stored on local storage and can accessed with getSessionToken function\n\t// Use this option if session token will stay small (less than 1k)\n\t// NOTE: Session token can grow, especially in cases of using authorization, or adding custom claims\n\tsessionTokenViaCookie?: boolean;\n\tchildren?: JSX.Element;\n}\n\nconst AuthProvider: FC<IAuthProviderProps> = ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie,\n\tchildren\n}) => {\n\tconst [user, setUser] = useState<User>();\n\tconst [session, setSession] = useState<string>();\n\n\tconst [isUserLoading, setIsUserLoading] = useState(false);\n\tconst [isSessionLoading, setIsSessionLoading] = useState(false);\n\n\tconst sdk = useSdk({ projectId, baseUrl, sessionTokenViaCookie });\n\n\tuseEffect(() => {\n\t\tif (sdk) {\n\t\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSession);\n\t\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\n\t\t\treturn () => {\n\t\t\t\tunsubscribeSessionToken();\n\t\t\t\tunsubscribeUser();\n\t\t\t};\n\t\t}\n\t\treturn undefined;\n\t}, [sdk]);\n\n\tconst fetchSession = useCallback(() => {\n\t\tsetIsSessionLoading(true);\n\t\twithValidation(sdk?.refresh)().then(() => {\n\t\t\tsetIsSessionLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst fetchUser = useCallback(() => {\n\t\tsetIsUserLoading(true);\n\t\twithValidation(sdk.me)().then(() => {\n\t\t\tsetIsUserLoading(false);\n\t\t});\n\t}, [sdk]);\n\n\tconst value = useMemo<IContext>(\n\t\t() => ({\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t}),\n\t\t[\n\t\t\tfetchUser,\n\t\t\tuser,\n\t\t\tisUserLoading,\n\t\t\tfetchSession,\n\t\t\tsession,\n\t\t\tisSessionLoading,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsetUser,\n\t\t\tsetSession,\n\t\t\tsdk\n\t\t]\n\t);\n\treturn <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined,\n\tsessionTokenViaCookie: false\n};\n\nexport default AuthProvider;\n","import { useMemo } from 'react';\nimport { baseHeaders } from '../../constants';\nimport createSdk from '../../sdk';\n\ntype Config = Pick<\n\tParameters<typeof createSdk>[0],\n\t'projectId' | 'baseUrl' | 'sessionTokenViaCookie'\n>;\n\nexport default ({\n\tprojectId,\n\tbaseUrl,\n\tsessionTokenViaCookie\n}: Config): ReturnType<typeof createSdk> =>\n\tuseMemo(() => {\n\t\tif (!projectId) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn createSdk({\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tsessionTokenViaCookie,\n\t\t\tbaseHeaders,\n\t\t\tpersistToken: true,\n\t\t\tautoRefresh: true\n\t\t});\n\t}, [projectId, baseUrl, sessionTokenViaCookie]);\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n\tconst module = await import('@descope/web-component');\n\t// we want to override the web-component base headers so we can tell that is was used via the React SDK\n\tmodule.default.sdkConfigOverrides = { baseHeaders };\n\n\treturn {\n\t\tdefault: ({\n\t\t\tprojectId,\n\t\t\tflowId,\n\t\t\tbaseUrl,\n\t\t\tinnerRef,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t}) => (\n\t\t\t<descope-wc\n\t\t\t\tproject-id={projectId}\n\t\t\t\tflow-id={flowId}\n\t\t\t\tbase-url={baseUrl}\n\t\t\t\tref={innerRef}\n\t\t\t\ttenant={tenant}\n\t\t\t\ttheme={theme}\n\t\t\t\tdebug={debug}\n\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\tredirect-url={redirectUrl}\n\t\t\t\tauto-focus={autoFocus}\n\t\t\t/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t(\n\t\t{\n\t\t\tflowId,\n\t\t\tonSuccess,\n\t\t\tonError,\n\t\t\ttenant,\n\t\t\ttheme,\n\t\t\tdebug,\n\t\t\ttelemetryKey,\n\t\t\tredirectUrl,\n\t\t\tautoFocus\n\t\t},\n\t\tref\n\t) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, sdk } = React.useContext(Context);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\tasync (e: CustomEvent) => {\n\t\t\t\t// In order to make sure all the after-hooks are running with the success response\n\t\t\t\t// we are generating a fake response with the success data and calling the http client after hook fn with it\n\t\t\t\tawait sdk.httpClient.hooks.afterRequest(\n\t\t\t\t\t{} as any,\n\t\t\t\t\tnew Response(JSON.stringify(e.detail))\n\t\t\t\t);\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tonSuccess(e);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[onSuccess]\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tconst ele = innerRef;\n\t\t\tele?.addEventListener('success', handleSuccess);\n\t\t\tif (onError) ele?.addEventListener('error', onError);\n\n\t\t\treturn () => {\n\t\t\t\tif (onError) ele?.removeEventListener('error', onError);\n\n\t\t\t\tele?.removeEventListener('success', handleSuccess);\n\t\t\t};\n\t\t}, [innerRef, onError, handleSuccess]);\n\n\t\treturn (\n\t\t\t/**\n\t\t\t * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n\t\t\t * this workaround is done in order to support webauthn passkeys\n\t\t\t * it can be removed once this issue will be solved\n\t\t\t * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n\t\t\t */\n\t\t\t<form>\n\t\t\t\t<Suspense fallback={null}>\n\t\t\t\t\t<DescopeWC\n\t\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\t\tflowId={flowId}\n\t\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\t\ttenant={tenant}\n\t\t\t\t\t\ttheme={theme}\n\t\t\t\t\t\tdebug={debug}\n\t\t\t\t\t\ttelemetryKey={telemetryKey}\n\t\t\t\t\t\tredirectUrl={redirectUrl}\n\t\t\t\t\t\tautoFocus={autoFocus}\n\t\t\t\t\t/>\n\t\t\t\t</Suspense>\n\t\t\t</form>\n\t\t);\n\t}\n);\n\nDescope.defaultProps = {\n\tonError: undefined,\n\tonSuccess: undefined\n};\n\nexport default Descope;\n","import React from 'react';\nimport { DefaultFlowProps } from '../types';\nimport Descope from './Descope';\n\nexport const SignInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-in\" />\n);\n\nexport const SignUpFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up\" />\n);\n\nexport const SignUpOrInFlow = (props: DefaultFlowProps) => (\n\t<Descope {...props} flowId=\"sign-up-or-in\" />\n);\n","import { useContext } from 'react';\nimport Context from './Context';\n\nexport default () => {\n\tconst ctx = useContext(Context);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use this hook in the context of <AuthProvider />`\n\t\t);\n\t}\n\n\treturn ctx;\n};\n","import { useMemo } from 'react';\nimport { Sdk } from '../types';\nimport useContext from './useContext';\nimport createSdk from '../sdk';\n\nconst generateErrorMsg = (entryType: string) =>\n\t`You can only use this ${entryType} after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component`;\n\n// handler which throw an error for every SDK function\nconst proxyThrowHandler = {\n\t// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\n\tget(target: Record<string, any>, key: string) {\n\t\tif (typeof target[key] === 'object' && target[key] !== null) {\n\t\t\treturn new Proxy(target[key], proxyThrowHandler);\n\t\t}\n\n\t\tif (typeof target[key] === 'function') {\n\t\t\treturn () => {\n\t\t\t\tthrow Error(generateErrorMsg('function'));\n\t\t\t};\n\t\t}\n\n\t\tthrow Error(generateErrorMsg('attribute'));\n\t}\n};\n\nconst useDescope = (): Sdk => {\n\tconst { sdk } = useContext();\n\n\treturn useMemo(() => {\n\t\tif (!sdk) {\n\t\t\t// In case the SDK is not initialized, we want to throw an error when the SDK functions are called\n\t\t\treturn new Proxy(\n\t\t\t\tcreateSdk({ projectId: 'dummy' }),\n\t\t\t\tproxyThrowHandler\n\t\t\t) as Sdk;\n\t\t}\n\n\t\treturn sdk;\n\t}, [sdk]);\n};\n\nexport default useDescope;\n","import { useEffect, useMemo, useRef } from 'react';\nimport useContext from './useContext';\n\nconst useSession = () => {\n\tconst { session, isSessionLoading, fetchSession } = useContext();\n\n\t// when session should be received, we want the return value of \"isSessionLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isSessionLoading);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isSessionLoading;\n\t}, [isSessionLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [fetchSession]);\n\n\tuseEffect(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tfetchSession();\n\t\t}\n\t}, [fetchSession]);\n\n\treturn {\n\t\tisSessionLoading: isLoading.current,\n\t\tsessionToken: session,\n\t\tisAuthenticated: !!session\n\t};\n};\n\nexport default useSession;\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport useContext from './useContext';\n\nconst useUser = () => {\n\tconst { user, fetchUser, isUserLoading, session } = useContext();\n\tconst [isInit, setIsInit] = useState(false); // we want to get the user only in the first time we got a session\n\n\t// when session should be received, we want the return value of \"isUserLoading\" to be true starting from the first call\n\t// (and not only when receiving an update from the context)\n\tconst isLoading = useRef(isUserLoading);\n\n\tconst shouldFetchUser = useMemo(\n\t\t() => !user && !isUserLoading && session && !isInit,\n\t\t[fetchUser, session, isInit]\n\t);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tisLoading.current = isUserLoading;\n\t}, [isUserLoading]);\n\n\t// we want this to happen before returning a value so we are using \"useMemo\" and not \"useEffect\"\n\tuseMemo(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tisLoading.current = true;\n\t\t}\n\t}, [shouldFetchUser]);\n\n\tuseEffect(() => {\n\t\tif (shouldFetchUser) {\n\t\t\tsetIsInit(true);\n\t\t\tfetchUser();\n\t\t}\n\t}, [shouldFetchUser]);\n\n\treturn { isUserLoading: isLoading.current, user };\n};\n\nexport default useUser;\n"],"names":["Context","React","createContext","undefined","withValidation","fn","args","Error","wrapInTry","res","err","console","error","baseHeaders","IS_BROWSER","window","sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","warn","getRefreshToken","getJwtPermissions","token","tenant","getJwtRoles","refresh","AuthProvider","baseUrl","sessionTokenViaCookie","children","user","setUser","useState","session","setSession","isUserLoading","setIsUserLoading","isSessionLoading","setIsSessionLoading","useMemo","persistToken","useSdk","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","fetchSession","useCallback","then","fetchUser","me","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","import","default","sdkConfigOverrides","flowId","innerRef","theme","debug","telemetryKey","redirectUrl","autoFocus","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","e","httpClient","hooks","afterRequest","Response","JSON","stringify","detail","ele","addEventListener","removeEventListener","Suspense","fallback","SignInFlow","props","SignUpFlow","SignUpOrInFlow","ctx","generateErrorMsg","entryType","proxyThrowHandler","get","target","key","Proxy","useDescope","useSession","isLoading","useRef","current","sessionToken","isAuthenticated","useUser","isInit","setIsInit","shouldFetchUser"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descope/react-sdk",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Descope React SDK",
5
5
  "author": "Descope Team <info@descope.com>",
6
6
  "homepage": "https://github.com/descope/react-sdk",
@@ -42,8 +42,8 @@
42
42
  ]
43
43
  },
44
44
  "dependencies": {
45
- "@descope/web-component": "2.0.5",
46
- "react-router-dom": "6.8.2"
45
+ "@descope/web-component": "2.0.14",
46
+ "react-router-dom": "6.9.0"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@babel/core": "7.21.0",
@@ -63,10 +63,10 @@
63
63
  "@types/react-dom": "18.0.11",
64
64
  "@types/react-router-dom": "^5.3.3",
65
65
  "babel-jest": "27.5.1",
66
- "eslint": "8.35.0",
66
+ "eslint": "8.36.0",
67
67
  "eslint-config-airbnb": "19.0.4",
68
68
  "eslint-config-airbnb-typescript": "17.0.0",
69
- "eslint-config-prettier": "8.6.0",
69
+ "eslint-config-prettier": "8.7.0",
70
70
  "eslint-config-standard": "17.0.0",
71
71
  "eslint-import-resolver-typescript": "2.7.1",
72
72
  "eslint-plugin-import": "2.27.5",
@@ -104,7 +104,7 @@
104
104
  "typescript": "^4.5.3"
105
105
  },
106
106
  "peerDependencies": {
107
- "@descope/web-js-sdk": "1.0.0",
107
+ "@descope/web-js-sdk": "1.0.8",
108
108
  "@types/react": ">=16",
109
109
  "react": ">=16"
110
110
  }