@descope/react-sdk 0.0.52-alpha.29 → 0.0.52-alpha.30

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
@@ -72,7 +72,7 @@ const App = () => {
72
72
  }
73
73
  ```
74
74
 
75
- #### Use the `useAuth` hook in your components in order to access authentication state and utilities
75
+ #### Use the `useDescope`, `useSession` and `useUser` hooks in your components in order to get authentication state, user details and utilities
76
76
 
77
77
  This can be helpful to implement application-specific logic. Examples:
78
78
 
@@ -81,27 +81,27 @@ This can be helpful to implement application-specific logic. Examples:
81
81
  - Logout button
82
82
 
83
83
  ```js
84
- import { useAuth } from '@descope/react-sdk'
84
+ import { useDescope, useSession, useUser } from '@descope/react-sdk'
85
85
 
86
86
  const App = () => {
87
- // NOTE - `useAuth` should be used inside `AuthProvider` context,
87
+ // NOTE - `useDescope`, `useSession`, `useUser` should be used inside `AuthProvider` context,
88
88
  // and will throw an exception if this requirement is not met
89
- const { authenticated, user, logout } = useAuth()
90
- return (
91
- {...}
92
- {
93
- // render different components if current session is authenticated
94
- authenticated && <MyPrivateComponent />
95
- }
96
- {
97
- // render user's content
98
- authenticated && <div>Hello ${user.name}</div>
99
- }
100
- {
101
- // logout button
102
- authenticated && <button onClick={logout}>Logout</div>
103
- }
104
- )
89
+ const { isAuthenticated, isSessionLoading } = useSession()
90
+ const { user, isUserLoading } = useUser()
91
+ const { logout } = useDescope()
92
+
93
+ if(isSessionLoading || isUserLoading){
94
+ return <p>Loading...</p>
95
+ }
96
+
97
+ if(isAuthenticated){
98
+ return (
99
+ <p>Hello ${user.name}</p>
100
+ <button onClick={logout}>Logout</div>
101
+ )
102
+ }
103
+
104
+ return <p>You are not logged in</p>
105
105
  }
106
106
  ```
107
107
 
@@ -205,8 +205,10 @@ DESCOPE_FLOW_ID=<flow-id>
205
205
  DESCOPE_BASE_URL=<base-url>
206
206
  # Optional - Debug mode
207
207
  DESCOPE_DEBUG_MODE=<debug-mode>
208
- # Optional - Theme, can be "light" or "dark". If empty, Descope will use the OS theme
208
+ # Optional - Theme, can be "light", "dark" or "os" (Auto select based on the OS theme settings). Default is "light"
209
209
  DESCOPE_THEME=<theme>
210
+ # Optional - Telemetry key provided by Descope Inc
211
+ DESCOPE_TELEMETRY_KEY=<telemetry-key>
210
212
  ```
211
213
 
212
214
  - Run `npm run start`
@@ -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);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.29"},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:m}=r.default.useContext(l),g=e.useCallback((e=>{b(e.detail?.user);const t=e.detail?.sessionJwt;h(t),m.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),s&&s(e)}),[b,h,s]);return e.useEffect((()=>{const e=d;return e?.addEventListener("success",g),o&&e?.addEventListener("error",o),()=>{o&&e?.removeEventListener("error",o),e?.removeEventListener("success",g)}}),[d,o,g]),r.default.createElement("form",null,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])};
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 i=r.default.createContext(void 0),a={"x-descope-sdk-name":"react","x-descope-sdk-version":"0.0.52-alpha.30"};let u;const l=e=>{const t=n.default({...e,persistTokens:!0,autoRefresh:!0});return u=t,t};u=l({projectId:"temp pid"});const c=()=>u?.getSessionToken();const d=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)},f=({projectId:t,baseUrl:s,sessionTokenViaCookie:o,children:n})=>{const[u,c]=e.useState(),[f,p]=e.useState(),[g,k]=e.useState(!1),[h,b]=e.useState(!1),m=(({projectId:t,baseUrl:s,sessionTokenViaCookie:o})=>e.useMemo((()=>{if(t)return l({projectId:t,baseUrl:s,sessionTokenViaCookie:o,baseHeaders:a,persistToken:!0,autoRefresh:!0})}),[t,s,o]))({projectId:t,baseUrl:s,sessionTokenViaCookie:o});e.useEffect((()=>{if(m){const e=m.onSessionTokenChange(p),t=m.onUserChange(c);return()=>{e(),t()}}}),[m]);const v=e.useCallback((()=>{b(!0),d(m?.refresh)().then((()=>{b(!1)}))}),[m]),w=e.useCallback((()=>{k(!0),d(m.me)().then((()=>{k(!1)}))}),[m]),S=e.useCallback(d(m?.logoutAll),[m]),E=e.useCallback(d(m?.logout),[m]),y=e.useMemo((()=>({fetchUser:w,user:u,isUserLoading:g,fetchSession:v,session:f,isSessionLoading:h,logout:E,logoutAll:S,projectId:t,baseUrl:s,setUser:c,setSession:p,sdk:m})),[w,u,g,v,f,h,E,S,t,s,c,p,m]);return r.default.createElement(i.Provider,{value:y},n)};f.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const p=e.lazy((async()=>((await Promise.resolve().then((function(){return o(require("@descope/web-component"))}))).default.sdkConfigOverrides={baseHeaders:a},{default:({projectId:e,flowId:t,baseUrl:s,innerRef:o,tenant:n,theme:i,debug:a,telemetryKey:u})=>r.default.createElement("descope-wc",{"project-id":e,"flow-id":t,"base-url":s,ref:o,tenant:n,theme:i,debug:a,telemetryKey:u})}))),g=r.default.forwardRef((({flowId:t,onSuccess:s,onError:o,tenant:n,theme:a,debug:u,telemetryKey:l},c)=>{const[d,f]=e.useState(null);e.useImperativeHandle(c,(()=>d));const{projectId:g,baseUrl:k,setUser:h,setSession:b,sdk:m}=r.default.useContext(i),v=e.useCallback((async e=>{h(e.detail?.user);const t=e.detail?.sessionJwt;b(t),await m.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),s&&s(e)}),[h,b,s]);return e.useEffect((()=>{const e=d;return e?.addEventListener("success",v),o&&e?.addEventListener("error",o),()=>{o&&e?.removeEventListener("error",o),e?.removeEventListener("success",v)}}),[d,o,v]),r.default.createElement("form",null,r.default.createElement(e.Suspense,{fallback:null},r.default.createElement(p,{projectId:g,flowId:t,baseUrl:k,innerRef:f,tenant:n,theme:a,debug:u,telemetryKey:l})))}));g.defaultProps={onError:void 0,onSuccess:void 0};var k=()=>{const t=e.useContext(i);if(!t)throw Error("You can only use this hook in the context of <AuthProvider />");return t};exports.AuthProvider=f,exports.Descope=g,exports.SignInFlow=e=>r.default.createElement(g,{...e,flowId:"sign-in"}),exports.SignUpFlow=e=>r.default.createElement(g,{...e,flowId:"sign-up"}),exports.SignUpOrInFlow=e=>r.default.createElement(g,{...e,flowId:"sign-up-or-in"}),exports.getJwtPermissions=(e=c(),t)=>u?.getJwtPermissions(e,t),exports.getJwtRoles=(e=c(),t)=>u?.getJwtRoles(e,t),exports.getRefreshToken=()=>u?.getRefreshToken(),exports.getSessionToken=c,exports.useDescope=()=>{const{logout:t,logoutAll:s}=k();return e.useMemo((()=>({logoutAll:s,logout:t})),[s,t])},exports.useSession=()=>{const{session:t,isSessionLoading:s,fetchSession:o}=k();return e.useEffect((()=>{t||s||o()}),[o]),{isSessionLoading:s,sessionToken:t,isAuthenticated:!!t}},exports.useUser=()=>{const{user:t,fetchUser:s,isUserLoading:o,session:r,isSessionLoading:n}=k(),[i,a]=e.useState(!1);return e.useEffect((()=>{t||o||!r||n||i||(a(!0),s())}),[n,s,r,i]),{isUserLoading:o,user:t}};
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
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\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\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/**\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/>\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, { 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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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/lib/hooks/Context.ts","../../src/lib/constants.ts","../../src/lib/sdk.ts","../../src/lib/utils.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","import createSdk from '@descope/web-js-sdk';\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: 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();\nexport const getJwtPermissions = (token = getSessionToken(), tenant?: string) =>\n\tsdkInstance?.getJwtPermissions(token, tenant);\nexport const getJwtRoles = (token = getSessionToken(), tenant?: string) =>\n\tsdkInstance?.getJwtRoles(token, tenant);\nexport const getRefreshToken = () => sdkInstance?.getRefreshToken();\n\nexport default createSdkWrapper;\n","/* eslint-disable import/prefer-default-export */\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 */\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","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}) => (\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/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t({ flowId, onSuccess, onError, tenant, theme, debug, telemetryKey }, ref) => {\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/>\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 } from 'react';\nimport useContext from './useContext';\n\nconst useSession = () => {\n\tconst { session, isSessionLoading, fetchSession } = useContext();\n\n\tuseEffect(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tfetchSession();\n\t\t}\n\t}, [fetchSession]);\n\n\treturn {\n\t\tisSessionLoading,\n\t\tsessionToken: session,\n\t\tisAuthenticated: !!session\n\t};\n};\n\nexport default useSession;\n","import { useEffect, useState } from 'react';\nimport useContext from './useContext';\n\nconst useUser = () => {\n\tconst { user, fetchUser, isUserLoading, session, isSessionLoading } =\n\t\tuseContext();\n\tconst [isInit, setIsInit] = useState(false); // we want to get the user only in the first time we got a session\n\n\tuseEffect(() => {\n\t\tif (!user && !isUserLoading && session && !isSessionLoading && !isInit) {\n\t\t\tsetIsInit(true);\n\t\t\tfetchUser();\n\t\t}\n\t}, [isSessionLoading, fetchUser, session, isInit]);\n\n\treturn { isUserLoading, user };\n};\n\nexport default useUser;\n"],"names":["Context","React","createContext","undefined","baseHeaders","sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","withValidation","fn","args","Error","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","tenant","theme","debug","telemetryKey","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","token","getJwtPermissions","getJwtRoles","getRefreshToken","sessionToken","isAuthenticated","isInit","setIsInit"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -26,17 +26,22 @@ declare const createSdkWrapper: <P extends Omit<{
26
26
  (...data: any[]): void;
27
27
  (message?: any, ...optionalParams: any[]): void;
28
28
  };
29
+ warn: {
30
+ (...data: any[]): void;
31
+ (message?: any, ...optionalParams: any[]): void;
32
+ };
29
33
  };
30
34
  baseUrl?: string;
31
35
  hooks?: {
32
36
  beforeRequest?: (config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig;
33
- afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void;
37
+ afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void | Promise<void>;
34
38
  };
35
39
  cookiePolicy?: RequestCredentials;
40
+ baseHeaders?: HeadersInit;
36
41
  }, "hooks"> & {
37
42
  hooks?: {
38
43
  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)[];
44
+ afterRequest?: ((req: _descope_core_js_sdk.RequestConfig, res: Response) => void | Promise<void>) | ((req: _descope_core_js_sdk.RequestConfig, res: Response) => void | Promise<void>)[];
40
45
  };
41
46
  } & {
42
47
  fpKey?: string;
@@ -50,8 +55,12 @@ declare const createSdkWrapper: <P extends Omit<{
50
55
  flow: {
51
56
  start: (flowId: string, options?: {
52
57
  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>>;
58
+ }, interactionId?: string, input?: {
59
+ [x: string]: string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | any[])[])[])[])[])[])[])[])[])[])[];
60
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
61
+ next: (executionId: string, stepId: string, interactionId: string, input?: {
62
+ [x: string]: string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | any[])[])[])[])[])[])[])[])[])[])[];
63
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
55
64
  };
56
65
  webauthn: {
57
66
  signUp: ((identifier: string, name: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>) & {
@@ -228,6 +237,16 @@ declare const createSdkWrapper: <P extends Omit<{
228
237
  }>(redirectURL?: string, config?: B_5) => Promise<B_5 extends {
229
238
  redirect: true;
230
239
  } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
240
+ discord: <B_6 extends {
241
+ redirect: boolean;
242
+ }>(redirectURL?: string, config?: B_6) => Promise<B_6 extends {
243
+ redirect: true;
244
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
245
+ linkedin: <B_7 extends {
246
+ redirect: boolean;
247
+ }>(redirectURL?: string, config?: B_7) => Promise<B_7 extends {
248
+ redirect: true;
249
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
231
250
  };
232
251
  exchange: (code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
233
252
  };
@@ -290,15 +309,19 @@ declare const createSdkWrapper: <P extends Omit<{
290
309
  }) => Promise<Response>;
291
310
  hooks?: {
292
311
  beforeRequest?: (config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig;
293
- afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void;
312
+ afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void | Promise<void>;
294
313
  };
295
314
  };
296
315
  } | {
297
316
  flow: {
298
317
  start: (flowId: string, options?: {
299
318
  tenant?: string;
300
- }, interactionId?: string, input?: Record<string, FormDataEntryValue>) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
301
- next: (executionId: string, stepId: string, interactionId: string, input?: Record<string, FormDataEntryValue>) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
319
+ }, interactionId?: string, input?: {
320
+ [x: string]: string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | any[])[])[])[])[])[])[])[])[])[])[];
321
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
322
+ next: (executionId: string, stepId: string, interactionId: string, input?: {
323
+ [x: string]: string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | any[])[])[])[])[])[])[])[])[])[])[];
324
+ }) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.FlowResponse>>;
302
325
  };
303
326
  webauthn: {
304
327
  signUp: ((identifier: string, name: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>) & {
@@ -445,9 +468,9 @@ declare const createSdkWrapper: <P extends Omit<{
445
468
  };
446
469
  oauth: {
447
470
  start: {
448
- facebook: <B_6 extends {
471
+ facebook: <B_8 extends {
449
472
  redirect: boolean;
450
- }>(redirectURL?: string, config?: B_6) => Promise<B_6 extends {
473
+ }>(redirectURL?: string, config?: B_8) => Promise<B_8 extends {
451
474
  redirect: true;
452
475
  } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
453
476
  github: <B_1_2 extends {
@@ -475,6 +498,16 @@ declare const createSdkWrapper: <P extends Omit<{
475
498
  }>(redirectURL?: string, config?: B_5_1) => Promise<B_5_1 extends {
476
499
  redirect: true;
477
500
  } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
501
+ discord: <B_6_1 extends {
502
+ redirect: boolean;
503
+ }>(redirectURL?: string, config?: B_6_1) => Promise<B_6_1 extends {
504
+ redirect: true;
505
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
506
+ linkedin: <B_7_1 extends {
507
+ redirect: boolean;
508
+ }>(redirectURL?: string, config?: B_7_1) => Promise<B_7_1 extends {
509
+ redirect: true;
510
+ } ? undefined : _descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.URLResponse>>;
478
511
  };
479
512
  exchange: (code: string) => Promise<_descope_core_js_sdk.SdkResponse<_descope_core_js_sdk.JWTResponse>>;
480
513
  };
@@ -537,7 +570,7 @@ declare const createSdkWrapper: <P extends Omit<{
537
570
  }) => Promise<Response>;
538
571
  hooks?: {
539
572
  beforeRequest?: (config: _descope_core_js_sdk.RequestConfig) => _descope_core_js_sdk.RequestConfig;
540
- afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void;
573
+ afterRequest?: (req: _descope_core_js_sdk.RequestConfig, res: Response) => void | Promise<void>;
541
574
  };
542
575
  };
543
576
  }) & {
@@ -547,7 +580,10 @@ declare const createSdkWrapper: <P extends Omit<{
547
580
  getRefreshToken: () => string;
548
581
  getSessionToken: () => string;
549
582
  };
550
- declare const getSessionToken: () => any;
583
+ declare const getSessionToken: () => string;
584
+ declare const getJwtPermissions: (token?: string, tenant?: string) => string[];
585
+ declare const getJwtRoles: (token?: string, tenant?: string) => string[];
586
+ declare const getRefreshToken: () => string;
551
587
 
552
588
  declare global {
553
589
  namespace JSX {
@@ -565,39 +601,9 @@ type CustomElement<T, K extends string = ''> = Partial<T & DOMAttributes<T> & {
565
601
  ref: React.Ref<HTMLElement>;
566
602
  } & CustomEvents<`on${K}`>>;
567
603
  type DescopeCustomElement = CustomElement<DescopeWc, 'success' | 'error'>;
568
- declare enum UserStatus {
569
- enabled = "enabled",
570
- disabled = "disabled",
571
- invited = "invited",
572
- unknown = "unknown"
573
- }
574
- interface IExternalID {
575
- id: string;
576
- type?: string;
577
- }
578
- interface User {
579
- externalIDs?: IExternalID[];
580
- displayName?: string;
581
- project?: string;
582
- logoutTime?: number;
583
- createTime?: number;
584
- email?: string;
585
- phoneNumber?: string;
586
- status?: UserStatus;
587
- verifiedEmail?: boolean;
588
- verifiedPhone?: boolean;
589
- tenants?: string[];
590
- }
591
604
  interface IAuth {
592
- authenticated: boolean;
593
- user?: User;
594
- sessionToken?: string;
595
605
  logoutAll: Sdk['logoutAll'];
596
606
  logout: Sdk['logout'];
597
- me: Sdk['me'];
598
- getJwtRoles: Sdk['getJwtRoles'];
599
- getJwtPermissions: Sdk['getJwtPermissions'];
600
- getRefreshToken: Sdk['getRefreshToken'];
601
607
  }
602
608
  type DescopeTheme = 'light' | 'dark';
603
609
  interface DescopeProps {
@@ -607,6 +613,7 @@ interface DescopeProps {
607
613
  tenant?: string;
608
614
  theme?: DescopeTheme;
609
615
  debug?: boolean;
616
+ telemetryKey?: string;
610
617
  }
611
618
  type DefaultFlowProps = Omit<DescopeProps, 'flowId'>;
612
619
 
@@ -616,6 +623,17 @@ declare const SignUpOrInFlow: (props: DefaultFlowProps) => JSX.Element;
616
623
 
617
624
  declare const Descope: React.ForwardRefExoticComponent<DescopeProps & React.RefAttributes<HTMLElement>>;
618
625
 
619
- declare const useAuth: () => IAuth;
626
+ declare const useDescope: () => IAuth;
627
+
628
+ declare const useSession: () => {
629
+ isSessionLoading: boolean;
630
+ sessionToken: string;
631
+ isAuthenticated: boolean;
632
+ };
633
+
634
+ declare const useUser: () => {
635
+ isUserLoading: boolean;
636
+ user: _descope_core_js_sdk.UserResponse;
637
+ };
620
638
 
621
- export { AuthProvider, Descope, SignInFlow, SignUpFlow, SignUpOrInFlow, getSessionToken, useAuth };
639
+ export { AuthProvider, Descope, SignInFlow, SignUpFlow, SignUpOrInFlow, getJwtPermissions, getJwtRoles, getRefreshToken, getSessionToken, useDescope, useSession, useUser };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
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 l;const d=e=>{const t=a({...e,persistTokens:!0,autoRefresh:!0});return l=t,t};l=d({projectId:"temp pid"});const u=()=>l?.getSessionToken(),f=e.createContext(void 0),p=({projectId:n,baseUrl:r,sessionTokenViaCookie:i,children:c})=>{const[a,l]=t({}),[u,p]=t(""),k=o((()=>{if(n)return d({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.29"},t}},persistToken:!0,autoRefresh:!0})}),[n,r]);s((()=>{if(!k)return;const e=k.onSessionTokenChange(p),t=k.onUserChange(l);return k.refresh(),()=>{e?.(),t?.()}}),[k]);const m=o((()=>({sdk:k,projectId:n,baseUrl:r,user:a,sessionToken:u,setUser:l,setSessionToken:p})),[u,a,n,r]);return e.createElement(f.Provider,{value:m},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})}))),m=e.forwardRef((({flowId:o,onSuccess:n,onError:a,tenant:l,theme:d,debug:u},p)=>{const[m,h]=t(null);r(p,(()=>m));const{projectId:g,baseUrl:w,setUser:b,setSessionToken:E,sdk:v}=e.useContext(f),I=i((e=>{b(e.detail?.user);const t=e.detail?.sessionJwt;E(t),v.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),n&&n(e)}),[b,E,n]);return s((()=>{const e=m;return e?.addEventListener("success",I),a&&e?.addEventListener("error",a),()=>{a&&e?.removeEventListener("error",a),e?.removeEventListener("success",I)}}),[m,a,I]),e.createElement("form",null,e.createElement(c,{fallback:null},e.createElement(k,{projectId:g,flowId:o,baseUrl:w,innerRef:h,tenant:l,theme:d,debug:u})))}));m.defaultProps={onError:void 0,onSuccess:void 0};const h=t=>e.createElement(m,{...t,flowId:"sign-in"}),g=t=>e.createElement(m,{...t,flowId:"sign-up"}),w=t=>e.createElement(m,{...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)},E=()=>{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]),l=i(b(r?.me),[r]),d=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:l,getJwtPermissions:d,getJwtRoles:u,getRefreshToken:p})),[s,n,r])};export{p as AuthProvider,m as Descope,h as SignInFlow,g as SignUpFlow,w as SignUpOrInFlow,u as getSessionToken,E as useAuth};
1
+ import e,{useMemo as s,useState as o,useEffect as t,useCallback as n,lazy as r,useImperativeHandle as i,Suspense as a,useContext as c}from"react";import l from"@descope/web-js-sdk";const d=e.createContext(void 0),u={"x-descope-sdk-name":"react","x-descope-sdk-version":"0.0.52-alpha.30"};let f;const p=e=>{const s=l({...e,persistTokens:!0,autoRefresh:!0});return f=s,s};f=p({projectId:"temp pid"});const g=()=>f?.getSessionToken(),h=(e=g(),s)=>f?.getJwtPermissions(e,s),m=(e=g(),s)=>f?.getJwtRoles(e,s),k=()=>f?.getRefreshToken();const b=e=>(...s)=>{if(!e)throw Error("You can only use this function after sdk initialization. Make sure to supply 'projectId' to <AuthProvider /> component");return e(...s)},w=({projectId:r,baseUrl:i,sessionTokenViaCookie:a,children:c})=>{const[l,f]=o(),[g,h]=o(),[m,k]=o(!1),[w,v]=o(!1),U=(({projectId:e,baseUrl:o,sessionTokenViaCookie:t})=>s((()=>{if(e)return p({projectId:e,baseUrl:o,sessionTokenViaCookie:t,baseHeaders:u,persistToken:!0,autoRefresh:!0})}),[e,o,t]))({projectId:r,baseUrl:i,sessionTokenViaCookie:a});t((()=>{if(U){const e=U.onSessionTokenChange(h),s=U.onUserChange(f);return()=>{e(),s()}}}),[U]);const E=n((()=>{v(!0),b(U?.refresh)().then((()=>{v(!1)}))}),[U]),I=n((()=>{k(!0),b(U.me)().then((()=>{k(!1)}))}),[U]),y=n(b(U?.logoutAll),[U]),S=n(b(U?.logout),[U]),j=s((()=>({fetchUser:I,user:l,isUserLoading:m,fetchSession:E,session:g,isSessionLoading:w,logout:S,logoutAll:y,projectId:r,baseUrl:i,setUser:f,setSession:h,sdk:U})),[I,l,m,E,g,w,S,y,r,i,f,h,U]);return e.createElement(d.Provider,{value:j},c)};w.defaultProps={baseUrl:"",children:void 0,sessionTokenViaCookie:!1};const v=r((async()=>((await import("@descope/web-component")).default.sdkConfigOverrides={baseHeaders:u},{default:({projectId:s,flowId:o,baseUrl:t,innerRef:n,tenant:r,theme:i,debug:a,telemetryKey:c})=>e.createElement("descope-wc",{"project-id":s,"flow-id":o,"base-url":t,ref:n,tenant:r,theme:i,debug:a,telemetryKey:c})}))),U=e.forwardRef((({flowId:s,onSuccess:r,onError:c,tenant:l,theme:u,debug:f,telemetryKey:p},g)=>{const[h,m]=o(null);i(g,(()=>h));const{projectId:k,baseUrl:b,setUser:w,setSession:U,sdk:E}=e.useContext(d),I=n((async e=>{w(e.detail?.user);const s=e.detail?.sessionJwt;U(s),await E.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),r&&r(e)}),[w,U,r]);return t((()=>{const e=h;return e?.addEventListener("success",I),c&&e?.addEventListener("error",c),()=>{c&&e?.removeEventListener("error",c),e?.removeEventListener("success",I)}}),[h,c,I]),e.createElement("form",null,e.createElement(a,{fallback:null},e.createElement(v,{projectId:k,flowId:s,baseUrl:b,innerRef:m,tenant:l,theme:u,debug:f,telemetryKey:p})))}));U.defaultProps={onError:void 0,onSuccess:void 0};const E=s=>e.createElement(U,{...s,flowId:"sign-in"}),I=s=>e.createElement(U,{...s,flowId:"sign-up"}),y=s=>e.createElement(U,{...s,flowId:"sign-up-or-in"});var S=()=>{const e=c(d);if(!e)throw Error("You can only use this hook in the context of <AuthProvider />");return e};const j=()=>{const{logout:e,logoutAll:o}=S();return s((()=>({logoutAll:o,logout:e})),[o,e])},C=()=>{const{session:e,isSessionLoading:s,fetchSession:o}=S();return t((()=>{e||s||o()}),[o]),{isSessionLoading:s,sessionToken:e,isAuthenticated:!!e}},L=()=>{const{user:e,fetchUser:s,isUserLoading:n,session:r,isSessionLoading:i}=S(),[a,c]=o(!1);return t((()=>{e||n||!r||i||a||(c(!0),s())}),[i,s,r,a]),{isUserLoading:n,user:e}};export{w as AuthProvider,U as Descope,E as SignInFlow,I as SignUpFlow,y as SignUpOrInFlow,h as getJwtPermissions,m as getJwtRoles,k as getRefreshToken,g as getSessionToken,j as useDescope,C as useSession,L as useUser};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
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\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\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/**\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/>\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 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":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/lib/hooks/Context.ts","../src/lib/constants.ts","../src/lib/sdk.ts","../src/lib/utils.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","import createSdk from '@descope/web-js-sdk';\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: 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();\nexport const getJwtPermissions = (token = getSessionToken(), tenant?: string) =>\n\tsdkInstance?.getJwtPermissions(token, tenant);\nexport const getJwtRoles = (token = getSessionToken(), tenant?: string) =>\n\tsdkInstance?.getJwtRoles(token, tenant);\nexport const getRefreshToken = () => sdkInstance?.getRefreshToken();\n\nexport default createSdkWrapper;\n","/* eslint-disable import/prefer-default-export */\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 */\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","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}) => (\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/>\n\t\t)\n\t};\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n\t({ flowId, onSuccess, onError, tenant, theme, debug, telemetryKey }, ref) => {\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/>\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 } from 'react';\nimport useContext from './useContext';\n\nconst useSession = () => {\n\tconst { session, isSessionLoading, fetchSession } = useContext();\n\n\tuseEffect(() => {\n\t\tif (!session && !isSessionLoading) {\n\t\t\tfetchSession();\n\t\t}\n\t}, [fetchSession]);\n\n\treturn {\n\t\tisSessionLoading,\n\t\tsessionToken: session,\n\t\tisAuthenticated: !!session\n\t};\n};\n\nexport default useSession;\n","import { useEffect, useState } from 'react';\nimport useContext from './useContext';\n\nconst useUser = () => {\n\tconst { user, fetchUser, isUserLoading, session, isSessionLoading } =\n\t\tuseContext();\n\tconst [isInit, setIsInit] = useState(false); // we want to get the user only in the first time we got a session\n\n\tuseEffect(() => {\n\t\tif (!user && !isUserLoading && session && !isSessionLoading && !isInit) {\n\t\t\tsetIsInit(true);\n\t\t\tfetchUser();\n\t\t}\n\t}, [isSessionLoading, fetchUser, session, isInit]);\n\n\treturn { isUserLoading, user };\n};\n\nexport default useUser;\n"],"names":["Context","React","createContext","undefined","baseHeaders","sdkInstance","createSdkWrapper","config","sdk","createSdk","persistTokens","autoRefresh","projectId","getSessionToken","getJwtPermissions","token","tenant","getJwtRoles","getRefreshToken","withValidation","fn","args","Error","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","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","sessionToken","isAuthenticated","useUser","isInit","setIsInit"],"mappings":"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"}
package/package.json CHANGED
@@ -1,36 +1,52 @@
1
1
  {
2
2
  "name": "@descope/react-sdk",
3
- "version": "0.0.52-alpha.29",
4
- "main": "dist/cjs/index.cjs.js",
5
- "module": "dist/index.esm.js",
6
- "types": "dist/index.d.ts",
7
- "exports": {
8
- "require": "./dist/cjs/index.cjs.js",
9
- "import": "./dist/index.esm.js"
10
- },
11
- "type": "module",
3
+ "version": "0.0.52-alpha.30",
12
4
  "description": "Descope React SDK",
13
- "license": "ISC",
14
5
  "repository": {
15
6
  "type": "git",
16
7
  "url": "https://github.com/descope/react-sdk.git"
17
8
  },
9
+ "license": "ISC",
10
+ "type": "module",
11
+ "exports": {
12
+ "require": "./dist/cjs/index.cjs.js",
13
+ "import": "./dist/index.esm.js"
14
+ },
15
+ "main": "dist/cjs/index.cjs.js",
16
+ "module": "dist/index.esm.js",
17
+ "types": "dist/index.d.ts",
18
18
  "files": [
19
19
  "dist"
20
20
  ],
21
+ "scripts": {
22
+ "build": "rollup -c",
23
+ "format": "prettier . -w --ignore-path .gitignore",
24
+ "format-check": "prettier . --check --ignore-path .gitignore",
25
+ "format-lint": "pretty-quick --staged --ignore-path .gitignore && lint-staged",
26
+ "lint": "eslint '+(src|test|testUtils)/**/*.ts' --fix",
27
+ "prepare": "husky install",
28
+ "prepublishOnly": "npm run build",
29
+ "start": "npm run build && rollup -c rollup.config.app.js -w",
30
+ "test": "jest"
31
+ },
32
+ "lint-staged": {
33
+ "+(src|test|examples)/**/*.{js,ts,jsx,tsx}": [
34
+ "npm run lint"
35
+ ]
36
+ },
21
37
  "dependencies": {
22
- "@descope/web-component": "0.1.0-alpha.29",
23
- "react-router-dom": "6.6.1"
38
+ "@descope/web-component": "0.1.0-alpha.39",
39
+ "react-router-dom": "6.6.2"
24
40
  },
25
41
  "devDependencies": {
26
- "@babel/core": "7.20.7",
42
+ "@babel/core": "7.20.12",
27
43
  "@babel/preset-env": "7.20.2",
28
44
  "@babel/preset-react": "7.18.6",
29
45
  "@babel/preset-typescript": "7.18.6",
30
46
  "@open-wc/rollup-plugin-html": "^1.2.5",
31
- "@rollup/plugin-commonjs": "^21.1.0",
32
- "@rollup/plugin-node-resolve": "^13.3.0",
33
- "@rollup/plugin-replace": "^3.0.0",
47
+ "@rollup/plugin-commonjs": "^24.0.0",
48
+ "@rollup/plugin-node-resolve": "^15.0.0",
49
+ "@rollup/plugin-replace": "^5.0.0",
34
50
  "@rollup/plugin-typescript": "^8.3.0",
35
51
  "@testing-library/jest-dom": "5.16.5",
36
52
  "@testing-library/react": "13.4.0",
@@ -40,23 +56,23 @@
40
56
  "@types/react-dom": "18.0.10",
41
57
  "@types/react-router-dom": "^5.3.3",
42
58
  "babel-jest": "27.5.1",
43
- "eslint": "8.31.0",
59
+ "eslint": "8.32.0",
44
60
  "eslint-config-airbnb": "19.0.4",
45
61
  "eslint-config-airbnb-typescript": "17.0.0",
46
62
  "eslint-config-prettier": "8.6.0",
47
63
  "eslint-config-standard": "17.0.0",
48
64
  "eslint-import-resolver-typescript": "2.7.1",
49
- "eslint-plugin-import": "2.26.0",
50
- "eslint-plugin-jest": "26.9.0",
65
+ "eslint-plugin-import": "2.27.5",
66
+ "eslint-plugin-jest": "27.2.1",
51
67
  "eslint-plugin-jest-dom": "4.0.3",
52
68
  "eslint-plugin-jest-formatting": "3.1.0",
53
- "eslint-plugin-jsx-a11y": "6.6.1",
54
- "eslint-plugin-n": "15.6.0",
55
- "eslint-plugin-no-only-tests": "2.6.0",
69
+ "eslint-plugin-jsx-a11y": "6.7.1",
70
+ "eslint-plugin-n": "15.6.1",
71
+ "eslint-plugin-no-only-tests": "3.1.0",
56
72
  "eslint-plugin-prefer-arrow": "1.2.3",
57
73
  "eslint-plugin-prettier": "4.2.1",
58
74
  "eslint-plugin-promise": "6.1.1",
59
- "eslint-plugin-react": "7.31.11",
75
+ "eslint-plugin-react": "7.32.1",
60
76
  "eslint-plugin-react-hooks": "4.6.0",
61
77
  "eslint-plugin-testing-library": "5.9.1",
62
78
  "husky": "^8.0.1",
@@ -74,31 +90,15 @@
74
90
  "rollup-plugin-dotenv": "^0.4.1",
75
91
  "rollup-plugin-dts": "^4.2.2",
76
92
  "rollup-plugin-livereload": "^2.0.5",
77
- "rollup-plugin-serve": "^1.1.0",
93
+ "rollup-plugin-serve": "^2.0.0",
78
94
  "rollup-plugin-terser": "^7.0.2",
79
95
  "ts-jest": "^27.0.7",
80
96
  "ts-node": "10.9.1",
81
97
  "typescript": "^4.5.3"
82
98
  },
83
99
  "peerDependencies": {
100
+ "@descope/web-js-sdk": "0.1.0-alpha.28",
84
101
  "@types/react": ">=16",
85
- "react": ">=16",
86
- "@descope/web-js-sdk": "0.1.0-alpha.21"
87
- },
88
- "scripts": {
89
- "start": "npm run build && rollup -c rollup.config.app.js -w",
90
- "build": "rollup -c",
91
- "prepare": "husky install",
92
- "test": "jest",
93
- "lint": "eslint '+(src|test|testUtils)/**/*.ts' --fix",
94
- "format": "prettier . -w --ignore-path .gitignore",
95
- "format-check": "prettier . --check --ignore-path .gitignore",
96
- "format-lint": "pretty-quick --staged --ignore-path .gitignore && lint-staged",
97
- "prepublishOnly": "npm run build"
98
- },
99
- "lint-staged": {
100
- "+(src|test|examples)/**/*.{js,ts,jsx,tsx}": [
101
- "npm run lint"
102
- ]
102
+ "react": ">=16"
103
103
  }
104
104
  }