@descope/react-sdk 0.0.52-alpha.24 → 0.0.52-alpha.25

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
@@ -20,7 +20,7 @@ import { AuthProvider } from '@descope/react-sdk';
20
20
 
21
21
  const AppRoot = () => {
22
22
  return (
23
- <AuthProvider projectId="myProjectId">
23
+ <AuthProvider projectId="my-project-id">
24
24
  <App />
25
25
  </AuthProvider>
26
26
  );
@@ -59,11 +59,14 @@ const App = () => {
59
59
  return (
60
60
  {...}
61
61
  <Descope
62
- flowId="myFlowId"
62
+ flowId="my-flow-id"
63
63
  onSuccess={(e) => console.log('Logged in!')}
64
- onError={(e) => console.log('Could not logged in!')}
64
+ onError={(e) => console.log('Could not logged in')}
65
65
  // theme can be "light" or "dark". If empty, Descope will use the OS theme
66
66
  // theme="light"
67
+
68
+ // debug can be set to true to enable debug mode
69
+ // debug={true}
67
70
  />
68
71
  )
69
72
  }
@@ -110,33 +113,42 @@ When developing a full-stack application, it is common to have private server AP
110
113
 
111
114
  Note: Descope also provides server-side SDKs in various languages (NodeJS, Go, Python, etc). Descope's server SDKs have out-of-the-box session validation API that supports the options described bellow. To read more about session validation, Read [this section](https://docs.descope.com/guides/gettingstarted/#session-validation) in Descope documentation.
112
115
 
113
- The mechanism to pass session token depends on the Descope project's "Token response method" configuration.
116
+ There are 2 ways to achieve that:
114
117
 
115
- ##### 1. Manage in cookies
118
+ 1. Using `getSessionToken` to get the token, and pass it on the `Authorization` Header (Recommended)
119
+ 2. Passing `sessionTokenViaCookie` boolean prop to the `AuthProvider` component (Use cautiously, session token may grow, especially in cases of using authorization, or adding custom claim)
116
120
 
117
- - Descope sets session token as cookie, which automatically sent each server api request. This option is more secure and is the recommended method for managing tokens, but for this option to work well with the browser - you must also configure a CNAME record for the custom domain listed, which will give a unified log in experience and securely restrict access to the session tokens that are stored in the cookies.
121
+ ##### 1. Using `getSessionToken` to get the token
118
122
 
119
- When this option is configured, the browser will automatically add the session token cookie to the server in every request.
123
+ An example for api function, and passing the token on the `Authorization` header:
120
124
 
121
- ##### 2. Manage in response body
122
-
123
- - Descope API returns session token in body. In this option, The React application should pass session cookie (`const { sessionToken } = useAuth()`) as Authorization header. This option never requires a custom domain, and is recommended for testing or while working in a sandbox environment.
125
+ ```js
126
+ import { getSessionToken } from '@descope/react-sdk';
127
+
128
+ // fetch data using back
129
+ // Note: Descope backend SDKs support extracting session token from the Authorization header
130
+ export const fetchData = async () => {
131
+ const sessionToken = getSessionToken();
132
+ const res = await fetch('/path/to/server/api', {
133
+ headers: {
134
+ Authorization: `Bearer ${sessionToken}`
135
+ }
136
+ });
137
+ // ... use res
138
+ };
139
+ ```
124
140
 
125
- An example for using session token,
141
+ An example for component that uses `fetchData` function from above
126
142
 
127
143
  ```js
128
- import { useAuth } from '@descope/react-sdk'
144
+ // Component code
145
+ import { fetchData } from 'path/to/api/file'
129
146
  import { useCallback } from 'react'
130
147
 
131
- const App = () => {
132
- const { sessionToken } = useAuth()
133
-
148
+ const Component = () => {
134
149
  const onClick = useCallback(() => {
135
- fetch('https://localhost:3002/api/some-path' {
136
- method: 'GET',
137
- headers: { Authorization: `Bearer ${sessionToken}` }
138
- })
139
- },[sessionToken])
150
+ fetchData()
151
+ },[])
140
152
  return (
141
153
  {...}
142
154
  {
@@ -147,6 +159,28 @@ const App = () => {
147
159
  }
148
160
  ```
149
161
 
162
+ ##### 2. Passing `sessionTokenViaCookie` boolean prop to the `AuthProvider`
163
+
164
+ Passing `sessionTokenViaCookie` prop to `AuthProvider` component. Descope SDK will automatically store session token on the `DS` cookie.
165
+
166
+ Note: Use this option if session token will stay small (less than 1k). Session token can grow, especially in cases of using authorization, or adding custom claims
167
+
168
+ Example:
169
+
170
+ ```js
171
+ import { AuthProvider } from '@descope/react-sdk';
172
+
173
+ const AppRoot = () => {
174
+ return (
175
+ <AuthProvider projectId="my-project-id" sessionTokenViaCookie>
176
+ <App />
177
+ </AuthProvider>
178
+ );
179
+ };
180
+ ```
181
+
182
+ Now, whenever you call `fetch`, the cookie will automatically be sent with the request. Descope backend SDKs also support extracting the token from the `DS` cookie.
183
+
150
184
  ## Run a local example
151
185
 
152
186
  There is a simple app that uses Descope React SDK, with two routes
@@ -169,6 +203,10 @@ DESCOPE_PROJECT_ID=<project-id>
169
203
  DESCOPE_FLOW_ID=<flow-id>
170
204
  # Optional - Descope base url, e.g. http://localhost:8000
171
205
  DESCOPE_BASE_URL=<base-url>
206
+ # Optional - Debug mode
207
+ DESCOPE_DEBUG_MODE=<debug-mode>
208
+ # Optional - Theme, can be "light" or "dark". If empty, Descope will use the OS theme
209
+ DESCOPE_THEME=<theme>
172
210
  ```
173
211
 
174
212
  - Run `npm run start`
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@descope/web-js-sdk"),t=require("react");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=n.default.createContext(void 0),a=({projectId:e,baseUrl:r,children:s})=>{const[a,l]=t.useState({}),[c,i]=t.useState(""),d=t.useMemo((()=>{if(e)return o.default({projectId:e,baseUrl:r,hooks:{beforeRequest:e=>{const t=e;return t.headers={...t.headers,"x-descope-sdk-name":"react","x-descope-sdk-version":"0.0.52-alpha.24"},t}}})}),[e,r]);t.useEffect((()=>{if(!d)return;const e=d.onSessionTokenChange(i),t=d.onUserChange(l);return()=>{e?.(),t?.()}}),[d]);const f=t.useMemo((()=>({sdk:d,projectId:e,baseUrl:r,user:a,sessionToken:c,setUser:l,setSessionToken:i})),[c,a,e,r]);return n.default.createElement(u.Provider,{value:f},s)};a.defaultProps={baseUrl:"",children:void 0};const l=t.lazy((async()=>(await Promise.resolve().then((function(){return s(require("@descope/web-component"))})),{default:({projectId:e,flowId:t,baseUrl:r,innerRef:s,tenant:o,theme:u})=>n.default.createElement("descope-wc",{"project-id":e,"flow-id":t,"base-url":r,ref:s,tenant:o,theme:u})}))),c=n.default.forwardRef((({flowId:e,onSuccess:r,onError:s,tenant:o,theme:a},c)=>{const[i,d]=t.useState(null);t.useImperativeHandle(c,(()=>i));const{projectId:f,baseUrl:p,setUser:b,setSessionToken:h}=n.default.useContext(u),m=t.useCallback((e=>{b(e.detail?.user);const t=e.detail?.sessionJwt;h(t),r&&r(e)}),[b,h,r]);return t.useEffect((()=>{const e=i;return e?.addEventListener("success",m),s&&e?.addEventListener("error",s),()=>{s&&e?.removeEventListener("error",s),e?.removeEventListener("success",m)}}),[i,s,m]),n.default.createElement(t.Suspense,{fallback:null},n.default.createElement(l,{projectId:f,flowId:e,baseUrl:p,innerRef:d,tenant:o,theme:a}))}));c.defaultProps={onError:void 0,onSuccess:void 0};const 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)};exports.AuthProvider=a,exports.Descope=c,exports.SignInFlow=e=>n.default.createElement(c,{...e,flowId:"sign-in"}),exports.SignUpFlow=e=>n.default.createElement(c,{...e,flowId:"sign-up"}),exports.SignUpOrInFlow=e=>n.default.createElement(c,{...e,flowId:"sign-up-or-in"}),exports.useAuth=()=>{const e=n.default.useContext(u);if(!e)throw Error("You can only use 'useAuth' in the context of <AuthProvider />");const{user:r,sessionToken:s,sdk:o}=e,a=t.useCallback(i(o?.logoutAll),[o]),l=t.useCallback(i(o?.logout),[o]),c=t.useCallback(i(o?.me),[o]),d=t.useCallback(i(o?.getJwtPermissions),[o]),f=t.useCallback(i(o?.getJwtRoles),[o]),p=t.useCallback(i(o?.getRefreshToken),[o]);return t.useMemo((()=>({authenticated:!!s,user:r,sessionToken:s,logoutAll:a,logout:l,me:c,getJwtPermissions:d,getJwtRoles:f,getRefreshToken:p})),[r,s,o])};
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);let u;const a=e=>{const t=n.default({...e,persistTokens:!0,autoRefresh:!0});return u=t,t};u=a({projectId:"temp pid"});const l=r.default.createContext(void 0),i=({projectId:t,baseUrl:s,sessionTokenViaCookie:o,children:n})=>{const[u,i]=e.useState({}),[c,d]=e.useState(""),f=e.useMemo((()=>{if(t)return a({projectId:t,baseUrl:s,sessionTokenViaCookie:o,hooks:{beforeRequest:e=>{const t=e;return t.headers={...t.headers,"x-descope-sdk-name":"react","x-descope-sdk-version":"0.0.52-alpha.25"},t}},persistToken:!0,autoRefresh:!0})}),[t,s]);e.useEffect((()=>{if(!f)return;const e=f.onSessionTokenChange(d),t=f.onUserChange(i);return f.refresh(),()=>{e?.(),t?.()}}),[f]);const p=e.useMemo((()=>({sdk:f,projectId:t,baseUrl:s,user:u,sessionToken:c,setUser:i,setSessionToken:d})),[c,u,t,s]);return r.default.createElement(l.Provider,{value:p},n)};i.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const c=e.lazy((async()=>(await Promise.resolve().then((function(){return o(require("@descope/web-component"))})),{default:({projectId:e,flowId:t,baseUrl:s,innerRef:o,tenant:n,theme:u,debug:a})=>r.default.createElement("descope-wc",{"project-id":e,"flow-id":t,"base-url":s,ref:o,tenant:n,theme:u,debug:a})}))),d=r.default.forwardRef((({flowId:t,onSuccess:s,onError:o,tenant:n,theme:u,debug:a},i)=>{const[d,f]=e.useState(null);e.useImperativeHandle(i,(()=>d));const{projectId:p,baseUrl:k,setUser:b,setSessionToken:h,sdk:g}=r.default.useContext(l),m=e.useCallback((e=>{b(e.detail?.user);const t=e.detail?.sessionJwt;h(t),s&&s(e),g.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail)))}),[b,h,s]);return e.useEffect((()=>{const e=d;return e?.addEventListener("success",m),o&&e?.addEventListener("error",o),()=>{o&&e?.removeEventListener("error",o),e?.removeEventListener("success",m)}}),[d,o,m]),r.default.createElement(e.Suspense,{fallback:null},r.default.createElement(c,{projectId:p,flowId:t,baseUrl:k,innerRef:f,tenant:n,theme:u,debug:a}))}));d.defaultProps={onError:void 0,onSuccess:void 0};const 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)};exports.AuthProvider=i,exports.Descope=d,exports.SignInFlow=e=>r.default.createElement(d,{...e,flowId:"sign-in"}),exports.SignUpFlow=e=>r.default.createElement(d,{...e,flowId:"sign-up"}),exports.SignUpOrInFlow=e=>r.default.createElement(d,{...e,flowId:"sign-up-or-in"}),exports.getSessionToken=()=>u?.getSessionToken(),exports.useAuth=()=>{const t=r.default.useContext(l);if(!t)throw Error("You can only use 'useAuth' in the context of <AuthProvider />");const{user:s,sessionToken:o,sdk:n}=t,u=e.useCallback(f(n?.logoutAll),[n]),a=e.useCallback(f(n?.logout),[n]),i=e.useCallback(f(n?.me),[n]),c=e.useCallback(f(n?.getJwtPermissions),[n]),d=e.useCallback(f(n?.getJwtRoles),[n]),p=e.useCallback(f(n?.getRefreshToken),[n]);return e.useMemo((()=>({authenticated:!!o,user:s,sessionToken:o,logoutAll:u,logout:a,me:i,getJwtPermissions:c,getJwtRoles:d,getRefreshToken:p})),[s,o,n])};
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/lib/hooks/authContext.ts","../../src/lib/components/AuthProvider.tsx","../../src/lib/components/Descope.tsx","../../src/lib/hooks/useAuth.ts","../../src/lib/components/DefaultFlows.tsx"],"sourcesContent":["import React from 'react';\nimport { IAuthContext } from '../types';\n\nconst AuthContext = React.createContext<IAuthContext>(undefined);\n\nexport default AuthContext;\n","// '@descope/web-js-sdk' is a dependency of '@descope/web-component'\n// and we want to use the same version that is used there\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport createSdk from '@descope/web-js-sdk';\nimport React, { FC, useEffect, useMemo, useState } from 'react';\nimport AuthContext from '../hooks/authContext';\nimport { IAuthContext } from '../types';\n\ndeclare const BUILD_VERSION: string;\n\ninterface IAuthProviderProps {\n\tprojectId: string;\n\tbaseUrl?: string;\n\tchildren?: JSX.Element;\n}\n\nconst AuthProvider: FC<IAuthProviderProps> = ({\n\tprojectId,\n\tbaseUrl,\n\tchildren\n}) => {\n\tconst [user, setUser] = useState({});\n\tconst [sessionToken, setSessionToken] = useState('');\n\n\tconst sdk = useMemo(() => {\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\thooks: {\n\t\t\t\tbeforeRequest: (config) => {\n\t\t\t\t\tconst conf = config;\n\t\t\t\t\tconf.headers = {\n\t\t\t\t\t\t...conf.headers,\n\t\t\t\t\t\t'x-descope-sdk-name': 'react',\n\t\t\t\t\t\t'x-descope-sdk-version': BUILD_VERSION\n\t\t\t\t\t};\n\t\t\t\t\treturn conf;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}, [projectId, baseUrl]);\n\n\tuseEffect(() => {\n\t\tif (!sdk) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSessionToken);\n\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\t\treturn () => {\n\t\t\tunsubscribeSessionToken?.();\n\t\t\tunsubscribeUser?.();\n\t\t};\n\t}, [sdk]);\n\n\tconst value = useMemo<IAuthContext>(\n\t\t() => ({\n\t\t\tsdk,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tsetUser,\n\t\t\tsetSessionToken\n\t\t}),\n\t\t[sessionToken, user, projectId, baseUrl]\n\t);\n\treturn <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined\n};\n\nexport default AuthProvider;\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport AuthContext from '../hooks/authContext';\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\tawait import('@descope/web-component');\n\treturn {\n\t\tdefault: ({ projectId, flowId, baseUrl, innerRef, tenant, theme }) => (\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/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t({ flowId, onSuccess, onError, tenant, theme }, ref) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, setUser, setSessionToken } =\n\t\t\tReact.useContext(AuthContext);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\t(e: CustomEvent) => {\n\t\t\t\tsetUser(e.detail?.user);\n\t\t\t\tconst sessionJwt = e.detail?.sessionJwt;\n\t\t\t\tsetSessionToken(sessionJwt);\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, setSessionToken, 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<Suspense fallback={null}>\n\t\t\t\t<DescopeWC\n\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\tflowId={flowId}\n\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\ttenant={tenant}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t);\n\t}\n);\n\nDescope.defaultProps = {\n\tonError: undefined,\n\tonSuccess: undefined\n};\n\nexport default Descope;\n","import React, { useCallback, useMemo } from 'react';\nimport { IAuth } from '../types';\nimport AuthContext from './authContext';\n\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 */\nconst 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\nconst useAuth = (): IAuth => {\n\tconst ctx = React.useContext(AuthContext);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use 'useAuth' in the context of <AuthProvider />`\n\t\t);\n\t}\n\tconst { user, sessionToken, sdk } = ctx;\n\n\tconst logoutAll = useCallback(withValidation(sdk?.logoutAll), [sdk]);\n\n\tconst logout = useCallback(withValidation(sdk?.logout), [sdk]);\n\n\tconst me = useCallback(withValidation(sdk?.me), [sdk]);\n\n\tconst getJwtPermissions = useCallback(\n\t\twithValidation(sdk?.getJwtPermissions),\n\t\t[sdk]\n\t);\n\n\tconst getJwtRoles = useCallback(withValidation(sdk?.getJwtRoles), [sdk]);\n\n\tconst getRefreshToken = useCallback(withValidation(sdk?.getRefreshToken), [\n\t\tsdk\n\t]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tauthenticated: !!sessionToken,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tlogoutAll,\n\t\t\tlogout,\n\t\t\tme,\n\t\t\tgetJwtPermissions,\n\t\t\tgetJwtRoles,\n\t\t\t/**\n\t\t\t * Returns refresh token. Use this function when:\n\t\t\t * 1. You need to pass refresh token to another party (For example, in SSR)\n\t\t\t * 2. Descope project's configuration is set to manage token response in BODY (in contrast to manage response in COOKIES)\n\t\t\t * NOTE: Use carefully! Refresh token is sensitive token with relativity long expiration. Prefer using this function only for testing, and to manage token response in COOKIES)\n\t\t\t */\n\t\t\tgetRefreshToken\n\t\t}),\n\t\t[user, sessionToken, sdk]\n\t);\n};\n\nexport default useAuth;\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"],"names":["AuthContext","React","createContext","undefined","AuthProvider","projectId","baseUrl","children","user","setUser","useState","sessionToken","setSessionToken","sdk","useMemo","createSdk","hooks","beforeRequest","config","conf","headers","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","Promise","resolve","then","_interopNamespace","require","default","flowId","innerRef","tenant","theme","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","useCallback","e","detail","sessionJwt","ele","addEventListener","removeEventListener","Suspense","fallback","withValidation","fn","args","Error","props","ctx","logoutAll","logout","me","getJwtPermissions","getJwtRoles","getRefreshToken","authenticated"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/lib/sdk.ts","../../src/lib/hooks/authContext.ts","../../src/lib/components/AuthProvider.tsx","../../src/lib/components/Descope.tsx","../../src/lib/hooks/useAuth.ts","../../src/lib/components/DefaultFlows.tsx"],"sourcesContent":["import createSdk from '@descope/web-js-sdk';\n\nlet sdkInstance;\n\nconst createSdkWrapper = <P extends Parameters<typeof createSdk>[0]>(\n\tconfig: P\n) => {\n\tconst sdk = createSdk({\n\t\t...config,\n\t\tpersistTokens: true,\n\t\tautoRefresh: 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 = () => sdkInstance?.getSessionToken();\n\nexport default createSdkWrapper;\n","import React from 'react';\nimport { IAuthContext } from '../types';\n\nconst AuthContext = React.createContext<IAuthContext>(undefined);\n\nexport default AuthContext;\n","import React, { FC, useEffect, useMemo, useState } from 'react';\nimport createSdk from '../sdk';\nimport AuthContext from '../hooks/authContext';\nimport { IAuthContext } from '../types';\n\ndeclare const BUILD_VERSION: string;\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({});\n\tconst [sessionToken, setSessionToken] = useState('');\n\n\tconst sdk = useMemo(() => {\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\thooks: {\n\t\t\t\tbeforeRequest: (config) => {\n\t\t\t\t\tconst conf = config;\n\t\t\t\t\tconf.headers = {\n\t\t\t\t\t\t...conf.headers,\n\t\t\t\t\t\t'x-descope-sdk-name': 'react',\n\t\t\t\t\t\t'x-descope-sdk-version': BUILD_VERSION\n\t\t\t\t\t};\n\t\t\t\t\treturn conf;\n\t\t\t\t}\n\t\t\t},\n\t\t\tpersistToken: true,\n\t\t\tautoRefresh: true\n\t\t});\n\t}, [projectId, baseUrl]);\n\n\tuseEffect(() => {\n\t\tif (!sdk) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSessionToken);\n\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\t\t// we are calling refresh once after creating the SDK instance\n\t\t// so if refresh token exists, the user will be logged in automatically\n\t\tsdk.refresh();\n\t\treturn () => {\n\t\t\tunsubscribeSessionToken?.();\n\t\t\tunsubscribeUser?.();\n\t\t};\n\t}, [sdk]);\n\n\tconst value = useMemo<IAuthContext>(\n\t\t() => ({\n\t\t\tsdk,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tsetUser,\n\t\t\tsetSessionToken\n\t\t}),\n\t\t[sessionToken, user, projectId, baseUrl]\n\t);\n\treturn <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined,\n\tsessionTokenViaCookie: false\n};\n\nexport default AuthProvider;\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport AuthContext from '../hooks/authContext';\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\tawait import('@descope/web-component');\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}) => (\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/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t({ flowId, onSuccess, onError, tenant, theme, debug }, ref) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, setUser, setSessionToken, sdk } =\n\t\t\tReact.useContext(AuthContext);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\t(e: CustomEvent) => {\n\t\t\t\tsetUser(e.detail?.user);\n\t\t\t\tconst sessionJwt = e.detail?.sessionJwt;\n\t\t\t\tsetSessionToken(sessionJwt);\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tonSuccess(e);\n\t\t\t\t}\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\tsdk.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},\n\t\t\t[setUser, setSessionToken, 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<Suspense fallback={null}>\n\t\t\t\t<DescopeWC\n\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\tflowId={flowId}\n\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\ttenant={tenant}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t\tdebug={debug}\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t);\n\t}\n);\n\nDescope.defaultProps = {\n\tonError: undefined,\n\tonSuccess: undefined\n};\n\nexport default Descope;\n","import React, { useCallback, useMemo } from 'react';\nimport { IAuth } from '../types';\nimport AuthContext from './authContext';\n\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 */\nconst 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\nconst useAuth = (): IAuth => {\n\tconst ctx = React.useContext(AuthContext);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use 'useAuth' in the context of <AuthProvider />`\n\t\t);\n\t}\n\tconst { user, sessionToken, sdk } = ctx;\n\n\tconst logoutAll = useCallback(withValidation(sdk?.logoutAll), [sdk]);\n\n\tconst logout = useCallback(withValidation(sdk?.logout), [sdk]);\n\n\tconst me = useCallback(withValidation(sdk?.me), [sdk]);\n\n\tconst getJwtPermissions = useCallback(\n\t\twithValidation(sdk?.getJwtPermissions),\n\t\t[sdk]\n\t);\n\n\tconst getJwtRoles = useCallback(withValidation(sdk?.getJwtRoles), [sdk]);\n\n\tconst getRefreshToken = useCallback(withValidation(sdk?.getRefreshToken), [\n\t\tsdk\n\t]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tauthenticated: !!sessionToken,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tlogoutAll,\n\t\t\tlogout,\n\t\t\tme,\n\t\t\tgetJwtPermissions,\n\t\t\tgetJwtRoles,\n\t\t\t/**\n\t\t\t * Returns refresh token. Use this function when:\n\t\t\t * 1. You need to pass refresh token to another party (For example, in SSR)\n\t\t\t * 2. Descope project's configuration is set to manage token response in BODY (in contrast to manage response in COOKIES)\n\t\t\t * NOTE: Use carefully! Refresh token is sensitive token with relativity long expiration. Prefer using this function only for testing, and to manage token response in COOKIES)\n\t\t\t */\n\t\t\tgetRefreshToken\n\t\t}),\n\t\t[user, sessionToken, sdk]\n\t);\n};\n\nexport default useAuth;\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"],"names":["sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","AuthContext","React","createContext","undefined","AuthProvider","baseUrl","sessionTokenViaCookie","children","user","setUser","useState","sessionToken","setSessionToken","useMemo","hooks","beforeRequest","conf","headers","persistToken","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","refresh","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","Promise","resolve","then","_interopNamespace","require","default","flowId","innerRef","tenant","theme","debug","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","useCallback","e","detail","sessionJwt","httpClient","afterRequest","Response","JSON","stringify","ele","addEventListener","removeEventListener","Suspense","fallback","withValidation","fn","args","Error","props","getSessionToken","ctx","logoutAll","logout","me","getJwtPermissions","getJwtRoles","getRefreshToken","authenticated"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,490 @@
1
1
  /// <reference types="react" />
2
2
  import React, { FC, DOMAttributes } from 'react';
3
3
  import DescopeWc from '@descope/web-component';
4
- import createSdk from '@descope/web-js-sdk';
4
+ import * as _descope_core_js_sdk from '@descope/core-js-sdk';
5
5
 
6
6
  interface IAuthProviderProps {
7
7
  projectId: string;
8
8
  baseUrl?: string;
9
+ sessionTokenViaCookie?: boolean;
9
10
  children?: JSX.Element;
10
11
  }
11
12
  declare const AuthProvider: FC<IAuthProviderProps>;
12
13
 
14
+ declare const createSdkWrapper: <P extends Omit<{
15
+ projectId: string;
16
+ logger?: {
17
+ debug: {
18
+ (...data: any[]): void;
19
+ (message?: any, ...optionalParams: any[]): void;
20
+ };
21
+ log: {
22
+ (...data: any[]): void;
23
+ (message?: any, ...optionalParams: any[]): void;
24
+ };
25
+ error: {
26
+ (...data: any[]): void;
27
+ (message?: any, ...optionalParams: any[]): void;
28
+ };
29
+ };
30
+ baseUrl?: string;
31
+ hooks?: {
32
+ beforeRequest?: (config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig;
33
+ afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void;
34
+ };
35
+ cookiePolicy?: RequestCredentials;
36
+ }, "hooks"> & {
37
+ hooks?: {
38
+ beforeRequest?: ((config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig) | ((config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig)[];
39
+ afterRequest?: ((req: _descope_core_js_sdk.RequestConfig, res: Response) => void) | ((req: _descope_core_js_sdk.RequestConfig, res: Response) => void)[];
40
+ };
41
+ } & {
42
+ fpKey?: string;
43
+ fpLoad?: boolean;
44
+ } & {
45
+ autoRefresh?: boolean;
46
+ } & {
47
+ persistTokens?: boolean;
48
+ sessionTokenViaCookie?: boolean;
49
+ }>(config: P) => (({
50
+ flow: {
51
+ start: (flowId: string, options?: {
52
+ tenant?: string;
53
+ }, interactionId?: string, input?: Record<string, FormDataEntryValue>) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
54
+ next: (executionId: string, stepId: string, interactionId: string, input?: Record<string, FormDataEntryValue>) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
55
+ };
56
+ webauthn: {
57
+ signUp(identifier: string, name: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
58
+ signIn(identifier: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
59
+ signUpOrIn(identifier: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
60
+ update(identifier: string, token: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.ResponseData>>;
61
+ helpers: {
62
+ create: (options: string) => Promise<string>;
63
+ get: (options: string) => Promise<string>;
64
+ isSupported: (requirePlatformAuthenticator?: boolean) => Promise<boolean>;
65
+ };
66
+ };
67
+ accessKey: {
68
+ exchange: (accessKey: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.ExchangeAccessKeyResponse>>;
69
+ };
70
+ otp: {
71
+ verify: {
72
+ email: (identifier: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
73
+ sms: (identifier: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
74
+ whatsapp: (identifier: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
75
+ };
76
+ signIn: {
77
+ email: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
78
+ sms: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
79
+ whatsapp: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
80
+ };
81
+ signUp: {
82
+ email: (identifier: string, user?: {
83
+ email?: string;
84
+ name?: string;
85
+ phone?: string;
86
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
87
+ sms: (identifier: string, user?: {
88
+ email?: string;
89
+ name?: string;
90
+ phone?: string;
91
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
92
+ whatsapp: (identifier: string, user?: {
93
+ email?: string;
94
+ name?: string;
95
+ phone?: string;
96
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
97
+ };
98
+ signUpOrIn: {
99
+ email: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
100
+ sms: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
101
+ whatsapp: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
102
+ };
103
+ update: {
104
+ email: (identifier: string, email: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
105
+ phone: {
106
+ email: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
107
+ sms: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
108
+ whatsapp: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
109
+ };
110
+ };
111
+ };
112
+ magicLink: {
113
+ verify: (token: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
114
+ signIn: {
115
+ email: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
116
+ sms: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
117
+ whatsapp: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
118
+ };
119
+ signUp: {
120
+ email: (identifier: string, uri: string, user?: {
121
+ email?: string;
122
+ name?: string;
123
+ phone?: string;
124
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
125
+ sms: (identifier: string, uri: string, user?: {
126
+ email?: string;
127
+ name?: string;
128
+ phone?: string;
129
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
130
+ whatsapp: (identifier: string, uri: string, user?: {
131
+ email?: string;
132
+ name?: string;
133
+ phone?: string;
134
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
135
+ };
136
+ signUpOrIn: {
137
+ email: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
138
+ sms: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
139
+ whatsapp: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
140
+ };
141
+ update: {
142
+ email: (identifier: string, email: string, uri: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
143
+ phone: {
144
+ email: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
145
+ sms: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
146
+ whatsapp: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
147
+ };
148
+ };
149
+ };
150
+ enchantedLink: {
151
+ verify: (token: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
152
+ signIn: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
153
+ signUpOrIn: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
154
+ signUp: (identifier: string, uri: string, user?: {
155
+ email?: string;
156
+ name?: string;
157
+ phone?: string;
158
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
159
+ waitForSession: (pendingRef: string, config?: {
160
+ pollingIntervalMs: number;
161
+ timeoutMs: number;
162
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
163
+ update: {
164
+ email: (identifier: string, email: string, uri: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
165
+ };
166
+ };
167
+ oauth: {
168
+ start: {
169
+ facebook: <B extends {
170
+ redirect: boolean;
171
+ }>(redirectURL?: string, config?: B) => Promise<B extends {
172
+ redirect: true;
173
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
174
+ github: <B_1 extends {
175
+ redirect: boolean;
176
+ }>(redirectURL?: string, config?: B_1) => Promise<B_1 extends {
177
+ redirect: true;
178
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
179
+ google: <B_2 extends {
180
+ redirect: boolean;
181
+ }>(redirectURL?: string, config?: B_2) => Promise<B_2 extends {
182
+ redirect: true;
183
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
184
+ microsoft: <B_3 extends {
185
+ redirect: boolean;
186
+ }>(redirectURL?: string, config?: B_3) => Promise<B_3 extends {
187
+ redirect: true;
188
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
189
+ gitlab: <B_4 extends {
190
+ redirect: boolean;
191
+ }>(redirectURL?: string, config?: B_4) => Promise<B_4 extends {
192
+ redirect: true;
193
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
194
+ apple: <B_5 extends {
195
+ redirect: boolean;
196
+ }>(redirectURL?: string, config?: B_5) => Promise<B_5 extends {
197
+ redirect: true;
198
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
199
+ };
200
+ exchange: (code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
201
+ };
202
+ saml: {
203
+ start: <B_1_1 extends {
204
+ redirect: boolean;
205
+ }>(tenantNameOrEmail: string, config?: B_1_1) => Promise<B_1_1 extends {
206
+ redirect: true;
207
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
208
+ exchange: (code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
209
+ };
210
+ totp: {
211
+ signUp: (identifier: string, user?: {
212
+ email?: string;
213
+ name?: string;
214
+ phone?: string;
215
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.TOTPResponse>>;
216
+ verify: (identifier: string, code: string, loginOptions?: {
217
+ stepup?: boolean;
218
+ mfa?: boolean;
219
+ customClaims?: Record<string, any>;
220
+ }, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
221
+ update: (identifier: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.TOTPResponse>>;
222
+ };
223
+ refresh: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
224
+ logout: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
225
+ logoutAll: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
226
+ me: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.UserResponse>>;
227
+ isJwtExpired: (token: string) => boolean;
228
+ getJwtPermissions: (token: string, tenant?: string) => string[];
229
+ getJwtRoles: (token: string, tenant?: string) => string[];
230
+ httpClient: {
231
+ get: (path: string, config?: {
232
+ headers?: HeadersInit;
233
+ queryParams?: {
234
+ [key: string]: string;
235
+ };
236
+ token?: string;
237
+ }) => Promise<Response>;
238
+ post: (path: string, body?: any, config?: {
239
+ headers?: HeadersInit;
240
+ queryParams?: {
241
+ [key: string]: string;
242
+ };
243
+ token?: string;
244
+ }) => Promise<Response>;
245
+ put: (path: string, body?: any, config?: {
246
+ headers?: HeadersInit;
247
+ queryParams?: {
248
+ [key: string]: string;
249
+ };
250
+ token?: string;
251
+ }) => Promise<Response>;
252
+ delete: (path: string, body?: any, config?: {
253
+ headers?: HeadersInit;
254
+ queryParams?: {
255
+ [key: string]: string;
256
+ };
257
+ token?: string;
258
+ }) => Promise<Response>;
259
+ hooks?: {
260
+ beforeRequest?: (config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig;
261
+ afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void;
262
+ };
263
+ };
264
+ } | {
265
+ flow: {
266
+ start: (flowId: string, options?: {
267
+ tenant?: string;
268
+ }, interactionId?: string, input?: Record<string, FormDataEntryValue>) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
269
+ next: (executionId: string, stepId: string, interactionId: string, input?: Record<string, FormDataEntryValue>) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
270
+ };
271
+ webauthn: {
272
+ signUp(identifier: string, name: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
273
+ signIn(identifier: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
274
+ signUpOrIn(identifier: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
275
+ update(identifier: string, token: string): Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.ResponseData>>;
276
+ helpers: {
277
+ create: (options: string) => Promise<string>;
278
+ get: (options: string) => Promise<string>;
279
+ isSupported: (requirePlatformAuthenticator?: boolean) => Promise<boolean>;
280
+ };
281
+ };
282
+ accessKey: {
283
+ exchange: (accessKey: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.ExchangeAccessKeyResponse>>;
284
+ };
285
+ otp: {
286
+ verify: {
287
+ email: (identifier: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
288
+ sms: (identifier: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
289
+ whatsapp: (identifier: string, code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
290
+ };
291
+ signIn: {
292
+ email: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
293
+ sms: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
294
+ whatsapp: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
295
+ };
296
+ signUp: {
297
+ email: (identifier: string, user?: {
298
+ email?: string;
299
+ name?: string;
300
+ phone?: string;
301
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
302
+ sms: (identifier: string, user?: {
303
+ email?: string;
304
+ name?: string;
305
+ phone?: string;
306
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
307
+ whatsapp: (identifier: string, user?: {
308
+ email?: string;
309
+ name?: string;
310
+ phone?: string;
311
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
312
+ };
313
+ signUpOrIn: {
314
+ email: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
315
+ sms: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
316
+ whatsapp: (identifier: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
317
+ };
318
+ update: {
319
+ email: (identifier: string, email: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
320
+ phone: {
321
+ email: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
322
+ sms: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
323
+ whatsapp: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
324
+ };
325
+ };
326
+ };
327
+ magicLink: {
328
+ verify: (token: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
329
+ signIn: {
330
+ email: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
331
+ sms: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
332
+ whatsapp: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
333
+ };
334
+ signUp: {
335
+ email: (identifier: string, uri: string, user?: {
336
+ email?: string;
337
+ name?: string;
338
+ phone?: string;
339
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
340
+ sms: (identifier: string, uri: string, user?: {
341
+ email?: string;
342
+ name?: string;
343
+ phone?: string;
344
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
345
+ whatsapp: (identifier: string, uri: string, user?: {
346
+ email?: string;
347
+ name?: string;
348
+ phone?: string;
349
+ }) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
350
+ };
351
+ signUpOrIn: {
352
+ email: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
353
+ sms: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
354
+ whatsapp: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
355
+ };
356
+ update: {
357
+ email: (identifier: string, email: string, uri: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
358
+ phone: {
359
+ email: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
360
+ sms: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
361
+ whatsapp: (identifier: string, phone: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
362
+ };
363
+ };
364
+ };
365
+ enchantedLink: {
366
+ verify: (token: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
367
+ signIn: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
368
+ signUpOrIn: (identifier: string, uri: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
369
+ signUp: (identifier: string, uri: string, user?: {
370
+ email?: string;
371
+ name?: string;
372
+ phone?: string;
373
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
374
+ waitForSession: (pendingRef: string, config?: {
375
+ pollingIntervalMs: number;
376
+ timeoutMs: number;
377
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
378
+ update: {
379
+ email: (identifier: string, email: string, uri: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.EnchantedLinkResponse>>;
380
+ };
381
+ };
382
+ oauth: {
383
+ start: {
384
+ facebook: <B_6 extends {
385
+ redirect: boolean;
386
+ }>(redirectURL?: string, config?: B_6) => Promise<B_6 extends {
387
+ redirect: true;
388
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
389
+ github: <B_1_2 extends {
390
+ redirect: boolean;
391
+ }>(redirectURL?: string, config?: B_1_2) => Promise<B_1_2 extends {
392
+ redirect: true;
393
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
394
+ google: <B_2_1 extends {
395
+ redirect: boolean;
396
+ }>(redirectURL?: string, config?: B_2_1) => Promise<B_2_1 extends {
397
+ redirect: true;
398
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
399
+ microsoft: <B_3_1 extends {
400
+ redirect: boolean;
401
+ }>(redirectURL?: string, config?: B_3_1) => Promise<B_3_1 extends {
402
+ redirect: true;
403
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
404
+ gitlab: <B_4_1 extends {
405
+ redirect: boolean;
406
+ }>(redirectURL?: string, config?: B_4_1) => Promise<B_4_1 extends {
407
+ redirect: true;
408
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
409
+ apple: <B_5_1 extends {
410
+ redirect: boolean;
411
+ }>(redirectURL?: string, config?: B_5_1) => Promise<B_5_1 extends {
412
+ redirect: true;
413
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
414
+ };
415
+ exchange: (code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
416
+ };
417
+ saml: {
418
+ start: <B_1_3 extends {
419
+ redirect: boolean;
420
+ }>(tenantNameOrEmail: string, config?: B_1_3) => Promise<B_1_3 extends {
421
+ redirect: true;
422
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
423
+ exchange: (code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
424
+ };
425
+ totp: {
426
+ signUp: (identifier: string, user?: {
427
+ email?: string;
428
+ name?: string;
429
+ phone?: string;
430
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.TOTPResponse>>;
431
+ verify: (identifier: string, code: string, loginOptions?: {
432
+ stepup?: boolean;
433
+ mfa?: boolean;
434
+ customClaims?: Record<string, any>;
435
+ }, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
436
+ update: (identifier: string, token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.TOTPResponse>>;
437
+ };
438
+ refresh: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
439
+ logout: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
440
+ logoutAll: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<never>>;
441
+ me: (token?: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.UserResponse>>;
442
+ isJwtExpired: (token: string) => boolean;
443
+ getJwtPermissions: (token: string, tenant?: string) => string[];
444
+ getJwtRoles: (token: string, tenant?: string) => string[];
445
+ httpClient: {
446
+ get: (path: string, config?: {
447
+ headers?: HeadersInit;
448
+ queryParams?: {
449
+ [key: string]: string;
450
+ };
451
+ token?: string;
452
+ }) => Promise<Response>;
453
+ post: (path: string, body?: any, config?: {
454
+ headers?: HeadersInit;
455
+ queryParams?: {
456
+ [key: string]: string;
457
+ };
458
+ token?: string;
459
+ }) => Promise<Response>;
460
+ put: (path: string, body?: any, config?: {
461
+ headers?: HeadersInit;
462
+ queryParams?: {
463
+ [key: string]: string;
464
+ };
465
+ token?: string;
466
+ }) => Promise<Response>;
467
+ delete: (path: string, body?: any, config?: {
468
+ headers?: HeadersInit;
469
+ queryParams?: {
470
+ [key: string]: string;
471
+ };
472
+ token?: string;
473
+ }) => Promise<Response>;
474
+ hooks?: {
475
+ beforeRequest?: (config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig;
476
+ afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void;
477
+ };
478
+ };
479
+ }) & {
480
+ onSessionTokenChange: (cb: (data: string) => void) => () => any[];
481
+ onUserChange: (cb: (data: _descope_core_js_sdk.UserResponse) => void) => () => any[];
482
+ }) & {
483
+ getRefreshToken: () => string;
484
+ getSessionToken: () => string;
485
+ };
486
+ declare const getSessionToken: () => any;
487
+
13
488
  declare global {
14
489
  namespace JSX {
15
490
  interface IntrinsicElements {
@@ -17,15 +492,15 @@ declare global {
17
492
  }
18
493
  }
19
494
  }
20
- declare type Sdk = ReturnType<typeof createSdk>;
21
- declare type CustomEvents<K extends string> = {
495
+ type Sdk = ReturnType<typeof createSdkWrapper>;
496
+ type CustomEvents<K extends string> = {
22
497
  [key in K]: (event: CustomEvent) => void;
23
498
  };
24
- declare type CustomElement<T, K extends string = ''> = Partial<T & DOMAttributes<T> & {
499
+ type CustomElement<T, K extends string = ''> = Partial<T & DOMAttributes<T> & {
25
500
  children: React.ReactChild;
26
501
  ref: React.Ref<HTMLElement>;
27
502
  } & CustomEvents<`on${K}`>>;
28
- declare type DescopeCustomElement = CustomElement<DescopeWc, 'success' | 'error'>;
503
+ type DescopeCustomElement = CustomElement<DescopeWc, 'success' | 'error'>;
29
504
  declare enum UserStatus {
30
505
  enabled = "enabled",
31
506
  disabled = "disabled",
@@ -60,15 +535,16 @@ interface IAuth {
60
535
  getJwtPermissions: Sdk['getJwtPermissions'];
61
536
  getRefreshToken: Sdk['getRefreshToken'];
62
537
  }
63
- declare type DescopeTheme = 'light' | 'dark';
538
+ type DescopeTheme = 'light' | 'dark';
64
539
  interface DescopeProps {
65
540
  flowId: string;
66
541
  onSuccess?: DescopeCustomElement['onsuccess'];
67
542
  onError?: DescopeCustomElement['onerror'];
68
543
  tenant?: string;
69
544
  theme?: DescopeTheme;
545
+ debug?: boolean;
70
546
  }
71
- declare type DefaultFlowProps = Omit<DescopeProps, 'flowId'>;
547
+ type DefaultFlowProps = Omit<DescopeProps, 'flowId'>;
72
548
 
73
549
  declare const SignInFlow: (props: DefaultFlowProps) => JSX.Element;
74
550
  declare const SignUpFlow: (props: DefaultFlowProps) => JSX.Element;
@@ -78,4 +554,4 @@ declare const Descope: React.ForwardRefExoticComponent<DescopeProps & React.RefA
78
554
 
79
555
  declare const useAuth: () => IAuth;
80
556
 
81
- export { AuthProvider, Descope, SignInFlow, SignUpFlow, SignUpOrInFlow, useAuth };
557
+ export { AuthProvider, Descope, SignInFlow, SignUpFlow, SignUpOrInFlow, getSessionToken, useAuth };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"@descope/web-js-sdk";import t,{useState as o,useMemo as r,useEffect as s,lazy as n,useImperativeHandle as c,useCallback as i,Suspense as a}from"react";const l=t.createContext(void 0),d=({projectId:n,baseUrl:c,children:i})=>{const[a,d]=o({}),[u,f]=o(""),p=r((()=>{if(n)return e({projectId:n,baseUrl:c,hooks:{beforeRequest:e=>{const t=e;return t.headers={...t.headers,"x-descope-sdk-name":"react","x-descope-sdk-version":"0.0.52-alpha.24"},t}}})}),[n,c]);s((()=>{if(!p)return;const e=p.onSessionTokenChange(f),t=p.onUserChange(d);return()=>{e?.(),t?.()}}),[p]);const m=r((()=>({sdk:p,projectId:n,baseUrl:c,user:a,sessionToken:u,setUser:d,setSessionToken:f})),[u,a,n,c]);return t.createElement(l.Provider,{value:m},i)};d.defaultProps={baseUrl:"",children:void 0};const u=n((async()=>(await import("@descope/web-component"),{default:({projectId:e,flowId:o,baseUrl:r,innerRef:s,tenant:n,theme:c})=>t.createElement("descope-wc",{"project-id":e,"flow-id":o,"base-url":r,ref:s,tenant:n,theme:c})}))),f=t.forwardRef((({flowId:e,onSuccess:r,onError:n,tenant:d,theme:f},p)=>{const[m,h]=o(null);c(p,(()=>m));const{projectId:w,baseUrl:k,setUser:g,setSessionToken:v}=t.useContext(l),E=i((e=>{g(e.detail?.user);const t=e.detail?.sessionJwt;v(t),r&&r(e)}),[g,v,r]);return s((()=>{const e=m;return e?.addEventListener("success",E),n&&e?.addEventListener("error",n),()=>{n&&e?.removeEventListener("error",n),e?.removeEventListener("success",E)}}),[m,n,E]),t.createElement(a,{fallback:null},t.createElement(u,{projectId:w,flowId:e,baseUrl:k,innerRef:h,tenant:d,theme:f}))}));f.defaultProps={onError:void 0,onSuccess:void 0};const p=e=>t.createElement(f,{...e,flowId:"sign-in"}),m=e=>t.createElement(f,{...e,flowId:"sign-up"}),h=e=>t.createElement(f,{...e,flowId:"sign-up-or-in"}),w=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)},k=()=>{const e=t.useContext(l);if(!e)throw Error("You can only use 'useAuth' in the context of <AuthProvider />");const{user:o,sessionToken:s,sdk:n}=e,c=i(w(n?.logoutAll),[n]),a=i(w(n?.logout),[n]),d=i(w(n?.me),[n]),u=i(w(n?.getJwtPermissions),[n]),f=i(w(n?.getJwtRoles),[n]),p=i(w(n?.getRefreshToken),[n]);return r((()=>({authenticated:!!s,user:o,sessionToken:s,logoutAll:c,logout:a,me:d,getJwtPermissions:u,getJwtRoles:f,getRefreshToken:p})),[o,s,n])};export{d as AuthProvider,f as Descope,p as SignInFlow,m as SignUpFlow,h as SignUpOrInFlow,k as useAuth};
1
+ import e,{useState as t,useMemo as o,useEffect as s,lazy as n,useImperativeHandle as r,useCallback as i,Suspense as c}from"react";import a from"@descope/web-js-sdk";let d;const l=e=>{const t=a({...e,persistTokens:!0,autoRefresh:!0});return d=t,t};d=l({projectId:"temp pid"});const u=()=>d?.getSessionToken(),f=e.createContext(void 0),p=({projectId:n,baseUrl:r,sessionTokenViaCookie:i,children:c})=>{const[a,d]=t({}),[u,p]=t(""),k=o((()=>{if(n)return l({projectId:n,baseUrl:r,sessionTokenViaCookie:i,hooks:{beforeRequest:e=>{const t=e;return t.headers={...t.headers,"x-descope-sdk-name":"react","x-descope-sdk-version":"0.0.52-alpha.25"},t}},persistToken:!0,autoRefresh:!0})}),[n,r]);s((()=>{if(!k)return;const e=k.onSessionTokenChange(p),t=k.onUserChange(d);return k.refresh(),()=>{e?.(),t?.()}}),[k]);const h=o((()=>({sdk:k,projectId:n,baseUrl:r,user:a,sessionToken:u,setUser:d,setSessionToken:p})),[u,a,n,r]);return e.createElement(f.Provider,{value:h},c)};p.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const k=n((async()=>(await import("@descope/web-component"),{default:({projectId:t,flowId:o,baseUrl:s,innerRef:n,tenant:r,theme:i,debug:c})=>e.createElement("descope-wc",{"project-id":t,"flow-id":o,"base-url":s,ref:n,tenant:r,theme:i,debug:c})}))),h=e.forwardRef((({flowId:o,onSuccess:n,onError:a,tenant:d,theme:l,debug:u},p)=>{const[h,m]=t(null);r(p,(()=>h));const{projectId:g,baseUrl:w,setUser:b,setSessionToken:v,sdk:E}=e.useContext(f),I=i((e=>{b(e.detail?.user);const t=e.detail?.sessionJwt;v(t),n&&n(e),E.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail)))}),[b,v,n]);return s((()=>{const e=h;return e?.addEventListener("success",I),a&&e?.addEventListener("error",a),()=>{a&&e?.removeEventListener("error",a),e?.removeEventListener("success",I)}}),[h,a,I]),e.createElement(c,{fallback:null},e.createElement(k,{projectId:g,flowId:o,baseUrl:w,innerRef:m,tenant:d,theme:l,debug:u}))}));h.defaultProps={onError:void 0,onSuccess:void 0};const m=t=>e.createElement(h,{...t,flowId:"sign-in"}),g=t=>e.createElement(h,{...t,flowId:"sign-up"}),w=t=>e.createElement(h,{...t,flowId:"sign-up-or-in"}),b=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)},v=()=>{const t=e.useContext(f);if(!t)throw Error("You can only use 'useAuth' in the context of <AuthProvider />");const{user:s,sessionToken:n,sdk:r}=t,c=i(b(r?.logoutAll),[r]),a=i(b(r?.logout),[r]),d=i(b(r?.me),[r]),l=i(b(r?.getJwtPermissions),[r]),u=i(b(r?.getJwtRoles),[r]),p=i(b(r?.getRefreshToken),[r]);return o((()=>({authenticated:!!n,user:s,sessionToken:n,logoutAll:c,logout:a,me:d,getJwtPermissions:l,getJwtRoles:u,getRefreshToken:p})),[s,n,r])};export{p as AuthProvider,h as Descope,m as SignInFlow,g as SignUpFlow,w as SignUpOrInFlow,u as getSessionToken,v as useAuth};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/lib/hooks/authContext.ts","../src/lib/components/AuthProvider.tsx","../src/lib/components/Descope.tsx","../src/lib/components/DefaultFlows.tsx","../src/lib/hooks/useAuth.ts"],"sourcesContent":["import React from 'react';\nimport { IAuthContext } from '../types';\n\nconst AuthContext = React.createContext<IAuthContext>(undefined);\n\nexport default AuthContext;\n","// '@descope/web-js-sdk' is a dependency of '@descope/web-component'\n// and we want to use the same version that is used there\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport createSdk from '@descope/web-js-sdk';\nimport React, { FC, useEffect, useMemo, useState } from 'react';\nimport AuthContext from '../hooks/authContext';\nimport { IAuthContext } from '../types';\n\ndeclare const BUILD_VERSION: string;\n\ninterface IAuthProviderProps {\n\tprojectId: string;\n\tbaseUrl?: string;\n\tchildren?: JSX.Element;\n}\n\nconst AuthProvider: FC<IAuthProviderProps> = ({\n\tprojectId,\n\tbaseUrl,\n\tchildren\n}) => {\n\tconst [user, setUser] = useState({});\n\tconst [sessionToken, setSessionToken] = useState('');\n\n\tconst sdk = useMemo(() => {\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\thooks: {\n\t\t\t\tbeforeRequest: (config) => {\n\t\t\t\t\tconst conf = config;\n\t\t\t\t\tconf.headers = {\n\t\t\t\t\t\t...conf.headers,\n\t\t\t\t\t\t'x-descope-sdk-name': 'react',\n\t\t\t\t\t\t'x-descope-sdk-version': BUILD_VERSION\n\t\t\t\t\t};\n\t\t\t\t\treturn conf;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}, [projectId, baseUrl]);\n\n\tuseEffect(() => {\n\t\tif (!sdk) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSessionToken);\n\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\t\treturn () => {\n\t\t\tunsubscribeSessionToken?.();\n\t\t\tunsubscribeUser?.();\n\t\t};\n\t}, [sdk]);\n\n\tconst value = useMemo<IAuthContext>(\n\t\t() => ({\n\t\t\tsdk,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tsetUser,\n\t\t\tsetSessionToken\n\t\t}),\n\t\t[sessionToken, user, projectId, baseUrl]\n\t);\n\treturn <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined\n};\n\nexport default AuthProvider;\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport AuthContext from '../hooks/authContext';\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\tawait import('@descope/web-component');\n\treturn {\n\t\tdefault: ({ projectId, flowId, baseUrl, innerRef, tenant, theme }) => (\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/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t({ flowId, onSuccess, onError, tenant, theme }, ref) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, setUser, setSessionToken } =\n\t\t\tReact.useContext(AuthContext);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\t(e: CustomEvent) => {\n\t\t\t\tsetUser(e.detail?.user);\n\t\t\t\tconst sessionJwt = e.detail?.sessionJwt;\n\t\t\t\tsetSessionToken(sessionJwt);\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, setSessionToken, 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<Suspense fallback={null}>\n\t\t\t\t<DescopeWC\n\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\tflowId={flowId}\n\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\ttenant={tenant}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t/>\n\t\t\t</Suspense>\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 React, { useCallback, useMemo } from 'react';\nimport { IAuth } from '../types';\nimport AuthContext from './authContext';\n\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 */\nconst 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\nconst useAuth = (): IAuth => {\n\tconst ctx = React.useContext(AuthContext);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use 'useAuth' in the context of <AuthProvider />`\n\t\t);\n\t}\n\tconst { user, sessionToken, sdk } = ctx;\n\n\tconst logoutAll = useCallback(withValidation(sdk?.logoutAll), [sdk]);\n\n\tconst logout = useCallback(withValidation(sdk?.logout), [sdk]);\n\n\tconst me = useCallback(withValidation(sdk?.me), [sdk]);\n\n\tconst getJwtPermissions = useCallback(\n\t\twithValidation(sdk?.getJwtPermissions),\n\t\t[sdk]\n\t);\n\n\tconst getJwtRoles = useCallback(withValidation(sdk?.getJwtRoles), [sdk]);\n\n\tconst getRefreshToken = useCallback(withValidation(sdk?.getRefreshToken), [\n\t\tsdk\n\t]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tauthenticated: !!sessionToken,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tlogoutAll,\n\t\t\tlogout,\n\t\t\tme,\n\t\t\tgetJwtPermissions,\n\t\t\tgetJwtRoles,\n\t\t\t/**\n\t\t\t * Returns refresh token. Use this function when:\n\t\t\t * 1. You need to pass refresh token to another party (For example, in SSR)\n\t\t\t * 2. Descope project's configuration is set to manage token response in BODY (in contrast to manage response in COOKIES)\n\t\t\t * NOTE: Use carefully! Refresh token is sensitive token with relativity long expiration. Prefer using this function only for testing, and to manage token response in COOKIES)\n\t\t\t */\n\t\t\tgetRefreshToken\n\t\t}),\n\t\t[user, sessionToken, sdk]\n\t);\n};\n\nexport default useAuth;\n"],"names":["AuthContext","React","createContext","undefined","AuthProvider","projectId","baseUrl","children","user","setUser","useState","sessionToken","setSessionToken","sdk","useMemo","createSdk","hooks","beforeRequest","config","conf","headers","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","import","default","flowId","innerRef","tenant","theme","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","useCallback","e","detail","sessionJwt","ele","addEventListener","removeEventListener","Suspense","fallback","SignInFlow","props","SignUpFlow","SignUpOrInFlow","withValidation","fn","args","Error","useAuth","ctx","logoutAll","logout","me","getJwtPermissions","getJwtRoles","getRefreshToken","authenticated"],"mappings":"qKAGA,MAAMA,EAAcC,EAAMC,mBAA4BC,GCahDC,EAAuC,EAC5CC,YACAC,UACAC,eAEA,MAAOC,EAAMC,GAAWC,EAAS,CAAE,IAC5BC,EAAcC,GAAmBF,EAAS,IAE3CG,EAAMC,GAAQ,KACnB,GAAKT,EAGL,OAAOU,EAAU,CAChBV,YACAC,UACAU,MAAO,CACNC,cAAgBC,IACf,MAAMC,EAAOD,EAMb,OALAC,EAAKC,QAAU,IACXD,EAAKC,QACR,qBAAsB,QACtB,wBAAyB,mBAEnBD,CAAI,IAGZ,GACA,CAACd,EAAWC,IAEfe,GAAU,KACT,IAAKR,EACJ,OAGD,MAAMS,EAA0BT,EAAIU,qBAAqBX,GACnDY,EAAkBX,EAAIY,aAAahB,GACzC,MAAO,KACNa,MACAE,KAAmB,CACnB,GACC,CAACX,IAEJ,MAAMa,EAAQZ,GACb,KAAO,CACND,MACAR,YACAC,UACAE,OACAG,eACAF,UACAG,qBAED,CAACD,EAAcH,EAAMH,EAAWC,IAEjC,OAAOL,EAAA0B,cAAC3B,EAAY4B,SAAQ,CAACF,MAAOA,GAAQnB,EAAgC,EAG7EH,EAAayB,aAAe,CAC3BvB,QAAS,GACTC,cAAUJ,GC/DX,MAAM2B,EAAYC,GAAKC,gBAChBC,OAAO,0BACN,CACNC,QAAS,EAAG7B,YAAW8B,SAAQ7B,UAAS8B,WAAUC,SAAQC,WACzDrC,EACa0B,cAAA,aAAA,CAAA,aAAAtB,YACH8B,EAAM,WACL7B,EACViC,IAAKH,EACLC,OAAQA,EACRC,MAAOA,QAMLE,EAAUvC,EAAMwC,YACrB,EAAGN,SAAQO,YAAWC,UAASN,SAAQC,SAASC,KAC/C,MAAOH,EAAUQ,GAAelC,EAAS,MAEzCmC,EAAoBN,GAAK,IAAMH,IAE/B,MAAM/B,UAAEA,EAASC,QAAEA,EAAOG,QAAEA,EAAOG,gBAAEA,GACpCX,EAAM6C,WAAW9C,GAEZ+C,EAAgBC,GACpBC,IACAxC,EAAQwC,EAAEC,QAAQ1C,MAClB,MAAM2C,EAAaF,EAAEC,QAAQC,WAC7BvC,EAAgBuC,GACZT,GACHA,EAAUO,EACV,GAEF,CAACxC,EAASG,EAAiB8B,IAe5B,OAZArB,GAAU,KACT,MAAM+B,EAAMhB,EAIZ,OAHAgB,GAAKC,iBAAiB,UAAWN,GAC7BJ,GAASS,GAAKC,iBAAiB,QAASV,GAErC,KACFA,GAASS,GAAKE,oBAAoB,QAASX,GAE/CS,GAAKE,oBAAoB,UAAWP,EAAc,CAClD,GACC,CAACX,EAAUO,EAASI,IAGtB9C,EAAC0B,cAAA4B,EAAS,CAAAC,SAAU,MACnBvD,EAAA0B,cAACG,EAAS,CACTzB,UAAWA,EACX8B,OAAQA,EACR7B,QAASA,EACT8B,SAAUQ,EACVP,OAAQA,EACRC,MAAOA,IAGR,IAIJE,EAAQX,aAAe,CACtBc,aAASxC,EACTuC,eAAWvC,SC1ECsD,EAAcC,GAC1BzD,gBAACuC,EAAO,IAAKkB,EAAOvB,OAAO,YAGfwB,EAAcD,GAC1BzD,gBAACuC,EAAO,IAAKkB,EAAOvB,OAAO,YAGfyB,EAAkBF,GAC9BzD,gBAACuC,EAAO,IAAKkB,EAAOvB,OAAO,kBCJtB0B,EACqBC,GAC1B,IAAIC,KACH,IAAKD,EACJ,MAAME,MACL,0HAGF,OAAOF,KAAMC,EAAK,EAGdE,EAAU,KACf,MAAMC,EAAMjE,EAAM6C,WAAW9C,GAC7B,IAAKkE,EACJ,MAAMF,MACL,iEAGF,MAAMxD,KAAEA,EAAIG,aAAEA,EAAYE,IAAEA,GAAQqD,EAE9BC,EAAYnB,EAAYa,EAAehD,GAAKsD,WAAY,CAACtD,IAEzDuD,EAASpB,EAAYa,EAAehD,GAAKuD,QAAS,CAACvD,IAEnDwD,EAAKrB,EAAYa,EAAehD,GAAKwD,IAAK,CAACxD,IAE3CyD,EAAoBtB,EACzBa,EAAehD,GAAKyD,mBACpB,CAACzD,IAGI0D,EAAcvB,EAAYa,EAAehD,GAAK0D,aAAc,CAAC1D,IAE7D2D,EAAkBxB,EAAYa,EAAehD,GAAK2D,iBAAkB,CACzE3D,IAGD,OAAOC,GACN,KAAO,CACN2D,gBAAiB9D,EACjBH,OACAG,eACAwD,YACAC,SACAC,KACAC,oBACAC,cAOAC,qBAED,CAAChE,EAAMG,EAAcE,GACrB"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/lib/sdk.ts","../src/lib/hooks/authContext.ts","../src/lib/components/AuthProvider.tsx","../src/lib/components/Descope.tsx","../src/lib/components/DefaultFlows.tsx","../src/lib/hooks/useAuth.ts"],"sourcesContent":["import createSdk from '@descope/web-js-sdk';\n\nlet sdkInstance;\n\nconst createSdkWrapper = <P extends Parameters<typeof createSdk>[0]>(\n\tconfig: P\n) => {\n\tconst sdk = createSdk({\n\t\t...config,\n\t\tpersistTokens: true,\n\t\tautoRefresh: 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 = () => sdkInstance?.getSessionToken();\n\nexport default createSdkWrapper;\n","import React from 'react';\nimport { IAuthContext } from '../types';\n\nconst AuthContext = React.createContext<IAuthContext>(undefined);\n\nexport default AuthContext;\n","import React, { FC, useEffect, useMemo, useState } from 'react';\nimport createSdk from '../sdk';\nimport AuthContext from '../hooks/authContext';\nimport { IAuthContext } from '../types';\n\ndeclare const BUILD_VERSION: string;\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({});\n\tconst [sessionToken, setSessionToken] = useState('');\n\n\tconst sdk = useMemo(() => {\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\thooks: {\n\t\t\t\tbeforeRequest: (config) => {\n\t\t\t\t\tconst conf = config;\n\t\t\t\t\tconf.headers = {\n\t\t\t\t\t\t...conf.headers,\n\t\t\t\t\t\t'x-descope-sdk-name': 'react',\n\t\t\t\t\t\t'x-descope-sdk-version': BUILD_VERSION\n\t\t\t\t\t};\n\t\t\t\t\treturn conf;\n\t\t\t\t}\n\t\t\t},\n\t\t\tpersistToken: true,\n\t\t\tautoRefresh: true\n\t\t});\n\t}, [projectId, baseUrl]);\n\n\tuseEffect(() => {\n\t\tif (!sdk) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst unsubscribeSessionToken = sdk.onSessionTokenChange(setSessionToken);\n\t\tconst unsubscribeUser = sdk.onUserChange(setUser);\n\t\t// we are calling refresh once after creating the SDK instance\n\t\t// so if refresh token exists, the user will be logged in automatically\n\t\tsdk.refresh();\n\t\treturn () => {\n\t\t\tunsubscribeSessionToken?.();\n\t\t\tunsubscribeUser?.();\n\t\t};\n\t}, [sdk]);\n\n\tconst value = useMemo<IAuthContext>(\n\t\t() => ({\n\t\t\tsdk,\n\t\t\tprojectId,\n\t\t\tbaseUrl,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tsetUser,\n\t\t\tsetSessionToken\n\t\t}),\n\t\t[sessionToken, user, projectId, baseUrl]\n\t);\n\treturn <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nAuthProvider.defaultProps = {\n\tbaseUrl: '',\n\tchildren: undefined,\n\tsessionTokenViaCookie: false\n};\n\nexport default AuthProvider;\n","import React, {\n\tlazy,\n\tSuspense,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseState\n} from 'react';\nimport AuthContext from '../hooks/authContext';\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\tawait import('@descope/web-component');\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}) => (\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/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t({ flowId, onSuccess, onError, tenant, theme, debug }, ref) => {\n\t\tconst [innerRef, setInnerRef] = useState(null);\n\n\t\tuseImperativeHandle(ref, () => innerRef);\n\n\t\tconst { projectId, baseUrl, setUser, setSessionToken, sdk } =\n\t\t\tReact.useContext(AuthContext);\n\n\t\tconst handleSuccess = useCallback(\n\t\t\t(e: CustomEvent) => {\n\t\t\t\tsetUser(e.detail?.user);\n\t\t\t\tconst sessionJwt = e.detail?.sessionJwt;\n\t\t\t\tsetSessionToken(sessionJwt);\n\t\t\t\tif (onSuccess) {\n\t\t\t\t\tonSuccess(e);\n\t\t\t\t}\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\tsdk.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},\n\t\t\t[setUser, setSessionToken, 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<Suspense fallback={null}>\n\t\t\t\t<DescopeWC\n\t\t\t\t\tprojectId={projectId}\n\t\t\t\t\tflowId={flowId}\n\t\t\t\t\tbaseUrl={baseUrl}\n\t\t\t\t\tinnerRef={setInnerRef}\n\t\t\t\t\ttenant={tenant}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t\tdebug={debug}\n\t\t\t\t/>\n\t\t\t</Suspense>\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 React, { useCallback, useMemo } from 'react';\nimport { IAuth } from '../types';\nimport AuthContext from './authContext';\n\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 */\nconst 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\nconst useAuth = (): IAuth => {\n\tconst ctx = React.useContext(AuthContext);\n\tif (!ctx) {\n\t\tthrow Error(\n\t\t\t`You can only use 'useAuth' in the context of <AuthProvider />`\n\t\t);\n\t}\n\tconst { user, sessionToken, sdk } = ctx;\n\n\tconst logoutAll = useCallback(withValidation(sdk?.logoutAll), [sdk]);\n\n\tconst logout = useCallback(withValidation(sdk?.logout), [sdk]);\n\n\tconst me = useCallback(withValidation(sdk?.me), [sdk]);\n\n\tconst getJwtPermissions = useCallback(\n\t\twithValidation(sdk?.getJwtPermissions),\n\t\t[sdk]\n\t);\n\n\tconst getJwtRoles = useCallback(withValidation(sdk?.getJwtRoles), [sdk]);\n\n\tconst getRefreshToken = useCallback(withValidation(sdk?.getRefreshToken), [\n\t\tsdk\n\t]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tauthenticated: !!sessionToken,\n\t\t\tuser,\n\t\t\tsessionToken,\n\t\t\tlogoutAll,\n\t\t\tlogout,\n\t\t\tme,\n\t\t\tgetJwtPermissions,\n\t\t\tgetJwtRoles,\n\t\t\t/**\n\t\t\t * Returns refresh token. Use this function when:\n\t\t\t * 1. You need to pass refresh token to another party (For example, in SSR)\n\t\t\t * 2. Descope project's configuration is set to manage token response in BODY (in contrast to manage response in COOKIES)\n\t\t\t * NOTE: Use carefully! Refresh token is sensitive token with relativity long expiration. Prefer using this function only for testing, and to manage token response in COOKIES)\n\t\t\t */\n\t\t\tgetRefreshToken\n\t\t}),\n\t\t[user, sessionToken, sdk]\n\t);\n};\n\nexport default useAuth;\n"],"names":["sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","AuthContext","React","createContext","undefined","AuthProvider","baseUrl","sessionTokenViaCookie","children","user","setUser","useState","sessionToken","setSessionToken","useMemo","hooks","beforeRequest","conf","headers","persistToken","useEffect","unsubscribeSessionToken","onSessionTokenChange","unsubscribeUser","onUserChange","refresh","value","createElement","Provider","defaultProps","DescopeWC","lazy","async","import","default","flowId","innerRef","tenant","theme","debug","ref","Descope","forwardRef","onSuccess","onError","setInnerRef","useImperativeHandle","useContext","handleSuccess","useCallback","e","detail","sessionJwt","httpClient","afterRequest","Response","JSON","stringify","ele","addEventListener","removeEventListener","Suspense","fallback","SignInFlow","props","SignUpFlow","SignUpOrInFlow","withValidation","fn","args","Error","useAuth","ctx","logoutAll","logout","me","getJwtPermissions","getJwtRoles","getRefreshToken","authenticated"],"mappings":"qKAEA,IAAIA,EAEJ,MAAMC,EACLC,IAEA,MAAMC,EAAMC,EAAU,IAClBF,EACHG,eAAe,EACfC,aAAa,IAId,OAFAN,EAAcG,EAEPA,CAAG,EAUXH,EAAcC,EAAiB,CAAEM,UAAW,aAE/B,MAAAC,EAAkB,IAAMR,GAAaQ,kBCvB5CC,EAAcC,EAAMC,mBAA4BC,GCehDC,EAAuC,EAC5CN,YACAO,UACAC,wBACAC,eAEA,MAAOC,EAAMC,GAAWC,EAAS,CAAE,IAC5BC,EAAcC,GAAmBF,EAAS,IAE3ChB,EAAMmB,GAAQ,KACnB,GAAKf,EAGL,OAAOH,EAAU,CAChBG,YACAO,UACAC,wBACAQ,MAAO,CACNC,cAAgBtB,IACf,MAAMuB,EAAOvB,EAMb,OALAuB,EAAKC,QAAU,IACXD,EAAKC,QACR,qBAAsB,QACtB,wBAAyB,mBAEnBD,CAAI,GAGbE,cAAc,EACdrB,aAAa,GACZ,GACA,CAACC,EAAWO,IAEfc,GAAU,KACT,IAAKzB,EACJ,OAGD,MAAM0B,EAA0B1B,EAAI2B,qBAAqBT,GACnDU,EAAkB5B,EAAI6B,aAAad,GAIzC,OADAf,EAAI8B,UACG,KACNJ,MACAE,KAAmB,CACnB,GACC,CAAC5B,IAEJ,MAAM+B,EAAQZ,GACb,KAAO,CACNnB,MACAI,YACAO,UACAG,OACAG,eACAF,UACAG,qBAED,CAACD,EAAcH,EAAMV,EAAWO,IAEjC,OAAOJ,EAAAyB,cAAC1B,EAAY2B,SAAQ,CAACF,MAAOA,GAAQlB,EAAgC,EAG7EH,EAAawB,aAAe,CAC3BvB,QAAS,GACTE,cAAUJ,EACVG,uBAAuB,GCzExB,MAAMuB,EAAYC,GAAKC,gBAChBC,OAAO,0BACN,CACNC,QAAS,EACRnC,YACAoC,SACA7B,UACA8B,WACAC,SACAC,QACAC,WAEArC,EAAAyB,cAAA,aAAA,CAAA,aACa5B,EACH,UAAAoC,aACC7B,EACVkC,IAAKJ,EACLC,OAAQA,EACRC,MAAOA,EACPC,MAAOA,QAMLE,EAAUvC,EAAMwC,YACrB,EAAGP,SAAQQ,YAAWC,UAASP,SAAQC,QAAOC,SAASC,KACtD,MAAOJ,EAAUS,GAAelC,EAAS,MAEzCmC,EAAoBN,GAAK,IAAMJ,IAE/B,MAAMrC,UAAEA,EAASO,QAAEA,EAAOI,QAAEA,EAAOG,gBAAEA,EAAelB,IAAEA,GACrDO,EAAM6C,WAAW9C,GAEZ+C,EAAgBC,GACpBC,IACAxC,EAAQwC,EAAEC,QAAQ1C,MAClB,MAAM2C,EAAaF,EAAEC,QAAQC,WAC7BvC,EAAgBuC,GACZT,GACHA,EAAUO,GAIXvD,EAAI0D,WAAWtC,MAAMuC,aACpB,CAAA,EACA,IAAIC,SAASC,KAAKC,UAAUP,EAAEC,SAC9B,GAEF,CAACzC,EAASG,EAAiB8B,IAe5B,OAZAvB,GAAU,KACT,MAAMsC,EAAMtB,EAIZ,OAHAsB,GAAKC,iBAAiB,UAAWX,GAC7BJ,GAASc,GAAKC,iBAAiB,QAASf,GAErC,KACFA,GAASc,GAAKE,oBAAoB,QAAShB,GAE/Cc,GAAKE,oBAAoB,UAAWZ,EAAc,CAClD,GACC,CAACZ,EAAUQ,EAASI,IAGtB9C,EAACyB,cAAAkC,EAAS,CAAAC,SAAU,MACnB5D,EAAAyB,cAACG,EAAS,CACT/B,UAAWA,EACXoC,OAAQA,EACR7B,QAASA,EACT8B,SAAUS,EACVR,OAAQA,EACRC,MAAOA,EACPC,MAAOA,IAGR,IAIJE,EAAQZ,aAAe,CACtBe,aAASxC,EACTuC,eAAWvC,SC1FC2D,EAAcC,GAC1B9D,gBAACuC,EAAO,IAAKuB,EAAO7B,OAAO,YAGf8B,EAAcD,GAC1B9D,gBAACuC,EAAO,IAAKuB,EAAO7B,OAAO,YAGf+B,EAAkBF,GAC9B9D,gBAACuC,EAAO,IAAKuB,EAAO7B,OAAO,kBCJtBgC,EACqBC,GAC1B,IAAIC,KACH,IAAKD,EACJ,MAAME,MACL,0HAGF,OAAOF,KAAMC,EAAK,EAGdE,EAAU,KACf,MAAMC,EAAMtE,EAAM6C,WAAW9C,GAC7B,IAAKuE,EACJ,MAAMF,MACL,iEAGF,MAAM7D,KAAEA,EAAIG,aAAEA,EAAYjB,IAAEA,GAAQ6E,EAE9BC,EAAYxB,EAAYkB,EAAexE,GAAK8E,WAAY,CAAC9E,IAEzD+E,EAASzB,EAAYkB,EAAexE,GAAK+E,QAAS,CAAC/E,IAEnDgF,EAAK1B,EAAYkB,EAAexE,GAAKgF,IAAK,CAAChF,IAE3CiF,EAAoB3B,EACzBkB,EAAexE,GAAKiF,mBACpB,CAACjF,IAGIkF,EAAc5B,EAAYkB,EAAexE,GAAKkF,aAAc,CAAClF,IAE7DmF,EAAkB7B,EAAYkB,EAAexE,GAAKmF,iBAAkB,CACzEnF,IAGD,OAAOmB,GACN,KAAO,CACNiE,gBAAiBnE,EACjBH,OACAG,eACA6D,YACAC,SACAC,KACAC,oBACAC,cAOAC,qBAED,CAACrE,EAAMG,EAAcjB,GACrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descope/react-sdk",
3
- "version": "0.0.52-alpha.24",
3
+ "version": "0.0.52-alpha.25",
4
4
  "main": "dist/cjs/index.cjs.js",
5
5
  "module": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,11 +19,11 @@
19
19
  "dist"
20
20
  ],
21
21
  "dependencies": {
22
- "@descope/web-component": "0.1.0-alpha.18",
23
- "react-router-dom": "6.4.3"
22
+ "@descope/web-component": "0.1.0-alpha.24",
23
+ "react-router-dom": "6.5.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@babel/core": "7.20.2",
26
+ "@babel/core": "7.20.5",
27
27
  "@babel/preset-env": "7.20.2",
28
28
  "@babel/preset-react": "7.18.6",
29
29
  "@babel/preset-typescript": "7.18.6",
@@ -36,11 +36,11 @@
36
36
  "@testing-library/react": "13.4.0",
37
37
  "@testing-library/user-event": "14.4.3",
38
38
  "@types/jest": "^27.0.2",
39
- "@types/react": "18.0.25",
39
+ "@types/react": "18.0.26",
40
40
  "@types/react-dom": "18.0.9",
41
41
  "@types/react-router-dom": "^5.3.3",
42
42
  "babel-jest": "27.5.1",
43
- "eslint": "8.26.0",
43
+ "eslint": "8.30.0",
44
44
  "eslint-config-airbnb": "19.0.4",
45
45
  "eslint-config-airbnb-typescript": "17.0.0",
46
46
  "eslint-config-prettier": "8.5.0",
@@ -51,7 +51,7 @@
51
51
  "eslint-plugin-jest-dom": "4.0.3",
52
52
  "eslint-plugin-jest-formatting": "3.1.0",
53
53
  "eslint-plugin-jsx-a11y": "6.6.1",
54
- "eslint-plugin-n": "15.5.1",
54
+ "eslint-plugin-n": "15.6.0",
55
55
  "eslint-plugin-no-only-tests": "2.6.0",
56
56
  "eslint-plugin-prefer-arrow": "1.2.3",
57
57
  "eslint-plugin-prettier": "4.2.1",
@@ -81,7 +81,8 @@
81
81
  },
82
82
  "peerDependencies": {
83
83
  "@types/react": ">=16",
84
- "react": ">=16"
84
+ "react": ">=16",
85
+ "@descope/web-js-sdk": "0.1.0-alpha.17"
85
86
  },
86
87
  "scripts": {
87
88
  "start": "npm run build && rollup -c rollup.config.app.js -w",