From 1350ebd0c5f677b6f1933bd6d6b572eae7fb0f73 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Thu, 16 Jan 2025 00:00:18 +0200 Subject: [PATCH 01/20] added support for custom screens --- .../sdks/react-sdk/src/components/Descope.tsx | 19 ++- packages/sdks/react-sdk/src/types.ts | 2 + .../sdks/web-component/src/app/index.html | 23 +++ .../src/lib/descope-wc/BaseDescopeWc.ts | 7 +- .../src/lib/descope-wc/DescopeWc.ts | 146 +++++++++++------- .../src/lib/descope-wc/initTemplate.ts | 4 + .../web-component/src/lib/helpers/helpers.ts | 29 +++- packages/sdks/web-component/src/lib/types.ts | 15 +- 8 files changed, 174 insertions(+), 71 deletions(-) diff --git a/packages/sdks/react-sdk/src/components/Descope.tsx b/packages/sdks/react-sdk/src/components/Descope.tsx index 44a13ea22..91863942b 100644 --- a/packages/sdks/react-sdk/src/components/Descope.tsx +++ b/packages/sdks/react-sdk/src/components/Descope.tsx @@ -42,7 +42,7 @@ const DescopeWC = lazy(async () => { return { default: withPropsMapping( React.forwardRef((props, ref) => ( - + )), ), }; @@ -69,6 +69,8 @@ const Descope = React.forwardRef( restartOnError, errorTransformer, styleId, + onPageUpdate, + children, }, ref, ) => { @@ -150,9 +152,9 @@ const Descope = React.forwardRef( * it can be removed once this issue will be solved * https://bugs.chromium.org/p/chromium/issues/detail?id=1404106#c2 */ -
- - + + ( // props 'errorTransformer.prop': errorTransformer, 'logger.prop': logger, + 'onPageUpdate.prop': onPageUpdate, }} - /> - - + > + {children} + +
+ ); }, ); diff --git a/packages/sdks/react-sdk/src/types.ts b/packages/sdks/react-sdk/src/types.ts index ddbc49258..a7e493144 100644 --- a/packages/sdks/react-sdk/src/types.ts +++ b/packages/sdks/react-sdk/src/types.ts @@ -127,6 +127,8 @@ export type DescopeProps = { // use to override client context in flow execution client?: Record; styleId?: string; + onPageUpdate?: (state: any, ref: HTMLElement) => boolean; + children?: React.ReactNode; }; export type UserManagementProps = WidgetProps; diff --git a/packages/sdks/web-component/src/app/index.html b/packages/sdks/web-component/src/app/index.html index 7413c1734..95c0630e0 100644 --- a/packages/sdks/web-component/src/app/index.html +++ b/packages/sdks/web-component/src/app/index.html @@ -73,5 +73,28 @@ // document.querySelector('.loading')?.style.display = 'none'; }); + diff --git a/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts index 663c10c19..0c82d98bd 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts @@ -109,6 +109,8 @@ class BaseDescopeWc extends BaseClass { nextRequestStatus = new State<{ isLoading: boolean }>({ isLoading: false }); rootElement: HTMLDivElement; + contentRootElement: HTMLDivElement; + slotElement: HTMLSlotElement; #debuggerEle: HTMLElement & { updateData: (data: DebuggerMessage | DebuggerMessage[]) => void; @@ -134,8 +136,9 @@ class BaseDescopeWc extends BaseClass { #initShadowDom() { this.shadowRoot.appendChild(initTemplate.content.cloneNode(true)); - - this.rootElement = this.shadowRoot.querySelector('#root'); + this.slotElement = document.createElement('slot'); + this.slotElement.classList.add('hidden'); + this.rootElement.appendChild(this.slotElement); } get flowId() { diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index d96e9b5ab..8d48cde1b 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -30,6 +30,7 @@ import { State, submitForm, timeoutPromise, + transformStepStateForCustomScreen, updateScreenFromScreenState, updateTemplateFromScreenState, withMemCache, @@ -79,6 +80,11 @@ class DescopeWc extends BaseDescopeWc { #conditionalUiAbortController = null; + onPageUpdate: ( + stepStateUpdate: Partial, + ref: typeof this, + ) => Promise<{ useDescopeComponents?: boolean } | boolean>; + constructor() { const flowState = new State({ deferredRedirect: false, @@ -602,13 +608,8 @@ class DescopeWc extends BaseDescopeWc { // But if any of the sso params are not empty, this optimization doesn't happen // because Descope may decide not to show the first screen (in cases like a user is already logged in) - this is more relevant for SSO scenarios if (showFirstScreenOnExecutionInit(startScreenId, ssoQueryParams)) { - stepStateUpdate.next = ( - interactionId, - version, - componentsVersion, - inputs, - ) => - this.sdk.flow.start( + stepStateUpdate.next = async (interactionId, inputs) => { + const res = await this.sdk.flow.start( flowId, { tenant, @@ -624,7 +625,7 @@ class DescopeWc extends BaseDescopeWc { }, conditionInteractionId, interactionId, - componentsVersion, + projectConfig.componentsVersion, flowVersions, { ...this.formConfigValues, @@ -634,20 +635,58 @@ class DescopeWc extends BaseDescopeWc { ...(token && { token }), }, ); + + this.#handleSdkResponse(res); + + return res; + }; } else if ( isChanged('projectId') || isChanged('baseUrl') || isChanged('executionId') || isChanged('stepId') ) { - stepStateUpdate.next = (...args) => - this.sdk.flow.next(executionId, stepId, ...args); + stepStateUpdate.next = async (interactionId, input) => { + const res = await this.sdk.flow.next( + executionId, + stepId, + interactionId, + flowConfig.version, + projectConfig.componentsVersion, + input, + ); + + this.#handleSdkResponse(res); + + return res; + }; } + const pageUpdateConfig = await this.onPageUpdate?.( + transformStepStateForCustomScreen(stepStateUpdate), + this, + ); + const isCustomScreen = !!pageUpdateConfig; + + if (!isCustomScreen) { + // no custom screen, we proceed with the flow screen - // update step state - this.stepState.update(stepStateUpdate); + // update step state + this.stepState.update(stepStateUpdate); + } else { + this.loggerWrapper.debug('Rendering a custom screen'); + + // TODO: need to think how can we know if this is the first screen, + // when the first screen is custom, we are not updating stepState + this.#dispatchPageEvents(!this.stepState.current.htmlFilename); + } + this.#toggleScreenVisibility(isCustomScreen); } + #toggleScreenVisibility = (isCustomScreen: boolean) => { + this.contentRootElement.classList.toggle('hidden', isCustomScreen); + this.slotElement.classList.toggle('hidden', !isCustomScreen); + }; + #handlePollingResponse = ( executionId: string, stepId: string, @@ -932,16 +971,10 @@ class DescopeWc extends BaseDescopeWc { this.sdk.webauthn.helpers .conditional(options, this.#conditionalUiAbortController) .then(async (response) => { - const resp = await next( - conditionalUiInput.id, - flowConfig.version, - projectConfig.componentsVersion, - { - transactionId, - response, - }, - ); - this.#handleSdkResponse(resp); + next(conditionalUiInput.id, { + transactionId, + response, + }); }) .catch((err) => { if (err.name !== 'AbortError') { @@ -952,6 +985,15 @@ class DescopeWc extends BaseDescopeWc { } } + #dispatchPageEvents(isFirstScreen: boolean) { + if (isFirstScreen) { + // Dispatch when the first page is ready + // So user can show a loader until his event is triggered + this.#dispatch('ready', {}); + } + this.#dispatch('page-updated', {}); + } + async onStepChange(currentState: StepState, prevState: StepState) { const { htmlFilename, @@ -1007,8 +1049,8 @@ class DescopeWc extends BaseDescopeWc { const injectNextPage = async () => { await loadDescopeUiComponents; - // put the totp and notp variable on the root element, which is the top level 'div' inside the shadowroot - const rootElement = this.shadowRoot.querySelector('div'); + // put the totp and notp variable on the root element, which is the top level 'div' inside the shadowRoot + const rootElement = this.contentRootElement; setTOTPVariable(rootElement, screenState?.totp?.image); setNOTPVariable(rootElement, screenState?.notp?.image); @@ -1016,7 +1058,7 @@ class DescopeWc extends BaseDescopeWc { // set dynamic css variables that should be set at runtime setCssVars(rootElement, clone, screenState.cssVars, this.loggerWrapper); - this.rootElement.replaceChildren(clone); + rootElement.replaceChildren(clone); // If before html url was empty, we deduce its the first time a screen is shown const isFirstScreen = !prevState.htmlFilename; @@ -1025,37 +1067,28 @@ class DescopeWc extends BaseDescopeWc { setTimeout(() => { this.#updateExternalInputs(); - handleAutoFocus(this.rootElement, this.autoFocus, isFirstScreen); - if (this.validateOnBlur) { - handleReportValidityOnBlur(this.rootElement); + handleReportValidityOnBlur(rootElement); } // we need to wait for all components to render before we can set its value - updateScreenFromScreenState(this.rootElement, screenState); + updateScreenFromScreenState(rootElement, screenState); + + this.#dispatchPageEvents(isFirstScreen); + + handleAutoFocus(rootElement, this.autoFocus, isFirstScreen); }); this.#hydrate(next); - if (isFirstScreen) { - // Dispatch when the first page is ready - // So user can show a loader until his event is triggered - this.#dispatch('ready', {}); - } - this.#dispatch('page-updated', {}); - const loader = this.rootElement.querySelector( + + const loader = rootElement.querySelector( `[${ELEMENT_TYPE_ATTRIBUTE}="polling"]`, ); if (loader) { const flowConfig = await this.getFlowConfig(); const projectConfig = await this.getProjectConfig(); // Loader component in the screen triggers polling interaction - const response = await next( - CUSTOM_INTERACTIONS.polling, - flowConfig.version, - projectConfig.componentsVersion, - {}, - ); - this.#handleSdkResponse(response); + next(CUSTOM_INTERACTIONS.polling, {}); } // open in a new tab should be done after the screen is rendered @@ -1158,7 +1191,9 @@ class DescopeWc extends BaseDescopeWc { // the slotted inputs it needs clearPreviousExternalInputs(); - const eles = this.rootElement.querySelectorAll('[external-input="true"]'); + const eles = this.contentRootElement.querySelectorAll( + '[external-input="true"]', + ); eles.forEach((ele) => this.#handleExternalInputs(ele)); } @@ -1213,16 +1248,7 @@ class DescopeWc extends BaseDescopeWc { origin: this.nativeOptions?.origin || window.location.origin, }; - const flowConfig = await this.getFlowConfig(); - const projectConfig = await this.getProjectConfig(); - const sdkResp = await next( - submitterId, - flowConfig.version, - projectConfig.componentsVersion, - actionArgs, - ); - - this.#handleSdkResponse(sdkResp); + next(submitterId, actionArgs); this.#handleStoreCredentials(formData); } @@ -1230,7 +1256,7 @@ class DescopeWc extends BaseDescopeWc { ); #addPasscodeAutoSubmitListeners(next: NextFn) { - this.rootElement + this.contentRootElement .querySelectorAll(`descope-passcode[data-auto-submit="true"]`) .forEach((passcode: HTMLInputElement) => { passcode.addEventListener('input', () => { @@ -1245,7 +1271,7 @@ class DescopeWc extends BaseDescopeWc { #hydrate(next: NextFn) { // hydrating the page // Adding event listeners to all buttons without the exclude attribute - this.rootElement + this.contentRootElement .querySelectorAll( `descope-button:not([${DESCOPE_ATTRIBUTE_EXCLUDE_NEXT_BUTTON}])`, ) @@ -1260,10 +1286,10 @@ class DescopeWc extends BaseDescopeWc { } #handleAnimation(injectNextPage: () => void, direction: Direction) { - this.rootElement.addEventListener( + this.contentRootElement.addEventListener( 'transitionend', () => { - this.rootElement.classList.remove('fade-out'); + this.contentRootElement.classList.remove('fade-out'); injectNextPage(); }, { once: true }, @@ -1273,14 +1299,14 @@ class DescopeWc extends BaseDescopeWc { direction === Direction.forward ? 'slide-forward' : 'slide-backward'; Array.from( - this.rootElement.getElementsByClassName('input-container'), + this.contentRootElement.getElementsByClassName('input-container'), ).forEach((ele, i) => { // eslint-disable-next-line no-param-reassign (ele as HTMLElement).style['transition-delay'] = `${i * 40}ms`; ele.classList.add(transitionClass); }); - this.rootElement.classList.add('fade-out'); + this.contentRootElement.classList.add('fade-out'); } #dispatch(eventName: string, detail: any) { diff --git a/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts b/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts index 7bb41ccf0..846119196 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts @@ -21,6 +21,10 @@ initTemplate.innerHTML = ` opacity: 0.1; } + .hidden { + display: none; + } + `; diff --git a/packages/sdks/web-component/src/lib/helpers/helpers.ts b/packages/sdks/web-component/src/lib/helpers/helpers.ts index 4227f61cf..a8befba70 100644 --- a/packages/sdks/web-component/src/lib/helpers/helpers.ts +++ b/packages/sdks/web-component/src/lib/helpers/helpers.ts @@ -23,7 +23,13 @@ import { THIRD_PARTY_APP_STATE_ID_PARAM_NAME, APPLICATION_SCOPES_PARAM_NAME, } from '../constants'; -import { AutoFocusOptions, Direction, Locale, SSOQueryParams } from '../types'; +import { + AutoFocusOptions, + Direction, + Locale, + SSOQueryParams, + StepState, +} from '../types'; const MD_COMPONENTS = ['descope-enriched-text']; @@ -644,3 +650,24 @@ export const clearPreviousExternalInputs = () => { export const shouldHandleMarkdown = (compName: string) => MD_COMPONENTS.includes(compName); + +export const transformStepStateForCustomScreen = ( + state: Partial, +) => { + const { + screenState: { inputs, ...screenState }, + htmlFilename, + htmlLocaleFilename, + ...rest + } = state; + + const screenId = htmlFilename?.replace('.html', ''); + + return { + ...rest, + screenId, + screenState: { + ...screenState, + }, + }; +}; diff --git a/packages/sdks/web-component/src/lib/types.ts b/packages/sdks/web-component/src/lib/types.ts index 233d7b97d..8bed7ebfc 100644 --- a/packages/sdks/web-component/src/lib/types.ts +++ b/packages/sdks/web-component/src/lib/types.ts @@ -14,6 +14,19 @@ type OmitFirstArg = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never; +type KeepArgsByIndex = F extends ( + ...args: infer A +) => infer R + ? (...args: PickArgsByIndex) => R + : never; + +type PickArgsByIndex< + All extends readonly any[], + Indices extends readonly number[], +> = { + [K in keyof Indices]: Indices[K] extends keyof All ? All[Indices[K]] : never; +}; + export enum Direction { backward = 'backward', forward = 'forward', @@ -103,7 +116,7 @@ export type DebugState = { isDebug: boolean; }; -export type NextFn = OmitFirstArg>; +export type NextFn = KeepArgsByIndex; export type NextFnReturnPromiseValue = Awaited>; export type DebuggerMessage = { From 85b2999deaaef93e0f9e7d1a4ecf5adbbc2cbc1b Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Thu, 16 Jan 2025 00:00:53 +0200 Subject: [PATCH 02/20] format --- .../sdks/react-sdk/src/components/AccessKeyManagement.tsx | 8 ++++---- .../sdks/react-sdk/src/components/ApplicationsPortal.tsx | 8 ++++---- .../sdks/react-sdk/src/components/AuditManagement.tsx | 8 ++++---- packages/sdks/react-sdk/src/components/RoleManagement.tsx | 8 ++++---- packages/sdks/react-sdk/src/components/UserManagement.tsx | 8 ++++---- packages/sdks/react-sdk/src/components/UserProfile.tsx | 8 ++++---- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/sdks/react-sdk/src/components/AccessKeyManagement.tsx b/packages/sdks/react-sdk/src/components/AccessKeyManagement.tsx index 18b4b9d8d..5834f1ea3 100644 --- a/packages/sdks/react-sdk/src/components/AccessKeyManagement.tsx +++ b/packages/sdks/react-sdk/src/components/AccessKeyManagement.tsx @@ -10,7 +10,7 @@ const AccessKeyManagementWC = lazy(async () => { return { default: withPropsMapping( React.forwardRef((props, ref) => ( - + )), ), }; @@ -27,8 +27,8 @@ const AccessKeyManagement = React.forwardRef< const { projectId, baseUrl, baseStaticUrl } = React.useContext(Context); return ( - - + - + ); }); diff --git a/packages/sdks/react-sdk/src/components/ApplicationsPortal.tsx b/packages/sdks/react-sdk/src/components/ApplicationsPortal.tsx index ff54c2317..e10922a90 100644 --- a/packages/sdks/react-sdk/src/components/ApplicationsPortal.tsx +++ b/packages/sdks/react-sdk/src/components/ApplicationsPortal.tsx @@ -10,7 +10,7 @@ const ApplicationsPortalWC = lazy(async () => { return { default: withPropsMapping( React.forwardRef((props, ref) => ( - + )), ), }; @@ -27,8 +27,8 @@ const ApplicationsPortal = React.forwardRef< const { projectId, baseUrl, baseStaticUrl } = React.useContext(Context); return ( - - + - + ); }); diff --git a/packages/sdks/react-sdk/src/components/AuditManagement.tsx b/packages/sdks/react-sdk/src/components/AuditManagement.tsx index c810470bf..f4fb5064c 100644 --- a/packages/sdks/react-sdk/src/components/AuditManagement.tsx +++ b/packages/sdks/react-sdk/src/components/AuditManagement.tsx @@ -10,7 +10,7 @@ const AuditManagementWC = lazy(async () => { return { default: withPropsMapping( React.forwardRef((props, ref) => ( - + )), ), }; @@ -25,8 +25,8 @@ const AuditManagement = React.forwardRef( const { projectId, baseUrl, baseStaticUrl } = React.useContext(Context); return ( - - + ( 'logger.prop': logger, }} /> - + ); }, ); diff --git a/packages/sdks/react-sdk/src/components/RoleManagement.tsx b/packages/sdks/react-sdk/src/components/RoleManagement.tsx index 9c91c7b7e..7e3e1cb74 100644 --- a/packages/sdks/react-sdk/src/components/RoleManagement.tsx +++ b/packages/sdks/react-sdk/src/components/RoleManagement.tsx @@ -10,7 +10,7 @@ const RoleManagementWC = lazy(async () => { return { default: withPropsMapping( React.forwardRef((props, ref) => ( - + )), ), }; @@ -25,8 +25,8 @@ const RoleManagement = React.forwardRef( const { projectId, baseUrl, baseStaticUrl } = React.useContext(Context); return ( - - + ( 'logger.prop': logger, }} /> - + ); }, ); diff --git a/packages/sdks/react-sdk/src/components/UserManagement.tsx b/packages/sdks/react-sdk/src/components/UserManagement.tsx index 831c4823b..5b50f9665 100644 --- a/packages/sdks/react-sdk/src/components/UserManagement.tsx +++ b/packages/sdks/react-sdk/src/components/UserManagement.tsx @@ -10,7 +10,7 @@ const UserManagementWC = lazy(async () => { return { default: withPropsMapping( React.forwardRef((props, ref) => ( - + )), ), }; @@ -25,8 +25,8 @@ const UserManagement = React.forwardRef( const { projectId, baseUrl, baseStaticUrl } = React.useContext(Context); return ( - - + ( 'logger.prop': logger, }} /> - + ); }, ); diff --git a/packages/sdks/react-sdk/src/components/UserProfile.tsx b/packages/sdks/react-sdk/src/components/UserProfile.tsx index 7ee9c4059..d21af9e13 100644 --- a/packages/sdks/react-sdk/src/components/UserProfile.tsx +++ b/packages/sdks/react-sdk/src/components/UserProfile.tsx @@ -16,7 +16,7 @@ const UserProfileWC = lazy(async () => { return { default: withPropsMapping( React.forwardRef((props, ref) => ( - + )), ), }; @@ -39,8 +39,8 @@ const UserProfile = React.forwardRef( }, [innerRef, onLogout]); return ( - - + ( 'logger.prop': logger, }} /> - + ); }, ); From 82737386b5433e45272baee2618e4f544e65517d Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Thu, 16 Jan 2025 12:39:56 +0200 Subject: [PATCH 03/20] fix animation --- .../sdks/web-component/src/lib/descope-wc/initTemplate.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts b/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts index 846119196..70ccfa5c5 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts @@ -9,10 +9,13 @@ initTemplate.innerHTML = ` #root { height: 100%; - transition: opacity 300ms ease-in-out; display: flex; } + #content-root { + transition: opacity 300ms ease-in-out; + } + #root[data-theme] { background-color: transparent; } From b05bc4ad0fcffe3c8e3cb3ce9ac02e545f334685 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Tue, 28 Jan 2025 12:44:07 +0200 Subject: [PATCH 04/20] fix content-root width --- packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts b/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts index 70ccfa5c5..98f73218d 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/initTemplate.ts @@ -10,6 +10,7 @@ initTemplate.innerHTML = ` #root { height: 100%; display: flex; + flex-direction: column; } #content-root { From a37c06cb6e433e2dd7c0a35085ddce55c3b84d39 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Wed, 29 Jan 2025 15:14:16 +0200 Subject: [PATCH 05/20] merge custom screen state with existin g state --- packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index 8d48cde1b..2e909bc75 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -662,7 +662,10 @@ class DescopeWc extends BaseDescopeWc { }; } const pageUpdateConfig = await this.onPageUpdate?.( - transformStepStateForCustomScreen(stepStateUpdate), + transformStepStateForCustomScreen({ + ...this.stepState.current, + ...stepStateUpdate, + }), this, ); const isCustomScreen = !!pageUpdateConfig; From 0c58f142701398696412a503f3feb6f1f5fdfb5a Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Wed, 29 Jan 2025 21:37:13 +0200 Subject: [PATCH 06/20] update step state on custom screen --- .../src/lib/descope-wc/DescopeWc.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index 2e909bc75..db2b38abf 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -661,6 +661,7 @@ class DescopeWc extends BaseDescopeWc { return res; }; } + const pageUpdateConfig = await this.onPageUpdate?.( transformStepStateForCustomScreen({ ...this.stepState.current, @@ -670,18 +671,22 @@ class DescopeWc extends BaseDescopeWc { ); const isCustomScreen = !!pageUpdateConfig; - if (!isCustomScreen) { - // no custom screen, we proceed with the flow screen - - // update step state - this.stepState.update(stepStateUpdate); - } else { + if (isCustomScreen) { this.loggerWrapper.debug('Rendering a custom screen'); - - // TODO: need to think how can we know if this is the first screen, - // when the first screen is custom, we are not updating stepState + this.contentRootElement.innerHTML = ''; this.#dispatchPageEvents(!this.stepState.current.htmlFilename); + // we are unsubscribing all the listeners because we are going to render a custom screen + // and we do not want that onStepChange will be called + this.stepState.unsubscribeAll(); + const subscribeId = this.stepState.subscribe(() => { + // after state was updated, we want to re-subscribe the onStepChange listener + this.stepState.unsubscribe(subscribeId); + this.stepState?.subscribe(this.onStepChange.bind(this)); + }); } + + // update step state + this.stepState.update(stepStateUpdate); this.#toggleScreenVisibility(isCustomScreen); } From 700cc1102dfc1b85199553fde0f1dbc5053229cc Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Thu, 6 Feb 2025 12:17:49 +0200 Subject: [PATCH 07/20] changes after mobile POC --- package.json | 2 +- packages/libs/sdk-helpers/src/state.ts | 8 +- .../sdks/react-sdk/src/components/Descope.tsx | 4 +- packages/sdks/react-sdk/src/types.ts | 10 +- packages/sdks/web-component/rollup.config.mjs | 2 + .../sdks/web-component/src/app/index.html | 12 +- .../src/lib/constants/general.ts | 2 + .../src/lib/descope-wc/DescopeWc.ts | 108 +- .../web-component/src/lib/helpers/helpers.ts | 30 +- .../web-component/src/lib/helpers/state.ts | 12 +- packages/sdks/web-component/src/lib/types.ts | 19 + .../web-component/test/helpers/state.test.ts | 4 +- .../src/app/index.html | 2 +- pnpm-lock.yaml | 1717 ++++++++++++++--- 14 files changed, 1653 insertions(+), 279 deletions(-) diff --git a/package.json b/package.json index 651736bcc..e147519c0 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "preversion:ci": "sh ./tools/scripts/latestTag.sh", "version:ci": "pnpm affected:ci --target version --noVerify=true --parallel 1", "postversion:ci": "pnpm run build:ci", - "print-affected:ci": "nx print-affected --base=$(sh ./tools/scripts/latestTag.sh) --select=projects", + "print-affected:ci": "nx show projects --affected --base=$(sh ./tools/scripts/latestTag.sh) --select=projects", "format": "nx format:write", "format:ci": "nx format:check", "postinstall": "pnpm update @descope/web-components-ui" diff --git a/packages/libs/sdk-helpers/src/state.ts b/packages/libs/sdk-helpers/src/state.ts index 814239686..099837eaa 100644 --- a/packages/libs/sdk-helpers/src/state.ts +++ b/packages/libs/sdk-helpers/src/state.ts @@ -57,11 +57,11 @@ export class State { #token = 0; - #updateOnlyOnChange = false; + #forceUpdate = true; - constructor(init: T = {} as T, { updateOnlyOnChange = true } = {}) { + constructor(init: T = {} as T, { forceUpdate = false } = {}) { this.#state = init; - this.#updateOnlyOnChange = updateOnlyOnChange; + this.#forceUpdate = forceUpdate; } get current() { @@ -73,7 +73,7 @@ export class State { typeof newState === 'function' ? newState(this.#state) : newState; const nextState = { ...this.#state, ...internalNewState }; - if (!this.#updateOnlyOnChange || !compareObjects(this.#state, nextState)) { + if (this.#forceUpdate || !compareObjects(this.#state, nextState)) { const prevState = this.#state; this.#state = nextState; Object.freeze(this.#state); diff --git a/packages/sdks/react-sdk/src/components/Descope.tsx b/packages/sdks/react-sdk/src/components/Descope.tsx index d5521cd47..23682966e 100644 --- a/packages/sdks/react-sdk/src/components/Descope.tsx +++ b/packages/sdks/react-sdk/src/components/Descope.tsx @@ -69,7 +69,7 @@ const Descope = React.forwardRef( restartOnError, errorTransformer, styleId, - onPageUpdate, + onScreenUpdate, children, }, ref, @@ -181,7 +181,7 @@ const Descope = React.forwardRef( // props 'errorTransformer.prop': errorTransformer, 'logger.prop': logger, - 'onPageUpdate.prop': onPageUpdate, + 'onScreenUpdate.prop': onScreenUpdate, }} > {children} diff --git a/packages/sdks/react-sdk/src/types.ts b/packages/sdks/react-sdk/src/types.ts index a7e493144..16c6e763e 100644 --- a/packages/sdks/react-sdk/src/types.ts +++ b/packages/sdks/react-sdk/src/types.ts @@ -127,7 +127,15 @@ export type DescopeProps = { // use to override client context in flow execution client?: Record; styleId?: string; - onPageUpdate?: (state: any, ref: HTMLElement) => boolean; + onScreenUpdate?: ( + screenName: string, + state: Record, + next: ( + interactionId: string, + form: Record, + ) => Promise, + ref: HTMLElement, + ) => boolean; children?: React.ReactNode; }; diff --git a/packages/sdks/web-component/rollup.config.mjs b/packages/sdks/web-component/rollup.config.mjs index b2ebea223..292235a22 100644 --- a/packages/sdks/web-component/rollup.config.mjs +++ b/packages/sdks/web-component/rollup.config.mjs @@ -49,11 +49,13 @@ export default [ dir: 'dist/esm', format: 'esm', preserveModules: true, + sourcemap: true, }, { dir: 'dist/cjs', format: 'cjs', preserveModules: true, + sourcemap: true, }, ], plugins: [ diff --git a/packages/sdks/web-component/src/app/index.html b/packages/sdks/web-component/src/app/index.html index 95c0630e0..d7c5bcf1b 100644 --- a/packages/sdks/web-component/src/app/index.html +++ b/packages/sdks/web-component/src/app/index.html @@ -57,7 +57,7 @@ }; return translationMap[error.type] || error.text; } - const descopeWcEle = document.getElementsByTagName('descope-wc')[0]; + const descopeWcEle = document.querySelector('descope-wc'); descopeWcEle.errorTransformer = translateError; descopeWcEle.addEventListener('error', (e) => @@ -72,11 +72,15 @@ // Alternatively, it can be hidden. For example: // document.querySelector('.loading')?.style.display = 'none'; }); + descopeWcEle.addEventListener('screen-updated', (e) => { + console.log('screen-updated', e.detail); + }); - +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 300a11f3c..3d4e4e6cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,7 +83,7 @@ importers: version: 3.1.0 ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.7.3) + version: 29.2.5(@babel/core@7.26.7)(jest@29.7.0)(typescript@5.7.3) ts-node: specifier: 10.9.2 version: 10.9.2(@types/node@20.17.12)(typescript@5.7.3) @@ -146,7 +146,7 @@ importers: version: 6.6.0(eslint@8.57.1) jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) + version: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) jest-environment-jsdom: specifier: ^29.0.0 version: 29.7.0 @@ -170,14 +170,16 @@ importers: version: 6.1.0(rollup@4.14.3)(typescript@5.6.3) ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.6.3) + version: 29.1.5(@babel/core@7.26.7)(jest@29.7.0)(typescript@5.6.3) ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.17.12)(typescript@5.6.3) + version: 10.9.2(@types/node@22.13.1)(typescript@5.6.3) typescript: specifier: ^5.0.2 version: 5.6.3 + packages/libs/escape-markdown/dist/cjs: {} + packages/libs/sdk-component-drivers: dependencies: '@descope/sdk-helpers': @@ -306,14 +308,16 @@ importers: version: 2.0.5 ts-jest: specifier: ^29.0.0 - version: 29.1.2(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.2(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 + packages/libs/sdk-component-drivers/dist/cjs: {} + packages/libs/sdk-helpers: dependencies: tslib: @@ -436,14 +440,16 @@ importers: version: 2.0.5 ts-jest: specifier: ^29.0.0 - version: 29.1.2(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.2(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 + packages/libs/sdk-helpers/dist/cjs: {} + packages/libs/sdk-mixins: dependencies: '@descope/sdk-component-drivers': @@ -590,14 +596,16 @@ importers: version: 1.2.1(rollup@4.13.0) ts-jest: specifier: ^29.0.0 - version: 29.1.2(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.2(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 + packages/libs/sdk-mixins/dist/cjs: {} + packages/sdks/angular-sdk: dependencies: '@descope/access-key-management-widget': @@ -699,7 +707,7 @@ importers: version: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) jest-preset-angular: specifier: ^13.1.2 - version: 13.1.6(@angular-devkit/build-angular@18.2.14)(@angular/compiler-cli@19.1.4)(@angular/core@19.1.4)(@angular/platform-browser-dynamic@19.1.4)(@babel/core@7.26.0)(jest@29.7.0)(typescript@4.9.5) + version: 13.1.6(@angular-devkit/build-angular@18.2.14)(@angular/compiler-cli@19.1.4)(@angular/core@19.1.4)(@angular/platform-browser-dynamic@19.1.4)(@babel/core@7.26.7)(jest@29.7.0)(typescript@4.9.5) lint-staged: specifier: ^15.2.0 version: 15.2.7 @@ -844,14 +852,16 @@ importers: version: 2.0.5 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 + packages/sdks/core-js-sdk/dist/cjs: {} + packages/sdks/nextjs-sdk: dependencies: '@descope/core-js-sdk': @@ -875,7 +885,7 @@ importers: optionalDependencies: '@descope/web-js-sdk': specifier: '>=1' - version: link:../web-js-sdk + version: 1.23.9 devDependencies: '@babel/core': specifier: 7.26.0 @@ -933,7 +943,7 @@ importers: version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.33.2)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-config-prettier: specifier: 8.10.0 version: 8.10.0(eslint@8.57.1) @@ -945,10 +955,10 @@ importers: version: 2.7.1(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-import: specifier: 2.31.0 - version: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) eslint-plugin-jest: specifier: 28.10.0 - version: 28.10.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5) + version: 28.10.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5) eslint-plugin-jest-dom: specifier: 4.0.3 version: 4.0.3(eslint@8.57.1) @@ -969,7 +979,7 @@ importers: version: 1.2.3(eslint@8.57.1) eslint-plugin-prettier: specifier: 4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@3.4.2) eslint-plugin-promise: specifier: 6.6.0 version: 6.6.0(eslint@8.57.1) @@ -987,10 +997,10 @@ importers: version: 3.1.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) + version: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) jest-config: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) + version: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -1047,7 +1057,7 @@ importers: version: 0.7.0(rollup@2.79.1) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@swc/core@1.7.1)(@types/node@22.13.1)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -1056,10 +1066,10 @@ importers: dependencies: '@descope/nextjs-sdk': specifier: file:../.. - version: file:packages/sdks/nextjs-sdk(@types/react@18.3.18)(next@14.2.21)(react@18.3.1) + version: file:packages/sdks/nextjs-sdk(@types/react@19.0.8)(next@14.2.21)(react@18.3.1) next: specifier: ^14.2.10 - version: 14.2.21(@babel/core@7.26.0)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.21(@babel/core@7.26.7)(react-dom@18.3.1)(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -1071,10 +1081,10 @@ importers: dependencies: '@descope/nextjs-sdk': specifier: file:../.. - version: file:packages/sdks/nextjs-sdk(@types/react@18.3.18)(next@14.2.10)(react@18.3.1) + version: file:packages/sdks/nextjs-sdk(@types/react@19.0.8)(next@14.2.10)(react@18.3.1) next: specifier: 14.2.10 - version: 14.2.10(@babel/core@7.26.0)(react-dom@18.3.1)(react@18.3.1) + version: 14.2.10(@babel/core@7.26.7)(react-dom@18.3.1)(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -1186,7 +1196,7 @@ importers: version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-config-prettier: specifier: 8.10.0 version: 8.10.0(eslint@8.57.1) @@ -1195,13 +1205,13 @@ importers: version: 17.1.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1) eslint-import-resolver-typescript: specifier: 3.6.1 - version: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-import: specifier: 2.31.0 - version: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) eslint-plugin-jest: specifier: 28.10.0 - version: 28.10.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5) + version: 28.10.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5) eslint-plugin-jest-dom: specifier: 4.0.3 version: 4.0.3(eslint@8.57.1) @@ -1311,6 +1321,8 @@ importers: specifier: ^5.0.2 version: 5.4.5 + packages/sdks/react-sdk/dist/cjs: {} + packages/sdks/vue-sdk: dependencies: '@descope/access-key-management-widget': @@ -1382,10 +1394,10 @@ importers: version: 2.4.6 '@vue/vue3-jest': specifier: ^27.0.0-alpha.1 - version: 27.0.0(@babel/core@7.26.0)(babel-jest@27.5.1)(jest@29.7.0)(ts-jest@27.1.5)(typescript@5.4.5)(vue@3.4.31) + version: 27.0.0(@babel/core@7.26.7)(babel-jest@27.5.1)(jest@29.7.0)(ts-jest@27.1.5)(typescript@5.4.5)(vue@3.4.31) babel-jest: specifier: ^27.0.6 - version: 27.5.1(@babel/core@7.26.0) + version: 27.5.1(@babel/core@7.26.7) eslint: specifier: ^7.32.0 version: 7.32.0 @@ -1445,7 +1457,7 @@ importers: version: 6.0.0(@vue/compiler-sfc@3.5.13) ts-jest: specifier: ^27.0.4 - version: 27.1.5(@babel/core@7.26.0)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5) + version: 27.1.5(@babel/core@7.26.7)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5) tslib: specifier: ^2.3.1 version: 2.6.3 @@ -1518,7 +1530,7 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: 19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 18.0.0 version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0)(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) @@ -1602,10 +1614,10 @@ importers: version: 1.0.2 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -1747,14 +1759,16 @@ importers: version: 2.0.5 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 + packages/sdks/web-js-sdk/dist/cjs: {} + packages/widgets/access-key-management-widget: dependencies: '@descope/sdk-component-drivers': @@ -1832,7 +1846,7 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: 19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 18.0.0 version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0)(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) @@ -1925,10 +1939,10 @@ importers: version: 1.0.2 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -2010,7 +2024,7 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: 19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 18.0.0 version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0)(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) @@ -2103,7 +2117,7 @@ importers: version: 1.0.2 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.5.4) + version: 29.1.5(@babel/core@7.26.7)(jest@29.7.0)(typescript@5.5.4) ts-node: specifier: 10.9.2 version: 10.9.2(@types/node@20.17.12)(typescript@5.5.4) @@ -2188,10 +2202,10 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: 19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-config-prettier: specifier: 9.1.0 version: 9.1.0(eslint@8.57.1) @@ -2200,13 +2214,13 @@ importers: version: 17.1.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@17.9.0)(eslint-plugin-promise@6.6.0)(eslint@8.57.1) eslint-import-resolver-typescript: specifier: 3.6.1 - version: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-import: specifier: 2.31.0 - version: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) eslint-plugin-jest: specifier: 28.10.0 - version: 28.10.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5) + version: 28.10.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5) eslint-plugin-jest-dom: specifier: 5.4.0 version: 5.4.0(@testing-library/dom@10.1.0)(eslint@8.57.1) @@ -2281,10 +2295,10 @@ importers: version: 1.0.2 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -2366,7 +2380,7 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: 19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 18.0.0 version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0)(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) @@ -2459,10 +2473,10 @@ importers: version: 1.0.2 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -2547,7 +2561,7 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: 19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 18.0.0 version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0)(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) @@ -2640,10 +2654,10 @@ importers: version: 1.0.2 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -2732,7 +2746,7 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: 19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: 18.0.0 version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0)(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) @@ -2825,10 +2839,10 @@ importers: version: 1.0.2 ts-jest: specifier: ^29.0.0 - version: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.17.12)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -3440,6 +3454,29 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true + + /@babel/core@7.26.7: + resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helpers': 7.26.7 + '@babel/parser': 7.26.7 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.7 + '@babel/types': 7.26.7 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color /@babel/generator@7.25.0: resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} @@ -3765,6 +3802,20 @@ packages: '@babel/traverse': 7.26.7 transitivePeerDependencies: - supports-color + dev: true + + /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7): + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.7 + transitivePeerDependencies: + - supports-color /@babel/helper-optimise-call-expression@7.24.7: resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} @@ -4157,6 +4208,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.7): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -4166,6 +4226,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.7): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -4184,6 +4253,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.7): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -4299,6 +4377,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.7): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -4317,6 +4404,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.7): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.26.0): resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} @@ -4355,6 +4451,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.7): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -4373,6 +4478,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.7): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -4391,6 +4505,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.7): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -4409,6 +4532,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.7): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -4427,6 +4559,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.7): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -4445,6 +4586,15 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.7): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -4475,6 +4625,16 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.7): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.26.0): resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} engines: {node: '>=6.9.0'} @@ -5101,6 +5261,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.26.7): + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.25.2): resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} @@ -6343,8 +6517,8 @@ packages: jwt-decode: 4.0.0 dev: false - /@descope/core-js-sdk@2.33.0: - resolution: {integrity: sha512-T2rPVRstUkzkzw4hYwl+D8r+5lBugXS/YAOy0CCmQhYf+GqUddZD7kj/W66+jkqwbC01slUss0Nesp4LG+21lw==} + /@descope/core-js-sdk@2.33.6: + resolution: {integrity: sha512-pnE9g4lj8muW8lXWPqKwuVodh+oW+6gPGW5fLrlPM2BWENGmydInLUdx9Qa0XTqhyKFeUREi0118gMGrjL32hQ==} requiresBuild: true dependencies: jwt-decode: 4.0.0 @@ -6396,15 +6570,15 @@ packages: - supports-color dev: true - /@descope/web-js-sdk@1.23.1: - resolution: {integrity: sha512-gaYohKYQKTAwqED49dZBWKGIgqy2k9U45N8enzaI2hyQnyq1ZYfJkssZ3QgMo8NnubLO/JfQ6iwRu4dLEuVl2A==} + /@descope/web-js-sdk@1.23.9: + resolution: {integrity: sha512-Ioig8pJZlZmRb6wqYNWQUcvC24qgahjcaLHvTx0HkEwEOmCKx5Ie+Ojs8ZAKFRT5J19K4EGrRDetyHWabNjn0A==} requiresBuild: true dependencies: - '@descope/core-js-sdk': 2.33.0 - '@fingerprintjs/fingerprintjs-pro': 3.9.9 + '@descope/core-js-sdk': 2.33.6 + '@fingerprintjs/fingerprintjs-pro': 3.11.6 js-cookie: 3.0.5 jwt-decode: 4.0.0 - tslib: 2.6.3 + tslib: 2.8.1 dev: false optional: true @@ -7454,14 +7628,6 @@ packages: tslib: 2.8.1 dev: false - /@fingerprintjs/fingerprintjs-pro@3.9.9: - resolution: {integrity: sha512-Fce0AKrLqzYXSQQGLGafZmX+uG9OPfy4p1/aCvhpmsm/tsenwh+szuaOTxc3ieQMBtt+EYwXm2vxyya3/Ml0ZQ==} - requiresBuild: true - dependencies: - tslib: 2.8.1 - dev: false - optional: true - /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} dev: true @@ -8171,35 +8337,35 @@ packages: rxjs: 7.8.1 dev: true - /@jsonjoy.com/base64@1.1.2(tslib@2.8.1): + /@jsonjoy.com/base64@1.1.2(tslib@2.6.3): resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' dependencies: - tslib: 2.8.1 + tslib: 2.6.3 dev: true - /@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1): + /@jsonjoy.com/json-pack@1.1.1(tslib@2.6.3): resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + '@jsonjoy.com/base64': 1.1.2(tslib@2.6.3) + '@jsonjoy.com/util': 1.5.0(tslib@2.6.3) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) - tslib: 2.8.1 + thingies: 1.21.0(tslib@2.6.3) + tslib: 2.6.3 dev: true - /@jsonjoy.com/util@1.5.0(tslib@2.8.1): + /@jsonjoy.com/util@1.5.0(tslib@2.6.3): resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' dependencies: - tslib: 2.8.1 + tslib: 2.6.3 dev: true /@leichtgewicht/ip-codec@2.0.5: @@ -8932,7 +9098,7 @@ packages: enquirer: 2.3.6 ignore: 5.3.2 nx: 19.5.2 - semver: 7.7.0 + semver: 7.7.1 tmp: 0.2.3 tslib: 2.8.1 yargs-parser: 21.1.1 @@ -10831,7 +10997,7 @@ packages: chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) + jest: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) lodash: 4.17.21 redent: 3.0.0 dev: true @@ -11234,6 +11400,12 @@ packages: undici-types: 6.20.0 dev: true + /@types/node@22.13.1: + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + dependencies: + undici-types: 6.20.0 + dev: true + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true @@ -11287,6 +11459,7 @@ packages: dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 + dev: true /@types/react@18.3.3: resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} @@ -11295,6 +11468,12 @@ packages: csstype: 3.1.3 dev: false + /@types/react@19.0.8: + resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} + dependencies: + csstype: 3.1.3 + dev: false + /@types/relateurl@0.2.29: resolution: {integrity: sha512-QSvevZ+IRww2ldtfv1QskYsqVVVwCKQf1XbwtcyyoRvLIQzfyPhj/C+3+PKzSDRdiyejaiLgnq//XTkleorpLg==} dev: true @@ -11440,35 +11619,36 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.4.5): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@4.9.5): + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.4.5) - debug: 4.3.4 - eslint: 8.57.1 + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.7 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.0 - tsutils: 3.21.0(typescript@5.4.5) - typescript: 5.4.5 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.0 + ts-api-utils: 1.3.0(typescript@4.9.5) + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.4.5): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -11480,19 +11660,19 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.4.5) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.4.5) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.7 - eslint: 8.57.0 + eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 semver: 7.7.0 - ts-api-utils: 1.3.0(typescript@4.9.5) - typescript: 4.9.5 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -11625,27 +11805,28 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.4.5): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - debug: 4.3.4 - eslint: 8.57.1 - typescript: 5.4.5 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.7 + eslint: 8.57.0 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@4.9.5): + /@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.4.5): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -11657,11 +11838,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.7 - eslint: 8.57.0 - typescript: 4.9.5 + eslint: 8.57.1 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -11810,27 +11991,27 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.4.5): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@4.9.5): + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) debug: 4.3.7 - eslint: 8.57.1 - tsutils: 3.21.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.4.5): resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -11840,12 +12021,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@4.9.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.4.5) debug: 4.3.7 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@4.9.5) - typescript: 4.9.5 + eslint: 8.57.1 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -12018,6 +12199,28 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.7 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@7.11.0(typescript@4.9.5): resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -12231,6 +12434,25 @@ packages: - typescript dev: true + /@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.4.5): + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + eslint: 8.57.1 + semver: 7.7.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -13038,14 +13260,14 @@ packages: '@types/jest': 27.5.2 '@vue/cli-service': 5.0.8(@vue/compiler-sfc@3.5.13)(prettier@2.8.8)(vue@3.4.31) '@vue/cli-shared-utils': 5.0.8 - '@vue/vue3-jest': 27.0.0(@babel/core@7.26.0)(babel-jest@27.5.1)(jest@29.7.0)(ts-jest@27.1.5)(typescript@5.4.5)(vue@3.4.31) + '@vue/vue3-jest': 27.0.0(@babel/core@7.26.7)(babel-jest@27.5.1)(jest@29.7.0)(ts-jest@27.1.5)(typescript@5.4.5)(vue@3.4.31) babel-jest: 27.5.1(@babel/core@7.26.0) deepmerge: 4.3.1 jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) jest-serializer-vue: 2.0.2 jest-transform-stub: 2.0.0 jest-watch-typeahead: 1.1.0(jest@29.7.0) - ts-jest: 27.1.5(@babel/core@7.26.0)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5) + ts-jest: 27.1.5(@babel/core@7.26.7)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5) transitivePeerDependencies: - encoding - supports-color @@ -13454,7 +13676,7 @@ packages: vue-component-type-helpers: 2.0.26 dev: true - /@vue/vue3-jest@27.0.0(@babel/core@7.26.0)(babel-jest@27.5.1)(jest@29.7.0)(ts-jest@27.1.5)(typescript@5.4.5)(vue@3.4.31): + /@vue/vue3-jest@27.0.0(@babel/core@7.26.7)(babel-jest@27.5.1)(jest@29.7.0)(ts-jest@27.1.5)(typescript@5.4.5)(vue@3.4.31): resolution: {integrity: sha512-VL61CgZBoQqayXfzlZJHHpZuX4lsT8dmdZMJzADhdAJjKu26JBpypHr/2ppevxItljPiuALQW4MKhhCXZRXnLg==} peerDependencies: '@babel/core': 7.x @@ -13469,15 +13691,15 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.26.0) - babel-jest: 27.5.1(@babel/core@7.26.0) + '@babel/core': 7.26.7 + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.26.7) + babel-jest: 27.5.1(@babel/core@7.26.7) chalk: 2.4.2 convert-source-map: 1.9.0 css-tree: 2.3.1 jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) source-map: 0.5.6 - ts-jest: 27.1.5(@babel/core@7.26.0)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5) + ts-jest: 27.1.5(@babel/core@7.26.7)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5) tsconfig: 7.0.0 typescript: 5.4.5 vue: 3.4.31(typescript@5.4.5) @@ -13981,6 +14203,14 @@ packages: is-array-buffer: 3.0.4 dev: true + /array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + dev: true + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true @@ -14050,6 +14280,16 @@ packages: es-shim-unscopables: 1.0.2 dev: true + /array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.0.2 + dev: true + /array.prototype.toreversed@1.1.2: resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} dependencies: @@ -14084,6 +14324,19 @@ packages: is-shared-array-buffer: 1.0.3 dev: true + /arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + dev: true + /arrify@2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} @@ -14107,6 +14360,11 @@ packages: engines: {node: '>=0.8.0'} dev: true + /async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + dev: true + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: @@ -14226,6 +14484,25 @@ packages: - supports-color dev: true + /babel-jest@27.5.1(@babel/core@7.26.7): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.26.7 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.0 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.26.7) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-jest@29.7.0(@babel/core@7.26.0): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -14472,6 +14749,26 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) dev: true + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.26.7): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.7) + dev: true + /babel-preset-jest@27.5.1(@babel/core@7.26.0): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -14483,6 +14780,17 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.0) dev: true + /babel-preset-jest@27.5.1(@babel/core@7.26.7): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.26.7 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.7) + dev: true + /babel-preset-jest@29.6.3(@babel/core@7.26.0): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -14818,6 +15126,14 @@ packages: unique-filename: 3.0.0 dev: true + /call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + dev: true + /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -14829,6 +15145,24 @@ packages: set-function-length: 1.2.2 dev: true + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -15876,6 +16210,25 @@ packages: - ts-node dev: true + /create-jest@29.7.0(@types/node@22.13.1)(ts-node@10.9.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -16263,6 +16616,15 @@ packages: is-data-view: 1.0.1 dev: true + /data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + /data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} @@ -16272,6 +16634,15 @@ packages: is-data-view: 1.0.1 dev: true + /data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + /data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} @@ -16281,6 +16652,15 @@ packages: is-data-view: 1.0.1 dev: true + /data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + dev: true + /debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true @@ -16354,6 +16734,17 @@ packages: dependencies: ms: 2.1.3 + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true @@ -16701,6 +17092,15 @@ packages: engines: {node: '>=12'} dev: true + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true @@ -16982,6 +17382,63 @@ packages: which-typed-array: 1.1.15 dev: true + /es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + dev: true + /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -16989,6 +17446,11 @@ packages: get-intrinsic: 1.2.4 dev: true + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + dev: true + /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -17028,6 +17490,28 @@ packages: safe-array-concat: 1.1.2 dev: true + /es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + dev: true + /es-module-lexer@1.4.2: resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} dev: true @@ -17043,6 +17527,13 @@ packages: es-errors: 1.3.0 dev: true + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -17052,6 +17543,16 @@ packages: hasown: 2.0.2 dev: true + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: @@ -17067,6 +17568,15 @@ packages: is-symbol: 1.0.4 dev: true + /es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + dev: true + /esbuild-wasm@0.19.12: resolution: {integrity: sha512-Zmc4hk6FibJZBcTx5/8K/4jT3/oG1vkGTEeKJUQFCUQKimD6Q7+adp/bdVQyYJFolMKaXkQnVZdV4O5ZaTYmyQ==} engines: {node: '>=12'} @@ -17273,7 +17783,7 @@ packages: semver: 6.3.1 dev: true - /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1): + /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@6.21.0)(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1): resolution: {integrity: sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==} peerDependencies: '@typescript-eslint/eslint-plugin': ^5.13.0 || ^6.0.0 @@ -17281,11 +17791,11 @@ packages: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.4.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.4.5) eslint: 8.57.1 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) dev: true /eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.18.0)(@typescript-eslint/parser@7.18.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1): @@ -17330,7 +17840,7 @@ packages: dependencies: eslint: 8.57.1 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.33.2(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -17350,7 +17860,7 @@ packages: dependencies: eslint: 8.57.1 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.34.3(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -17358,6 +17868,26 @@ packages: object.entries: 1.1.8 dev: true + /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.37.4)(eslint@8.57.1): + resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} + engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + dependencies: + eslint: 8.57.1 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) + eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) + object.assign: 4.1.5 + object.entries: 1.1.8 + dev: true + /eslint-config-prettier@8.10.0(eslint@7.32.0): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true @@ -17404,7 +17934,7 @@ packages: eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.57.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) dev: true @@ -17443,7 +17973,7 @@ packages: dependencies: debug: 4.3.4 eslint: 8.57.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) glob: 7.2.3 is-glob: 4.0.3 resolve: 1.22.4 @@ -17452,7 +17982,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -17462,8 +17992,8 @@ packages: debug: 4.3.7 enhanced-resolve: 5.17.0 eslint: 8.57.1 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) fast-glob: 3.3.1 get-tsconfig: 4.7.3 is-core-module: 2.13.1 @@ -17521,7 +18051,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1): + /eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1): resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: @@ -17542,7 +18072,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 @@ -17551,7 +18081,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): + /eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: @@ -17572,11 +18102,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color dev: true @@ -17641,7 +18171,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -17662,10 +18192,10 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.1 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color dev: true @@ -17751,7 +18281,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1): + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1): resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: @@ -17762,7 +18292,7 @@ packages: optional: true dependencies: '@rtsao/scc': 1.1.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.4.5) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -17771,7 +18301,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@2.7.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -17788,7 +18318,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: @@ -17799,7 +18329,7 @@ packages: optional: true dependencies: '@rtsao/scc': 1.1.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.4.5) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -17808,7 +18338,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -17952,7 +18482,7 @@ packages: eslint: 8.57.1 dev: true - /eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5): + /eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@6.21.0)(eslint@8.57.1)(jest@29.7.0)(typescript@5.4.5): resolution: {integrity: sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: @@ -17965,10 +18495,10 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.1)(typescript@5.4.5) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.4.5) eslint: 8.57.1 - jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) + jest: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) transitivePeerDependencies: - supports-color - typescript @@ -18034,7 +18564,7 @@ packages: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 - jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) + jest: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) transitivePeerDependencies: - supports-color - typescript @@ -18145,6 +18675,23 @@ packages: prettier-linter-helpers: 1.0.0 dev: true + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@3.4.2): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.57.1 + eslint-config-prettier: 8.10.0(eslint@8.57.1) + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + dev: true + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} @@ -18291,6 +18838,33 @@ packages: string.prototype.matchall: 4.0.11 dev: true + /eslint-plugin-react@7.37.4(eslint@8.57.1): + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + dev: true + /eslint-plugin-testing-library@5.11.1(eslint@8.57.1)(typescript@5.4.5): resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} @@ -19140,6 +19714,13 @@ packages: is-callable: 1.2.7 dev: true + /for-each@0.3.4: + resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -19310,6 +19891,18 @@ packages: functions-have-names: 1.2.3 dev: true + /function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + dev: true + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true @@ -19343,11 +19936,35 @@ packages: hasown: 2.0.2 dev: true + /get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + dev: true + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + dev: true + /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} @@ -19386,6 +20003,15 @@ packages: get-intrinsic: 1.2.4 dev: true + /get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + dev: true + /get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: @@ -19546,6 +20172,11 @@ packages: get-intrinsic: 1.2.4 dev: true + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + dev: true + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -19590,6 +20221,11 @@ packages: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true + /has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + dev: true + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -19611,11 +20247,23 @@ packages: engines: {node: '>= 0.4'} dev: true + /has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + dev: true + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + dev: true + /has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -20130,7 +20778,7 @@ packages: /injection-js@2.4.0: resolution: {integrity: sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==} dependencies: - tslib: 2.8.1 + tslib: 2.6.3 dev: true /inquirer@8.2.6: @@ -20163,6 +20811,15 @@ packages: side-channel: 1.0.6 dev: true + /internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + dev: true + /ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} @@ -20197,6 +20854,15 @@ packages: get-intrinsic: 1.2.4 dev: true + /is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true @@ -20212,6 +20878,17 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + /is-base64@0.1.0: resolution: {integrity: sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==} dev: true @@ -20222,6 +20899,13 @@ packages: has-bigints: 1.0.2 dev: true + /is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + dependencies: + has-bigints: 1.1.0 + dev: true + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -20237,6 +20921,14 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true @@ -20280,6 +20972,15 @@ packages: is-typed-array: 1.1.13 dev: true + /is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -20287,6 +20988,14 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -20321,6 +21030,13 @@ packages: call-bind: 1.0.7 dev: true + /is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -20355,6 +21071,16 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -20415,6 +21141,14 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -20475,6 +21209,16 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + /is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -20487,6 +21231,13 @@ packages: call-bind: 1.0.7 dev: true + /is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} @@ -20509,6 +21260,14 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + dev: true + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} @@ -20516,6 +21275,15 @@ packages: has-symbols: 1.0.3 dev: true + /is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + dev: true + /is-text-path@2.0.0: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} @@ -20530,6 +21298,13 @@ packages: which-typed-array: 1.1.15 dev: true + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.18 + dev: true + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true @@ -20550,6 +21325,13 @@ packages: call-bind: 1.0.7 dev: true + /is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + dev: true + /is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} @@ -20690,6 +21472,18 @@ packages: set-function-name: 2.0.2 dev: true + /iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + dev: true + /jackspeak@3.4.0: resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} @@ -20819,6 +21613,34 @@ packages: - ts-node dev: true + /jest-cli@29.7.0(@types/node@22.13.1)(ts-node@10.9.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.1 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jest-config@29.7.0(@types/node@20.14.7)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -20936,7 +21758,48 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.17.12)(typescript@5.6.3) + ts-node: 10.9.2(@types/node@20.17.12)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-config@29.7.0(@types/node@22.13.1)(ts-node@10.9.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.13.1 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@22.13.1)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -21166,7 +22029,7 @@ packages: jest-resolve: 29.7.0 dev: true - /jest-preset-angular@13.1.6(@angular-devkit/build-angular@18.2.14)(@angular/compiler-cli@19.1.4)(@angular/core@19.1.4)(@angular/platform-browser-dynamic@19.1.4)(@babel/core@7.26.0)(jest@29.7.0)(typescript@4.9.5): + /jest-preset-angular@13.1.6(@angular-devkit/build-angular@18.2.14)(@angular/compiler-cli@19.1.4)(@angular/core@19.1.4)(@angular/platform-browser-dynamic@19.1.4)(@babel/core@7.26.7)(jest@29.7.0)(typescript@4.9.5): resolution: {integrity: sha512-0pXSm6168Qn+qKp7DpzYoaIp0uyMHdQaWYVp8jlw7Mh+NEBtrBjKqts3kLeBHgAhGMQArp07S2IxZ6eCr8fc7Q==} engines: {node: ^14.15.0 || >=16.10.0} peerDependencies: @@ -21187,7 +22050,7 @@ packages: jest-environment-jsdom: 29.7.0 jest-util: 29.7.0 pretty-format: 29.7.0 - ts-jest: 29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@4.9.5) + ts-jest: 29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@4.9.5) typescript: 4.9.5 optionalDependencies: esbuild: 0.24.2 @@ -21518,6 +22381,27 @@ packages: - ts-node dev: true + /jest@29.7.0(@types/node@22.13.1)(ts-node@10.9.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true @@ -21822,7 +22706,7 @@ packages: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.8.1 + tslib: 2.6.3 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -22380,6 +23264,11 @@ packages: uc.micro: 2.1.0 dev: true + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + dev: true + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true @@ -22408,10 +23297,10 @@ packages: resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} engines: {node: '>= 4.0.0'} dependencies: - '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - tree-dump: 1.0.2(tslib@2.8.1) - tslib: 2.8.1 + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.6.3) + '@jsonjoy.com/util': 1.5.0(tslib@2.6.3) + tree-dump: 1.0.2(tslib@2.6.3) + tslib: 2.6.3 dev: true /meow@12.1.1: @@ -22845,7 +23734,7 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /next@14.2.10(@babel/core@7.26.0)(react-dom@18.3.1)(react@18.3.1): + /next@14.2.10(@babel/core@7.26.7)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} engines: {node: '>=18.17.0'} hasBin: true @@ -22871,7 +23760,7 @@ packages: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.7)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.10 '@next/swc-darwin-x64': 14.2.10 @@ -22927,6 +23816,49 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: true + + /next@14.2.21(@babel/core@7.26.7)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-rZmLwucLHr3/zfDMYbJXbw0ZeoBpirxkXuvsJbk7UPorvPYZhP7vq7aHbKnU7dQNCYIimRrbB2pp3xmf+wsYUg==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.2.21 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001696 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.7)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.21 + '@next/swc-darwin-x64': 14.2.21 + '@next/swc-linux-arm64-gnu': 14.2.21 + '@next/swc-linux-arm64-musl': 14.2.21 + '@next/swc-linux-x64-gnu': 14.2.21 + '@next/swc-linux-x64-musl': 14.2.21 + '@next/swc-win32-arm64-msvc': 14.2.21 + '@next/swc-win32-ia32-msvc': 14.2.21 + '@next/swc-win32-x64-msvc': 14.2.21 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false /ng-mocks@14.13.0(@angular/common@19.1.4)(@angular/core@19.1.4)(@angular/forms@19.1.4)(@angular/platform-browser@19.1.4): resolution: {integrity: sha512-cQ6nUj/P+v7X52gYU6bAj/03iDKl2pzbPy2V0tx/d5lxME063Vxc190p6UPlJkbRIxcB+OqSALPgQvy83efzjw==} @@ -23380,6 +24312,11 @@ packages: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + /object-is@1.1.6: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} @@ -23403,6 +24340,18 @@ packages: object-keys: 1.1.1 dev: true + /object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + dev: true + /object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} @@ -23449,6 +24398,16 @@ packages: es-object-atoms: 1.0.0 dev: true + /object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} dev: true @@ -23611,6 +24570,15 @@ packages: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} dev: true + /own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + dev: true + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -24754,6 +25722,12 @@ packages: hasBin: true dev: true + /prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: @@ -25205,6 +26179,20 @@ packages: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} dev: true + /reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + dev: true + /reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -25268,6 +26256,18 @@ packages: set-function-name: 2.0.2 dev: true + /regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + dev: true + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -26090,6 +27090,17 @@ packages: isarray: 2.0.5 dev: true + /safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -26098,6 +27109,14 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true + /safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + dev: true + /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} @@ -26107,6 +27126,15 @@ packages: is-regex: 1.1.4 dev: true + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + /safe-resolve@1.0.0: resolution: {integrity: sha512-aQpRvfxoi1y0UxKEU0tNO327kb0/LMo8Xrk64M2u172UqOOLCCM0khxN2OTClDiTqTJz5864GMD1X92j4YiHTg==} dev: true @@ -26273,6 +27301,12 @@ packages: hasBin: true dev: true + /semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + dev: true + /send@0.16.2: resolution: {integrity: sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==} engines: {node: '>= 0.8.0'} @@ -26430,6 +27464,15 @@ packages: has-property-descriptors: 1.0.2 dev: true + /set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + dev: true + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: true @@ -26495,6 +27538,35 @@ packages: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: true + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + /side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -26505,6 +27577,17 @@ packages: object-inspect: 1.13.1 dev: true + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -26953,6 +28036,45 @@ packages: side-channel: 1.0.6 dev: true + /string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + dev: true + + /string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + dev: true + + /string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + dev: true + /string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -26971,6 +28093,16 @@ packages: es-object-atoms: 1.0.0 dev: true + /string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + dev: true + /string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} @@ -27086,6 +28218,25 @@ packages: '@babel/core': 7.26.0 client-only: 0.0.1 react: 18.3.1 + dev: true + + /styled-jsx@5.1.1(@babel/core@7.26.7)(react@18.3.1): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.26.7 + client-only: 0.0.1 + react: 18.3.1 + dev: false /stylehacks@5.1.1(postcss@8.4.39): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} @@ -27331,13 +28482,13 @@ packages: any-promise: 1.3.0 dev: true - /thingies@1.21.0(tslib@2.8.1): + /thingies@1.21.0(tslib@2.6.3): resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 dependencies: - tslib: 2.8.1 + tslib: 2.6.3 dev: true /thread-loader@3.0.4(webpack@5.93.0): @@ -27443,13 +28594,13 @@ packages: punycode: 2.3.0 dev: true - /tree-dump@1.0.2(tslib@2.8.1): + /tree-dump@1.0.2(tslib@2.6.3): resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' dependencies: - tslib: 2.8.1 + tslib: 2.6.3 dev: true /tree-kill@1.2.2: @@ -27502,7 +28653,7 @@ packages: typescript: 5.7.3 dev: true - /ts-jest@27.1.5(@babel/core@7.26.0)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5): + /ts-jest@27.1.5(@babel/core@7.26.7)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@29.7.0)(typescript@5.4.5): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -27523,9 +28674,9 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.7 '@types/jest': 27.5.2 - babel-jest: 27.5.1(@babel/core@7.26.0) + babel-jest: 27.5.1(@babel/core@7.26.7) bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) @@ -27538,7 +28689,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-jest@29.1.2(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5): + /ts-jest@29.1.2(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5): resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -27559,7 +28710,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.7 bs-logger: 0.2.6 esbuild: 0.24.2 fast-json-stable-stringify: 2.1.0 @@ -27611,7 +28762,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@4.9.5): + /ts-jest@29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@4.9.5): resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -27635,7 +28786,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.7 bs-logger: 0.2.6 esbuild: 0.24.2 fast-json-stable-stringify: 2.1.0 @@ -27649,7 +28800,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.5(@babel/core@7.26.0)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5): + /ts-jest@29.1.5(@babel/core@7.26.7)(esbuild@0.24.2)(jest@29.7.0)(typescript@5.4.5): resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -27673,7 +28824,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.7 bs-logger: 0.2.6 esbuild: 0.24.2 fast-json-stable-stringify: 2.1.0 @@ -27687,7 +28838,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.5.4): + /ts-jest@29.1.5(@babel/core@7.26.7)(jest@29.7.0)(typescript@5.5.4): resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -27711,7 +28862,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) @@ -27724,7 +28875,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.6.3): + /ts-jest@29.1.5(@babel/core@7.26.7)(jest@29.7.0)(typescript@5.6.3): resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -27748,10 +28899,10 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.12)(ts-node@10.9.2) + jest: 29.7.0(@types/node@22.13.1)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -27761,7 +28912,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.2.5(@babel/core@7.26.0)(jest@29.7.0)(typescript@5.7.3): + /ts-jest@29.2.5(@babel/core@7.26.7)(jest@29.7.0)(typescript@5.7.3): resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -27785,7 +28936,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.7 bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 @@ -27908,7 +29059,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.2(@swc/core@1.7.1)(@types/node@20.17.12)(typescript@5.4.5): + /ts-node@10.9.2(@swc/core@1.7.1)(@types/node@22.13.1)(typescript@5.4.5): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -27928,7 +29079,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 20.17.12 + '@types/node': 22.13.1 acorn: 8.12.1 acorn-walk: 8.2.0 arg: 4.1.3 @@ -27940,7 +29091,7 @@ packages: yn: 3.1.1 dev: true - /ts-node@10.9.2(@types/node@20.17.12)(typescript@5.5.4): + /ts-node@10.9.2(@types/node@20.17.12)(typescript@5.4.5): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -27966,12 +29117,12 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /ts-node@10.9.2(@types/node@20.17.12)(typescript@5.6.3): + /ts-node@10.9.2(@types/node@20.17.12)(typescript@5.5.4): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -27997,7 +29148,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -28033,6 +29184,37 @@ packages: yn: 3.1.1 dev: true + /ts-node@10.9.2(@types/node@22.13.1)(typescript@5.6.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 22.13.1 + acorn: 8.12.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.6.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -28167,6 +29349,15 @@ packages: is-typed-array: 1.1.13 dev: true + /typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + dev: true + /typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} @@ -28178,6 +29369,17 @@ packages: is-typed-array: 1.1.13 dev: true + /typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + dev: true + /typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} @@ -28190,6 +29392,19 @@ packages: is-typed-array: 1.1.13 dev: true + /typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + dev: true + /typed-array-length@1.0.6: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} @@ -28202,6 +29417,18 @@ packages: possible-typed-array-names: 1.0.0 dev: true + /typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.8 + for-each: 0.3.4 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + dev: true + /typed-assert@1.0.9: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} dev: true @@ -28267,6 +29494,16 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true @@ -29077,6 +30314,17 @@ packages: is-symbol: 1.0.4 dev: true + /which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + dev: true + /which-builtin-type@1.1.3: resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} @@ -29095,6 +30343,25 @@ packages: which-typed-array: 1.1.15 dev: true + /which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + dev: true + /which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} @@ -29116,6 +30383,18 @@ packages: has-tostringtag: 1.0.2 dev: true + /which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -29430,7 +30709,7 @@ packages: resolution: {integrity: sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==} dev: true - file:packages/sdks/nextjs-sdk(@types/react@18.3.18)(next@14.2.10)(react@18.3.1): + file:packages/sdks/nextjs-sdk(@types/react@19.0.8)(next@14.2.10)(react@18.3.1): resolution: {directory: packages/sdks/nextjs-sdk, type: directory} id: file:packages/sdks/nextjs-sdk name: '@descope/nextjs-sdk' @@ -29444,16 +30723,16 @@ packages: '@descope/node-sdk': 1.6.13 '@descope/react-sdk': link:packages/sdks/react-sdk '@descope/web-component': link:packages/sdks/web-component - '@types/react': 18.3.18 - next: 14.2.10(@babel/core@7.26.0)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 19.0.8 + next: 14.2.10(@babel/core@7.26.7)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@descope/web-js-sdk': 1.23.1 + '@descope/web-js-sdk': 1.23.9 transitivePeerDependencies: - encoding dev: false - file:packages/sdks/nextjs-sdk(@types/react@18.3.18)(next@14.2.21)(react@18.3.1): + file:packages/sdks/nextjs-sdk(@types/react@19.0.8)(next@14.2.21)(react@18.3.1): resolution: {directory: packages/sdks/nextjs-sdk, type: directory} id: file:packages/sdks/nextjs-sdk name: '@descope/nextjs-sdk' @@ -29467,11 +30746,11 @@ packages: '@descope/node-sdk': 1.6.13 '@descope/react-sdk': link:packages/sdks/react-sdk '@descope/web-component': link:packages/sdks/web-component - '@types/react': 18.3.18 - next: 14.2.21(@babel/core@7.26.0)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 19.0.8 + next: 14.2.21(@babel/core@7.26.7)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@descope/web-js-sdk': 1.23.1 + '@descope/web-js-sdk': 1.23.9 transitivePeerDependencies: - encoding dev: false From 86028f311cb346897c44429deab4fdff526d0cbf Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Thu, 6 Feb 2025 15:28:51 +0200 Subject: [PATCH 08/20] tests --- .../src/lib/constants/general.ts | 2 - .../src/lib/descope-wc/DescopeWc.ts | 16 +- .../src/lib/helpers/conditions.ts | 2 + .../web-component/src/lib/helpers/helpers.ts | 35 ++-- packages/sdks/web-component/src/lib/types.ts | 14 +- .../web-component/test/descope-wc.test.ts | 174 ++++++++++++++++++ 6 files changed, 217 insertions(+), 26 deletions(-) diff --git a/packages/sdks/web-component/src/lib/constants/general.ts b/packages/sdks/web-component/src/lib/constants/general.ts index d46586696..5107fc1d2 100644 --- a/packages/sdks/web-component/src/lib/constants/general.ts +++ b/packages/sdks/web-component/src/lib/constants/general.ts @@ -3,5 +3,3 @@ export const IS_LOCAL_STORAGE = typeof localStorage !== 'undefined'; export const FETCH_EXCEPTION_ERROR_CODE = 'J151000'; export const FETCH_ERROR_RESPONSE_ERROR_CODE = 'J151001'; - -export const IS_RUNNING_IN_DESCOPE_BRIDGE = (window as any).isDescopeBridge; diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index 7c06ad584..0821aa7cd 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -9,7 +9,6 @@ import { ELEMENT_TYPE_ATTRIBUTE, FETCH_ERROR_RESPONSE_ERROR_CODE, FETCH_EXCEPTION_ERROR_CODE, - IS_RUNNING_IN_DESCOPE_BRIDGE, RESPONSE_ACTIONS, URL_CODE_PARAM_NAME, URL_RUN_IDS_PARAM_NAME, @@ -198,7 +197,7 @@ class DescopeWc extends BaseDescopeWc { // when running in a webview (mobile SDK) we want to lazy init the component // so the mobile SDK will be able to register all the necessary callbacks // before the component will start loading the flow - if (!IS_RUNNING_IN_DESCOPE_BRIDGE) { + if (!(window as any).isDescopeBridge) { return this._init(); } else { (this as any).lazyInit = this._init; @@ -366,6 +365,7 @@ class DescopeWc extends BaseDescopeWc { } = currentState; let startScreenId: string; + let startScreenName: string; let conditionInteractionId: string; const abTestingKey = getABTestingKey(); const loginId = this.sdk.getLastUserLoginId(); @@ -407,10 +407,11 @@ class DescopeWc extends BaseDescopeWc { } if (flowConfig.conditions) { - ({ startScreenId, conditionInteractionId } = calculateConditions( - { loginId, code, token, abTestingKey }, - flowConfig.conditions, - )); + ({ startScreenId, conditionInteractionId, startScreenName } = + calculateConditions( + { loginId, code, token, abTestingKey }, + flowConfig.conditions, + )); } else if (flowConfig.condition) { ({ startScreenId, conditionInteractionId } = calculateCondition( flowConfig.condition, @@ -422,6 +423,7 @@ class DescopeWc extends BaseDescopeWc { }, )); } else { + startScreenName = flowConfig.startScreenName; startScreenId = flowConfig.startScreenId; } @@ -648,7 +650,7 @@ class DescopeWc extends BaseDescopeWc { htmlFilename: `${readyScreenId}.html`, htmlLocaleFilename: filenameWithLocale, screenId: readyScreenId, - stepName: currentState.stepName || flowConfig.startScreenName, + stepName: currentState.stepName || startScreenName, samlIdpUsername, oidcLoginHint, oidcPrompt, diff --git a/packages/sdks/web-component/src/lib/helpers/conditions.ts b/packages/sdks/web-component/src/lib/helpers/conditions.ts index d5f41ea7b..8c11f7a45 100644 --- a/packages/sdks/web-component/src/lib/helpers/conditions.ts +++ b/packages/sdks/web-component/src/lib/helpers/conditions.ts @@ -36,6 +36,7 @@ export const calculateCondition = ( : condition.unmet; return { startScreenId: conditionResult?.screenId, + startScreenName: conditionResult?.screenName, conditionInteractionId: conditionResult?.interactionId, }; }; @@ -56,6 +57,7 @@ export const calculateConditions = ( ? {} : { startScreenId: conditionResult.met.screenId, + startScreenName: conditionResult.met.screenName, conditionInteractionId: conditionResult.met.interactionId, }; }; diff --git a/packages/sdks/web-component/src/lib/helpers/helpers.ts b/packages/sdks/web-component/src/lib/helpers/helpers.ts index 189f92a85..d1a11ce92 100644 --- a/packages/sdks/web-component/src/lib/helpers/helpers.ts +++ b/packages/sdks/web-component/src/lib/helpers/helpers.ts @@ -23,6 +23,7 @@ import { THIRD_PARTY_APP_STATE_ID_PARAM_NAME, APPLICATION_SCOPES_PARAM_NAME, } from '../constants'; +import { EXCLUDED_STATE_KEYS } from '../constants/customScreens'; import { AutoFocusOptions, CustomScreenState, @@ -652,28 +653,32 @@ export const clearPreviousExternalInputs = () => { export const shouldHandleMarkdown = (compName: string) => MD_COMPONENTS.includes(compName); +const omitBy = >( + obj: T, + predicate: (value: any, key: keyof T) => boolean, +): T => { + return Object.fromEntries( + Object.entries(obj).filter( + ([key, value]) => !predicate(value, key as keyof T), + ), + ) as T; +}; + export const transformStepStateForCustomScreen = ( state: Partial, ) => { + const sanitizedState: CustomScreenState = omitBy( + state.screenState, + (_, key) => EXCLUDED_STATE_KEYS.includes(key) || key.startsWith('_'), + ); + const { - screenState: { - cssVars, - componentsConfig, - inputs, - // keys we want to exclude ^^ - errorText, - errorType, - ...screenState - }, + screenState: { errorText, errorType }, } = state; - const result: CustomScreenState = { - ...screenState, - }; - if (errorText || errorType) { - result.error = { text: errorText, type: errorType }; + sanitizedState.error = { text: errorText, type: errorType }; } - return result; + return sanitizedState; }; diff --git a/packages/sdks/web-component/src/lib/types.ts b/packages/sdks/web-component/src/lib/types.ts index 1d15c90d5..ffcb2bb8f 100644 --- a/packages/sdks/web-component/src/lib/types.ts +++ b/packages/sdks/web-component/src/lib/types.ts @@ -52,6 +52,15 @@ export interface ScreenState { project?: Project; totp?: { image?: string; provisionUrl?: string }; notp?: { image?: string; redirectUrl?: string }; + clientScripts?: unknown; + selfProvisionDomains?: unknown; + user?: unknown; + sso?: unknown; + dynamicSelects?: unknown; + keysInUse?: unknown; + genericForm?: unknown; + linkId?: unknown; + sentTo?: unknown; } export type SSOQueryParams = { @@ -120,9 +129,9 @@ export type StepState = { openInNewTabUrl?: string; } & OIDCOptions; -export type CustomScreenState = Pick< +export type CustomScreenState = Omit< ScreenState, - 'form' | 'lastAuth' | 'project' + 'cssVars' | 'componentsConfig' | 'inputs' > & { error?: { text: ScreenState['errorText']; @@ -159,6 +168,7 @@ type Operator = export interface ClientConditionResult { screenId: string; + screenName: string; interactionId: string; } diff --git a/packages/sdks/web-component/test/descope-wc.test.ts b/packages/sdks/web-component/test/descope-wc.test.ts index 02ca55275..619f71a16 100644 --- a/packages/sdks/web-component/test/descope-wc.test.ts +++ b/packages/sdks/web-component/test/descope-wc.test.ts @@ -4846,4 +4846,178 @@ describe('web-component', () => { { timeout: WAIT_TIMEOUT }, ); }); + + describe('custom screen', () => { + it('should call the onScreenUpdate with the correct params', async () => { + startMock.mockReturnValue( + generateSdkResponse({ + screenState: { + user: { name: 'john' }, + inputs: {}, + cssVars: {}, + componentsConfig: {}, + errorText: 'errorText', + errorType: 'errorType', + clientScripts: {}, + _key: {}, + }, + }), + ); + + pageContent = `
Loaded123
ho!`; + + document.body.innerHTML = `

Custom element test

`; + + const descopeWc = document.querySelector('descope-wc'); + const onScreenUpdate = jest.fn(); + descopeWc.onScreenUpdate = onScreenUpdate; + + await waitFor(() => screen.getByShadowText('Loaded123'), { + timeout: WAIT_TIMEOUT, + }); + + await waitFor(() => expect(onScreenUpdate).toHaveBeenCalledTimes(1)); + + await waitFor(() => + expect(onScreenUpdate).toHaveBeenCalledWith( + 'Step Name', + { + form: {}, + lastAuth: { loginId: undefined, name: undefined }, + user: { name: 'john' }, + error: { + text: 'errorText', + type: 'errorType', + }, + }, + expect.any(Function), + expect.any(HTMLElement), + ), + ); + }); + it('should render a flow screen when onScreenUpdate returns false', async () => { + startMock.mockReturnValue(generateSdkResponse()); + + pageContent = `
Loaded123
ho!`; + + document.body.innerHTML = `

Custom element test

`; + + const descopeWc = document.querySelector('descope-wc'); + const onScreenUpdate = jest.fn(() => false); + descopeWc.onScreenUpdate = onScreenUpdate; + + await waitFor(() => expect(onScreenUpdate).toHaveBeenCalledTimes(1), { + timeout: WAIT_TIMEOUT, + }); + + await waitFor(() => screen.getByShadowText('Loaded123'), { + timeout: WAIT_TIMEOUT, + }); + + await waitFor( + () => + expect(descopeWc.shadowRoot.querySelector('slot')).toHaveClass( + 'hidden', + ), + { + timeout: 20000, + }, + ); + }); + it('should render a custom screen when onScreenUpdate returns true', async () => { + startMock.mockReturnValue(generateSdkResponse()); + + pageContent = `
Loaded123
ho!`; + + document.body.innerHTML = `

Custom element test

`; + + const descopeWc = document.querySelector('descope-wc'); + const onScreenUpdate = jest.fn(() => true); + descopeWc.onScreenUpdate = onScreenUpdate; + + await waitFor(() => expect(onScreenUpdate).toHaveBeenCalledTimes(1), { + timeout: WAIT_TIMEOUT, + }); + + await waitFor( + () => + expect(screen.queryByShadowText('Loaded123')).not.toBeInTheDocument(), + { + timeout: WAIT_TIMEOUT, + }, + ); + + await waitFor( + () => + expect(descopeWc.shadowRoot.querySelector('slot')).not.toHaveClass( + 'hidden', + ), + { + timeout: 20000, + }, + ); + }); + it('should call onScreenUpdate when rendering a custom screen even if there is no state change', async () => { + startMock.mockReturnValue(generateSdkResponse()); + + nextMock.mockReturnValue(generateSdkResponse()); + + pageContent = `
Loaded123
ho!`; + + document.body.innerHTML = `

Custom element test

`; + + const descopeWc = document.querySelector('descope-wc'); + const onScreenUpdate = jest.fn(() => true); + descopeWc.onScreenUpdate = onScreenUpdate; + + await waitFor(() => expect(onScreenUpdate).toHaveBeenCalledTimes(1), { + timeout: WAIT_TIMEOUT, + }); + + const next = onScreenUpdate.mock.calls[0][2]; + + next('bla', {}); + + await waitFor(() => expect(onScreenUpdate).toHaveBeenCalledTimes(2), { + timeout: 20000, + }); + + expect(onScreenUpdate.mock.calls[0][1]).toEqual( + onScreenUpdate.mock.calls[1][1], + ); + }); + it('should allow lazy render when window attribute is set (for mobile)', async () => { + startMock.mockReturnValue(generateSdkResponse()); + + window.isDescopeBridge = true; + + pageContent = `
Loaded123
ho!`; + + document.body.innerHTML = `

Custom element test

`; + + const descopeWc = document.querySelector('descope-wc'); + + await waitFor( + () => expect(descopeWc.lazyInit).toEqual(expect.any(Function)), + { timeout: 20000 }, + ); + + await waitFor( + () => + expect(screen.queryByShadowText('Loaded123')).not.toBeInTheDocument(), + { + timeout: WAIT_TIMEOUT, + }, + ); + + descopeWc.lazyInit(); + + await waitFor( + () => expect(screen.queryByShadowText('Loaded123')).toBeInTheDocument(), + { + timeout: WAIT_TIMEOUT, + }, + ); + }); + }); }); From 5bb4b0b5fbfab3e87a2c06e1a096a0d2ef74ddc2 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Thu, 6 Feb 2025 15:29:23 +0200 Subject: [PATCH 09/20] tests --- .../sdks/web-component/src/lib/constants/customScreens.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 packages/sdks/web-component/src/lib/constants/customScreens.ts diff --git a/packages/sdks/web-component/src/lib/constants/customScreens.ts b/packages/sdks/web-component/src/lib/constants/customScreens.ts new file mode 100644 index 000000000..6f31a319e --- /dev/null +++ b/packages/sdks/web-component/src/lib/constants/customScreens.ts @@ -0,0 +1,8 @@ +export const EXCLUDED_STATE_KEYS = [ + 'cssVars', + 'componentsConfig', + 'inputs', + 'errorText', + 'errorType', + 'clientScripts', +]; From af116d0f5a829b865ec772ba8b4cb221401cf2a5 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Sun, 9 Feb 2025 20:19:31 +0200 Subject: [PATCH 10/20] readme --- packages/sdks/web-component/README.md | 75 ++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 13 deletions(-) diff --git a/packages/sdks/web-component/README.md b/packages/sdks/web-component/README.md index f93bd35b2..cceef762b 100644 --- a/packages/sdks/web-component/README.md +++ b/packages/sdks/web-component/README.md @@ -71,22 +71,22 @@ NOTE: This package is a part of a monorepo. so if you make changes in a dependen ## Optional Attributes -| Attribute | Available options | Default value | -| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------- | -| base-url | Custom Descope base URL | **""** | -| theme | **"light"** - Light theme
**"dark"** - Dark theme
**"os"** - Auto select a theme based on the OS theme settings | **"light"** | -| debug | **"true"** - Enable debugger
**"false"** - Disable debugger | **"false"** | -| preview | **"true"** - Run flow in a preview mode
**"false"** - Do run flow in a preview mode | **"false"** | -| auto-focus | **"true"** - Automatically focus on the first input of each screen
**"false"** - Do not automatically focus on screen's inputs
**"skipFirstScreen"** - Automatically focus on the first input of each screen, except first screen | **"true"** | +| Attribute | Available options | Default value | +| ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| base-url | Custom Descope base URL | **""** | +| theme | **"light"** - Light theme
**"dark"** - Dark theme
**"os"** - Auto select a theme based on the OS theme settings | **"light"** | +| debug | **"true"** - Enable debugger
**"false"** - Disable debugger | **"false"** | +| preview | **"true"** - Run flow in a preview mode
**"false"** - Do run flow in a preview mode | **"false"** | +| auto-focus | **"true"** - Automatically focus on the first input of each screen
**"false"** - Do not automatically focus on screen's inputs
**"skipFirstScreen"** - Automatically focus on the first input of each screen, except first screen | **"true"** | -| validate-on-blur | **"true"** - Triggers the input validation upon blur in addition to the validation on submit
**"false"** - Do not triggers validation upon blur
| **"false"** | +| validate-on-blur | **"true"** - Triggers the input validation upon blur in addition to the validation on submit
**"false"** - Do not triggers validation upon blur
| **"false"** | -| restart-on-error | **"true"** - In case of flow version mismatch, will restart the flow if the components version was not changed
**"false"** - Do not restart the flow automatically
| **"false"** | +| restart-on-error | **"true"** - In case of flow version mismatch, will restart the flow if the components version was not changed
**"false"** - Do not restart the flow automatically
| **"false"** | -| storage-prefix | **String** - A prefix to add to the key of the local storage when persisting tokens | **""** | -| store-last-authenticated-user | **"true"** - Stores last-authenticated user details in local storage when flow is completed
**"false"** - Do not store last-auth user details. Disabling this flag may cause last-authenticated user features to not function properly | **"true"** | -| keep-last-authenticated-user-after-logout | **"true"** - Do not clear the last authenticated user details from the browser storage after logout
**"false"** - Clear the last authenticated user details from the browser storage after logout | **"false"** | -| style-id | **"String"** - Set a specific style to load rather then the default style | **""** | +| storage-prefix | **String** - A prefix to add to the key of the local storage when persisting tokens | **""** | +| store-last-authenticated-user | **"true"** - Stores last-authenticated user details in local storage when flow is completed
**"false"** - Do not store last-auth user details. Disabling this flag may cause last-authenticated user features to not function properly | **"true"** | +| keep-last-authenticated-user-after-logout | **"true"** - Do not clear the last authenticated user details from the browser storage after logout
**"false"** - Clear the last authenticated user details from the browser storage after logout | **"false"** | +| style-id | **"String"** - Set a specific style to load rather then the default style | **""** | ## Optional Properties @@ -131,6 +131,55 @@ const descopeWcEle = document.getElementsByTagName('descope-wc')[0]; descopeWcEle.logger = logger; ``` +### `onScreenUpdate` + +A function that is called whenever there is a new screen state or after every next call. It receives the following parameters: + +- `screenName`: The name of the screen that is about to be rendered +- `state`: An object containing the upcoming screen state +- `next`: A function that, when called, continues the flow execution +- `ref`: A reference to the descope-wc node + +The function should return a boolean indicating whether a custom screen should be rendered: + +- `true`: Render a custom screen +- `false`: Render the default flow screen + +This function allows rendering custom screens instead of the default flow screens. +It can be useful for highly customized UIs or specific logic not covered by the default screens + +Usage example: + +```javascript +function onScreenUpdate(screenName, state, next, ref) { + if (screenName === 'My Custom Screen') { + ref.innerHTML = ` +
+ + +
+ `; + + ref.closest('form').addEventListener('submit', (e) => { + e.preventDefault(); + const formData = new FormData(e.target); + const data = Object.fromEntries(formData.entries()); + + // replace with the button interaction id + next('interactionId', data); + }); + + return true; + } + + return false; +} + +const descopeWcEle = document.querySelector('descope-wc'); + +descopeWcEle.onScreenUpdate = onScreenUpdate; +``` + ## Events ### `error` - Fired when an error occurs. The event detail contains the error object. From 547dd3ea0ecbe1937466c8f6dff880be7f0633da Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Sun, 9 Feb 2025 21:22:20 +0200 Subject: [PATCH 11/20] lint --- .../web-component/src/lib/descope-wc/BaseDescopeWc.ts | 2 ++ .../web-component/src/lib/descope-wc/DescopeWc.ts | 11 +++++------ .../sdks/web-component/src/lib/helpers/helpers.ts | 5 ++--- packages/sdks/web-component/src/lib/types.ts | 4 ---- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts index 3209a350e..382bdebd5 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/BaseDescopeWc.ts @@ -108,7 +108,9 @@ class BaseDescopeWc extends BaseClass { nextRequestStatus = new State<{ isLoading: boolean }>({ isLoading: false }); rootElement: HTMLDivElement; + contentRootElement: HTMLDivElement; + slotElement: HTMLSlotElement; #debuggerEle: HTMLElement & { diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index 0821aa7cd..b7e415eeb 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -193,17 +193,20 @@ class DescopeWc extends BaseDescopeWc { }); } - init() { + async init() { // when running in a webview (mobile SDK) we want to lazy init the component // so the mobile SDK will be able to register all the necessary callbacks // before the component will start loading the flow if (!(window as any).isDescopeBridge) { - return this._init(); + // eslint-disable-next-line no-underscore-dangle + this._init(); } else { + // eslint-disable-next-line no-underscore-dangle (this as any).lazyInit = this._init; } } + // eslint-disable-next-line no-underscore-dangle async _init() { if (this.shadowRoot.isConnected) { this.flowState?.subscribe(this.onFlowChange.bind(this)); @@ -1013,8 +1016,6 @@ class DescopeWc extends BaseDescopeWc { // we need the abort controller so we can cancel the current webauthn session in case the user clicked on a webauthn button, and we need to start a new session this.#conditionalUiAbortController = new AbortController(); - const flowConfig = await this.getFlowConfig(); - const projectConfig = await this.getProjectConfig(); // we should not wait for this fn, it will call next when the user uses his passkey on the input this.sdk.webauthn.helpers .conditional(options, this.#conditionalUiAbortController) @@ -1146,8 +1147,6 @@ class DescopeWc extends BaseDescopeWc { `[${ELEMENT_TYPE_ATTRIBUTE}="polling"]`, ); if (loader) { - const flowConfig = await this.getFlowConfig(); - const projectConfig = await this.getProjectConfig(); // Loader component in the screen triggers polling interaction next(CUSTOM_INTERACTIONS.polling, {}); } diff --git a/packages/sdks/web-component/src/lib/helpers/helpers.ts b/packages/sdks/web-component/src/lib/helpers/helpers.ts index d1a11ce92..c1daa19b2 100644 --- a/packages/sdks/web-component/src/lib/helpers/helpers.ts +++ b/packages/sdks/web-component/src/lib/helpers/helpers.ts @@ -656,13 +656,12 @@ export const shouldHandleMarkdown = (compName: string) => const omitBy = >( obj: T, predicate: (value: any, key: keyof T) => boolean, -): T => { - return Object.fromEntries( +): T => + Object.fromEntries( Object.entries(obj).filter( ([key, value]) => !predicate(value, key as keyof T), ), ) as T; -}; export const transformStepStateForCustomScreen = ( state: Partial, diff --git a/packages/sdks/web-component/src/lib/types.ts b/packages/sdks/web-component/src/lib/types.ts index ffcb2bb8f..a07fcc042 100644 --- a/packages/sdks/web-component/src/lib/types.ts +++ b/packages/sdks/web-component/src/lib/types.ts @@ -10,10 +10,6 @@ export type SdkFlowNext = Sdk['flow']['next']; export type ComponentsConfig = Record; export type CssVars = Record; -type OmitFirstArg = F extends (x: any, ...args: infer P) => infer R - ? (...args: P) => R - : never; - type KeepArgsByIndex = F extends ( ...args: infer A ) => infer R From 42c964406b58941a96f5979d6a142633aed2b246 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Sun, 9 Feb 2025 21:46:40 +0200 Subject: [PATCH 12/20] tests --- .../libs/sdk-mixins/src/mixins/configMixin/types.ts | 2 ++ .../sdks/web-component/src/lib/descope-wc/DescopeWc.ts | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/libs/sdk-mixins/src/mixins/configMixin/types.ts b/packages/libs/sdk-mixins/src/mixins/configMixin/types.ts index 3e4f8e90d..9bcb127b2 100644 --- a/packages/libs/sdk-mixins/src/mixins/configMixin/types.ts +++ b/packages/libs/sdk-mixins/src/mixins/configMixin/types.ts @@ -39,11 +39,13 @@ export type ClientCondition = { export type ClientConditionResult = { screenId: string; + screenName: string; interactionId: string; }; export type FlowConfig = { startScreenId?: string; + startScreenName?: string; version: number; targetLocales?: string[]; conditions?: ClientCondition[]; diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index b7e415eeb..389a66961 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -193,17 +193,17 @@ class DescopeWc extends BaseDescopeWc { }); } - async init() { + init() { // when running in a webview (mobile SDK) we want to lazy init the component // so the mobile SDK will be able to register all the necessary callbacks // before the component will start loading the flow if (!(window as any).isDescopeBridge) { // eslint-disable-next-line no-underscore-dangle - this._init(); - } else { - // eslint-disable-next-line no-underscore-dangle - (this as any).lazyInit = this._init; + return this._init(); } + // eslint-disable-next-line no-underscore-dangle + (this as any).lazyInit = this._init; + return undefined; } // eslint-disable-next-line no-underscore-dangle From 280b09d8dc4f5194566319951b747bd3265cc97f Mon Sep 17 00:00:00 2001 From: Gil Shapira Date: Mon, 10 Feb 2025 14:46:45 +0200 Subject: [PATCH 13/20] Update screen-updated object field key --- packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index 389a66961..4147e4de5 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -1047,8 +1047,8 @@ class DescopeWc extends BaseDescopeWc { this.#dispatch('ready', {}); } - this.#dispatch('page-updated', { stepName }); - this.#dispatch('screen-updated', { stepName }); + this.#dispatch('page-updated', { screenName: stepName }); + this.#dispatch('screen-updated', { screenName: stepName }); } async onStepChange(currentState: StepState, prevState: StepState) { From 9f464593271a55773a4ebf714e7d5ba336c7dc67 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Mon, 10 Feb 2025 17:27:33 +0200 Subject: [PATCH 14/20] fix no flow page when onScreenUpdate is not provided --- .../web-component/src/lib/descope-wc/DescopeWc.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index 4147e4de5..4dd2f5389 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -301,11 +301,13 @@ class DescopeWc extends BaseDescopeWc { ...stepStateUpdate, }; - const isCustomScreen: boolean = await this.onScreenUpdate?.( - stepName, - transformStepStateForCustomScreen(state), - next, - this, + const isCustomScreen: boolean = Boolean( + await this.onScreenUpdate?.( + stepName, + transformStepStateForCustomScreen(state), + next, + this, + ), ); if (isCustomScreen) { From 00ba8c87cdeb6a609ad7621edad2514aacc32bca Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Tue, 11 Feb 2025 08:33:51 +0200 Subject: [PATCH 15/20] merge with main --- packages/sdks/nextjs-sdk/package.json | 6 ++-- packages/sdks/nextjs-sdk/rollup.config.mjs | 34 +++++++++++----------- packages/sdks/vue-sdk/src/Descope.vue | 9 ++++-- packages/sdks/vue-sdk/src/UserProfile.vue | 2 +- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/packages/sdks/nextjs-sdk/package.json b/packages/sdks/nextjs-sdk/package.json index ed4248b65..d338b003c 100644 --- a/packages/sdks/nextjs-sdk/package.json +++ b/packages/sdks/nextjs-sdk/package.json @@ -24,14 +24,14 @@ }, "./client": { "import": { - "types": "./dist/types/client/index.d.ts", + "types": "./dist/types/client/index.d.ts", "default": "./dist/esm/client/index.js" }, "require": "./dist/cjs/client/index.js" }, "./server": { "import": { - "types": "./dist/types/server/index.d.ts", + "types": "./dist/types/server/index.d.ts", "default": "./dist/esm/server/index.js" }, "require": "./dist/cjs/server/index.js" @@ -129,7 +129,7 @@ "rollup-plugin-dotenv": "^0.5.0", "rollup-plugin-dts": "^6.1.1", "rollup-plugin-livereload": "^2.0.5", - "rollup-plugin-no-emit": "1.2.1", + "rollup-plugin-no-emit": "1.2.1", "rollup-plugin-preserve-directives": "^0.4.0", "rollup-plugin-serve": "^2.0.3", "rollup-plugin-swc3": "^0.12.0", diff --git a/packages/sdks/nextjs-sdk/rollup.config.mjs b/packages/sdks/nextjs-sdk/rollup.config.mjs index 7529d91c4..707d84419 100644 --- a/packages/sdks/nextjs-sdk/rollup.config.mjs +++ b/packages/sdks/nextjs-sdk/rollup.config.mjs @@ -26,7 +26,7 @@ const commonPlugins = (outputDir) => [ }), typescript({ tsconfig: './tsconfig.json', - declaration: false, + declaration: false }), // swcPreserveDirectives(), preserveDirectives({ supressPreserveModulesWarning: true }), @@ -89,20 +89,20 @@ const configurations = ['server', 'client', ''].flatMap((entry) => { }); export default [ - ...configurations, - { - input: 'src/index.ts', - output: [{ dir: './dist', format: 'esm' }], - plugins: [ - typescript({ - tsconfig: './tsconfig.json', - compilerOptions: { - rootDir: './src', - declaration: true, - declarationDir: './dist/types', - }, - }), - noEmit({ match: (file) => file.endsWith('.js') }), - ], - }, + ...configurations, + { + input: 'src/index.ts', + output: [{ dir: './dist', format: 'esm' }], + plugins: [ + typescript({ + tsconfig: './tsconfig.json', + compilerOptions: { + rootDir: './src', + declaration: true, + declarationDir: './dist/types' + } + }), + noEmit({ match: (file) => file.endsWith('.js') }) + ] + } ]; diff --git a/packages/sdks/vue-sdk/src/Descope.vue b/packages/sdks/vue-sdk/src/Descope.vue index 18dbcb69f..5d8ea77d9 100644 --- a/packages/sdks/vue-sdk/src/Descope.vue +++ b/packages/sdks/vue-sdk/src/Descope.vue @@ -111,8 +111,13 @@ const emit = defineEmits<{ (e: 'error', payload: CustomEvent): void; (e: 'ready', payload: CustomEvent>): void; }>(); -const { projectId, baseUrl, baseStaticUrl, storeLastAuthenticatedUser, baseCdnUrl } = - useOptions(); +const { + projectId, + baseUrl, + baseStaticUrl, + storeLastAuthenticatedUser, + baseCdnUrl, +} = useOptions(); const sdk = useDescope(); const formStr = computed(() => (props.form ? JSON.stringify(props.form) : '')); diff --git a/packages/sdks/vue-sdk/src/UserProfile.vue b/packages/sdks/vue-sdk/src/UserProfile.vue index 7ebc5bf5e..fbd6c52cd 100644 --- a/packages/sdks/vue-sdk/src/UserProfile.vue +++ b/packages/sdks/vue-sdk/src/UserProfile.vue @@ -34,5 +34,5 @@ defineProps({ }, }); -const { projectId, baseUrl, baseStaticUrl, baseCdnUrl} = useOptions(); +const { projectId, baseUrl, baseStaticUrl, baseCdnUrl } = useOptions(); From 1546ce537fe4f855ba6f8a564b86f788243ba1b9 Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Tue, 11 Feb 2025 12:54:11 +0200 Subject: [PATCH 16/20] update readme & sdks --- packages/sdks/angular-sdk/README.md | 31 +++++++++ .../descope/descope.component.spec.ts | 1 + .../components/descope/descope.component.ts | 13 ++++ .../sign-in-flow/sign-in-flow.component.html | 1 + .../sign-in-flow/sign-in-flow.component.ts | 11 ++- .../sign-up-flow/sign-up-flow.component.html | 1 + .../sign-up-flow/sign-up-flow.component.ts | 11 ++- .../sign-up-or-in-flow.component.html | 1 + .../sign-up-or-in-flow.component.ts | 11 ++- packages/sdks/react-sdk/README.md | 69 +++++++++++++++++++ packages/sdks/react-sdk/src/types.ts | 2 +- packages/sdks/vue-sdk/README.md | 33 +++++++++ .../sdks/vue-sdk/example/components/Login.vue | 10 ++- packages/sdks/vue-sdk/src/Descope.vue | 8 ++- packages/sdks/vue-sdk/tests/Descope.test.ts | 12 ++-- packages/sdks/web-component/README.md | 6 +- .../src/lib/descope-wc/DescopeWc.ts | 2 +- 17 files changed, 210 insertions(+), 13 deletions(-) diff --git a/packages/sdks/angular-sdk/README.md b/packages/sdks/angular-sdk/README.md index ff3d1ddf7..dbd76065e 100644 --- a/packages/sdks/angular-sdk/README.md +++ b/packages/sdks/angular-sdk/README.md @@ -203,6 +203,37 @@ export class AppComponent { > ``` +### `onScreenUpdate` + +A function that is called whenever there is a new screen state and after every next call. It receives the following parameters: + +- `screenName`: The name of the screen that is about to be rendered +- `state`: An object containing the upcoming screen state +- `next`: A function that, when called, continues the flow execution +- `ref`: A reference to the descope-wc node + +The function can be sync or async, and should return a boolean indicating whether a custom screen should be rendered: + +- `true`: Render a custom screen +- `false`: Render the default flow screen + +This function allows rendering custom screens instead of the default flow screens. +It can be useful for highly customized UIs or specific logic not covered by the default screens + +To render a custom screen, its elements should be appended as children of the `descope` component + +Usage example: + +```javascript +function onScreenUpdate(screenName, state, next, ref) { + if (screenName === 'My Custom Screen') { + return true; + } + + return false; +} +``` + #### Standalone Mode All components in the sdk are standalone, so you can use them by directly importing them to your components. diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.spec.ts b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.spec.ts index 8ad8743e5..14f5d9556 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.spec.ts +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.spec.ts @@ -62,6 +62,7 @@ describe('DescopeComponent', () => { debug: jest.fn() }; component.errorTransformer = jest.fn(); + component.onScreenUpdate = jest.fn(); component.client = {}; component.form = {}; component.storeLastAuthenticatedUser = true; diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.ts b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.ts index 7baeffa23..2ff19624c 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.ts +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/descope/descope.component.ts @@ -38,6 +38,15 @@ export class DescopeComponent implements OnInit, OnChanges { @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string; + @Input() onScreenUpdate: ( + screenName: string, + state: Record, + next: ( + interactionId: string, + form: Record + ) => Promise, + ref: HTMLElement + ) => boolean | Promise; @Input() client: Record; @Input() form: Record; @Input() logger: ILogger; @@ -155,6 +164,10 @@ export class DescopeComponent implements OnInit, OnChanges { this.webComponent.errorTransformer = this.errorTransformer; } + if (this.onScreenUpdate) { + this.webComponent.onScreenUpdate = this.onScreenUpdate; + } + if (this.client) { this.webComponent.setAttribute('client', JSON.stringify(this.client)); } diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html index d2483e87f..d9de91196 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.html @@ -12,6 +12,7 @@ [restartOnError]="restartOnError" [debug]="debug" [errorTransformer]="errorTransformer" + [onScreenUpdate]="onScreenUpdate" [client]="client" [form]="form" [logger]="logger" diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts index ff5eb3f81..d2bd500a1 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-in-flow/sign-in-flow.component.ts @@ -20,9 +20,18 @@ export class SignInFlowComponent { @Input() autoFocus: true | false | 'skipFirstScreen'; @Input() validateOnBlur: boolean; @Input() restartOnError: boolean; - + @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string; + @Input() onScreenUpdate: ( + screenName: string, + state: Record, + next: ( + interactionId: string, + form: Record + ) => Promise, + ref: HTMLElement + ) => boolean | Promise; @Input() client: Record; @Input() form: Record; @Input() logger: ILogger; diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html index 31eaeb775..031235ee1 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.html @@ -12,6 +12,7 @@ [restartOnError]="restartOnError" [debug]="debug" [errorTransformer]="errorTransformer" + [onScreenUpdate]="onScreenUpdate" [client]="client" [form]="form" [logger]="logger" diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts index 0dff55933..8a1c4925f 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-flow/sign-up-flow.component.ts @@ -20,9 +20,18 @@ export class SignUpFlowComponent { @Input() autoFocus: true | false | 'skipFirstScreen'; @Input() validateOnBlur: boolean; @Input() restartOnError: boolean; - + @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string; + @Input() onScreenUpdate: ( + screenName: string, + state: Record, + next: ( + interactionId: string, + form: Record + ) => Promise, + ref: HTMLElement + ) => boolean | Promise; @Input() client: Record; @Input() form: Record; @Input() logger: ILogger; diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html index 14dc176e1..f34f713a5 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.html @@ -12,6 +12,7 @@ [restartOnError]="restartOnError" [debug]="debug" [errorTransformer]="errorTransformer" + [onScreenUpdate]="onScreenUpdate" [client]="client" [form]="form" [logger]="logger" diff --git a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts index a15624a48..ec5b49c75 100644 --- a/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts +++ b/packages/sdks/angular-sdk/projects/angular-sdk/src/lib/components/sign-up-or-in-flow/sign-up-or-in-flow.component.ts @@ -20,9 +20,18 @@ export class SignUpOrInFlowComponent { @Input() autoFocus: true | false | 'skipFirstScreen'; @Input() validateOnBlur: boolean; @Input() restartOnError: boolean; - + @Input() debug: boolean; @Input() errorTransformer: (error: { text: string; type: string }) => string; + @Input() onScreenUpdate: ( + screenName: string, + state: Record, + next: ( + interactionId: string, + form: Record + ) => Promise, + ref: HTMLElement + ) => boolean | Promise; @Input() client: Record; @Input() form: Record; @Input() logger: ILogger; diff --git a/packages/sdks/react-sdk/README.md b/packages/sdks/react-sdk/README.md index dc4365e9d..80af2d358 100644 --- a/packages/sdks/react-sdk/README.md +++ b/packages/sdks/react-sdk/README.md @@ -166,6 +166,75 @@ const App = () => { } ``` +### `onScreenUpdate` + +A function that is called whenever there is a new screen state and after every next call. It receives the following parameters: + +- `screenName`: The name of the screen that is about to be rendered +- `state`: An object containing the upcoming screen state +- `next`: A function that, when called, continues the flow execution +- `ref`: A reference to the descope-wc node + +The function can be sync or async, and should return a boolean indicating whether a custom screen should be rendered: + +- `true`: Render a custom screen +- `false`: Render the default flow screen + +This function allows rendering custom screens instead of the default flow screens. +It can be useful for highly customized UIs or specific logic not covered by the default screens + +To render a custom screen, its elements should be appended as children of the `Descope` component + +Usage example: + +```javascript +const CustomScreen = ({onClick, setForm}) => { + const onChange = (e) => setForm({ email: e.target.value }) + + return ( + <> + + + +)} + +const Login = () => { + const [state, setState] = useState(); + const [form, setForm] = useState(); + + const onScreenUpdate = (screenName, state, next) => { + setState({screenName, state, next}) + + if (screenName === 'My Custom Screen') { + return true; + } + + return false; + }; + + return {state.screenName === 'My Custom Screen' && { + // replace with the button interaction id + next('interactionId', form) + }} + setForm={setForm}/>} + +} + +``` + ### Use the `useDescope`, `useSession` and `useUser` hooks in your components in order to get authentication state, user details and utilities This can be helpful to implement application-specific logic. Examples: diff --git a/packages/sdks/react-sdk/src/types.ts b/packages/sdks/react-sdk/src/types.ts index 3bea03b10..23ade2de2 100644 --- a/packages/sdks/react-sdk/src/types.ts +++ b/packages/sdks/react-sdk/src/types.ts @@ -136,7 +136,7 @@ export type DescopeProps = { form: Record, ) => Promise, ref: HTMLElement, - ) => boolean; + ) => boolean | Promise; children?: React.ReactNode; }; diff --git a/packages/sdks/vue-sdk/README.md b/packages/sdks/vue-sdk/README.md index 4c6fc2740..cf56ba9c7 100644 --- a/packages/sdks/vue-sdk/README.md +++ b/packages/sdks/vue-sdk/README.md @@ -87,6 +87,39 @@ const handleReady = () => { ``` + +### `onScreenUpdate` + +A function that is called whenever there is a new screen state and after every next call. It receives the following parameters: + +- `screenName`: The name of the screen that is about to be rendered +- `state`: An object containing the upcoming screen state +- `next`: A function that, when called, continues the flow execution +- `ref`: A reference to the descope-wc node + +The function can be sync or async, and should return a boolean indicating whether a custom screen should be rendered: + +- `true`: Render a custom screen +- `false`: Render the default flow screen + +This function allows rendering custom screens instead of the default flow screens. +It can be useful for highly customized UIs or specific logic not covered by the default screens + +To render a custom screen, its elements should be appended as children of the `Descope` component + +Usage example: + +```javascript +function onScreenUpdate(screenName, state, next) { + if (screenName === 'My Custom Screen') { + return true; + } + + return false; +} +``` + + ### Use the `useDescope`, `useSession` and `useUser` functions in your components in order to get authentication state, user details and utilities This can be helpful to implement application-specific logic. Examples: diff --git a/packages/sdks/vue-sdk/example/components/Login.vue b/packages/sdks/vue-sdk/example/components/Login.vue index a9023a144..4c58131e8 100644 --- a/packages/sdks/vue-sdk/example/components/Login.vue +++ b/packages/sdks/vue-sdk/example/components/Login.vue @@ -11,9 +11,11 @@ @error="handleError" @ready="handleReady" :errorTransformer="errorTransformer" + :onScreenUpdate="onScreenUpdate" :form="form" :client="client" - /> + > + @@ -44,6 +46,12 @@ const errorTransformer = (error) => { return translationMap[error.type] || error.text; }; +const onScreenUpdate = (screenName, state, next) => { + console.log('Screen update', screenName, state, next); + + return false; +}; + const { isLoading, isAuthenticated } = useSession(); const flowId = process.env.VUE_APP_DESCOPE_FLOW_ID || 'sign-up-or-in'; const form = {}; // { email: 'myemail@domain.com' }; // found in context key: form.email diff --git a/packages/sdks/vue-sdk/src/Descope.vue b/packages/sdks/vue-sdk/src/Descope.vue index 5d8ea77d9..1304c9942 100644 --- a/packages/sdks/vue-sdk/src/Descope.vue +++ b/packages/sdks/vue-sdk/src/Descope.vue @@ -19,12 +19,15 @@ :restart-on-error="restartOnError" :store-last-authenticated-user="storeLastAuthenticatedUser" :errorTransformer.prop="errorTransformer" + :onScreenUpdate.prop="onScreenUpdate" :form.attr="formStr" :client.attr="clientStr" @success="onSuccess" @error="onError" @ready="onReady" - /> + > + +
@@ -95,6 +98,9 @@ const props = defineProps({ errorTransformer: { type: Function, }, + onScreenUpdate: { + type: Function, + }, form: { type: Object, }, diff --git a/packages/sdks/vue-sdk/tests/Descope.test.ts b/packages/sdks/vue-sdk/tests/Descope.test.ts index 153824011..86822fb57 100644 --- a/packages/sdks/vue-sdk/tests/Descope.test.ts +++ b/packages/sdks/vue-sdk/tests/Descope.test.ts @@ -23,6 +23,7 @@ describe('Descope.vue', () => { const errorTransformer = (error: { text: string; type: string }) => { return error.text || error.type; }; + const onScreenUpdate = () => false; const wrapper = mount(Descope, { props: { flowId: 'test-flow-id', @@ -34,6 +35,7 @@ describe('Descope.vue', () => { redirectUrl: 'test-redirect-url', autoFocus: true, errorTransformer, + onScreenUpdate, form: { test: 'a' }, client: { test: 'b' }, styleId: 'test-style-id', @@ -53,6 +55,7 @@ describe('Descope.vue', () => { expect(descopeWc.attributes('redirect-url')).toBe('test-redirect-url'); expect(descopeWc.attributes('auto-focus')).toBe('true'); expect(wrapper.vm.errorTransformer).toBe(errorTransformer); + expect(wrapper.vm.onScreenUpdate).toBe(onScreenUpdate); expect(descopeWc.attributes('form')).toBe('{"test":"a"}'); expect(wrapper.vm.client).toStrictEqual({ test: 'b' }); expect(descopeWc.attributes('style-id')).toBe('test-style-id'); @@ -61,14 +64,15 @@ describe('Descope.vue', () => { it('renders a DescopeWc component with empty props', () => { const wrapper = mount(Descope, { props: { - form: null, - client: null, + flowId: 'test-flow-id', + form: {}, + client: {}, }, }); const descopeWc = wrapper.find('descope-wc'); - expect(descopeWc.attributes('form')).toBe(''); - expect(wrapper.vm.client).toBeNull(); + expect(descopeWc.attributes('form')).toEqual('{}'); + expect(wrapper.vm.client).toEqual({}); }); it('init sdk config', async () => { diff --git a/packages/sdks/web-component/README.md b/packages/sdks/web-component/README.md index cceef762b..ac73709ef 100644 --- a/packages/sdks/web-component/README.md +++ b/packages/sdks/web-component/README.md @@ -133,14 +133,14 @@ descopeWcEle.logger = logger; ### `onScreenUpdate` -A function that is called whenever there is a new screen state or after every next call. It receives the following parameters: +A function that is called whenever there is a new screen state and after every next call. It receives the following parameters: - `screenName`: The name of the screen that is about to be rendered - `state`: An object containing the upcoming screen state - `next`: A function that, when called, continues the flow execution - `ref`: A reference to the descope-wc node -The function should return a boolean indicating whether a custom screen should be rendered: +The function can be sync or async, and should return a boolean indicating whether a custom screen should be rendered: - `true`: Render a custom screen - `false`: Render the default flow screen @@ -148,6 +148,8 @@ The function should return a boolean indicating whether a custom screen should b This function allows rendering custom screens instead of the default flow screens. It can be useful for highly customized UIs or specific logic not covered by the default screens +To render a custom screen, its elements should be appended as children of the `descope-wc` component + Usage example: ```javascript diff --git a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts index 4dd2f5389..3a3660b32 100644 --- a/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts +++ b/packages/sdks/web-component/src/lib/descope-wc/DescopeWc.ts @@ -86,7 +86,7 @@ class DescopeWc extends BaseDescopeWc { screenState: CustomScreenState, next: StepState['next'], ref: typeof this, - ) => Promise; + ) => boolean | Promise; constructor() { const flowState = new State({ From e8d775e9cb24904c6667c2ace6c74ce0871d932c Mon Sep 17 00:00:00 2001 From: Nir Gur Arie Date: Tue, 11 Feb 2025 12:54:42 +0200 Subject: [PATCH 17/20] update readme & sdks --- packages/sdks/react-sdk/README.md | 10 +++++----- packages/sdks/vue-sdk/README.md | 2 -- packages/sdks/vue-sdk/src/Descope.vue | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/sdks/react-sdk/README.md b/packages/sdks/react-sdk/README.md index 80af2d358..d280b29bf 100644 --- a/packages/sdks/react-sdk/README.md +++ b/packages/sdks/react-sdk/README.md @@ -193,9 +193,9 @@ const CustomScreen = ({onClick, setForm}) => { return ( <> -