-
+
{showSkeleton &&
}
![]()
Date: Mon, 26 Jan 2026 16:16:23 +0600
Subject: [PATCH 11/29] fix(construct): fixed sonarqube issue
---
src/components/core/org-switcher/org-switcher.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/core/org-switcher/org-switcher.tsx b/src/components/core/org-switcher/org-switcher.tsx
index 7ba2edad..de880ea5 100644
--- a/src/components/core/org-switcher/org-switcher.tsx
+++ b/src/components/core/org-switcher/org-switcher.tsx
@@ -29,7 +29,7 @@ export const OrgSwitcher = () => {
const currentOrgId = useMemo(() => {
if (!accessToken) return null;
const decoded = decodeJWT(accessToken);
- return decoded?.org_id || null;
+ return decoded?.org_id ?? null;
}, [accessToken]);
const { data, isLoading } = useGetAccount();
@@ -72,7 +72,7 @@ export const OrgSwitcher = () => {
setTokens({
accessToken: response.access_token,
- refreshToken: response.refresh_token || useAuthStore.getState().refreshToken || '',
+ refreshToken: (response.refresh_token || useAuthStore.getState().refreshToken) ?? '',
});
localStorage.setItem('selected-org-id', orgId);
From 24c045e9f4b92a14f4e6ca9021c03fb82c33070a Mon Sep 17 00:00:00 2001
From: Sangay Thinley <59992112+sangayt1997@users.noreply.github.com>
Date: Tue, 27 Jan 2026 19:05:44 +0600
Subject: [PATCH 12/29] fix(construct): fixed the inappropriate toast message
for forbidden 403 api called
---
src/hooks/use-error-handler.ts | 70 +++++++++++++++++++-----
src/lib/https.ts | 21 ++++++-
src/modules/profile/hooks/use-account.ts | 7 +++
src/state/store/auth/guard.tsx | 18 +++++-
4 files changed, 99 insertions(+), 17 deletions(-)
diff --git a/src/hooks/use-error-handler.ts b/src/hooks/use-error-handler.ts
index 1bbb5a8c..727b6af4 100644
--- a/src/hooks/use-error-handler.ts
+++ b/src/hooks/use-error-handler.ts
@@ -79,22 +79,51 @@ export const useErrorHandler = (defaultOptions: ErrorHandlerOptions = {}) => {
const handleErrorObject = (err: any): ErrorResponse => {
const errorDescriptionResult = handleErrorDescription(err);
- if (errorDescriptionResult) return errorDescriptionResult;
+ if (errorDescriptionResult) {
+ return {
+ ...errorDescriptionResult,
+ status: err.response?.status ?? err.status,
+ };
+ }
const responseDataResult = handleResponseData(err.response?.data);
- if (responseDataResult) return responseDataResult;
+ if (responseDataResult) {
+ return {
+ ...responseDataResult,
+ status: err.response?.status ?? err.status,
+ };
+ }
return {
error: err.error,
error_description: err.error_description,
message: err.message || t('UNKNOWN_ERROR_OCCURRED'),
+ status: err.response?.status ?? err.status,
};
};
const normalizeError = (error: unknown): ErrorResponse => {
if (error instanceof Error) {
const parsed = parseJsonError(error.message);
- return parsed || { message: error.message };
+ const errorObj = error as any;
+ // Check for status in multiple locations: direct property, response.status, or status property
+ const status = errorObj.status ?? errorObj.response?.status;
+
+ // If error has an 'error' property (like HttpError), merge it
+ if (errorObj.error) {
+ // HttpError stores the full error response in the error property
+ // Extract error_description if it exists in the error object
+ const errorResponse = errorObj.error;
+ return {
+ ...(parsed || {}),
+ error: errorResponse.error ?? errorResponse,
+ error_description: errorResponse.error_description,
+ message: errorResponse.error_description || error.message,
+ status,
+ };
+ }
+
+ return parsed ? { ...parsed, status } : { message: error.message, status };
}
if (typeof error === 'string') {
@@ -158,25 +187,40 @@ export const useErrorHandler = (defaultOptions: ErrorHandlerOptions = {}) => {
...options,
};
+ const errorDetails = normalizeError(error);
+
+ // Handle 403 Forbidden errors specifically
+ if (errorDetails.status === 403) {
+ toast({
+ title: t('FORBIDDEN'),
+ description: t('YOU_ARE_NOT_ALLOWED_PERFORM_ACTION'),
+ duration,
+ variant,
+ });
+ return t('YOU_ARE_NOT_ALLOWED_PERFORM_ACTION');
+ }
+
const finalTitle = translate ? t(title) : title;
let finalMessage: string;
if (typeof error === 'string' && translate) {
finalMessage = t(error);
} else {
- const errorDetails = normalizeError(error);
const isBackendError = errorDetails.error_description ?? errorDetails.error;
- finalMessage = translate
- ? t(getErrorMessage(errorDetails, messageMap))
- : getErrorMessage(errorDetails, messageMap);
+ const errorMessage = getErrorMessage(errorDetails, messageMap);
+
+ // Don't translate error_description as it's already human-readable from backend
+ // Only translate if it's a translation key (uppercase with underscores)
+ const isTranslationKey = /^[A-Z_]+$/.test(errorMessage);
+ finalMessage = translate && isTranslationKey ? t(errorMessage) : errorMessage;
if (isBackendError) {
- const errorString =
- errorDetails.message ??
- (typeof errorDetails.error === 'string'
- ? errorDetails.error
- : errorDetails.error?.message);
- const isAuthError = ['invalid_request'].includes(errorString ?? '');
+ // Check the error code field for authentication errors
+ const errorCode =
+ typeof errorDetails.error === 'string' ? errorDetails.error : errorDetails.error?.error;
+ const isAuthError = ['invalid_request', 'invalid_username_password'].includes(
+ errorCode ?? ''
+ );
toast({
title: isAuthError ? t('INVALID_CREDENTIALS') : t('SOMETHING_WENT_WRONG'),
diff --git a/src/lib/https.ts b/src/lib/https.ts
index d96c8286..86c7b933 100644
--- a/src/lib/https.ts
+++ b/src/lib/https.ts
@@ -130,10 +130,29 @@ export const clients: Https = {
}
if (response.status === 401) {
+ // Parse error response first to check if it's a login error
+ let err;
+ try {
+ err = await response.json();
+ } catch {
+ err = { error: response.statusText || 'Unauthorized' };
+ }
+
+ // If error has error_description, it's likely a login error, throw it directly
+ if (err.error_description) {
+ throw new HttpError(response.status, err);
+ }
+
+ // Otherwise, try to refresh token
return this.handleAuthError
(url, method, headers, body);
}
- const err = await response.json();
+ let err;
+ try {
+ err = await response.json();
+ } catch {
+ err = { error: response.statusText || 'Request failed' };
+ }
throw new HttpError(response.status, err);
} catch (error) {
if (error instanceof HttpError) {
diff --git a/src/modules/profile/hooks/use-account.ts b/src/modules/profile/hooks/use-account.ts
index cefd9f55..639d645a 100644
--- a/src/modules/profile/hooks/use-account.ts
+++ b/src/modules/profile/hooks/use-account.ts
@@ -20,6 +20,13 @@ export const useGetAccount = () => {
return useQuery({
queryKey: ['getAccount'],
queryFn: getAccount,
+ retry: (failureCount, error: any) => {
+ if (error?.response?.status === 403) {
+ return false;
+ }
+ return failureCount < 3;
+ },
+ throwOnError: false,
});
};
diff --git a/src/state/store/auth/guard.tsx b/src/state/store/auth/guard.tsx
index d91a32f5..029d36bf 100644
--- a/src/state/store/auth/guard.tsx
+++ b/src/state/store/auth/guard.tsx
@@ -1,15 +1,27 @@
import { useGetAccount } from '@/modules/profile/hooks/use-account';
import { useAuthStore } from '.';
-import { useEffect } from 'react';
+import { useEffect, useRef } from 'react';
+import { useErrorHandler } from '@/hooks/use-error-handler';
export const Guard = ({ children }: { children: React.ReactNode }) => {
- const { data, isSuccess } = useGetAccount();
+ const { data, isSuccess, error } = useGetAccount();
const { setUser, isAuthenticated } = useAuthStore();
+ const { handleError } = useErrorHandler();
+ const lastErrorRef = useRef(null);
+
useEffect(() => {
if (!isAuthenticated) return;
+
+ if (error && error !== lastErrorRef.current) {
+ lastErrorRef.current = error;
+ handleError(error);
+ return;
+ }
+
if (!isSuccess) return;
setUser(data || null);
- }, [data, isAuthenticated, isSuccess, setUser]);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [data, isAuthenticated, isSuccess, error, setUser]);
return <>{children}>;
};
From 46de9134e57381eb72a93ff3f4f0ebdfd184f3ff Mon Sep 17 00:00:00 2001
From: Sangay Thinley <59992112+sangayt1997@users.noreply.github.com>
Date: Wed, 28 Jan 2026 13:41:46 +0600
Subject: [PATCH 13/29] fix(construct): fixed the roles issue in the
updateAccount due to reponse changed
---
.../edit-iam-profile-details.tsx | 12 ++++++++++--
.../components/modals/edit-profile/edit-profile.tsx | 1 +
src/modules/profile/components/utils/index.utils.ts | 8 ++++++++
src/modules/profile/services/accounts.service.ts | 6 +-----
src/state/query-client/hooks.tsx | 4 ++++
5 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx b/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx
index e99ac426..6376124a 100644
--- a/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx
+++ b/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx
@@ -261,18 +261,26 @@ export function EditIamProfileDetails({ userInfo, onClose }: Readonly {
const { firstName, lastName } = parseFullName(data.fullName);
+ // Get organizationId from existing user memberships
+ const organizationId = userInfo?.memberships?.[0]?.organizationId || '';
+
const payload = {
itemId: data.itemId,
firstName,
lastName,
email: data.email,
phoneNumber: data.phoneNumber,
- roles: data.roles,
+ memberships: [
+ {
+ organizationId,
+ roles: data.roles,
+ },
+ ],
};
updateAccount(payload);
},
- [updateAccount]
+ [updateAccount, userInfo]
);
const handlePhoneChange = useCallback(
diff --git a/src/modules/profile/components/modals/edit-profile/edit-profile.tsx b/src/modules/profile/components/modals/edit-profile/edit-profile.tsx
index 3a43a08d..8eb75a03 100644
--- a/src/modules/profile/components/modals/edit-profile/edit-profile.tsx
+++ b/src/modules/profile/components/modals/edit-profile/edit-profile.tsx
@@ -196,6 +196,7 @@ export function EditProfile({ userInfo, onClose }: Readonly) {
email: data.email,
phoneNumber: data.phoneNumber,
profileImageUrl,
+ memberships: userInfo.memberships || [],
};
updateAccount(payload);
diff --git a/src/modules/profile/components/utils/index.utils.ts b/src/modules/profile/components/utils/index.utils.ts
index e30ca1c3..00334c28 100644
--- a/src/modules/profile/components/utils/index.utils.ts
+++ b/src/modules/profile/components/utils/index.utils.ts
@@ -11,6 +11,14 @@ export const getValidationSchemas = (t: (key: string) => string) => ({
firstName: z.string().min(1, { message: t('FIRST_NAME_CANT_EMPTY') }),
lastName: z.string().min(1, { message: t('LAST_NAME_CANT_EMPTY') }),
// email: z.string().email(),
+ memberships: z
+ .array(
+ z.object({
+ organizationId: z.string(),
+ roles: z.array(z.string()),
+ })
+ )
+ .optional(),
}),
changePasswordFormValidationSchema: z.object({
diff --git a/src/modules/profile/services/accounts.service.ts b/src/modules/profile/services/accounts.service.ts
index 8d0ac353..9570e321 100644
--- a/src/modules/profile/services/accounts.service.ts
+++ b/src/modules/profile/services/accounts.service.ts
@@ -14,11 +14,7 @@ export const getAccount = async (): Promise => {
};
export const updateAccount = (data: ProfileFormType) => {
- return clients.post<{
- itemId: string;
- errors: unknown;
- isSuccess: boolean;
- }>('/idp/v1/Iam/UpdateAccount', JSON.stringify(data));
+ return clients.post('/idp/v1/Iam/UpdateAccount', JSON.stringify(data));
};
export const createAccount = (data: CreateUserFormType) => {
diff --git a/src/state/query-client/hooks.tsx b/src/state/query-client/hooks.tsx
index 5a55effe..012005ba 100644
--- a/src/state/query-client/hooks.tsx
+++ b/src/state/query-client/hooks.tsx
@@ -16,6 +16,9 @@ const processApiError = (err: any): ErrorResponse => {
// Extract errors object from backend response (e.g., {"isSuccess":false,"errors":{"Password":"..."}})
const backendErrors = err.error?.errors || err.response?.data?.errors;
+ // Extract status code from multiple possible locations
+ const status = err.status || err.response?.status || err.error?.status;
+
const errorInfo = {
error: err.error?.error || err.response?.data?.error || 'UNKNOWN_ERROR',
message: err.error?.message || err.response?.data?.message,
@@ -29,6 +32,7 @@ const processApiError = (err: any): ErrorResponse => {
err.error?.message ||
err.message ||
err.response?.data?.error_description,
+ status,
};
if (errorInfo.error === 'invalid_refresh_token') {
From 29d8b47a576fb11a7ab7c79a2f7ea365cc054ab7 Mon Sep 17 00:00:00 2001
From: Sangay Thinley <59992112+sangayt1997@users.noreply.github.com>
Date: Wed, 28 Jan 2026 15:34:59 +0600
Subject: [PATCH 14/29] fix(construct): fixed the account activation toast with
proper message
---
src/hooks/use-error-handler.ts | 15 +++++++++++++++
src/modules/auth/hooks/use-auth.tsx | 5 ++++-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/src/hooks/use-error-handler.ts b/src/hooks/use-error-handler.ts
index 727b6af4..dbd7bb18 100644
--- a/src/hooks/use-error-handler.ts
+++ b/src/hooks/use-error-handler.ts
@@ -200,6 +200,21 @@ export const useErrorHandler = (defaultOptions: ErrorHandlerOptions = {}) => {
return t('YOU_ARE_NOT_ALLOWED_PERFORM_ACTION');
}
+ // Handle expired activation code errors (400 with Code field in errors)
+ if (errorDetails.status === 400 && errorDetails.error?.details?.Code) {
+ const codeErrorMessage = Array.isArray(errorDetails.error.details.Code)
+ ? errorDetails.error.details.Code[0]
+ : errorDetails.error.details.Code;
+
+ toast({
+ title: t('ACTIVATION_EXPIRED'),
+ description: codeErrorMessage,
+ duration,
+ variant,
+ });
+ return codeErrorMessage;
+ }
+
const finalTitle = translate ? t(title) : title;
let finalMessage: string;
diff --git a/src/modules/auth/hooks/use-auth.tsx b/src/modules/auth/hooks/use-auth.tsx
index 7ceee1a0..0ae67370 100644
--- a/src/modules/auth/hooks/use-auth.tsx
+++ b/src/modules/auth/hooks/use-auth.tsx
@@ -81,9 +81,12 @@ export const useSignoutMutation = () => {
};
export const useAccountActivation = () => {
- return useMutation({
+ return useGlobalMutation({
mutationKey: ['accountActivation'],
mutationFn: accountActivation,
+ onError: (error) => {
+ throw error;
+ },
});
};
From 9b95ac424c7929bf4b491b02d319be8a674f7092 Mon Sep 17 00:00:00 2001
From: Sangay Thinley <59992112+sangayt1997@users.noreply.github.com>
Date: Mon, 2 Feb 2026 17:03:15 +0600
Subject: [PATCH 15/29] fix(construct): fixed aurthorized roles and permission
---
.../edit-iam-profile-details/edit-iam-profile-details.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx b/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx
index cb87556e..90cd55f2 100644
--- a/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx
+++ b/src/modules/profile/components/modals/edit-iam-profile-details/edit-iam-profile-details.tsx
@@ -260,7 +260,7 @@ export function EditIamProfileDetails({ userInfo, onClose }: Readonly
Date: Mon, 2 Feb 2026 21:55:10 +0600
Subject: [PATCH 16/29] fix(construct): fixed filtering the organization based
on user's membership
---
src/components/core/org-switcher/org-switcher.tsx | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/components/core/org-switcher/org-switcher.tsx b/src/components/core/org-switcher/org-switcher.tsx
index de880ea5..34592ef5 100644
--- a/src/components/core/org-switcher/org-switcher.tsx
+++ b/src/components/core/org-switcher/org-switcher.tsx
@@ -42,9 +42,15 @@ export const OrgSwitcher = () => {
const organizations = orgsData?.organizations ?? [];
const enabledOrganizations = organizations.filter((org) => org.isEnable);
+ const userOrganizations = useMemo(() => {
+ if (!data?.memberships?.length) return enabledOrganizations;
+ const membershipOrgIds = data.memberships.map((m) => m.organizationId);
+ return enabledOrganizations.filter((org) => membershipOrgIds.includes(org.itemId));
+ }, [data, enabledOrganizations]);
+
const selectedOrg = currentOrgId
- ? enabledOrganizations.find((org) => org.itemId === currentOrgId)
- : enabledOrganizations[0];
+ ? userOrganizations.find((org) => org.itemId === currentOrgId)
+ : userOrganizations[0];
const currentOrgRoles = useMemo(() => {
if (!data?.memberships?.length || !currentOrgId) return [];
@@ -150,8 +156,8 @@ export const OrgSwitcher = () => {
side="top"
sideOffset={10}
>
- {enabledOrganizations.length > 0 ? (
- enabledOrganizations.map((org) => (
+ {userOrganizations.length > 0 ? (
+ userOrganizations.map((org) => (
handleOrgSelect(org.itemId)}>
{org.name}
From e415c5f6e7e21d51b5b07ffe833967fe40cbc492 Mon Sep 17 00:00:00 2001
From: afiapreety
Date: Thu, 5 Feb 2026 16:08:43 +0600
Subject: [PATCH 17/29] fix: /oidc
---
.env.dev | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.env.dev b/.env.dev
index 86af6a8c..0d49aea7 100644
--- a/.env.dev
+++ b/.env.dev
@@ -6,7 +6,7 @@ VITE_CAPTCHA_TYPE=reCaptcha
VITE_PROJECT_SLUG = ddoxpd
VITE_BLOCKS_OIDC_CLIENT_ID = d45f37a6-7f4a-4f38-9a13-06d74531d7ef
-VITE_BLOCKS_OIDC_REDIRECT_URI = https://dev-construct.seliseblocks.com/login
+VITE_BLOCKS_OIDC_REDIRECT_URI = https://dev-construct.seliseblocks.com/oidc
# Build configuration
GENERATE_SOURCEMAP=false
From 13b30d316baa72d619275a9b666c1843c49022cf Mon Sep 17 00:00:00 2001
From: afiapreety
Date: Thu, 5 Feb 2026 18:39:31 +0600
Subject: [PATCH 18/29] feat: oidc for stg construct
---
.env.stg | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.env.stg b/.env.stg
index c36f2dda..beb9edfe 100644
--- a/.env.stg
+++ b/.env.stg
@@ -4,6 +4,7 @@ VITE_X_BLOCKS_KEY = eb87bd227c3d45a196de6956ecb93cd0
VITE_CAPTCHA_SITE_KEY=6LckI90qAAAAAK8RP2t0Nohwii1CeKOETsXPVNQA
VITE_CAPTCHA_TYPE=reCaptcha
VITE_PROJECT_SLUG = dboxup
-
+VITE_BLOCKS_OIDC_CLIENT_ID = 019dd8a4-ce76-4159-b275-2de5ebe16729
+VITE_BLOCKS_OIDC_REDIRECT_URI = https://stg-construct.seliseblocks.com/oidc
# Build configuration
GENERATE_SOURCEMAP=false
From c15cd0e08689ea7fc48da6645870d35ed93a3a3c Mon Sep 17 00:00:00 2001
From: Sangay Thinley <59992112+sangayt1997@users.noreply.github.com>
Date: Thu, 5 Feb 2026 19:33:13 +0600
Subject: [PATCH 19/29] fix(construct): fixed sonarQube issue on time
complexity in logics
---
src/components/core/org-switcher/org-switcher.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/core/org-switcher/org-switcher.tsx b/src/components/core/org-switcher/org-switcher.tsx
index 34592ef5..5d073da9 100644
--- a/src/components/core/org-switcher/org-switcher.tsx
+++ b/src/components/core/org-switcher/org-switcher.tsx
@@ -44,8 +44,8 @@ export const OrgSwitcher = () => {
const userOrganizations = useMemo(() => {
if (!data?.memberships?.length) return enabledOrganizations;
- const membershipOrgIds = data.memberships.map((m) => m.organizationId);
- return enabledOrganizations.filter((org) => membershipOrgIds.includes(org.itemId));
+ const membershipOrgIds = new Set(data.memberships.map((m) => m.organizationId));
+ return enabledOrganizations.filter((org) => membershipOrgIds.has(org.itemId));
}, [data, enabledOrganizations]);
const selectedOrg = currentOrgId
From 772b9bf1bb4cd7721c7097523e4b26cf606b971e Mon Sep 17 00:00:00 2001
From: sojeebakhtar <155369921+sojeebakhtar@users.noreply.github.com>
Date: Thu, 5 Feb 2026 19:47:57 +0600
Subject: [PATCH 20/29] Disable SonarQube Quality Gate check step
Comment out SonarQube Quality Gate check step in workflow.
---
.github/workflows/2_sonar.yml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/2_sonar.yml b/.github/workflows/2_sonar.yml
index bb26dfd8..5772038f 100644
--- a/.github/workflows/2_sonar.yml
+++ b/.github/workflows/2_sonar.yml
@@ -87,10 +87,10 @@ jobs:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ env.SONARQUBE_HOST }}
- - name: SonarQube Quality Gate check
- uses: sonarsource/sonarqube-quality-gate-action@v1.2.0
- # Force to fail step after specific time.
- timeout-minutes: 5
- env:
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- SONAR_HOST_URL: ${{ env.SONARQUBE_HOST }}
+ # - name: SonarQube Quality Gate check
+ # uses: sonarsource/sonarqube-quality-gate-action@v1.2.0
+ # # Force to fail step after specific time.
+ # timeout-minutes: 5
+ # env:
+ # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ # SONAR_HOST_URL: ${{ env.SONARQUBE_HOST }}
From 8d6696667fdce7e76973e18be2e7383ac253c13f Mon Sep 17 00:00:00 2001
From: afiapreety
Date: Sun, 8 Feb 2026 13:55:03 +0600
Subject: [PATCH 21/29] fix: removed login with blocks button
---
src/modules/auth/components/signin/signin.tsx | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/modules/auth/components/signin/signin.tsx b/src/modules/auth/components/signin/signin.tsx
index 86188e1d..773b7bb7 100644
--- a/src/modules/auth/components/signin/signin.tsx
+++ b/src/modules/auth/components/signin/signin.tsx
@@ -8,7 +8,6 @@ import darklogo from '@/assets/images/construct_logo_dark.svg';
import lightlogo from '@/assets/images/construct_logo_light.svg';
import { Link } from 'react-router-dom';
import { useGetLoginOptions } from '../../hooks/use-auth';
-import { SigninOidc } from '../signin-oidc';
export const Signin = () => {
const { data: loginOption } = useGetLoginOptions();
@@ -58,7 +57,6 @@ export const Signin = () => {
{passwordGrantAllowed && }
{isDivider && }
{socialGrantAllowed && loginOption && }
- {oidcGrantAllowed && loginOption && }
);
From ecb4efed1d783ac81cbebd1e98143de98c1d1a4c Mon Sep 17 00:00:00 2001
From: Sangay Thinley <59992112+sangayt1997@users.noreply.github.com>
Date: Wed, 11 Feb 2026 18:54:08 +0600
Subject: [PATCH 22/29] fix(construct): fix the vulnerbilities issue in
construct
---
package-lock.json | 652 +++++++-----------
package.json | 23 +-
src/lib/utils/custom-date/custom-date.spec.ts | 8 +-
3 files changed, 248 insertions(+), 435 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 8461bfd5..2e6845b0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -47,22 +47,22 @@
"emoji-picker-react": "^4.12.2",
"html2canvas": "^1.4.1",
"i18next": "^22.5.1",
- "jspdf": "^4.0.0",
+ "jspdf": "^4.1.0",
"lucide-react": "^0.453.0",
"papaparse": "^5.5.2",
- "quill": "^2.0.3",
- "react": "^19.0.0",
+ "quill": "2.0.2",
+ "react": "^19.2.4",
"react-big-calendar": "^1.18.0",
"react-day-picker": "^9.11.0",
"react-dnd": "^16.0.1",
- "react-dom": "^19.0.0",
+ "react-dom": "^19.2.4",
"react-dropzone": "^14.3.8",
"react-easy-crop": "^5.4.2",
"react-hook-form": "^7.54.2",
"react-i18next": "^12.3.1",
"react-otp-input": "^3.1.1",
"react-phone-number-input": "^3.4.11",
- "react-router-dom": "^7.9.4",
+ "react-router-dom": "^7.13.0",
"recharts": "^2.15.0",
"rrule": "^2.8.1",
"sonner": "^2.0.7",
@@ -81,15 +81,15 @@
"@types/lodash": "^4.17.23",
"@types/node": "^20.19.19",
"@types/papaparse": "^5.3.15",
- "@types/react": "^19.0.0",
+ "@types/react": "^19.2.13",
"@types/react-big-calendar": "^1.16.1",
- "@types/react-dom": "^19.0.0",
+ "@types/react-dom": "^19.2.3",
"@types/uuid": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"@vitejs/plugin-react": "^4.3.1",
- "@vitest/coverage-v8": "^3.2.4",
- "@vitest/ui": "^3.2.4",
+ "@vitest/coverage-v8": "^4.0.18",
+ "@vitest/ui": "^4.0.18",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
"eslint": "^8.57.1",
@@ -108,7 +108,7 @@
"ts-node": "^10.9.2",
"typescript": "^4.9.5",
"vite": "^7.1.7",
- "vitest": "^3.2.4"
+ "vitest": "^4.0.18"
}
},
"node_modules/@adobe/css-tools": {
@@ -131,20 +131,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@asamuzakjp/css-color": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.0.5.tgz",
@@ -579,9 +565,9 @@
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
- "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -628,13 +614,13 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
- "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.4"
+ "@babel/types": "^7.29.0"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -2257,14 +2243,14 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
- "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1"
+ "@babel/helper-validator-identifier": "^7.28.5"
},
"engines": {
"node": ">=6.9.0"
@@ -3482,16 +3468,6 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -5179,6 +5155,13 @@
"@microsoft/signalr": "^7.0.7"
}
},
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@tanstack/query-core": {
"version": "5.90.2",
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.2.tgz",
@@ -5435,13 +5418,14 @@
}
},
"node_modules/@types/chai": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
- "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==",
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/deep-eql": "*"
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
}
},
"node_modules/@types/conventional-commits-parser": {
@@ -5607,12 +5591,12 @@
"optional": true
},
"node_modules/@types/react": {
- "version": "19.2.0",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.0.tgz",
- "integrity": "sha512-1LOH8xovvsKsCBq1wnT4ntDUdCJKmnEakhsuoUSy6ExlHCkGP2hqnatagYTgFk6oeL0VU31u7SNjunPN+GchtA==",
+ "version": "19.2.13",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.13.tgz",
+ "integrity": "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==",
"license": "MIT",
"dependencies": {
- "csstype": "^3.0.2"
+ "csstype": "^3.2.2"
}
},
"node_modules/@types/react-big-calendar": {
@@ -5628,9 +5612,9 @@
}
},
"node_modules/@types/react-dom": {
- "version": "19.2.0",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.0.tgz",
- "integrity": "sha512-brtBs0MnE9SMx7px208g39lRmC5uHZs96caOJfTjFcYSLHNamvaSMfJNagChVNkup2SdtOxKX1FDBkRSJe1ZAg==",
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
"devOptional": true,
"license": "MIT",
"peerDependencies": {
@@ -5909,32 +5893,29 @@
}
},
"node_modules/@vitest/coverage-v8": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz",
- "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz",
+ "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@ampproject/remapping": "^2.3.0",
"@bcoe/v8-coverage": "^1.0.2",
- "ast-v8-to-istanbul": "^0.3.3",
- "debug": "^4.4.1",
+ "@vitest/utils": "4.0.18",
+ "ast-v8-to-istanbul": "^0.3.10",
"istanbul-lib-coverage": "^3.2.2",
"istanbul-lib-report": "^3.0.1",
- "istanbul-lib-source-maps": "^5.0.6",
- "istanbul-reports": "^3.1.7",
- "magic-string": "^0.30.17",
- "magicast": "^0.3.5",
- "std-env": "^3.9.0",
- "test-exclude": "^7.0.1",
- "tinyrainbow": "^2.0.0"
+ "istanbul-reports": "^3.2.0",
+ "magicast": "^0.5.1",
+ "obug": "^2.1.1",
+ "std-env": "^3.10.0",
+ "tinyrainbow": "^3.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "@vitest/browser": "3.2.4",
- "vitest": "3.2.4"
+ "@vitest/browser": "4.0.18",
+ "vitest": "4.0.18"
},
"peerDependenciesMeta": {
"@vitest/browser": {
@@ -5943,39 +5924,40 @@
}
},
"node_modules/@vitest/expect": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
- "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz",
+ "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==",
"dev": true,
"license": "MIT",
"dependencies": {
+ "@standard-schema/spec": "^1.0.0",
"@types/chai": "^5.2.2",
- "@vitest/spy": "3.2.4",
- "@vitest/utils": "3.2.4",
- "chai": "^5.2.0",
- "tinyrainbow": "^2.0.0"
+ "@vitest/spy": "4.0.18",
+ "@vitest/utils": "4.0.18",
+ "chai": "^6.2.1",
+ "tinyrainbow": "^3.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/mocker": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
- "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz",
+ "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.2.4",
+ "@vitest/spy": "4.0.18",
"estree-walker": "^3.0.3",
- "magic-string": "^0.30.17"
+ "magic-string": "^0.30.21"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
"msw": "^2.4.9",
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ "vite": "^6.0.0 || ^7.0.0-0"
},
"peerDependenciesMeta": {
"msw": {
@@ -5986,53 +5968,42 @@
}
}
},
- "node_modules/@vitest/mocker/node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
"node_modules/@vitest/pretty-format": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
- "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz",
+ "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "tinyrainbow": "^2.0.0"
+ "tinyrainbow": "^3.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/runner": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz",
- "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz",
+ "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "3.2.4",
- "pathe": "^2.0.3",
- "strip-literal": "^3.0.0"
+ "@vitest/utils": "4.0.18",
+ "pathe": "^2.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/snapshot": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz",
- "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz",
+ "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.2.4",
- "magic-string": "^0.30.17",
+ "@vitest/pretty-format": "4.0.18",
+ "magic-string": "^0.30.21",
"pathe": "^2.0.3"
},
"funding": {
@@ -6040,50 +6011,46 @@
}
},
"node_modules/@vitest/spy": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
- "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz",
+ "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "tinyspy": "^4.0.3"
- },
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/ui": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz",
- "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.18.tgz",
+ "integrity": "sha512-CGJ25bc8fRi8Lod/3GHSvXRKi7nBo3kxh0ApW4yCjmrWmRmlT53B5E08XRSZRliygG0aVNxLrBEqPYdz/KcCtQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "3.2.4",
+ "@vitest/utils": "4.0.18",
"fflate": "^0.8.2",
"flatted": "^3.3.3",
"pathe": "^2.0.3",
- "sirv": "^3.0.1",
- "tinyglobby": "^0.2.14",
- "tinyrainbow": "^2.0.0"
+ "sirv": "^3.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "vitest": "3.2.4"
+ "vitest": "4.0.18"
}
},
"node_modules/@vitest/utils": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
- "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz",
+ "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.2.4",
- "loupe": "^3.1.4",
- "tinyrainbow": "^2.0.0"
+ "@vitest/pretty-format": "4.0.18",
+ "tinyrainbow": "^3.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
@@ -6468,31 +6435,21 @@
"license": "MIT"
},
"node_modules/ast-v8-to-istanbul": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz",
- "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==",
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.11.tgz",
+ "integrity": "sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.30",
+ "@jridgewell/trace-mapping": "^0.3.31",
"estree-walker": "^3.0.3",
- "js-tokens": "^9.0.1"
- }
- },
- "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
+ "js-tokens": "^10.0.0"
}
},
"node_modules/ast-v8-to-istanbul/node_modules/js-tokens": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
- "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
+ "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
"dev": true,
"license": "MIT"
},
@@ -6824,16 +6781,6 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/cac": {
- "version": "6.7.14",
- "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
- "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
@@ -6946,18 +6893,11 @@
}
},
"node_modules/chai": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
- "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "assertion-error": "^2.0.1",
- "check-error": "^2.1.1",
- "deep-eql": "^5.0.1",
- "loupe": "^3.1.0",
- "pathval": "^2.0.0"
- },
"engines": {
"node": ">=18"
}
@@ -6975,16 +6915,6 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/check-error": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
- "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 16"
- }
- },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -7395,12 +7325,16 @@
"license": "MIT"
},
"node_modules/cookie": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
- "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
"license": "MIT",
"engines": {
"node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/core-js": {
@@ -7562,9 +7496,9 @@
}
},
"node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
"license": "MIT"
},
"node_modules/d3-array": {
@@ -7835,16 +7769,6 @@
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
"license": "MIT"
},
- "node_modules/deep-eql": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
- "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -7911,9 +7835,9 @@
"license": "Apache-2.0"
},
"node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
@@ -7982,9 +7906,9 @@
}
},
"node_modules/dompurify": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz",
- "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz",
+ "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==",
"license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
@@ -9096,6 +9020,16 @@
"node": ">=4.0"
}
},
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -9155,9 +9089,9 @@
}
},
"node_modules/expect-type": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz",
- "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -10705,21 +10639,6 @@
"node": ">=10"
}
},
- "node_modules/istanbul-lib-source-maps": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
- "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.23",
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/istanbul-reports": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
@@ -10954,9 +10873,9 @@
}
},
"node_modules/jspdf": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.0.0.tgz",
- "integrity": "sha512-w12U97Z6edKd2tXDn3LzTLg7C7QLJlx0BPfM3ecjK2BckUl9/81vZ+r5gK4/3KQdhAcEZhENUxRhtgYBj75MqQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.1.0.tgz",
+ "integrity": "sha512-xd1d/XRkwqnsq6FP3zH1Q+Ejqn2ULIJeDZ+FTKpaabVpZREjsJKRJwuokTNgdqOU+fl55KgbvgZ1pRTSWCP2kQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.4",
@@ -10966,7 +10885,7 @@
"optionalDependencies": {
"canvg": "^3.0.11",
"core-js": "^3.6.0",
- "dompurify": "^3.2.4",
+ "dompurify": "^3.3.1",
"html2canvas": "^1.0.0-rc.5"
}
},
@@ -11214,15 +11133,15 @@
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"license": "MIT"
},
"node_modules/lodash-es": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
- "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
+ "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",
"license": "MIT"
},
"node_modules/lodash.camelcase": {
@@ -11458,13 +11377,6 @@
"loose-envify": "cli.js"
}
},
- "node_modules/loupe": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
- "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -11504,9 +11416,9 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.19",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
- "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11514,15 +11426,15 @@
}
},
"node_modules/magicast": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz",
- "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz",
+ "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.25.4",
- "@babel/types": "^7.25.4",
- "source-map-js": "^1.2.0"
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "source-map-js": "^1.2.1"
}
},
"node_modules/make-dir": {
@@ -12016,6 +11928,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/obug": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT"
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -12258,16 +12181,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/pathval": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
- "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14.16"
- }
- },
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -12621,9 +12534,9 @@
"license": "MIT"
},
"node_modules/quill": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz",
- "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.2.tgz",
+ "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==",
"license": "BSD-3-Clause",
"dependencies": {
"eventemitter3": "^5.0.1",
@@ -12660,9 +12573,9 @@
}
},
"node_modules/react": {
- "version": "19.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
- "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -12767,15 +12680,15 @@
}
},
"node_modules/react-dom": {
- "version": "19.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
- "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
"license": "MIT",
"dependencies": {
"scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.2.0"
+ "react": "^19.2.4"
}
},
"node_modules/react-dropzone": {
@@ -12965,9 +12878,9 @@
}
},
"node_modules/react-router": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.4.tgz",
- "integrity": "sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==",
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz",
+ "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==",
"license": "MIT",
"dependencies": {
"cookie": "^1.0.1",
@@ -12987,12 +12900,12 @@
}
},
"node_modules/react-router-dom": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.4.tgz",
- "integrity": "sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==",
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.0.tgz",
+ "integrity": "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==",
"license": "MIT",
"dependencies": {
- "react-router": "7.9.4"
+ "react-router": "7.13.0"
},
"engines": {
"node": ">=20.0.0"
@@ -13890,9 +13803,9 @@
}
},
"node_modules/std-env": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
- "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==",
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
"dev": true,
"license": "MIT"
},
@@ -14183,26 +14096,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/strip-literal": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
- "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^9.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/strip-literal/node_modules/js-tokens": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
- "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/sucrase": {
"version": "3.35.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
@@ -14343,47 +14236,6 @@
"tailwindcss": ">=3.0.0 || insiders"
}
},
- "node_modules/test-exclude": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz",
- "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^10.4.1",
- "minimatch": "^9.0.4"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/test-exclude/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/test-exclude/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/text-extensions": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
@@ -14457,11 +14309,14 @@
"license": "MIT"
},
"node_modules/tinyexec": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
- "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/tinyglobby": {
"version": "0.2.15",
@@ -14480,30 +14335,10 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
- "node_modules/tinypool": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
- "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- }
- },
"node_modules/tinyrainbow": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
- "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/tinyspy": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz",
- "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz",
+ "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -15129,75 +14964,51 @@
}
}
},
- "node_modules/vite-node": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
- "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cac": "^6.7.14",
- "debug": "^4.4.1",
- "es-module-lexer": "^1.7.0",
- "pathe": "^2.0.3",
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
- },
- "bin": {
- "vite-node": "vite-node.mjs"
- },
- "engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
"node_modules/vitest": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
- "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
+ "version": "4.0.18",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz",
+ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/chai": "^5.2.2",
- "@vitest/expect": "3.2.4",
- "@vitest/mocker": "3.2.4",
- "@vitest/pretty-format": "^3.2.4",
- "@vitest/runner": "3.2.4",
- "@vitest/snapshot": "3.2.4",
- "@vitest/spy": "3.2.4",
- "@vitest/utils": "3.2.4",
- "chai": "^5.2.0",
- "debug": "^4.4.1",
- "expect-type": "^1.2.1",
- "magic-string": "^0.30.17",
+ "@vitest/expect": "4.0.18",
+ "@vitest/mocker": "4.0.18",
+ "@vitest/pretty-format": "4.0.18",
+ "@vitest/runner": "4.0.18",
+ "@vitest/snapshot": "4.0.18",
+ "@vitest/spy": "4.0.18",
+ "@vitest/utils": "4.0.18",
+ "es-module-lexer": "^1.7.0",
+ "expect-type": "^1.2.2",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
"pathe": "^2.0.3",
- "picomatch": "^4.0.2",
- "std-env": "^3.9.0",
+ "picomatch": "^4.0.3",
+ "std-env": "^3.10.0",
"tinybench": "^2.9.0",
- "tinyexec": "^0.3.2",
- "tinyglobby": "^0.2.14",
- "tinypool": "^1.1.1",
- "tinyrainbow": "^2.0.0",
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
- "vite-node": "3.2.4",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.0.3",
+ "vite": "^6.0.0 || ^7.0.0",
"why-is-node-running": "^2.3.0"
},
"bin": {
"vitest": "vitest.mjs"
},
"engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
"@edge-runtime/vm": "*",
- "@types/debug": "^4.1.12",
- "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "@vitest/browser": "3.2.4",
- "@vitest/ui": "3.2.4",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.0.18",
+ "@vitest/browser-preview": "4.0.18",
+ "@vitest/browser-webdriverio": "4.0.18",
+ "@vitest/ui": "4.0.18",
"happy-dom": "*",
"jsdom": "*"
},
@@ -15205,13 +15016,19 @@
"@edge-runtime/vm": {
"optional": true
},
- "@types/debug": {
+ "@opentelemetry/api": {
"optional": true
},
"@types/node": {
"optional": true
},
- "@vitest/browser": {
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
"optional": true
},
"@vitest/ui": {
@@ -15225,13 +15042,6 @@
}
}
},
- "node_modules/vitest/node_modules/tinyexec": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
- "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
diff --git a/package.json b/package.json
index c0add04d..853fa62c 100644
--- a/package.json
+++ b/package.json
@@ -65,22 +65,22 @@
"emoji-picker-react": "^4.12.2",
"html2canvas": "^1.4.1",
"i18next": "^22.5.1",
- "jspdf": "^4.0.0",
+ "jspdf": "^4.1.0",
"lucide-react": "^0.453.0",
"papaparse": "^5.5.2",
- "quill": "^2.0.3",
- "react": "^19.0.0",
+ "quill": "2.0.2",
+ "react": "^19.2.4",
"react-big-calendar": "^1.18.0",
"react-day-picker": "^9.11.0",
"react-dnd": "^16.0.1",
- "react-dom": "^19.0.0",
+ "react-dom": "^19.2.4",
"react-dropzone": "^14.3.8",
"react-easy-crop": "^5.4.2",
"react-hook-form": "^7.54.2",
"react-i18next": "^12.3.1",
"react-otp-input": "^3.1.1",
"react-phone-number-input": "^3.4.11",
- "react-router-dom": "^7.9.4",
+ "react-router-dom": "^7.13.0",
"recharts": "^2.15.0",
"rrule": "^2.8.1",
"sonner": "^2.0.7",
@@ -99,15 +99,15 @@
"@types/lodash": "^4.17.23",
"@types/node": "^20.19.19",
"@types/papaparse": "^5.3.15",
- "@types/react": "^19.0.0",
+ "@types/react": "^19.2.13",
"@types/react-big-calendar": "^1.16.1",
- "@types/react-dom": "^19.0.0",
+ "@types/react-dom": "^19.2.3",
"@types/uuid": "^10.0.0",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"@vitejs/plugin-react": "^4.3.1",
- "@vitest/coverage-v8": "^3.2.4",
- "@vitest/ui": "^3.2.4",
+ "@vitest/coverage-v8": "^4.0.18",
+ "@vitest/ui": "^4.0.18",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
"eslint": "^8.57.1",
@@ -126,7 +126,7 @@
"ts-node": "^10.9.2",
"typescript": "^4.9.5",
"vite": "^7.1.7",
- "vitest": "^3.2.4"
+ "vitest": "^4.0.18"
},
"lint-staged": {
"src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
@@ -134,6 +134,9 @@
"eslint --fix"
]
},
+ "overrides": {
+ "lodash": "4.17.23"
+ },
"browserslist": {
"production": [
">0.2%",
diff --git a/src/lib/utils/custom-date/custom-date.spec.ts b/src/lib/utils/custom-date/custom-date.spec.ts
index fa0d59e0..74f097c7 100644
--- a/src/lib/utils/custom-date/custom-date.spec.ts
+++ b/src/lib/utils/custom-date/custom-date.spec.ts
@@ -55,15 +55,15 @@ describe('Date formatting utilities', () => {
expect(formatDate(fixedDate, true)).toBe('15/06/2023');
});
- test('should handle mocked current dates with jest.spyOn', () => {
- // This is a better way to mock dates in Jest tests
+ test('should handle mocked current dates with vi.useFakeTimers', () => {
const mockDate = new Date(2023, 5, 15, 15, 30);
- vi.spyOn(global, 'Date').mockImplementation(() => mockDate);
+ vi.useFakeTimers();
+ vi.setSystemTime(mockDate);
expect(formatDate(new Date())).toBe('15/06/2023, 15:30');
// Clean up
- vi.restoreAllMocks();
+ vi.useRealTimers();
});
test('should handle leap years correctly', () => {
From d8dde026be7f64272f428b641341f77c4f02cd82 Mon Sep 17 00:00:00 2001
From: Sangay Thinley <59992112+sangayt1997@users.noreply.github.com>
Date: Mon, 16 Feb 2026 10:56:28 +0600
Subject: [PATCH 23/29] fix(construct): layout alignment + profile role binding
fix
---
src/layout/main-layout/main-layout.tsx | 2 +-
.../components/profile-card/profile-card.tsx | 15 ++++++++++++++-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/src/layout/main-layout/main-layout.tsx b/src/layout/main-layout/main-layout.tsx
index 87aef64b..dd6aaf91 100644
--- a/src/layout/main-layout/main-layout.tsx
+++ b/src/layout/main-layout/main-layout.tsx
@@ -85,8 +85,8 @@ export const MainLayout = () => {
-
+