@descope/react-sdk 2.27.12 → 2.28.1
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 +41 -0
- package/dist/cjs/components/Descope.js +1 -1
- package/dist/cjs/components/Descope.js.map +1 -1
- package/dist/cjs/constants.js +1 -1
- package/dist/esm/components/Descope.js +1 -1
- package/dist/esm/components/Descope.js.map +1 -1
- package/dist/esm/constants.js +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/types/sdk.d.ts +9 -0
- package/dist/types/types.d.ts +2 -0
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -541,10 +541,51 @@ const AppRoot = () => {
|
|
|
541
541
|
};
|
|
542
542
|
````
|
|
543
543
|
|
|
544
|
+
### Custom Storage
|
|
545
|
+
|
|
546
|
+
By default the SDK reads and writes to `window.localStorage` for state that needs to outlive a single page load (last-authenticated user, client-side session-refresh optimization markers, etc.). If `localStorage` is unavailable or you want to back these keys with something else — `sessionStorage`, an in-memory store, an encrypted wrapper — pass a `customStorage` prop to the `AuthProvider`.
|
|
547
|
+
|
|
548
|
+
```js
|
|
549
|
+
import { AuthProvider } from '@descope/react-sdk';
|
|
550
|
+
|
|
551
|
+
const inMemoryStorage = (() => {
|
|
552
|
+
const map = new Map();
|
|
553
|
+
return {
|
|
554
|
+
getItem: (key) => (map.has(key) ? map.get(key) : null),
|
|
555
|
+
setItem: (key, value) => {
|
|
556
|
+
map.set(key, value);
|
|
557
|
+
},
|
|
558
|
+
removeItem: (key) => {
|
|
559
|
+
map.delete(key);
|
|
560
|
+
},
|
|
561
|
+
};
|
|
562
|
+
})();
|
|
563
|
+
|
|
564
|
+
const AppRoot = () => (
|
|
565
|
+
<AuthProvider projectId="my-project-id" customStorage={inMemoryStorage}>
|
|
566
|
+
<App />
|
|
567
|
+
</AuthProvider>
|
|
568
|
+
);
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
The object must implement the `CustomStorage` interface:
|
|
572
|
+
|
|
573
|
+
```ts
|
|
574
|
+
type CustomStorage = {
|
|
575
|
+
getItem: (key: string) => string | null;
|
|
576
|
+
setItem: (key: string, value: string) => void;
|
|
577
|
+
removeItem: (key: string) => void;
|
|
578
|
+
};
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
> **Note:** The SDK writes a small set of internal keys (e.g. for the last-authenticated user feature and client-side session-refresh optimizations). Make sure your implementation round-trips these keys cleanly — `getItem(key)` should return the same string that was last passed to `setItem(key, value)`. If your storage drops, filters, or namespaces keys so that they don't survive a round-trip, some optimizations may degrade — for example, an extra `/v1/auth/try-refresh` round-trip may be made on every page load even for anonymous visitors.
|
|
582
|
+
|
|
544
583
|
### Last User Persistence
|
|
545
584
|
|
|
546
585
|
Descope stores the last user information in local storage. If you wish to disable this feature, you can pass `storeLastAuthenticatedUser={false}` to the `AuthProvider` component. Please note that some features related to the last authenticated user may not function as expected if this behavior is disabled. Local storage is being cleared when the user logs out, if you want the avoid clearing the local storage, you can pass `keepLastAuthenticatedUserAfterLogout={true}` to the `AuthProvider` component.
|
|
547
586
|
|
|
587
|
+
The last-user key also serves as a signal for the SDK's session initialization optimization: on mount, the `AuthProvider` skips the initial `/try-refresh` network call if no prior session indicator is found in `localStorage` (neither the last-user key nor the `DSLI` key written on every successful authentication). This means anonymous visitors never pay a round-trip at startup. If `storeLastAuthenticatedUser={false}`, only the `DSLI` key is used as the indicator.
|
|
588
|
+
|
|
548
589
|
### Seamless Session Migration
|
|
549
590
|
|
|
550
591
|
If you are migrating from an external authentication provider to Descope, you can use the `getExternalToken` prop in the `AuthProvider` component. This function should return a valid token from the external provider. The SDK will then use this token to authenticate the user with Descope.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),t=require("react"),r=require("../constants.js"),s=require("../hooks/Context.js"),n=require("../sdk.js"),o=require("./withPropsMapping/index.js");function a(e){return e&&e.__esModule?e:{default:e}}var u=a(t);const l=t.lazy((async()=>(((null===customElements||void 0===customElements?void 0:customElements.get("descope-wc"))||await import("@descope/web-component").then((e=>e.default))).sdkConfigOverrides={baseHeaders:r.baseHeaders,persistTokens:!1,hooks:{get beforeRequest(){return n.getGlobalSdk().httpClient.hooks.beforeRequest},set beforeRequest(e){}}},{default:o.default(u.default.forwardRef(((s,n)=>{var{"external-request-id":o}=s,a=e.__rest(s,["external-request-id"]);return t.useMemo((()=>{var e,t;e="x-external-rid",(t=o)?r.baseHeaders[e]=t:delete r.baseHeaders[e]}),[o]),u.default.createElement("descope-wc",Object.assign({ref:n},a))})))}))),d=u.default.forwardRef((({flowId:e,onSuccess:r,onError:n,onReady:o,logger:a,tenant:d,theme:c,nonce:i,locale:p,debug:f,client:m,form:v,telemetryKey:E,redirectUrl:b,autoFocus:g,validateOnBlur:h,restartOnError:L,errorTransformer:k,styleId:y,onScreenUpdate:q,dismissScreenErrorOnInput:S,outboundAppId:U,outboundAppScopes:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib"),t=require("react"),r=require("../constants.js"),s=require("../hooks/Context.js"),n=require("../sdk.js"),o=require("./withPropsMapping/index.js");function a(e){return e&&e.__esModule?e:{default:e}}var u=a(t);const l=t.lazy((async()=>(((null===customElements||void 0===customElements?void 0:customElements.get("descope-wc"))||await import("@descope/web-component").then((e=>e.default))).sdkConfigOverrides={baseHeaders:r.baseHeaders,persistTokens:!1,hooks:{get beforeRequest(){return n.getGlobalSdk().httpClient.hooks.beforeRequest},set beforeRequest(e){}}},{default:o.default(u.default.forwardRef(((s,n)=>{var{"external-request-id":o}=s,a=e.__rest(s,["external-request-id"]);return t.useMemo((()=>{var e,t;e="x-external-rid",(t=o)?r.baseHeaders[e]=t:delete r.baseHeaders[e]}),[o]),u.default.createElement("descope-wc",Object.assign({ref:n},a))})))}))),d=u.default.forwardRef((({flowId:e,onSuccess:r,onError:n,onReady:o,logger:a,tenant:d,theme:c,nonce:i,locale:p,debug:f,client:m,form:v,telemetryKey:E,redirectUrl:b,autoFocus:g,validateOnBlur:h,restartOnError:L,errorTransformer:k,styleId:y,onScreenUpdate:q,dismissScreenErrorOnInput:S,outboundAppId:U,outboundAppScopes:O,popupOrigin:w,children:x,externalRequestId:I,themeOverride:C},R)=>{const[j,A]=t.useState(null);t.useImperativeHandle(R,(()=>j));const{projectId:_,baseUrl:H,baseStaticUrl:M,baseCdnUrl:N,storeLastAuthenticatedUser:T,keepLastAuthenticatedUserAfterLogout:B,refreshCookieName:F,customStorage:K,sdk:P}=u.default.useContext(s.default),z=t.useCallback((async e=>{await P.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),r&&r(e)}),[r]);return t.useEffect((()=>{const e=j;return null==e||e.addEventListener("success",z),n&&(null==e||e.addEventListener("error",n)),o&&(null==e||e.addEventListener("ready",o)),()=>{n&&(null==e||e.removeEventListener("error",n)),o&&(null==e||e.removeEventListener("ready",o)),null==e||e.removeEventListener("success",z)}}),[j,n,z]),t.useEffect((()=>{const e=j;return null==e||e.addEventListener("success",z),()=>{null==e||e.removeEventListener("success",z)}}),[j,z]),t.useEffect((()=>{const e=j;return n&&(null==e||e.addEventListener("error",n)),()=>{n&&(null==e||e.removeEventListener("error",n))}}),[j,n]),t.useEffect((()=>{const e=j;return o&&(null==e||e.addEventListener("ready",o)),()=>{o&&(null==e||e.removeEventListener("error",o))}}),[j,o]),u.default.createElement("form",null,u.default.createElement(t.Suspense,{fallback:null},u.default.createElement(l,{projectId:_,flowId:e,baseUrl:H,baseStaticUrl:M,baseCdnUrl:N,ref:A,telemetryKey:E,redirectUrl:b,autoFocus:g,styleId:y,validateOnBlur:h,restartOnError:L,keepLastAuthenticatedUserAfterLogout:B,tenant:d,externalRequestId:I,customStorage:K,themeOverride:C,"theme.attr":c,"nonce.attr":i,"locale.attr":p,"form.attr":v,"client.attr":m,"debug.attr":f,"outbound-app-id.attr":U,"outbound-app-scopes.attr":O,"popup-origin.attr":w,"store-last-authenticated-user.attr":T,"refreshCookieName.attr":F,"dismiss-screen-error-on-input.attr":S,"errorTransformer.prop":k,"logger.prop":a,"onScreenUpdate.prop":q,"customStorage.prop":K},x)))}));exports.default=d;
|
|
2
2
|
//# sourceMappingURL=Descope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Descope.js","sources":["../../../src/components/Descope.tsx"],"sourcesContent":["/* eslint-disable react/prop-types */\nimport React, {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\nimport { getGlobalSdk } from '../sdk';\nimport withPropsMapping from './withPropsMapping';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n const updateDynamicHeader = (key: string, value: string) => {\n if (value) {\n baseHeaders[key] = value;\n } else {\n delete baseHeaders[key];\n }\n };\n\n const WebComponent: any =\n customElements?.get('descope-wc') ||\n (await import('@descope/web-component').then((module) => module.default));\n\n WebComponent.sdkConfigOverrides = {\n // Overrides the web-component's base headers to indicate usage via the React SDK\n baseHeaders,\n // Disables token persistence within the web-component to delegate token management\n // to the global SDK hooks. This ensures token handling aligns with the SDK's configuration,\n // and web-component requests leverage the global SDK's beforeRequest hooks for consistency\n persistTokens: false,\n hooks: {\n get beforeRequest() {\n // Retrieves the beforeRequest hook from the global SDK, which is initialized\n // within the AuthProvider using the desired configuration. This approach ensures\n // the web-component utilizes the same beforeRequest hooks as the global SDK\n return getGlobalSdk().httpClient.hooks.beforeRequest;\n },\n set beforeRequest(_) {\n // The empty setter prevents runtime errors when attempts are made to assign a value to 'beforeRequest'.\n // JavaScript objects default to having both getters and setters\n },\n },\n };\n\n return {\n default: withPropsMapping(\n React.forwardRef<HTMLElement>(\n ({ 'external-request-id': externalRequestId, ...props }: any, ref) => {\n // update the dynamic headers with the external request ID if provided\n useMemo(() => {\n updateDynamicHeader('x-external-rid', externalRequestId);\n }, [externalRequestId]);\n\n return <descope-wc ref={ref} {...props} />;\n },\n ),\n ),\n };\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n (\n {\n flowId,\n onSuccess,\n onError,\n onReady,\n logger,\n tenant,\n theme,\n nonce,\n locale,\n debug,\n client,\n form,\n telemetryKey,\n redirectUrl,\n autoFocus,\n validateOnBlur,\n restartOnError,\n errorTransformer,\n styleId,\n onScreenUpdate,\n dismissScreenErrorOnInput,\n outboundAppId,\n outboundAppScopes,\n popupOrigin,\n children,\n externalRequestId,\n },\n ref,\n ) => {\n const [innerRef, setInnerRef] = useState(null);\n\n useImperativeHandle(ref, () => innerRef);\n\n const {\n projectId,\n baseUrl,\n baseStaticUrl,\n baseCdnUrl,\n storeLastAuthenticatedUser,\n keepLastAuthenticatedUserAfterLogout,\n refreshCookieName,\n customStorage,\n sdk,\n } = React.useContext(Context);\n\n const handleSuccess = useCallback(\n async (e: CustomEvent) => {\n // In order to make sure all the after-hooks are running with the success response\n // we are generating a fake response with the success data and calling the http client after hook fn with it\n await sdk.httpClient.hooks.afterRequest(\n {} as any,\n new Response(JSON.stringify(e.detail)),\n );\n if (onSuccess) {\n onSuccess(e);\n }\n },\n [onSuccess],\n );\n\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n if (onError) ele?.addEventListener('error', onError);\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n if (onReady) ele?.removeEventListener('ready', onReady);\n\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, onError, handleSuccess]);\n\n // Success event\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n return () => {\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, handleSuccess]);\n\n // Error event\n useEffect(() => {\n const ele = innerRef;\n if (onError) ele?.addEventListener('error', onError);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n };\n }, [innerRef, onError]);\n\n // Ready event\n useEffect(() => {\n const ele = innerRef;\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onReady) ele?.removeEventListener('error', onReady);\n };\n }, [innerRef, onReady]);\n\n return (\n /**\n * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n * this workaround is done in order to support webauthn passkeys\n * it can be removed once this issue will be solved\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n */\n\t<form>\n\t\t<Suspense fallback={null}>\n\t\t\t<DescopeWC\n projectId={projectId}\n flowId={flowId}\n baseUrl={baseUrl}\n baseStaticUrl={baseStaticUrl}\n baseCdnUrl={baseCdnUrl}\n ref={setInnerRef}\n telemetryKey={telemetryKey}\n redirectUrl={redirectUrl}\n autoFocus={autoFocus}\n styleId={styleId}\n validateOnBlur={validateOnBlur}\n restartOnError={restartOnError}\n keepLastAuthenticatedUserAfterLogout={\n keepLastAuthenticatedUserAfterLogout\n }\n tenant={tenant}\n externalRequestId={externalRequestId}\n customStorage={customStorage}\n {...{\n // attributes\n 'theme.attr': theme,\n 'nonce.attr': nonce,\n 'locale.attr': locale,\n 'form.attr': form,\n 'client.attr': client,\n 'debug.attr': debug,\n 'outbound-app-id.attr': outboundAppId,\n 'outbound-app-scopes.attr': outboundAppScopes,\n 'popup-origin.attr': popupOrigin,\n 'store-last-authenticated-user.attr': storeLastAuthenticatedUser,\n 'refreshCookieName.attr': refreshCookieName,\n 'dismiss-screen-error-on-input.attr': dismissScreenErrorOnInput,\n // props\n 'errorTransformer.prop': errorTransformer,\n 'logger.prop': logger,\n 'onScreenUpdate.prop': onScreenUpdate,\n 'customStorage.prop': customStorage,\n }}\n >\n\t\t\t\t{children}\n\t\t\t</DescopeWC>\n\t\t</Suspense>\n\t</form>\n );\n },\n);\n\nexport default Descope;\n"],"names":["DescopeWC","lazy","async","customElements","get","import","then","module","default","sdkConfigOverrides","baseHeaders","persistTokens","hooks","beforeRequest","getGlobalSdk","httpClient","_","withPropsMapping","React","forwardRef","_a","ref","externalRequestId","props","__rest","useMemo","key","value","Descope","flowId","onSuccess","onError","onReady","logger","tenant","theme","nonce","locale","debug","client","form","telemetryKey","redirectUrl","autoFocus","validateOnBlur","restartOnError","errorTransformer","styleId","onScreenUpdate","dismissScreenErrorOnInput","outboundAppId","outboundAppScopes","popupOrigin","children","innerRef","setInnerRef","useState","useImperativeHandle","projectId","baseUrl","baseStaticUrl","baseCdnUrl","storeLastAuthenticatedUser","keepLastAuthenticatedUserAfterLogout","refreshCookieName","customStorage","sdk","useContext","Context","handleSuccess","useCallback","e","afterRequest","Response","JSON","stringify","detail","useEffect","ele","addEventListener","removeEventListener","createElement","Suspense","fallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Descope.js","sources":["../../../src/components/Descope.tsx"],"sourcesContent":["/* eslint-disable react/prop-types */\nimport React, {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\nimport { getGlobalSdk } from '../sdk';\nimport withPropsMapping from './withPropsMapping';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n const updateDynamicHeader = (key: string, value: string) => {\n if (value) {\n baseHeaders[key] = value;\n } else {\n delete baseHeaders[key];\n }\n };\n\n const WebComponent: any =\n customElements?.get('descope-wc') ||\n (await import('@descope/web-component').then((module) => module.default));\n\n WebComponent.sdkConfigOverrides = {\n // Overrides the web-component's base headers to indicate usage via the React SDK\n baseHeaders,\n // Disables token persistence within the web-component to delegate token management\n // to the global SDK hooks. This ensures token handling aligns with the SDK's configuration,\n // and web-component requests leverage the global SDK's beforeRequest hooks for consistency\n persistTokens: false,\n hooks: {\n get beforeRequest() {\n // Retrieves the beforeRequest hook from the global SDK, which is initialized\n // within the AuthProvider using the desired configuration. This approach ensures\n // the web-component utilizes the same beforeRequest hooks as the global SDK\n return getGlobalSdk().httpClient.hooks.beforeRequest;\n },\n set beforeRequest(_) {\n // The empty setter prevents runtime errors when attempts are made to assign a value to 'beforeRequest'.\n // JavaScript objects default to having both getters and setters\n },\n },\n };\n\n return {\n default: withPropsMapping(\n React.forwardRef<HTMLElement>(\n ({ 'external-request-id': externalRequestId, ...props }: any, ref) => {\n // update the dynamic headers with the external request ID if provided\n useMemo(() => {\n updateDynamicHeader('x-external-rid', externalRequestId);\n }, [externalRequestId]);\n\n return <descope-wc ref={ref} {...props} />;\n },\n ),\n ),\n };\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n (\n {\n flowId,\n onSuccess,\n onError,\n onReady,\n logger,\n tenant,\n theme,\n nonce,\n locale,\n debug,\n client,\n form,\n telemetryKey,\n redirectUrl,\n autoFocus,\n validateOnBlur,\n restartOnError,\n errorTransformer,\n styleId,\n onScreenUpdate,\n dismissScreenErrorOnInput,\n outboundAppId,\n outboundAppScopes,\n popupOrigin,\n children,\n externalRequestId,\n themeOverride,\n },\n ref,\n ) => {\n const [innerRef, setInnerRef] = useState(null);\n\n useImperativeHandle(ref, () => innerRef);\n\n const {\n projectId,\n baseUrl,\n baseStaticUrl,\n baseCdnUrl,\n storeLastAuthenticatedUser,\n keepLastAuthenticatedUserAfterLogout,\n refreshCookieName,\n customStorage,\n sdk,\n } = React.useContext(Context);\n\n const handleSuccess = useCallback(\n async (e: CustomEvent) => {\n // In order to make sure all the after-hooks are running with the success response\n // we are generating a fake response with the success data and calling the http client after hook fn with it\n await sdk.httpClient.hooks.afterRequest(\n {} as any,\n new Response(JSON.stringify(e.detail)),\n );\n if (onSuccess) {\n onSuccess(e);\n }\n },\n [onSuccess],\n );\n\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n if (onError) ele?.addEventListener('error', onError);\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n if (onReady) ele?.removeEventListener('ready', onReady);\n\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, onError, handleSuccess]);\n\n // Success event\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n return () => {\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, handleSuccess]);\n\n // Error event\n useEffect(() => {\n const ele = innerRef;\n if (onError) ele?.addEventListener('error', onError);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n };\n }, [innerRef, onError]);\n\n // Ready event\n useEffect(() => {\n const ele = innerRef;\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onReady) ele?.removeEventListener('error', onReady);\n };\n }, [innerRef, onReady]);\n\n return (\n /**\n * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n * this workaround is done in order to support webauthn passkeys\n * it can be removed once this issue will be solved\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n */\n <form>\n <Suspense fallback={null}>\n <DescopeWC\n projectId={projectId}\n flowId={flowId}\n baseUrl={baseUrl}\n baseStaticUrl={baseStaticUrl}\n baseCdnUrl={baseCdnUrl}\n ref={setInnerRef}\n telemetryKey={telemetryKey}\n redirectUrl={redirectUrl}\n autoFocus={autoFocus}\n styleId={styleId}\n validateOnBlur={validateOnBlur}\n restartOnError={restartOnError}\n keepLastAuthenticatedUserAfterLogout={\n keepLastAuthenticatedUserAfterLogout\n }\n tenant={tenant}\n externalRequestId={externalRequestId}\n customStorage={customStorage}\n themeOverride={themeOverride}\n {...{\n // attributes\n 'theme.attr': theme,\n 'nonce.attr': nonce,\n 'locale.attr': locale,\n 'form.attr': form,\n 'client.attr': client,\n 'debug.attr': debug,\n 'outbound-app-id.attr': outboundAppId,\n 'outbound-app-scopes.attr': outboundAppScopes,\n 'popup-origin.attr': popupOrigin,\n 'store-last-authenticated-user.attr': storeLastAuthenticatedUser,\n 'refreshCookieName.attr': refreshCookieName,\n 'dismiss-screen-error-on-input.attr': dismissScreenErrorOnInput,\n // props\n 'errorTransformer.prop': errorTransformer,\n 'logger.prop': logger,\n 'onScreenUpdate.prop': onScreenUpdate,\n 'customStorage.prop': customStorage,\n }}\n >\n {children}\n </DescopeWC>\n </Suspense>\n </form>\n );\n },\n);\n\nexport default Descope;\n"],"names":["DescopeWC","lazy","async","customElements","get","import","then","module","default","sdkConfigOverrides","baseHeaders","persistTokens","hooks","beforeRequest","getGlobalSdk","httpClient","_","withPropsMapping","React","forwardRef","_a","ref","externalRequestId","props","__rest","useMemo","key","value","Descope","flowId","onSuccess","onError","onReady","logger","tenant","theme","nonce","locale","debug","client","form","telemetryKey","redirectUrl","autoFocus","validateOnBlur","restartOnError","errorTransformer","styleId","onScreenUpdate","dismissScreenErrorOnInput","outboundAppId","outboundAppScopes","popupOrigin","children","themeOverride","innerRef","setInnerRef","useState","useImperativeHandle","projectId","baseUrl","baseStaticUrl","baseCdnUrl","storeLastAuthenticatedUser","keepLastAuthenticatedUserAfterLogout","refreshCookieName","customStorage","sdk","useContext","Context","handleSuccess","useCallback","e","afterRequest","Response","JSON","stringify","detail","useEffect","ele","addEventListener","removeEventListener","createElement","Suspense","fallback"],"mappings":"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"}
|
package/dist/cjs/constants.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e="undefined"!=typeof window;exports.IS_BROWSER=e,exports.baseHeaders={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.
|
|
1
|
+
"use strict";const e="undefined"!=typeof window;exports.IS_BROWSER=e,exports.baseHeaders={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.28.1"};
|
|
2
2
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{__rest as e}from"tslib";import t,{lazy as r,useMemo as n,useState as o,useImperativeHandle as s,useCallback as a,useEffect as l,Suspense as u}from"react";import{baseHeaders as d}from"../constants.js";import
|
|
1
|
+
import{__rest as e}from"tslib";import t,{lazy as r,useMemo as n,useState as o,useImperativeHandle as s,useCallback as a,useEffect as l,Suspense as u}from"react";import{baseHeaders as d}from"../constants.js";import i from"../hooks/Context.js";import{getGlobalSdk as c}from"../sdk.js";import p from"./withPropsMapping/index.js";const m=r((async()=>(((null===customElements||void 0===customElements?void 0:customElements.get("descope-wc"))||await import("@descope/web-component").then((e=>e.default))).sdkConfigOverrides={baseHeaders:d,persistTokens:!1,hooks:{get beforeRequest(){return c().httpClient.hooks.beforeRequest},set beforeRequest(e){}}},{default:p(t.forwardRef(((r,o)=>{var{"external-request-id":s}=r,a=e(r,["external-request-id"]);return n((()=>{var e,t;e="x-external-rid",(t=s)?d[e]=t:delete d[e]}),[s]),t.createElement("descope-wc",Object.assign({ref:o},a))})))}))),f=t.forwardRef((({flowId:e,onSuccess:r,onError:n,onReady:d,logger:c,tenant:p,theme:f,nonce:v,locale:E,debug:b,client:g,form:h,telemetryKey:L,redirectUrl:k,autoFocus:y,validateOnBlur:U,restartOnError:w,errorTransformer:O,styleId:S,onScreenUpdate:x,dismissScreenErrorOnInput:I,outboundAppId:R,outboundAppScopes:C,popupOrigin:q,children:j,externalRequestId:A,themeOverride:N},T)=>{const[B,F]=o(null);s(T,(()=>B));const{projectId:K,baseUrl:H,baseStaticUrl:J,baseCdnUrl:M,storeLastAuthenticatedUser:P,keepLastAuthenticatedUserAfterLogout:z,refreshCookieName:D,customStorage:G,sdk:Q}=t.useContext(i),V=a((async e=>{await Q.httpClient.hooks.afterRequest({},new Response(JSON.stringify(e.detail))),r&&r(e)}),[r]);return l((()=>{const e=B;return null==e||e.addEventListener("success",V),n&&(null==e||e.addEventListener("error",n)),d&&(null==e||e.addEventListener("ready",d)),()=>{n&&(null==e||e.removeEventListener("error",n)),d&&(null==e||e.removeEventListener("ready",d)),null==e||e.removeEventListener("success",V)}}),[B,n,V]),l((()=>{const e=B;return null==e||e.addEventListener("success",V),()=>{null==e||e.removeEventListener("success",V)}}),[B,V]),l((()=>{const e=B;return n&&(null==e||e.addEventListener("error",n)),()=>{n&&(null==e||e.removeEventListener("error",n))}}),[B,n]),l((()=>{const e=B;return d&&(null==e||e.addEventListener("ready",d)),()=>{d&&(null==e||e.removeEventListener("error",d))}}),[B,d]),t.createElement("form",null,t.createElement(u,{fallback:null},t.createElement(m,{projectId:K,flowId:e,baseUrl:H,baseStaticUrl:J,baseCdnUrl:M,ref:F,telemetryKey:L,redirectUrl:k,autoFocus:y,styleId:S,validateOnBlur:U,restartOnError:w,keepLastAuthenticatedUserAfterLogout:z,tenant:p,externalRequestId:A,customStorage:G,themeOverride:N,"theme.attr":f,"nonce.attr":v,"locale.attr":E,"form.attr":h,"client.attr":g,"debug.attr":b,"outbound-app-id.attr":R,"outbound-app-scopes.attr":C,"popup-origin.attr":q,"store-last-authenticated-user.attr":P,"refreshCookieName.attr":D,"dismiss-screen-error-on-input.attr":I,"errorTransformer.prop":O,"logger.prop":c,"onScreenUpdate.prop":x,"customStorage.prop":G},j)))}));export{f as default};
|
|
2
2
|
//# sourceMappingURL=Descope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Descope.js","sources":["../../../src/components/Descope.tsx"],"sourcesContent":["/* eslint-disable react/prop-types */\nimport React, {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\nimport { getGlobalSdk } from '../sdk';\nimport withPropsMapping from './withPropsMapping';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n const updateDynamicHeader = (key: string, value: string) => {\n if (value) {\n baseHeaders[key] = value;\n } else {\n delete baseHeaders[key];\n }\n };\n\n const WebComponent: any =\n customElements?.get('descope-wc') ||\n (await import('@descope/web-component').then((module) => module.default));\n\n WebComponent.sdkConfigOverrides = {\n // Overrides the web-component's base headers to indicate usage via the React SDK\n baseHeaders,\n // Disables token persistence within the web-component to delegate token management\n // to the global SDK hooks. This ensures token handling aligns with the SDK's configuration,\n // and web-component requests leverage the global SDK's beforeRequest hooks for consistency\n persistTokens: false,\n hooks: {\n get beforeRequest() {\n // Retrieves the beforeRequest hook from the global SDK, which is initialized\n // within the AuthProvider using the desired configuration. This approach ensures\n // the web-component utilizes the same beforeRequest hooks as the global SDK\n return getGlobalSdk().httpClient.hooks.beforeRequest;\n },\n set beforeRequest(_) {\n // The empty setter prevents runtime errors when attempts are made to assign a value to 'beforeRequest'.\n // JavaScript objects default to having both getters and setters\n },\n },\n };\n\n return {\n default: withPropsMapping(\n React.forwardRef<HTMLElement>(\n ({ 'external-request-id': externalRequestId, ...props }: any, ref) => {\n // update the dynamic headers with the external request ID if provided\n useMemo(() => {\n updateDynamicHeader('x-external-rid', externalRequestId);\n }, [externalRequestId]);\n\n return <descope-wc ref={ref} {...props} />;\n },\n ),\n ),\n };\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n (\n {\n flowId,\n onSuccess,\n onError,\n onReady,\n logger,\n tenant,\n theme,\n nonce,\n locale,\n debug,\n client,\n form,\n telemetryKey,\n redirectUrl,\n autoFocus,\n validateOnBlur,\n restartOnError,\n errorTransformer,\n styleId,\n onScreenUpdate,\n dismissScreenErrorOnInput,\n outboundAppId,\n outboundAppScopes,\n popupOrigin,\n children,\n externalRequestId,\n },\n ref,\n ) => {\n const [innerRef, setInnerRef] = useState(null);\n\n useImperativeHandle(ref, () => innerRef);\n\n const {\n projectId,\n baseUrl,\n baseStaticUrl,\n baseCdnUrl,\n storeLastAuthenticatedUser,\n keepLastAuthenticatedUserAfterLogout,\n refreshCookieName,\n customStorage,\n sdk,\n } = React.useContext(Context);\n\n const handleSuccess = useCallback(\n async (e: CustomEvent) => {\n // In order to make sure all the after-hooks are running with the success response\n // we are generating a fake response with the success data and calling the http client after hook fn with it\n await sdk.httpClient.hooks.afterRequest(\n {} as any,\n new Response(JSON.stringify(e.detail)),\n );\n if (onSuccess) {\n onSuccess(e);\n }\n },\n [onSuccess],\n );\n\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n if (onError) ele?.addEventListener('error', onError);\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n if (onReady) ele?.removeEventListener('ready', onReady);\n\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, onError, handleSuccess]);\n\n // Success event\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n return () => {\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, handleSuccess]);\n\n // Error event\n useEffect(() => {\n const ele = innerRef;\n if (onError) ele?.addEventListener('error', onError);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n };\n }, [innerRef, onError]);\n\n // Ready event\n useEffect(() => {\n const ele = innerRef;\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onReady) ele?.removeEventListener('error', onReady);\n };\n }, [innerRef, onReady]);\n\n return (\n /**\n * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n * this workaround is done in order to support webauthn passkeys\n * it can be removed once this issue will be solved\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n */\n\t<form>\n\t\t<Suspense fallback={null}>\n\t\t\t<DescopeWC\n projectId={projectId}\n flowId={flowId}\n baseUrl={baseUrl}\n baseStaticUrl={baseStaticUrl}\n baseCdnUrl={baseCdnUrl}\n ref={setInnerRef}\n telemetryKey={telemetryKey}\n redirectUrl={redirectUrl}\n autoFocus={autoFocus}\n styleId={styleId}\n validateOnBlur={validateOnBlur}\n restartOnError={restartOnError}\n keepLastAuthenticatedUserAfterLogout={\n keepLastAuthenticatedUserAfterLogout\n }\n tenant={tenant}\n externalRequestId={externalRequestId}\n customStorage={customStorage}\n {...{\n // attributes\n 'theme.attr': theme,\n 'nonce.attr': nonce,\n 'locale.attr': locale,\n 'form.attr': form,\n 'client.attr': client,\n 'debug.attr': debug,\n 'outbound-app-id.attr': outboundAppId,\n 'outbound-app-scopes.attr': outboundAppScopes,\n 'popup-origin.attr': popupOrigin,\n 'store-last-authenticated-user.attr': storeLastAuthenticatedUser,\n 'refreshCookieName.attr': refreshCookieName,\n 'dismiss-screen-error-on-input.attr': dismissScreenErrorOnInput,\n // props\n 'errorTransformer.prop': errorTransformer,\n 'logger.prop': logger,\n 'onScreenUpdate.prop': onScreenUpdate,\n 'customStorage.prop': customStorage,\n }}\n >\n\t\t\t\t{children}\n\t\t\t</DescopeWC>\n\t\t</Suspense>\n\t</form>\n );\n },\n);\n\nexport default Descope;\n"],"names":["DescopeWC","lazy","async","customElements","get","import","then","module","default","sdkConfigOverrides","baseHeaders","persistTokens","hooks","beforeRequest","getGlobalSdk","httpClient","_","withPropsMapping","React","forwardRef","_a","ref","externalRequestId","props","__rest","useMemo","key","value","Descope","flowId","onSuccess","onError","onReady","logger","tenant","theme","nonce","locale","debug","client","form","telemetryKey","redirectUrl","autoFocus","validateOnBlur","restartOnError","errorTransformer","styleId","onScreenUpdate","dismissScreenErrorOnInput","outboundAppId","outboundAppScopes","popupOrigin","children","innerRef","setInnerRef","useState","useImperativeHandle","projectId","baseUrl","baseStaticUrl","baseCdnUrl","storeLastAuthenticatedUser","keepLastAuthenticatedUserAfterLogout","refreshCookieName","customStorage","sdk","useContext","Context","handleSuccess","useCallback","e","afterRequest","Response","JSON","stringify","detail","useEffect","ele","addEventListener","removeEventListener","createElement","Suspense","fallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Descope.js","sources":["../../../src/components/Descope.tsx"],"sourcesContent":["/* eslint-disable react/prop-types */\nimport React, {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n} from 'react';\nimport { baseHeaders } from '../constants';\nimport Context from '../hooks/Context';\nimport { DescopeProps } from '../types';\nimport { getGlobalSdk } from '../sdk';\nimport withPropsMapping from './withPropsMapping';\n\n// web-component code uses browser API, but can be used in SSR apps, hence the lazy loading\nconst DescopeWC = lazy(async () => {\n const updateDynamicHeader = (key: string, value: string) => {\n if (value) {\n baseHeaders[key] = value;\n } else {\n delete baseHeaders[key];\n }\n };\n\n const WebComponent: any =\n customElements?.get('descope-wc') ||\n (await import('@descope/web-component').then((module) => module.default));\n\n WebComponent.sdkConfigOverrides = {\n // Overrides the web-component's base headers to indicate usage via the React SDK\n baseHeaders,\n // Disables token persistence within the web-component to delegate token management\n // to the global SDK hooks. This ensures token handling aligns with the SDK's configuration,\n // and web-component requests leverage the global SDK's beforeRequest hooks for consistency\n persistTokens: false,\n hooks: {\n get beforeRequest() {\n // Retrieves the beforeRequest hook from the global SDK, which is initialized\n // within the AuthProvider using the desired configuration. This approach ensures\n // the web-component utilizes the same beforeRequest hooks as the global SDK\n return getGlobalSdk().httpClient.hooks.beforeRequest;\n },\n set beforeRequest(_) {\n // The empty setter prevents runtime errors when attempts are made to assign a value to 'beforeRequest'.\n // JavaScript objects default to having both getters and setters\n },\n },\n };\n\n return {\n default: withPropsMapping(\n React.forwardRef<HTMLElement>(\n ({ 'external-request-id': externalRequestId, ...props }: any, ref) => {\n // update the dynamic headers with the external request ID if provided\n useMemo(() => {\n updateDynamicHeader('x-external-rid', externalRequestId);\n }, [externalRequestId]);\n\n return <descope-wc ref={ref} {...props} />;\n },\n ),\n ),\n };\n});\n\nconst Descope = React.forwardRef<HTMLElement, DescopeProps>(\n (\n {\n flowId,\n onSuccess,\n onError,\n onReady,\n logger,\n tenant,\n theme,\n nonce,\n locale,\n debug,\n client,\n form,\n telemetryKey,\n redirectUrl,\n autoFocus,\n validateOnBlur,\n restartOnError,\n errorTransformer,\n styleId,\n onScreenUpdate,\n dismissScreenErrorOnInput,\n outboundAppId,\n outboundAppScopes,\n popupOrigin,\n children,\n externalRequestId,\n themeOverride,\n },\n ref,\n ) => {\n const [innerRef, setInnerRef] = useState(null);\n\n useImperativeHandle(ref, () => innerRef);\n\n const {\n projectId,\n baseUrl,\n baseStaticUrl,\n baseCdnUrl,\n storeLastAuthenticatedUser,\n keepLastAuthenticatedUserAfterLogout,\n refreshCookieName,\n customStorage,\n sdk,\n } = React.useContext(Context);\n\n const handleSuccess = useCallback(\n async (e: CustomEvent) => {\n // In order to make sure all the after-hooks are running with the success response\n // we are generating a fake response with the success data and calling the http client after hook fn with it\n await sdk.httpClient.hooks.afterRequest(\n {} as any,\n new Response(JSON.stringify(e.detail)),\n );\n if (onSuccess) {\n onSuccess(e);\n }\n },\n [onSuccess],\n );\n\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n if (onError) ele?.addEventListener('error', onError);\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n if (onReady) ele?.removeEventListener('ready', onReady);\n\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, onError, handleSuccess]);\n\n // Success event\n useEffect(() => {\n const ele = innerRef;\n ele?.addEventListener('success', handleSuccess);\n return () => {\n ele?.removeEventListener('success', handleSuccess);\n };\n }, [innerRef, handleSuccess]);\n\n // Error event\n useEffect(() => {\n const ele = innerRef;\n if (onError) ele?.addEventListener('error', onError);\n\n return () => {\n if (onError) ele?.removeEventListener('error', onError);\n };\n }, [innerRef, onError]);\n\n // Ready event\n useEffect(() => {\n const ele = innerRef;\n if (onReady) ele?.addEventListener('ready', onReady);\n\n return () => {\n if (onReady) ele?.removeEventListener('error', onReady);\n };\n }, [innerRef, onReady]);\n\n return (\n /**\n * in order to avoid redundant remounting of the WC, we are wrapping it with a form element\n * this workaround is done in order to support webauthn passkeys\n * it can be removed once this issue will be solved\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2\n */\n <form>\n <Suspense fallback={null}>\n <DescopeWC\n projectId={projectId}\n flowId={flowId}\n baseUrl={baseUrl}\n baseStaticUrl={baseStaticUrl}\n baseCdnUrl={baseCdnUrl}\n ref={setInnerRef}\n telemetryKey={telemetryKey}\n redirectUrl={redirectUrl}\n autoFocus={autoFocus}\n styleId={styleId}\n validateOnBlur={validateOnBlur}\n restartOnError={restartOnError}\n keepLastAuthenticatedUserAfterLogout={\n keepLastAuthenticatedUserAfterLogout\n }\n tenant={tenant}\n externalRequestId={externalRequestId}\n customStorage={customStorage}\n themeOverride={themeOverride}\n {...{\n // attributes\n 'theme.attr': theme,\n 'nonce.attr': nonce,\n 'locale.attr': locale,\n 'form.attr': form,\n 'client.attr': client,\n 'debug.attr': debug,\n 'outbound-app-id.attr': outboundAppId,\n 'outbound-app-scopes.attr': outboundAppScopes,\n 'popup-origin.attr': popupOrigin,\n 'store-last-authenticated-user.attr': storeLastAuthenticatedUser,\n 'refreshCookieName.attr': refreshCookieName,\n 'dismiss-screen-error-on-input.attr': dismissScreenErrorOnInput,\n // props\n 'errorTransformer.prop': errorTransformer,\n 'logger.prop': logger,\n 'onScreenUpdate.prop': onScreenUpdate,\n 'customStorage.prop': customStorage,\n }}\n >\n {children}\n </DescopeWC>\n </Suspense>\n </form>\n );\n },\n);\n\nexport default Descope;\n"],"names":["DescopeWC","lazy","async","customElements","get","import","then","module","default","sdkConfigOverrides","baseHeaders","persistTokens","hooks","beforeRequest","getGlobalSdk","httpClient","_","withPropsMapping","React","forwardRef","_a","ref","externalRequestId","props","__rest","useMemo","key","value","Descope","flowId","onSuccess","onError","onReady","logger","tenant","theme","nonce","locale","debug","client","form","telemetryKey","redirectUrl","autoFocus","validateOnBlur","restartOnError","errorTransformer","styleId","onScreenUpdate","dismissScreenErrorOnInput","outboundAppId","outboundAppScopes","popupOrigin","children","themeOverride","innerRef","setInnerRef","useState","useImperativeHandle","projectId","baseUrl","baseStaticUrl","baseCdnUrl","storeLastAuthenticatedUser","keepLastAuthenticatedUserAfterLogout","refreshCookieName","customStorage","sdk","useContext","Context","handleSuccess","useCallback","e","afterRequest","Response","JSON","stringify","detail","useEffect","ele","addEventListener","removeEventListener","createElement","Suspense","fallback"],"mappings":"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"}
|
package/dist/esm/constants.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.
|
|
1
|
+
const e={"x-descope-sdk-name":"react","x-descope-sdk-version":"2.28.1"},d="undefined"!=typeof window;export{d as IS_BROWSER,e as baseHeaders};
|
|
2
2
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../src/constants.ts"],"sourcesContent":["declare const BUILD_VERSION: string;\n\nexport const baseHeaders = {\n 'x-descope-sdk-name': 'react',\n '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"],"names":["baseHeaders","IS_BROWSER","window"],"mappings":"AAEa,MAAAA,EAAc,CACzB,qBAAsB,QACtB,wBAAyB,
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../src/constants.ts"],"sourcesContent":["declare const BUILD_VERSION: string;\n\nexport const baseHeaders = {\n 'x-descope-sdk-name': 'react',\n '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"],"names":["baseHeaders","IS_BROWSER","window"],"mappings":"AAEa,MAAAA,EAAc,CACzB,qBAAsB,QACtB,wBAAyB,UAIdC,EAA+B,oBAAXC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -92,6 +92,7 @@ declare const createSdkWrapper: <P extends {
|
|
|
92
92
|
wsfedIdpStateId?: string;
|
|
93
93
|
samlIdpUsername?: string;
|
|
94
94
|
ssoAppId?: string;
|
|
95
|
+
customAppId?: string;
|
|
95
96
|
thirdPartyAppId?: string;
|
|
96
97
|
oidcLoginHint?: string;
|
|
97
98
|
abTestingKey?: number;
|
|
@@ -834,6 +835,7 @@ declare const createSdkWrapper: <P extends {
|
|
|
834
835
|
wsfedIdpStateId?: string;
|
|
835
836
|
samlIdpUsername?: string;
|
|
836
837
|
ssoAppId?: string;
|
|
838
|
+
customAppId?: string;
|
|
837
839
|
thirdPartyAppId?: string;
|
|
838
840
|
oidcLoginHint?: string;
|
|
839
841
|
abTestingKey?: number;
|
|
@@ -1576,6 +1578,7 @@ declare const createSdkWrapper: <P extends {
|
|
|
1576
1578
|
wsfedIdpStateId?: string;
|
|
1577
1579
|
samlIdpUsername?: string;
|
|
1578
1580
|
ssoAppId?: string;
|
|
1581
|
+
customAppId?: string;
|
|
1579
1582
|
thirdPartyAppId?: string;
|
|
1580
1583
|
oidcLoginHint?: string;
|
|
1581
1584
|
abTestingKey?: number;
|
|
@@ -2410,6 +2413,7 @@ type DescopeProps = {
|
|
|
2410
2413
|
onScreenUpdate?: (screenName: string, context: Record<string, any>, next: (interactionId: string, form: Record<string, any>) => Promise<unknown>, ref: HTMLElement) => boolean | Promise<boolean>;
|
|
2411
2414
|
children?: React.ReactNode;
|
|
2412
2415
|
externalRequestId?: string;
|
|
2416
|
+
themeOverride?: _descope_web_component__default;
|
|
2413
2417
|
};
|
|
2414
2418
|
type UserManagementProps = WidgetProps;
|
|
2415
2419
|
type RoleManagementProps = WidgetProps;
|