@descope/react-sdk 0.1.2 → 0.1.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Descope
3
+ Copyright (c) 2023 Descope <help@descope.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,16 +1,22 @@
1
- # @descope/react-sdk
1
+ # Descope SDK for React
2
2
 
3
- This library lets you consume your login pages created by Descope console-app in your application
4
- Under the hood, it uses [web-js-sdk](https://github.com/descope/web-js-sdk)
3
+ The Descope SDK for React provides convenient access to the Descope for an application written on top of React. You can read more on the [Descope Website](https://descope.com).
5
4
 
6
- ## Usage
5
+ ## Requirements
6
+
7
+ - The SDK supports React version 16 and above.
8
+ - A Descope `Project ID` is required for using the SDK. Find it on the [project page in the Descope Console](https://app.descope.com/settings/project).
9
+
10
+ ## Installing the SDK
7
11
 
8
- ### Install the package
12
+ Install the package with:
9
13
 
10
14
  ```bash
11
- npm install @descope/react-sdk
15
+ npm i --save @descope/react-sdk
12
16
  ```
13
17
 
18
+ ## Usage
19
+
14
20
  ### Render it in your application
15
21
 
16
22
  #### Wrap your app with Auth Provider
@@ -62,17 +68,23 @@ const App = () => {
62
68
  flowId="my-flow-id"
63
69
  onSuccess={(e) => console.log('Logged in!')}
64
70
  onError={(e) => console.log('Could not logged in')}
65
- // theme can be "light" or "dark". If empty, Descope will use the OS theme
66
- // theme="light"
71
+ // theme can be "light", "dark" or "os", which auto select a theme based on the OS theme. Default is "light"
72
+ // theme="dark"
67
73
 
68
74
  // debug can be set to true to enable debug mode
69
75
  // debug={true}
70
76
 
71
- // You can configure which tenant the signin/signup flow will sign the user into by providing the tenant ID
77
+ // Which tenant the signin/signup flow will sign the user into by providing the tenant ID
72
78
  // tenant=<tenantId>
73
79
 
74
- // You can configure the redirect URL for OAuth and SSO (will be used when redirecting back from the OAuth provider / IdP), or for "Magic Link" and "Enchanted Link" (will be used as a link in the message sent to the the user)
80
+ // Redirect URL for OAuth and SSO (will be used when redirecting back from the OAuth provider / IdP), or for "Magic Link" and "Enchanted Link" (will be used as a link in the message sent to the the user)
75
81
  // redirectUrl=<redirectUrl>
82
+
83
+ // auto-focus can be true, false or "skipFirstScreen". Default is true.
84
+ // - true: automatically focus on the first input of each screen
85
+ // - false: do not automatically focus on screen's inputs
86
+ // - "skipFirstScreen": automatically focus on the first input of each screen, except first screen
87
+ // autoFocus="skipFirstScreen"
76
88
  />
77
89
  )
78
90
  }
@@ -117,7 +129,7 @@ When developing a full-stack application, it is common to have private server AP
117
129
 
118
130
  ![session-token-validation-diagram](https://docs.descope.com/static/SessionValidation-cf7b2d5d26594f96421d894273a713d8.png)
119
131
 
120
- 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.
132
+ 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/build/guides/gettingstarted/#session-validation) in Descope documentation.
121
133
 
122
134
  There are 2 ways to achieve that:
123
135
 
@@ -187,51 +199,72 @@ const AppRoot = () => {
187
199
 
188
200
  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.
189
201
 
190
- ## Run a local example
202
+ ## Code Example
191
203
 
192
- There is a simple app that uses Descope React SDK, with two routes
204
+ You can find an example react app in the [examples folder](./examples).
193
205
 
194
- - Home
195
- - Login
206
+ ### Setup
196
207
 
197
- In order to run this app locally, do the following steps:
208
+ To run the examples, set your `Project ID` by setting the `DESCOPE_PROJECT_ID` env var or directly
209
+ in the sample code.
210
+ Find your Project ID in the [Descope console](https://app.descope.com/settings/project).
198
211
 
199
- - Clone this repository
200
- - Navigate to repository directory
201
- - Run `npm i`
202
- - Create a `.env` file with the following variables (or alternatively export them manually):
212
+ ```bash
213
+ export DESCOPE_PROJECT_ID=<Project-ID>
214
+ ```
203
215
 
204
- ```env
205
- // .env
206
- # Your project id
207
- DESCOPE_PROJECT_ID=<project-id>
216
+ Alternatively, put the environment variable in `.env` file in the project root directory.
217
+ See bellow for an `.env` file template with more information.
208
218
 
209
- # Flow id to run, e.g. sign-up-or-in
210
- DESCOPE_FLOW_ID=<flow-id>
219
+ ### Run Example
211
220
 
212
- # Optional - Descope base url, e.g. http://localhost:8000
213
- DESCOPE_BASE_URL=<base-url>
221
+ Run the following command in the root of the project to build and run the example:
214
222
 
215
- # Optional - Debug mode
216
- DESCOPE_DEBUG_MODE=<debug-mode>
223
+ ```bash
224
+ npm i && npm start
225
+ ```
217
226
 
218
- # Optional - Theme, can be "light", "dark" or "os" (Auto select based on the OS theme settings). Default is "light"
219
- DESCOPE_THEME=<theme>
227
+ ### Example Optional Env Variables
220
228
 
221
- # Optional - Telemetry key provided by Descope Inc
222
- DESCOPE_TELEMETRY_KEY=<telemetry-key>
229
+ See the following table for customization environment variables for the example app:
223
230
 
224
- # Optional - Step-Up flow id. If exists, The home page of a logged-in user will show a step-up button
225
- DESCOPE_STEP_UP_FLOW_ID=step-up
231
+ | Env Variable | Description | Default value |
232
+ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------- | ----------------- |
233
+ | DESCOPE_FLOW_ID | Which flow id to use in the login page | **sign-up-or-in** |
234
+ | DESCOPE_BASE_URL | Custom Descope base URL | **""** |
235
+ | DESCOPE_THEME | **"light"** - Light theme</br>**"dark"** - Dark theme</br>**"os"** - Auto select a theme based on the OS theme settings | **light** |
236
+ | DESCOPE_DEBUG_MODE | **"true"** - Enable debugger</br>**"false"** - Disable flow debugger | **false** |
237
+ | DESCOPE_STEP_UP_FLOW_ID | Step up flow ID to show to logged in user (via button). e.g. "step-up". Button will be hidden if not provided | **""** |
238
+ | DESCOPE_TELEMETRY_KEY | **String** - Telemetry public key provided by Descope Inc | **""** |
239
+ | | | |
226
240
 
227
- # Optional - You can configure the redirect URL for OAuth and SSO (will be used when redirecting back from the OAuth provider / IdP), or for "Magic Link" and "Enchanted Link" (will be used as a link in the message sent to the the user). Default is the browser address
228
- DESCOPE_REDIRECT_URL=<redirectUrl>
241
+ Example for `.env` file template:
229
242
 
230
- # Optional - You can configure which tenant the signin/signup flow will sign the user into by providing the tenant ID
231
- DESCOPE_TENANT_ID=<tenantId>
232
243
  ```
244
+ # Your project ID
245
+ DESCOPE_PROJECT_ID="<Project-ID>"
246
+ # Login flow ID
247
+ DESCOPE_FLOW_ID=""
248
+ # Descope base URL
249
+ DESCOPE_BASE_URL=""
250
+ # Set flow theme to dark
251
+ DESCOPE_THEME=dark
252
+ # Enable debugger
253
+ DESCOPE_DEBUG_MODE=true
254
+ # Show step-up flow for logged in user
255
+ DESCOPE_STEP_UP_FLOW_ID=step-up
256
+ # Telemetry key
257
+ DESCOPE_TELEMETRY_KEY=""
258
+ ```
259
+
260
+ ## Learn More
261
+
262
+ To learn more please see the [Descope Documentation and API reference page](https://docs.descope.com/).
263
+
264
+ ## Contact Us
265
+
266
+ If you need help you can email [Descope Support](mailto:support@descope.com)
233
267
 
234
- - Run `npm run start`
235
- - Go to `http://localhost:3000/` and press the "Start Flow" button
268
+ ## License
236
269
 
237
- Note: if you change env file (for example, change DESCOPE_PROJECT_ID), you need to rerun `npm run start`
270
+ The Descope SDK for React is licensed for use under the terms and conditions of the [MIT license Agreement](./LICENSE).
@@ -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={"x-descope-sdk-name":"react","x-descope-sdk-version":"0.1.2"},a="undefined"!=typeof window,l=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)},c=e=>(...t)=>{let s;try{s=e(...t)}catch(e){console.error(e)}return s};let d;const f=e=>{const t=n.default({...e,persistTokens:a,autoRefresh:a});return d=t,t};d=f({projectId:"temp pid"});const p=()=>a?d?.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),g=c(((e=p(),t)=>d?.getJwtPermissions(e,t))),k=c(((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,k]=e.useState(!1),[m,h]=e.useState(!1),b=(({projectId:t,baseUrl:s,sessionTokenViaCookie:o})=>e.useMemo((()=>{if(t)return f({projectId:t,baseUrl:s,sessionTokenViaCookie:o,baseHeaders:i,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((()=>{h(!0),l(b?.refresh)().then((()=>{h(!1)}))}),[b]),S=e.useCallback((()=>{k(!0),l(b.me)().then((()=>{k(!1)}))}),[b]),v=e.useCallback(l(b?.logoutAll),[b]),U=e.useCallback(l(b?.logout),[b]),y=e.useMemo((()=>({fetchUser:S,user:a,isUserLoading:g,fetchSession:w,session:d,isSessionLoading:m,logout:U,logoutAll:v,projectId:t,baseUrl:s,setUser:c,setSession:p,sdk:b})),[S,a,g,w,d,m,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 h=e.lazy((async()=>((await Promise.resolve().then((function(){return o(require("@descope/web-component"))}))).default.sdkConfigOverrides={baseHeaders:i},{default:({projectId:e,flowId:t,baseUrl:s,innerRef:o,tenant:n,theme:u,debug:i,telemetryKey:a,redirectUrl:l})=>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})}))),b=r.default.forwardRef((({flowId:t,onSuccess:s,onError:o,tenant:n,theme:i,debug:a,telemetryKey:l,redirectUrl:c},d)=>{const[f,p]=e.useState(null);e.useImperativeHandle(d,(()=>f));const{projectId:g,baseUrl:k,setUser:m,setSession:b,sdk:w}=r.default.useContext(u),S=e.useCallback((async e=>{m(e.detail?.user);const t=e.detail?.sessionJwt;b(t),await w.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),s&&s(e)}),[m,b,s]);return e.useEffect((()=>{const e=f;return e?.addEventListener("success",S),o&&e?.addEventListener("error",o),()=>{o&&e?.removeEventListener("error",o),e?.removeEventListener("success",S)}}),[f,o,S]),r.default.createElement("form",null,r.default.createElement(e.Suspense,{fallback:null},r.default.createElement(h,{projectId:g,flowId:t,baseUrl:k,innerRef:p,tenant:n,theme:i,debug:a,telemetryKey:l,redirectUrl:c})))}));b.defaultProps={onError:void 0,onSuccess:void 0};var w=()=>{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=b,exports.SignInFlow=e=>r.default.createElement(b,{...e,flowId:"sign-in"}),exports.SignUpFlow=e=>r.default.createElement(b,{...e,flowId:"sign-up"}),exports.SignUpOrInFlow=e=>r.default.createElement(b,{...e,flowId:"sign-up-or-in"}),exports.getJwtPermissions=g,exports.getJwtRoles=k,exports.getRefreshToken=()=>a?d?.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),exports.getSessionToken=p,exports.useDescope=()=>{const{logout:t,logoutAll:s}=w();return e.useMemo((()=>({logoutAll:s,logout:t})),[s,t])},exports.useSession=()=>{const{session:t,isSessionLoading:s,fetchSession:o}=w(),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}=w(),[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 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":"0.1.3"},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=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,k]=e.useState(!1),[m,h]=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((()=>{h(!0),i(b?.refresh)().then((()=>{h(!1)}))}),[b]),S=e.useCallback((()=>{k(!0),i(b.me)().then((()=>{k(!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:m,logout:U,logoutAll:v,projectId:t,baseUrl:s,setUser:c,setSession:p,sdk:b})),[S,a,g,w,d,m,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 h=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})}))),b=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:k,baseUrl:m,setUser:b,setSession:w,sdk:S}=r.default.useContext(u),v=e.useCallback((async e=>{b(e.detail?.user);const t=e.detail?.sessionJwt;w(t),await S.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),s&&s(e)}),[b,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(h,{projectId:k,flowId:t,baseUrl:m,innerRef:g,tenant:n,theme:i,debug:a,telemetryKey:l,redirectUrl:c,autoFocus:d})))}));b.defaultProps={onError:void 0,onSuccess:void 0};var w=()=>{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=b,exports.SignInFlow=e=>r.default.createElement(b,{...e,flowId:"sign-in"}),exports.SignUpFlow=e=>r.default.createElement(b,{...e,flowId:"sign-up"}),exports.SignUpOrInFlow=e=>r.default.createElement(b,{...e,flowId:"sign-up-or-in"}),exports.getJwtPermissions=g,exports.getJwtRoles=k,exports.getRefreshToken=()=>c?d?.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),exports.getSessionToken=p,exports.useDescope=()=>{const{logout:t,logoutAll:s}=w();return e.useMemo((()=>({logoutAll:s,logout:t})),[s,t])},exports.useSession=()=>{const{session:t,isSessionLoading:s,fetchSession:o}=w(),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}=w(),[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}};
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/lib/hooks/Context.ts","../../src/lib/constants.ts","../../src/lib/utils.ts","../../src/lib/sdk.ts","../../src/lib/components/AuthProvider/AuthProvider.tsx","../../src/lib/components/AuthProvider/useSdk.ts","../../src/lib/components/Descope.tsx","../../src/lib/hooks/useContext.ts","../../src/lib/components/DefaultFlows.tsx","../../src/lib/hooks/useDescope.ts","../../src/lib/hooks/useSession.ts","../../src/lib/hooks/useUser.ts"],"sourcesContent":["import React from 'react';\nimport { IContext } from '../types';\n\nconst Context = React.createContext<IContext>(undefined);\n\nexport default Context;\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","/**\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","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 default createSdkWrapper;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport Context from '../../hooks/Context';\nimport { IContext, User } from '../../types';\nimport useSdk from './useSdk';\nimport { withValidation } from '../../utils';\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 Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\nimport { baseHeaders } from '../constants';\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}) => (\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/>\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},\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/>\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","baseHeaders","IS_BROWSER","window","withValidation","fn","args","Error","wrapInTry","res","err","console","error","sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","warn","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","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","getRefreshToken","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/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 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","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","getRefreshToken","isLoading","useRef","current","sessionToken","isAuthenticated","isInit","setIsInit","shouldFetchUser"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ declare const App: () => JSX.Element;
3
+ export default App;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ declare const Home: () => JSX.Element;
3
+ export default Home;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ declare const Login: () => JSX.Element;
3
+ export default Login;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ declare const StepUp: () => JSX.Element;
3
+ export default StepUp;
@@ -0,0 +1 @@
1
+ export declare const fetchData: () => Promise<any>;
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import React, { FC, DOMAttributes } from 'react';
3
- import DescopeWc from '@descope/web-component';
3
+ import DescopeWc, { ThemeOptions, AutoFocusOptions } from '@descope/web-component';
4
4
  import * as _descope_core_js_sdk from '@descope/core-js-sdk';
5
5
 
6
6
  interface IAuthProviderProps {
@@ -642,13 +642,13 @@ interface IAuth {
642
642
  logoutAll: Sdk['logoutAll'];
643
643
  logout: Sdk['logout'];
644
644
  }
645
- type DescopeTheme = 'light' | 'dark';
646
645
  interface DescopeProps {
647
646
  flowId: string;
648
647
  onSuccess?: DescopeCustomElement['onsuccess'];
649
648
  onError?: DescopeCustomElement['onerror'];
650
649
  tenant?: string;
651
- theme?: DescopeTheme;
650
+ theme?: ThemeOptions;
651
+ autoFocus?: AutoFocusOptions;
652
652
  debug?: boolean;
653
653
  telemetryKey?: string;
654
654
  redirectUrl?: string;
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 l,useRef as a}from"react";import d from"@descope/web-js-sdk";const u=e.createContext(void 0),f={"x-descope-sdk-name":"react","x-descope-sdk-version":"0.1.2"},p="undefined"!=typeof window,h=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)},m=e=>(...t)=>{let o;try{o=e(...t)}catch(e){console.error(e)}return o};let g;const k=e=>{const t=d({...e,persistTokens:p,autoRefresh:p});return g=t,t};g=k({projectId:"temp pid"});const w=()=>p?g?.getSessionToken():(console.warn("Get session token is not supported in SSR"),""),U=()=>p?g?.getRefreshToken():(console.warn("Get refresh token is not supported in SSR"),""),b=m(((e=w(),t)=>g?.getJwtPermissions(e,t))),v=m(((e=w(),t)=>g?.getJwtRoles(e,t)));const y=({projectId:n,baseUrl:i,sessionTokenViaCookie:c,children:l})=>{const[a,d]=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:f,persistToken:!0,autoRefresh:!0})}),[e,o,s]))({projectId:n,baseUrl:i,sessionTokenViaCookie:c});s((()=>{if(v){const e=v.onSessionTokenChange(m),t=v.onUserChange(d);return()=>{e(),t()}}}),[v]);const y=r((()=>{b(!0),h(v?.refresh)().then((()=>{b(!1)}))}),[v]),E=r((()=>{w(!0),h(v.me)().then((()=>{w(!1)}))}),[v]),I=r(h(v?.logoutAll),[v]),S=r(h(v?.logout),[v]),j=t((()=>({fetchUser:E,user:a,isUserLoading:g,fetchSession:y,session:p,isSessionLoading:U,logout:S,logoutAll:I,projectId:n,baseUrl:i,setUser:d,setSession:m,sdk:v})),[E,a,g,y,p,U,S,I,n,i,d,m,v]);return e.createElement(u.Provider,{value:j},l)};y.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const E=n((async()=>((await import("@descope/web-component")).default.sdkConfigOverrides={baseHeaders:f},{default:({projectId:t,flowId:o,baseUrl:s,innerRef:r,tenant:n,theme:i,debug:c,telemetryKey:l,redirectUrl:a})=>e.createElement("descope-wc",{"project-id":t,"flow-id":o,"base-url":s,ref:r,tenant:n,theme:i,debug:c,telemetryKey:l,"redirect-url":a})}))),I=e.forwardRef((({flowId:t,onSuccess:n,onError:l,tenant:a,theme:d,debug:f,telemetryKey:p,redirectUrl:h},m)=>{const[g,k]=o(null);i(m,(()=>g));const{projectId:w,baseUrl:U,setUser:b,setSession:v,sdk:y}=e.useContext(u),I=r((async e=>{b(e.detail?.user);const t=e.detail?.sessionJwt;v(t),await y.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),n&&n(e)}),[b,v,n]);return s((()=>{const e=g;return e?.addEventListener("success",I),l&&e?.addEventListener("error",l),()=>{l&&e?.removeEventListener("error",l),e?.removeEventListener("success",I)}}),[g,l,I]),e.createElement("form",null,e.createElement(c,{fallback:null},e.createElement(E,{projectId:w,flowId:t,baseUrl:U,innerRef:k,tenant:a,theme:d,debug:f,telemetryKey:p,redirectUrl:h})))}));I.defaultProps={onError:void 0,onSuccess:void 0};const S=t=>e.createElement(I,{...t,flowId:"sign-in"}),j=t=>e.createElement(I,{...t,flowId:"sign-up"}),C=t=>e.createElement(I,{...t,flowId:"sign-up-or-in"});var R=()=>{const e=l(u);if(!e)throw Error("You can only use this hook in the context of <AuthProvider />");return e};const T=()=>{const{logout:e,logoutAll:o}=R();return t((()=>({logoutAll:o,logout:e})),[o,e])},L=()=>{const{session:e,isSessionLoading:o,fetchSession:r}=R(),n=a(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}},x=()=>{const{user:e,fetchUser:r,isUserLoading:n,session:i}=R(),[c,l]=o(!1),d=a(n),u=t((()=>!e&&!n&&i&&!c),[r,i,c]);return t((()=>{d.current=n}),[n]),t((()=>{u&&(d.current=!0)}),[u]),s((()=>{u&&(l(!0),r())}),[u]),{isUserLoading:d.current,user:e}};export{y as AuthProvider,I as Descope,S as SignInFlow,j as SignUpFlow,C as SignUpOrInFlow,b as getJwtPermissions,v as getJwtRoles,U as getRefreshToken,w as getSessionToken,T as useDescope,L as useSession,x as useUser};
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":"0.1.3"},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)));const y=({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)};y.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const E=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})}))),I=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:I}=e.useContext(d),S=r((async e=>{v(e.detail?.user);const t=e.detail?.sessionJwt;y(t),await I.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(E,{projectId:U,flowId:t,baseUrl:b,innerRef:w,tenant:l,theme:u,debug:f,telemetryKey:p,redirectUrl:h,autoFocus:m})))}));I.defaultProps={onError:void 0,onSuccess:void 0};const S=t=>e.createElement(I,{...t,flowId:"sign-in"}),j=t=>e.createElement(I,{...t,flowId:"sign-up"}),C=t=>e.createElement(I,{...t,flowId:"sign-up-or-in"});var R=()=>{const e=a(d);if(!e)throw Error("You can only use this hook in the context of <AuthProvider />");return e};const T=()=>{const{logout:e,logoutAll:o}=R();return t((()=>({logoutAll:o,logout:e})),[o,e])},L=()=>{const{session:e,isSessionLoading:o,fetchSession:r}=R(),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}},x=()=>{const{user:e,fetchUser:r,isUserLoading:n,session:i}=R(),[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{y as AuthProvider,I as Descope,S as SignInFlow,j as SignUpFlow,C as SignUpOrInFlow,b as getJwtPermissions,v as getJwtRoles,U as getRefreshToken,w as getSessionToken,T as useDescope,L as useSession,x as useUser};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/lib/hooks/Context.ts","../src/lib/constants.ts","../src/lib/utils.ts","../src/lib/sdk.ts","../src/lib/components/AuthProvider/AuthProvider.tsx","../src/lib/components/AuthProvider/useSdk.ts","../src/lib/components/Descope.tsx","../src/lib/components/DefaultFlows.tsx","../src/lib/hooks/useContext.ts","../src/lib/hooks/useDescope.ts","../src/lib/hooks/useSession.ts","../src/lib/hooks/useUser.ts"],"sourcesContent":["import React from 'react';\nimport { IContext } from '../types';\n\nconst Context = React.createContext<IContext>(undefined);\n\nexport default Context;\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","/**\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","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 default createSdkWrapper;\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport Context from '../../hooks/Context';\nimport { IContext, User } from '../../types';\nimport useSdk from './useSdk';\nimport { withValidation } from '../../utils';\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 Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\nimport { baseHeaders } from '../constants';\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}) => (\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/>\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},\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/>\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","baseHeaders","IS_BROWSER","window","withValidation","fn","args","Error","wrapInTry","res","err","console","error","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","import","default","sdkConfigOverrides","flowId","innerRef","theme","debug","telemetryKey","redirectUrl","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 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","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","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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"}
package/package.json CHANGED
@@ -1,7 +1,13 @@
1
1
  {
2
2
  "name": "@descope/react-sdk",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Descope React SDK",
5
+ "author": "Descope Team <info@descope.com>",
6
+ "homepage": "https://github.com/descope/react-sdk",
7
+ "bugs": {
8
+ "url": "https://github.com/descope/react-sdk/issues",
9
+ "email": "help@descope.com"
10
+ },
5
11
  "repository": {
6
12
  "type": "git",
7
13
  "url": "https://github.com/descope/react-sdk.git"
@@ -24,7 +30,7 @@
24
30
  "format-check": "prettier . --check --ignore-path .gitignore",
25
31
  "format-lint": "pretty-quick --staged --ignore-path .gitignore && lint-staged",
26
32
  "leaks": "bash ./scripts/gitleaks/gitleaks.sh",
27
- "lint": "eslint '+(src|test|testUtils)/**/*.+(ts|tsx)' --fix",
33
+ "lint": "eslint '+(src|test|examples|testUtils)/**/*.+(ts|tsx)' --fix",
28
34
  "prepare": "husky install",
29
35
  "prepublishOnly": "npm run build",
30
36
  "start": "npm run build && rollup -c rollup.config.app.js -w",
@@ -36,7 +42,7 @@
36
42
  ]
37
43
  },
38
44
  "dependencies": {
39
- "@descope/web-component": "0.1.3",
45
+ "@descope/web-component": "0.1.4",
40
46
  "react-router-dom": "6.8.0"
41
47
  },
42
48
  "devDependencies": {