diff --git a/src/management-system-v2/app/(auth)/layout.tsx b/src/management-system-v2/app/(auth)/layout.tsx
index dbeedfec3..fe8cd401c 100644
--- a/src/management-system-v2/app/(auth)/layout.tsx
+++ b/src/management-system-v2/app/(auth)/layout.tsx
@@ -1,11 +1,18 @@
import Layout from '@/app/(dashboard)/[environmentId]/layout-client';
+import { getCurrentUser } from '@/components/auth';
import Content from '@/components/content';
import Processes from '@/components/processes';
import { SetAbility } from '@/lib/abilityStore';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
import { FC, PropsWithChildren } from 'react';
import { AiOutlineFile, AiOutlineProfile } from 'react-icons/ai';
-const SigninLayout: FC = ({ children }) => {
+const SigninLayout: FC = async ({ children }) => {
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+
return (
<>
{children}
diff --git a/src/management-system-v2/app/(auth)/signin/page.tsx b/src/management-system-v2/app/(auth)/signin/page.tsx
index 4846c82fb..43901c6a2 100644
--- a/src/management-system-v2/app/(auth)/signin/page.tsx
+++ b/src/management-system-v2/app/(auth)/signin/page.tsx
@@ -1,17 +1,24 @@
import { getProviders } from '@/lib/auth';
import { getCurrentUser } from '@/components/auth';
-import { redirect } from 'next/navigation';
+import { notFound, redirect } from 'next/navigation';
import SignIn from './signin';
import { generateGuestReferenceToken } from '@/lib/reference-guest-user-token';
import { env } from '@/lib/ms-config/env-vars';
import db from '@/lib/data/db';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const dayInMS = 1000 * 60 * 60 * 24;
// take in search query
const SignInPage = async (props: { searchParams: Promise<{ callbackUrl: string }> }) => {
const searchParams = await props.searchParams;
- const { session } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ // this shouldn't really occur since it is handled in the layout file in the parent folder
+ // already
+ return notFound();
+ }
+ const { session } = currentUser.value;
const isGuest = session?.user.isGuest;
if (session?.user && !isGuest) {
diff --git a/src/management-system-v2/app/(auth)/signin/signin.tsx b/src/management-system-v2/app/(auth)/signin/signin.tsx
index 23fce962d..2c67cc1fd 100644
--- a/src/management-system-v2/app/(auth)/signin/signin.tsx
+++ b/src/management-system-v2/app/(auth)/signin/signin.tsx
@@ -147,7 +147,7 @@ const SignIn: FC<{
>
@@ -163,8 +163,9 @@ const SignIn: FC<{
color: '#434343',
}}
>
- By using the this Platform, you agree to the Terms of Service{' '}
- and the storage of functionally essential cookies on your device.
+ By using the PROCEED Platform, you agree to the{' '}
+ Terms of Service and the storage of functionally essential
+ cookies on your device.
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/[dbEngineId]/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/[dbEngineId]/page.tsx
index e4bf761fe..481bac505 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/[dbEngineId]/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/[dbEngineId]/page.tsx
@@ -9,6 +9,7 @@ import { getDbEngineById } from '@/lib/data/db/engines';
import { getMSConfig } from '@/lib/ms-config/ms-config';
import EngineDashboard from '@/components/engine-dashboard/server-component';
import SpaceLink from '@/components/space-link';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
export type TableEngine = Engine & { id: string };
@@ -24,8 +25,15 @@ export default async function EnginesPage(props: {
const dbEngineId = decodeURIComponent(params.dbEngineId);
const engineId = decodeURIComponent(searchParams.engineId || '');
- const { ability, activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability, activeEnvironment } = currentSpace.value;
const dbEngine = await getDbEngineById(dbEngineId, activeEnvironment.spaceId, ability);
+ if (dbEngine.isErr()) {
+ return errorResponse(dbEngine);
+ }
return (
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/page.tsx
index 4ce4afa44..38321e9d3 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/engines/page.tsx
@@ -10,6 +10,7 @@ import { getSpaceSettingsValues } from '@/lib/data/db/space-settings';
import { savedEnginesToEngines } from '@/lib/engines/saved-engines-helpers';
import { Engine as DBEngine } from '@prisma/client';
import { spaceURL } from '@/lib/utils';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const getEngineStatus = async (engine: DBEngine) => {
const engines = await savedEnginesToEngines([engine]);
@@ -26,20 +27,30 @@ const EnginesPage = async (props: { params: Promise<{ environmentId: string }> }
if (!msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE) return notFound();
const params = await props.params;
- const { activeEnvironment, ability } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment, ability } = currentSpace.value;
const machinesSettings = await getSpaceSettingsValues(
activeEnvironment.spaceId,
'process-automation.process-engines',
);
+ if (machinesSettings.isErr()) {
+ return errorResponse(machinesSettings);
+ }
- if (machinesSettings.active === false) {
+ if (machinesSettings.value.active === false) {
return notFound();
}
const engines = await getDbEngines(activeEnvironment.spaceId, ability);
+ if (engines.isErr()) {
+ return errorResponse(engines);
+ }
- const enginesWithStatus = engines.map((engine) => {
+ const enginesWithStatus = engines.value.map((engine) => {
return {
...engine,
status: (
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions-dashboard/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions-dashboard/page.tsx
index 7947356fc..9157b87f5 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions-dashboard/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions-dashboard/page.tsx
@@ -4,21 +4,29 @@ import { getCurrentEnvironment } from '@/components/auth';
import { getMSConfig } from '@/lib/ms-config/ms-config';
import { getSpaceSettingsValues } from '@/lib/data/db/space-settings';
import DashboardView from './dashboard-view';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const Page = async (props: any) => {
const params = await props.params;
const msConfig = await getMSConfig();
if (!msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE) return notFound();
- const { activeEnvironment, ability } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment, ability } = currentSpace.value;
const machinesSettings = await getSpaceSettingsValues(
activeEnvironment.spaceId,
'process-automation.dashboard',
ability,
);
+ if (machinesSettings.isErr()) {
+ return errorResponse(machinesSettings);
+ }
- if (machinesSettings.active === false) {
+ if (machinesSettings.value.active === false) {
return notFound();
}
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/[processId]/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/[processId]/page.tsx
index 1276f2f06..6be269b37 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/[processId]/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/[processId]/page.tsx
@@ -4,9 +4,13 @@ import { getDeployment } from '@/lib/engines/server-actions';
import ProcessDeploymentView from './process-deployment-view';
import { Suspense } from 'react';
import { getCurrentEnvironment } from '@/components/auth';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
+import { err } from 'neverthrow';
async function Deployment({ processId, spaceId }: { processId: string; spaceId: string }) {
const deployment = await getDeployment(spaceId, processId);
+ if (isUserErrorResponse(deployment)) return errorResponse(err());
if (!deployment) {
return (
@@ -24,7 +28,11 @@ export default async function Page(props: {
}) {
const params = await props.params;
//TODO: authentication + authorization
- const { activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment } = currentSpace.value;
return (
;
@@ -17,14 +18,21 @@ const ExecutionsLayout: React.FC = async (props) => {
if (!msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE) return notFound();
- const { activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment } = currentSpace.value;
- const exeuctionsSettings = await getSpaceSettingsValues(
+ const executionsSettings = await getSpaceSettingsValues(
activeEnvironment.spaceId,
'process-automation.executions',
);
+ if (executionsSettings.isErr()) {
+ return errorResponse(executionsSettings);
+ }
- if (exeuctionsSettings.active === false) {
+ if (executionsSettings.value.active === false) {
return notFound();
}
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/page.tsx
index 5fbf356e6..40b8060d8 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/executions/page.tsx
@@ -5,10 +5,10 @@ import { getRootFolder, getFolderById, getFolderContents } from '@/lib/data/db/f
import { getUsersFavourites } from '@/lib/data/users';
import { getDeployedProcessesFromSavedEngines } from '@/lib/engines/saved-engines-helpers';
import { DeployedProcessInfo } from '@/lib/engines/deployment';
-import { isUserErrorResponse } from '@/lib/user-error';
-import { Skeleton } from 'antd';
-import { Suspense } from 'react';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
import { getDbEngines } from '@/lib/data/db/engines';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { Result, err, ok } from 'neverthrow';
function getDeploymentNames(
deployments: T[],
@@ -29,30 +29,56 @@ function getDeploymentNames {
- const rootFolder = await getRootFolder(activeEnvironment.spaceId, ability);
- const folder = await getFolderById(rootFolder.id);
- const folderContents = await getFolderContents(folder.id, ability);
- return [folder, folderContents];
- })(),
- (async () => {
- const engines = await getDbEngines(null, ability, 'dont-check');
- return await getDeployedProcessesFromSavedEngines(engines);
- })(),
- (async () => {
- const spaceEngines = await getDbEngines(activeEnvironment.spaceId, ability);
- if (isUserErrorResponse(spaceEngines)) return [];
- return await getDeployedProcessesFromSavedEngines(spaceEngines);
- })(),
- ]);
+ let promises = await Promise.all([
+ (async () => {
+ const favorites = await getUsersFavourites();
+ if (isUserErrorResponse(favorites)) return err(favorites);
+
+ return ok(favorites);
+ })(),
+ (async () => {
+ const rootFolder = await getRootFolder(activeEnvironment.spaceId, ability);
+ if (rootFolder.isErr()) return rootFolder;
+
+ const folder = await getFolderById(rootFolder.value.id);
+ if (folder.isErr()) return folder;
+
+ const folderContents = await getFolderContents(folder.value.id, ability);
+ if (folderContents.isErr()) {
+ return folderContents;
+ }
+
+ return ok([folder.value, folderContents.value] as const);
+ })(),
+ (async () => {
+ const engines = await getDbEngines(null, ability, 'dont-check');
+ if (engines.isErr()) return engines;
+
+ return ok(await getDeployedProcessesFromSavedEngines(engines.value));
+ })(),
+ (async () => {
+ const spaceEngines = await getDbEngines(activeEnvironment.spaceId, ability);
+ if (spaceEngines.isErr()) return spaceEngines;
+
+ return ok(await getDeployedProcessesFromSavedEngines(spaceEngines.value));
+ })(),
+ ]);
+
+ const results = Result.combine(promises);
+ if (results.isErr()) {
+ return errorResponse(results);
+ }
+
+ let [favs, [folder, folderContents], deployedInProceed, deployedInSpaceEngines] = results.value;
folderContents = folderContents.filter((p) => p.type === 'folder' || p.versions.length);
@@ -66,12 +92,14 @@ async function Executions({ environmentId }: { environmentId: string }) {
const deployedProcesses = getDeploymentNames(deployedWithRemappedIds);
return (
-
+
+
+
);
}
@@ -79,9 +107,5 @@ export default async function ExecutionsPage(props: {
params: Promise<{ environmentId: string }>;
}) {
const params = await props.params;
- return (
-
-
-
- );
+ return ;
}
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/layout.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/layout.tsx
index b1708b9ef..8eb7fa046 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/layout.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/layout.tsx
@@ -3,6 +3,7 @@ import { getSpaceSettingsValues } from '@/lib/data/db/space-settings';
import { notFound } from 'next/navigation';
import { getCurrentEnvironment } from '@/components/auth';
import { getMSConfig } from '@/lib/ms-config/ms-config';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
type AutomationLayoutProps = {
params: Promise<{ environmentId: string }>;
@@ -18,14 +19,21 @@ const AutomationsLayout: React.FC = async (props) => {
return notFound();
}
- const { activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment } = currentSpace.value;
const automationSettings = await getSpaceSettingsValues(
activeEnvironment.spaceId,
'process-automation',
);
+ if (automationSettings.isErr()) {
+ return errorResponse(automationSettings);
+ }
- if (automationSettings.active === false) {
+ if (automationSettings.value.active === false) {
return notFound();
}
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/projects/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/projects/page.tsx
index 2494a9261..f14aee242 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/projects/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/(automation)/projects/page.tsx
@@ -4,10 +4,15 @@ import Content from '@/components/content';
import { Space } from 'antd';
import { getCurrentEnvironment } from '@/components/auth';
import { redirect } from 'next/navigation';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const Projects = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
- const { ability } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability } = currentSpace.value;
if (!ability.can('view', 'Setting')) return redirect('/');
return (
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/general-settings/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/general-settings/page.tsx
index 85ca445e8..5c219dfed 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/general-settings/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/general-settings/page.tsx
@@ -5,10 +5,15 @@ import SettingsForm from './settings-form';
// Card throws a react children error if you don't import Title separately.
import Title from 'antd/es/typography/Title';
import { redirect } from 'next/navigation';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const GeneralSettingsPage = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
- const { ability } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability } = currentSpace.value;
if (!ability.can('view', 'Setting')) return redirect('/');
const updateSettings = async (newSettings: Object) => {
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/page.tsx
index f08cf8028..8731ff9e7 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/page.tsx
@@ -4,7 +4,7 @@ import { getRoleWithMembersById } from '@/lib/data/db/iam/roles';
import UnauthorizedFallback from '@/components/unauthorized-fallback';
import { getMembers } from '@/lib/data/db/iam/memberships';
import { getUserById } from '@/lib/data/db/iam/users';
-import { Button, Card, Result, Space, Tabs } from 'antd';
+import { Button, Card, Result as AntdResult, Space, Tabs } from 'antd';
import { LeftOutlined } from '@ant-design/icons';
import RoleGeneralData from './roleGeneralData';
import RolePermissions from './rolePermissions';
@@ -12,21 +12,31 @@ import RoleMembers from './role-members';
import { AuthenticatedUser } from '@/lib/data/user-schema';
import SpaceLink from '@/components/space-link';
import { getFolderById } from '@/lib/data/db/folders';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { Result } from 'neverthrow';
const Page = async (props: { params: Promise<{ roleId: string; environmentId: string }> }) => {
const params = await props.params;
const { roleId, environmentId } = params;
- const { ability, activeEnvironment } = await getCurrentEnvironment(environmentId);
+ const currentSpace = await getCurrentEnvironment(environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability, activeEnvironment } = currentSpace.value;
const role = await getRoleWithMembersById(roleId, ability);
+ if (role.isErr()) {
+ return errorResponse(role);
+ }
+
// if (role && !ability.can('manage', toCaslResource('Role', role))) return ;
if (!ability.can('admin', 'All')) return ;
- if (!role)
+ if (!role.value)
return (
-
);
- const usersInRole = role.members;
+ const usersInRole = role.value.members;
const roleUserSet = new Set(usersInRole.map((member) => member.id));
const memberships = await getMembers(activeEnvironment.spaceId, ability);
- const usersNotInRole = (await Promise.all(
- memberships
- .filter(({ userId }) => !roleUserSet.has(userId))
- .map((user) => getUserById(user.userId)),
- )) as AuthenticatedUser[];
+ if (memberships.isErr()) return errorResponse(memberships);
+
+ const usersNotInRole = Result.combine(
+ await Promise.all(
+ memberships.value
+ .filter(({ userId }) => !roleUserSet.has(userId))
+ .map((user) => getUserById(user.userId)),
+ ),
+ );
+ if (usersNotInRole.isErr()) {
+ return errorResponse(usersNotInRole);
+ }
- const roleParentFolder = role.parentId ? await getFolderById(role.parentId, ability) : undefined;
+ const roleParentFolder = role.value.parentId
+ ? await getFolderById(role.value.parentId, ability)
+ : undefined;
+ if (roleParentFolder && roleParentFolder.isErr()) {
+ return errorResponse(roleParentFolder);
+ }
const tabs = [
{
key: 'generalData',
label: 'General Data',
- children: ,
+ children: ,
},
{
key: 'permissions',
label: 'Permissions',
- children: ,
+ children: ,
},
];
- if (role.name !== '@everyone' && role.name !== '@guest') {
+ if (role.value.name !== '@everyone' && role.value.name !== '@guest') {
tabs.push({
key: 'members',
label: 'Manage Members',
children: (
-
+
),
});
}
@@ -84,7 +110,7 @@ const Page = async (props: { params: Promise<{ roleId: string; environmentId: st
Roles
- {role?.name}
+ {role.value.name}
}
>
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/rolePermissions.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/rolePermissions.tsx
index dbbcc7372..be741e57e 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/rolePermissions.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/[roleId]/rolePermissions.tsx
@@ -8,7 +8,7 @@ import { useAbilityStore } from '@/lib/abilityStore';
import { updateRole as serverUpdateRole } from '@/lib/data/roles';
import { Role } from '@/lib/data/role-schema';
import { useEnvironment } from '@/components/auth-can';
-import { UserErrorType } from '@/lib/user-error';
+import { UserErrorType } from '@/lib/server-error-handling/user-error';
import { EnvVarsContext } from '@/components/env-vars-context';
type PermissionCategory = {
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/page.tsx
index bb3fc12eb..06b9e5709 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/roles/page.tsx
@@ -3,19 +3,27 @@ import Content from '@/components/content';
import { getRolesWithMembers } from '@/lib/data/db/iam/roles';
import RolesPage from './role-page';
import UnauthorizedFallback from '@/components/unauthorized-fallback';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const Page = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
- const { ability, activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability, activeEnvironment } = currentSpace.value;
// if (!ability.can('manage', 'Role')) return ;
if (!ability.can('admin', 'All')) return ;
const roles = await getRolesWithMembers(activeEnvironment.spaceId, ability);
+ if (roles.isErr()) {
+ return errorResponse(roles);
+ }
return (
-
+
);
};
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/invite-users.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/invite-users.tsx
index acff9a1ce..afb613d1b 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/invite-users.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/invite-users.tsx
@@ -29,7 +29,7 @@ import { EnvVarsContext } from '@/components/env-vars-context';
import useOrganizationRoles from './use-org-roles';
import useDebounce from '@/lib/useDebounce';
import { queryUsers } from '@/lib/data/users';
-import { isUserErrorResponse } from '@/lib/user-error';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
import UserAvatar from '@/components/user-avatar';
import { z } from 'zod';
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/page.tsx
index d2fb19f8c..52461b04b 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/iam/users/page.tsx
@@ -3,17 +3,23 @@ import UsersPage from './users-page';
import Content from '@/components/content';
import UnauthorizedFallback from '@/components/unauthorized-fallback';
import { getFullMembersWithRoles } from '@/lib/data/db/iam/memberships';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const Page = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
- const { ability, activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability, activeEnvironment } = currentSpace.value;
if (!ability.can('manage', 'User')) return ;
const users = await getFullMembersWithRoles(activeEnvironment.spaceId, ability);
+ if (users.isErr()) return errorResponse(users);
return (
-
+
);
};
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/layout.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/layout.tsx
index 25af777eb..657e013e4 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/layout.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/layout.tsx
@@ -4,6 +4,7 @@ import { SetAbility } from '@/lib/abilityStore';
import Layout, { ExtendedMenuItems } from './layout-client';
import { getUserOrganizationEnvironments } from '@/lib/data/db/iam/memberships';
import { MenuProps } from 'antd';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
import {
PartitionOutlined,
@@ -42,6 +43,7 @@ import { customLinkIcons } from '@/lib/custom-links/icons';
import { CustomNavigationLink } from '@/lib/custom-links/custom-link';
import { env } from '@/lib/ms-config/env-vars';
import { getUserPassword } from '@/lib/data/db/iam/users';
+import { Result } from 'neverthrow';
const DashboardLayout = async (
props: PropsWithChildren<{ params: Promise<{ environmentId: string }> }>,
@@ -50,33 +52,66 @@ const DashboardLayout = async (
const { children } = props;
- const { userId, systemAdmin, user } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { userId, systemAdmin, user } = currentUser.value;
+
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment, ability } = currentSpace.value;
- const { activeEnvironment, ability } = await getCurrentEnvironment(params.environmentId);
const can = ability.can.bind(ability);
const userEnvironments: Environment[] = [];
- if (env.PROCEED_PUBLIC_IAM_PERSONAL_SPACES_ACTIVE)
- userEnvironments.push(await getEnvironmentById(userId))!;
+ if (env.PROCEED_PUBLIC_IAM_PERSONAL_SPACES_ACTIVE) {
+ const personalEnvironment = await getEnvironmentById(userId);
+ if (personalEnvironment.isErr()) return errorResponse(personalEnvironment);
+
+ userEnvironments.push(personalEnvironment.value);
+ }
const userOrgEnvs = await getUserOrganizationEnvironments(userId);
- const orgEnvironments = await asyncMap(
- userOrgEnvs,
- async (envId) => (await getEnvironmentById(envId))!,
+ if (userOrgEnvs.isErr()) {
+ return errorResponse(userOrgEnvs);
+ }
+
+ const orgEnvironments = Result.combine(
+ await asyncMap(userOrgEnvs.value, async (envId) => await getEnvironmentById(envId)),
);
+ if (orgEnvironments.isErr()) {
+ return errorResponse(orgEnvironments);
+ }
+
const msConfig = await getMSConfig();
- userEnvironments.push(...orgEnvironments);
+ userEnvironments.push(...orgEnvironments.value);
- const userRules = systemAdmin
- ? getSystemAdminRules(activeEnvironment.isOrganization)
- : await getUserRules(userId, activeEnvironment.spaceId);
+ let userRules;
+ if (systemAdmin) {
+ userRules = getSystemAdminRules(activeEnvironment.isOrganization);
+ } else {
+ const rules = await getUserRules(userId, activeEnvironment.spaceId);
+ if (rules.isErr()) {
+ return errorResponse(rules);
+ }
+
+ userRules = rules.value;
+ }
const generalSettings = await getSpaceSettingsValues(
activeEnvironment.spaceId,
'general-settings',
);
- const customNavLinks: CustomNavigationLink[] = generalSettings.customNavigationLinks?.links || [];
+ if (generalSettings.isErr()) {
+ return errorResponse(generalSettings);
+ }
+
+ const customNavLinks: CustomNavigationLink[] =
+ generalSettings.value.customNavigationLinks?.links || [];
const topCustomNavLinks = customNavLinks.filter((link) => link.position === 'top');
const middleCustomNavLinks = customNavLinks.filter((link) => link.position === 'middle');
const bottomCustomNavLinks = customNavLinks.filter((link) => link.position === 'bottom');
@@ -115,7 +150,11 @@ const DashboardLayout = async (
}
const userPassword = await getUserPassword(user!.id);
- const userNeedsToChangePassword = userPassword ? userPassword.isTemporaryPassword : false;
+ if (userPassword.isErr()) {
+ return errorResponse(userPassword);
+ }
+
+ const userNeedsToChangePassword = userPassword ? userPassword.value?.isTemporaryPassword : false;
let layoutMenuItems: ExtendedMenuItems = [];
@@ -139,17 +178,20 @@ const DashboardLayout = async (
activeEnvironment.spaceId,
'process-documentation',
);
+ if (documentationSettings.isErr()) {
+ return errorResponse(documentationSettings);
+ }
- if (documentationSettings.active !== false) {
+ if (documentationSettings.value.active !== false) {
const processRegex = '/processes($|/)';
let children: ExtendedMenuItems = [
- documentationSettings.list?.active !== false && {
+ documentationSettings.value.list?.active !== false && {
key: 'processes-list',
label: List,
icon: ,
selectedRegex: '/processes/list($|/)',
},
- documentationSettings.editor?.active !== false && {
+ documentationSettings.value.editor?.active !== false && {
key: 'processes-editor',
label: Editor,
icon: ,
@@ -173,14 +215,20 @@ const DashboardLayout = async (
activeEnvironment.spaceId,
'process-automation',
);
+ if (automationSettings.isErr()) {
+ return errorResponse(automationSettings);
+ }
- if (msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE && automationSettings.active !== false) {
+ if (
+ msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE &&
+ automationSettings.value.active !== false
+ ) {
let childRegex = '';
let children: ExtendedMenuItems = [];
if (
msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_TASK_EDITOR_ACTIVE &&
- automationSettings.task_editor?.active !== false
+ automationSettings.value.task_editor?.active !== false
) {
childRegex = '/tasks($|/)';
children.push({
@@ -206,11 +254,11 @@ const DashboardLayout = async (
}
if (msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE) {
- if (automationSettings.active !== false) {
+ if (automationSettings.value.active !== false) {
let childRegex = '';
let children: ExtendedMenuItems = [];
- if (automationSettings.dashboard?.active !== false) {
+ if (automationSettings.value.dashboard?.active !== false) {
const dashboardRegex = '/executions-dashboard($|/)';
childRegex = !childRegex ? dashboardRegex : `(${childRegex})|(${dashboardRegex})`;
children.push({
@@ -220,7 +268,7 @@ const DashboardLayout = async (
selectedRegex: dashboardRegex,
});
}
- if (automationSettings.executions?.active !== false) {
+ if (automationSettings.value.executions?.active !== false) {
const executionsRegex = '/executions($|/)';
childRegex = !childRegex ? executionsRegex : `(${childRegex})|(${executionsRegex})`;
children.push({
@@ -230,7 +278,7 @@ const DashboardLayout = async (
selectedRegex: executionsRegex,
});
}
- if (automationSettings.machines?.active !== false) {
+ if (automationSettings.value.machines?.active !== false) {
const machinesRegex = '/engines($|/)';
childRegex = !childRegex ? machinesRegex : `(${childRegex})|(${machinesRegex})`;
children.push({
@@ -414,14 +462,22 @@ const DashboardLayout = async (
);
}
- const logo = (await getSpaceLogo(activeEnvironment.spaceId))?.spaceLogo ?? undefined;
+ const spaceLogo = await getSpaceLogo(activeEnvironment.spaceId);
+ if (spaceLogo.isErr()) {
+ return errorResponse(spaceLogo);
+ }
+
+ const logo = spaceLogo.value?.spaceLogo ?? undefined;
+
+ const treeMap = await getSpaceFolderTree(activeEnvironment.spaceId);
+ if (treeMap.isErr()) return errorResponse(treeMap);
return (
<>
}) => {
const params = await props.params;
- const { ability, activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability, activeEnvironment } = currentSpace.value;
if (
!activeEnvironment.isOrganization ||
(!ability.can('update', 'Environment') && !ability.can('delete', 'Environment'))
@@ -17,9 +22,12 @@ const GeneralSettingsPage = async (props: { params: Promise<{ environmentId: str
throw new UnauthorizedError();
}
- const organization = (await getEnvironmentById(
- activeEnvironment.spaceId,
- )) as OrganizationEnvironment;
+ const _organization = await getEnvironmentById(activeEnvironment.spaceId);
+ if (_organization.isErr()) {
+ return errorResponse(_organization);
+ }
+
+ const organization = _organization.value as OrganizationEnvironment;
const children: (Setting | SettingGroup)[] = [];
if (ability.can('update', 'Environment')) {
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/management/layout.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/management/layout.tsx
index 497095652..d5129ecb9 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/management/layout.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/management/layout.tsx
@@ -1,13 +1,27 @@
import Content from '@/components/content';
import SettingsPage from '../settings/settings-page';
+import { getCurrentEnvironment } from '@/components/auth';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { UnauthorizedError } from '@/lib/ability/abilityHelper';
+import { err } from 'neverthrow';
-export default function Layout({
+export default async function Layout({
params,
...children
}: {
params: Promise<{ environmentId: string }>;
}) {
- // TODO: check if the user has the rights to change the settings
+ const currentSpace = await getCurrentEnvironment((await params).environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability, activeEnvironment } = currentSpace.value;
+ if (
+ !activeEnvironment.isOrganization ||
+ (!ability.can('update', 'Environment') && !ability.can('delete', 'Environment'))
+ ) {
+ return errorResponse(err(new UnauthorizedError()));
+ }
return (
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/modeler-toolbar.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/modeler-toolbar.tsx
index 7fb330ff3..83ad1295f 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/modeler-toolbar.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/modeler-toolbar.tsx
@@ -26,7 +26,7 @@ import { useEnvironment } from '@/components/auth-can';
import { ShareModal } from '@/components/share-modal/share-modal';
import { useAddControlCallback } from '@/lib/controls-store';
import { spaceURL } from '@/lib/utils';
-import { isUserErrorResponse } from '@/lib/user-error';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
import useTimelineViewStore from '@/lib/use-timeline-view-store';
import { handleOpenDocumentation } from '../../processes-helper';
import { EnvVarsContext } from '@/components/env-vars-context';
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/page.tsx
index f0c267127..c148f44c9 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/page.tsx
@@ -5,14 +5,15 @@ import Modeler from './modeler';
import { toCaslResource } from '@/lib/ability/caslAbility';
import AddUserControls from '@/components/add-user-controls';
import { getProcess, getProcesses } from '@/lib/data/db/process';
-import { getRolesWithMembers } from '@/lib/data/db/iam/roles';
import { getProcessBPMN } from '@/lib/data/processes';
import BPMNTimeline from '@/components/bpmn-timeline';
import { UnauthorizedError } from '@/lib/ability/abilityHelper';
-import { RoleType, UserType } from './use-potentialOwner-store';
import type { Process } from '@/lib/data/process-schema';
import { redirect } from 'next/navigation';
import { spaceURL } from '@/lib/utils';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
+import { err } from 'neverthrow';
import { getFolderById } from '@/lib/data/db/folders';
type ProcessPageProps = {
@@ -35,24 +36,32 @@ const ProcessComponent = async (props: ProcessComponentProps) => {
//console.log('processId', processId);
//console.log('query', searchParams);
- const { ability, activeEnvironment } = await getCurrentEnvironment(environmentId);
+ const currentSpace = await getCurrentEnvironment(environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { ability, activeEnvironment } = currentSpace.value;
const selectedVersionId = searchParams.version;
// Only load BPMN if no version selected (for latest version)
const process = await getProcess(processId, !selectedVersionId);
+ if (process.isErr()) {
+ return errorResponse(process);
+ }
// For list view: check for redirect
if (props.isListView) {
// If no version specified but released versions exist, redirect to last released version
- if (!searchParams.version && process.versions.length > 0) {
- const lastVersionId = process.versions[process.versions.length - 1].id;
+ if (!searchParams.version && process.value.versions.length > 0) {
+ const lastVersionId = process.value.versions[process.value.versions.length - 1].id;
const currentPath = `/processes/list/${processId}`;
const redirectUrl = spaceURL(activeEnvironment, `${currentPath}?version=${lastVersionId}`);
redirect(redirectUrl);
}
}
const processes = await getProcesses(activeEnvironment.spaceId, ability, false);
- const folder = await getFolderById(process.folderId, ability);
+ const folder = await getFolderById(process.value.folderId, ability);
+ if (folder.isErr()) return errorResponse(folder);
// const rawRoles = activeEnvironment.isOrganization
// ? await getRolesWithMembers(activeEnvironment.spaceId, ability)
@@ -70,15 +79,25 @@ const ProcessComponent = async (props: ProcessComponentProps) => {
// return acc;
// }, {} as UserType);
- if (!ability.can('view', toCaslResource('Process', process))) {
+ if (!ability.can('view', toCaslResource('Process', process.value))) {
throw new UnauthorizedError();
}
- const selectedVersionBpmn = selectedVersionId
- ? await getProcessBPMN(processId, environmentId, selectedVersionId)
- : process.bpmn;
+ let selectedVersionBpmn;
+ if (selectedVersionId) {
+ const bpmn = await getProcessBPMN(processId, environmentId, selectedVersionId);
+ // TODO: don't use server action
+ if (isUserErrorResponse(bpmn)) {
+ return errorResponse(err());
+ }
+
+ selectedVersionBpmn = bpmn;
+ } else {
+ selectedVersionBpmn = process.value.bpmn;
+ }
+
const selectedVersion = selectedVersionId
- ? process.versions.find((version) => version.id === selectedVersionId)
+ ? process.value.versions.find((version) => version.id === selectedVersionId)
: undefined;
// Since the user is able to minimize and close the page, everything is in a
@@ -86,8 +105,8 @@ const ProcessComponent = async (props: ProcessComponentProps) => {
return (
<>
{
modelerComponent={
}
timelineComponent={
}
/>
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/planned-cost-input.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/planned-cost-input.tsx
index ce41bf94a..9d03e0a67 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/planned-cost-input.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/planned-cost-input.tsx
@@ -1,5 +1,4 @@
import { Input, Select } from 'antd';
-import { EditOutlined } from '@ant-design/icons';
import React, { useEffect, useState } from 'react';
import styles from './planned-cost-input.module.scss';
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts
index 8639bc654..e9f381cdf 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/potentialOwner-server-action.ts
@@ -3,17 +3,26 @@
import { getCurrentEnvironment, getCurrentUser } from '@/components/auth';
import { getRolesWithMembers } from '@/lib/data/db/iam/roles';
import { RoleType, UserType } from './use-potentialOwner-store';
+import { getErrorMessage, userError } from '@/lib/server-error-handling/user-error';
export const fetchPotentialOwner = async (environmentId: string) => {
const user: UserType = {};
const roles: RoleType = {};
if (environmentId) {
- const { ability, activeEnvironment } = await getCurrentEnvironment(environmentId);
+ const currentSpace = await getCurrentEnvironment(environmentId);
+ if (currentSpace.isErr()) {
+ return userError(getErrorMessage(currentSpace.error));
+ }
+
+ const { ability, activeEnvironment } = currentSpace.value;
if (activeEnvironment.isOrganization) {
const rawRoles = await getRolesWithMembers(activeEnvironment.spaceId, ability);
+ if (rawRoles.isErr()) {
+ return userError(getErrorMessage(rawRoles.error));
+ }
- rawRoles.forEach((role) => {
+ rawRoles.value.forEach((role) => {
roles[role.id] = role.name;
role.members.forEach((member) => {
@@ -26,8 +35,12 @@ export const fetchPotentialOwner = async (environmentId: string) => {
} else {
// make sure to get the current user that might not be assigned to any role
const u = await getCurrentUser();
- if (u.session?.user) {
- const currUser = u.session.user;
+ if (u.isErr()) {
+ return userError(getErrorMessage(u.error));
+ }
+
+ if (u.value.session?.user) {
+ const currUser = u.value.session.user;
if (!currUser.isGuest) {
user[currUser.id] = {
userName: currUser.username,
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor-environment.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor-environment.tsx
index a1d1bddf8..abbb95a93 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor-environment.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor-environment.tsx
@@ -11,7 +11,7 @@ import { getFolderScriptTasks, getFolderPathScriptTasks } from '@/lib/data/proce
import styles from './tab-bar-height.module.scss';
import { FolderTree, TreeNode as FolderTreeNode, generateTreeNode } from '@/components/FolderTree';
import { useQuery } from '@tanstack/react-query';
-import { isUserErrorResponse } from '@/lib/user-error';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
import type { FolderContentWithScriptTasks } from '@/lib/data/db/process';
import { Folder } from '@/lib/data/folder-schema';
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor.tsx
index 01ac9ee4c..bdc0a17b6 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/script-task-editor/script-task-editor.tsx
@@ -1,14 +1,6 @@
'use client';
-import {
- useCallback,
- useEffect,
- useImperativeHandle,
- useMemo,
- useRef,
- useState,
- forwardRef,
-} from 'react';
+import { useEffect, useImperativeHandle, useMemo, useRef, useState, forwardRef } from 'react';
import dynamic from 'next/dynamic';
import {
Button,
@@ -39,7 +31,11 @@ import { useEnvironment } from '@/components/auth-can';
import { generateScriptTaskFileName } from '@proceed/bpmn-helper';
import { type BlocklyEditorRefType } from './blockly-editor';
import { useQuery } from '@tanstack/react-query';
-import { getErrorMessage, isUserErrorResponse, userError } from '@/lib/user-error';
+import {
+ getErrorMessage,
+ isUserErrorResponse,
+ userError,
+} from '@/lib/server-error-handling/user-error';
import { wrapServerCall } from '@/lib/wrap-server-call';
import useProcessVariables from '../use-process-variables';
import ProcessVariableForm from '../variable-definition/process-variable-form';
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/use-potentialOwner-store.ts b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/use-potentialOwner-store.ts
index 220baf4c5..0722f8435 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/use-potentialOwner-store.ts
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/use-potentialOwner-store.ts
@@ -3,6 +3,7 @@ import { immer } from 'zustand/middleware/immer';
import { useEffect } from 'react';
import { fetchPotentialOwner } from './potentialOwner-server-action';
import { useEnvironment } from '@/components/auth-can';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
export type UserType = {
[key: string]: {
@@ -50,7 +51,10 @@ export const useInitialisePotentialOwnerStore = () => {
const environment = useEnvironment();
useEffect(() => {
const initialiseStore = async () => {
- const { user, roles } = await fetchPotentialOwner(environment.spaceId);
+ const response = await fetchPotentialOwner(environment.spaceId);
+ if (isUserErrorResponse(response)) return;
+
+ const { user, roles } = response;
const store = usePotentialOwnerStore.getState();
store.setUser(user);
store.setRoles(roles);
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/user-task-editor.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/user-task-editor.tsx
index 1f53859b1..a40b29373 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/user-task-editor.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/user-task-editor.tsx
@@ -318,4 +318,6 @@ const UserTaskEditorModal: React.FC = ({ processId, op
);
};
+UserTaskEditor.displayName = 'UserTaskEditor';
+
export default UserTaskEditorModal;
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/folder/[folderId]/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/folder/[folderId]/page.tsx
index 88e89c7cc..b66d67acd 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/folder/[folderId]/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/[mode]/folder/[folderId]/page.tsx
@@ -16,32 +16,37 @@ import EllipsisBreadcrumb from '@/components/ellipsis-breadcrumb';
import { ComponentProps } from 'react';
import { spaceURL } from '@/lib/utils';
import { getFolderById, getRootFolder, getFolderContents } from '@/lib/data/db/folders';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
export type ListItem = ProcessMetadata | (Folder & { type: 'folder' });
const ProcessesPage = async (props: {
params: Promise<{ environmentId: string; folderId?: string; mode: string }>;
}) => {
const params = await props.params;
-
- const { ability, activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) return errorResponse(currentSpace);
+ const { ability, activeEnvironment } = currentSpace.value;
const favs = await getUsersFavourites();
const rootFolder = await getRootFolder(activeEnvironment.spaceId, ability);
+ if (rootFolder.isErr()) return errorResponse(rootFolder);
const folder = await getFolderById(
- params.folderId ? decodeURIComponent(params.folderId) : rootFolder.id,
+ params.folderId ? decodeURIComponent(params.folderId) : rootFolder.value.id,
);
+ if (folder.isErr()) return errorResponse(folder);
- const folderContents = await getFolderContents(folder.id, ability);
+ const folderContents = await getFolderContents(folder.value.id, ability);
+ if (folderContents.isErr()) return errorResponse(folderContents);
const isListView = params.mode === 'list';
const folderContentsFiltered = isListView
- ? folderContents.filter(
+ ? folderContents.value.filter(
(folderContent) => folderContent.type === 'folder' || folderContent.versions.length > 0,
)
- : folderContents;
+ : folderContents.value;
const hasNoReleasedProcesses = isListView
? folderContentsFiltered.every((item) => item.type === 'folder')
@@ -49,19 +54,32 @@ const ProcessesPage = async (props: {
const pathToFolder: ComponentProps['items'] = [];
const wrappingFolderIds = [] as string[];
- let currentFolder: Folder | null = folder;
+ let currentFolder: Folder | null = folder.value;
do {
pathToFolder.push({
title: (
- {currentFolder.parentId ? currentFolder.name : isListView ? 'List' : 'Editor'}
+ {currentFolder?.parentId ? currentFolder?.name : isListView ? 'List' : 'Editor'}
),
});
if (currentFolder) wrappingFolderIds.push(currentFolder.id);
- currentFolder = currentFolder.parentId ? await getFolderById(currentFolder.parentId) : null;
+
+ if (currentFolder?.parentId) {
+ const result = await getFolderById(currentFolder.parentId);
+ if (result.isErr()) {
+ return errorResponse(result);
+ }
+
+ currentFolder = result.value;
+ } else {
+ currentFolder = null;
+ }
} while (currentFolder);
pathToFolder.reverse();
wrappingFolderIds.reverse();
@@ -71,11 +89,11 @@ const ProcessesPage = async (props: {
- {folder.parentId && (
+ {folder.value.parentId && (
} type="text">
@@ -90,10 +108,10 @@ const ProcessesPage = async (props: {
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/layout.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/layout.tsx
index cf328d5b7..d25f7d8d9 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/processes/layout.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/processes/layout.tsx
@@ -2,6 +2,7 @@ import React from 'react';
import { getSpaceSettingsValues } from '@/lib/data/db/space-settings';
import { notFound } from 'next/navigation';
import { getCurrentEnvironment } from '@/components/auth';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
type DocumentationLayoutProps = {
params: Promise<{ environmentId: string }>;
@@ -11,15 +12,24 @@ const DocumentationLayout: React.FC = async (props) =>
const params = await props.params;
const { children } = props;
-
- const { activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment } = currentSpace.value;
const documentationSettings = await getSpaceSettingsValues(
activeEnvironment.spaceId,
'process-documentation',
);
+ if (documentationSettings.isErr()) {
+ return errorResponse(documentationSettings);
+ }
- if (documentationSettings.active === false || documentationSettings.editor?.active === false) {
+ if (
+ documentationSettings.value.active === false ||
+ documentationSettings.value.editor?.active === false
+ ) {
return notFound();
}
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/profile/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/profile/page.tsx
index 1437d4a1b..1ef0e1e88 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/profile/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/profile/page.tsx
@@ -4,20 +4,32 @@ import Content from '@/components/content';
import { getUserById, getUserPassword } from '@/lib/data/db/iam/users';
import { notFound } from 'next/navigation';
import { env } from '@/lib/ms-config/env-vars';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const ProfilePage = async () => {
- const { userId } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { userId } = currentUser.value;
//TODO take guest into consideration
const userData = await getUserById(userId);
- const userHasPassword = !!(await getUserPassword(userId));
+ if (userData.isErr()) return errorResponse(userData);
+
+ if (!userData.value) return notFound();
+
+ const userHasPassword = await getUserPassword(userId);
+ if (userHasPassword.isErr()) {
+ return errorResponse(userHasPassword);
+ }
if (!env.PROCEED_PUBLIC_IAM_ACTIVE) return notFound();
return (
-
+
);
};
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/profile/user-profile.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/profile/user-profile.tsx
index 1076610c0..ca81622ee 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/profile/user-profile.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/profile/user-profile.tsx
@@ -33,7 +33,7 @@ import ImageUpload, { fallbackImage } from '@/components/image-upload';
import { EntityType } from '@/lib/helpers/fileManagerHelpers';
import { useFileManager } from '@/lib/useFileManager';
import ChangeUserPasswordModal from './change-password-modal';
-import { isUserErrorResponse } from '@/lib/user-error';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
const UserProfile: FC<{ userData: User; userHasPassword: boolean }> = ({
userData,
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@generalSettings/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@generalSettings/page.tsx
index b72f40fdd..334551204 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@generalSettings/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@generalSettings/page.tsx
@@ -4,16 +4,18 @@ import SettingsInjector from '../settings-injector';
import { SettingGroup } from '../type-util';
import Wrapper from './wrapper';
import db from '@/lib/data/db';
-import { SpaceNotFoundError } from '@/lib/errors';
-import { getMSConfig } from '@/lib/ms-config/ms-config';
+import { SpaceNotFoundError } from '@/lib/server-error-handling/errors';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const Page = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
const {
- ability,
activeEnvironment: { spaceId },
- } = await getCurrentEnvironment(params.environmentId);
- //if (!ability.can('update', 'Environment')) return null;
+ } = currentSpace.value;
const spaceLogo = await db.space.findUnique({
where: { id: spaceId },
@@ -57,7 +59,8 @@ const Page = async (props: { params: Promise<{ environmentId: string }> }) => {
};
// Read config values from the db and write them to the settings object
- await populateSpaceSettingsGroup(spaceId, settings);
+ const res = await populateSpaceSettingsGroup(spaceId, settings);
+ if (res.isErr()) return errorResponse(res);
return (
<>
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processAutomation/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processAutomation/page.tsx
index 584bbaa0c..325fe3006 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processAutomation/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processAutomation/page.tsx
@@ -4,18 +4,23 @@ import SettingsInjector from '../settings-injector';
import { settings } from './settings';
import Wrapper from './wrapper';
import { getMSConfig } from '@/lib/ms-config/ms-config';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const Page = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
const msConfig = await getMSConfig();
if (!msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE) return null;
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
const {
- ability,
activeEnvironment: { spaceId },
- } = await getCurrentEnvironment(params.environmentId);
+ } = currentSpace.value;
- await populateSpaceSettingsGroup(spaceId, settings);
+ const res = await populateSpaceSettingsGroup(spaceId, settings);
+ if (res.isErr()) return errorResponse(res);
return (
<>
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processDocumentation/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processDocumentation/page.tsx
index f2a9c960c..3e0d25adf 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processDocumentation/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/@processDocumentation/page.tsx
@@ -3,15 +3,21 @@ import { getCurrentEnvironment } from '@/components/auth';
import SettingsInjector from '../settings-injector';
import Wrapper from './wrapper';
import { getSettings } from './settings';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const Page = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
const {
activeEnvironment: { spaceId },
- } = await getCurrentEnvironment(params.environmentId);
+ } = currentSpace.value;
const settings = await getSettings();
- await populateSpaceSettingsGroup(spaceId, settings);
+ const res = await populateSpaceSettingsGroup(spaceId, settings);
+ if (res.isErr()) return errorResponse(res);
return (
<>
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/layout.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/layout.tsx
index e0802ecd3..b546b0864 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/settings/layout.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/settings/layout.tsx
@@ -2,14 +2,20 @@ import React from 'react';
import Content from '@/components/content';
import SettingsPage from './settings-page';
+import { getCurrentEnvironment } from '@/components/auth';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
-export default function Layout({
+export default async function Layout({
params,
...children
}: {
params: Promise<{ environmentId: string }>;
}) {
// TODO: check if the user has the rights to change the settings
+ const currentSpace = await getCurrentEnvironment((await params).environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
return (
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/spaces/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/spaces/page.tsx
index f14065d9b..1fe1f1227 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/spaces/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/spaces/page.tsx
@@ -5,17 +5,37 @@ import { getUserOrganizationEnvironments } from '@/lib/data/db/iam/memberships';
import EnvironmentsPage from './environments-page';
import { getUserById } from '@/lib/data/db/iam/users';
import UnauthorizedFallback from '@/components/unauthorized-fallback';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { Result } from 'neverthrow';
const Page = async () => {
- const { userId } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { userId } = currentUser.value;
const user = await getUserById(userId);
- if (user?.isGuest) return ;
+ if (user.isErr()) return errorResponse(user);
+ if (user.value?.isGuest) return ;
const environmentIds = await getUserOrganizationEnvironments(userId);
- const userSpaces = (await Promise.all(
- environmentIds.map((environmentId: string) => getEnvironmentById(environmentId)),
- )) as { id: string; name: string; description: string; isOrganization: boolean }[];
+ if (environmentIds.isErr()) return errorResponse(environmentIds);
+
+ const _userSpaces = Result.combine(
+ await Promise.all(
+ environmentIds.value.map((environmentId: string) => getEnvironmentById(environmentId)),
+ ),
+ );
+ if (_userSpaces.isErr()) return errorResponse(_userSpaces);
+
+ const userSpaces = _userSpaces.value as {
+ id: string;
+ name: string;
+ description: string;
+ isOrganization: boolean;
+ }[];
+
userSpaces.unshift({
id: userId,
name: 'My Personal Space',
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/tasklist/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/tasklist/page.tsx
index 2b2df6bda..876009f48 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/tasklist/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/tasklist/page.tsx
@@ -9,6 +9,7 @@ import { getUserRoles } from '@/lib/data/db/iam/roles';
import { truthyFilter } from '@/lib/typescript-utils';
import { getSpaceSettingsValues } from '@/lib/data/db/space-settings';
import { getUsersInSpace } from '@/lib/data/db/iam/memberships';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const TasklistPage = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
@@ -17,7 +18,11 @@ const TasklistPage = async (props: { params: Promise<{ environmentId: string }>
return notFound();
}
- const { userId, user: userData } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { userId, user: userData } = currentUser.value;
if (!userData || userData?.isGuest) {
return (
@@ -29,13 +34,24 @@ const TasklistPage = async (props: { params: Promise<{ environmentId: string }>
);
}
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
const {
ability,
activeEnvironment: { spaceId, isOrganization },
- } = await getCurrentEnvironment(params.environmentId);
+ } = currentSpace.value;
const automationSettings = await getSpaceSettingsValues(spaceId, 'process-automation');
- if (automationSettings.active === false || automationSettings.tasklist?.active === false) {
+ if (automationSettings.isErr()) {
+ return errorResponse(automationSettings);
+ }
+
+ if (
+ automationSettings.value.active === false ||
+ automationSettings.value.tasklist?.active === false
+ ) {
return notFound();
}
@@ -50,8 +66,11 @@ const TasklistPage = async (props: { params: Promise<{ environmentId: string }>
}
const spaceUsers = await getUsersInSpace(spaceId, ability);
+ if (spaceUsers.isErr()) {
+ return errorResponse(spaceUsers);
+ }
const users = Object.fromEntries(
- spaceUsers.map((member) => [
+ spaceUsers.value.map((member) => [
member.id,
{
userName: member.username || undefined,
@@ -66,13 +85,17 @@ const TasklistPage = async (props: { params: Promise<{ environmentId: string }>
}
const userRoles = await getUserRoles(userId, spaceId, ability);
+ if (userRoles.isErr()) {
+ return errorResponse(userRoles);
+ }
+
userTasks = userTasks.filter((uT) => {
const utRoles = uT.potentialOwners?.roles || [];
const utUsers = uT.potentialOwners?.user || [];
if (!utUsers.length && !utRoles.length) return true;
const userCanOwn = utUsers.some((id) => id === userId);
- const userRoleCanOwn = utRoles.some((id) => userRoles.some((role) => role.id === id));
+ const userRoleCanOwn = utRoles.some((id) => userRoles.value.some((role) => role.id === id));
return userCanOwn || userRoleCanOwn;
});
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/[formId]/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/[formId]/page.tsx
index 79546a104..6676ecc91 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/[formId]/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/[formId]/page.tsx
@@ -5,16 +5,27 @@ import { getSpaceSettingsValues } from '@/lib/data/db/space-settings';
import { Result } from 'antd';
import { notFound } from 'next/navigation';
import FormView from './form-view';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const FormPage = async (props: { params: Promise<{ environmentId: string; formId: string }> }) => {
const params = await props.params;
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
const {
activeEnvironment: { spaceId },
- } = await getCurrentEnvironment(params.environmentId);
+ } = currentSpace.value;
const automationSettings = await getSpaceSettingsValues(spaceId, 'process-automation');
+ if (automationSettings.isErr()) {
+ return errorResponse(automationSettings);
+ }
- if (automationSettings.active === false || automationSettings.tasklist?.active === false) {
+ if (
+ automationSettings.value.active === false ||
+ automationSettings.value.tasklist?.active === false
+ ) {
return notFound();
}
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/form-list.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/form-list.tsx
index 97c96a8ed..754c90d28 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/form-list.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/form-list.tsx
@@ -66,7 +66,7 @@ const FormListEntryLink: React.FC<
}>
> = ({ children, data, style, className }) => {
return (
-
+
{children}
);
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/layout.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/layout.tsx
index 1c6bcdeee..61ec92c79 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/layout.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/layout.tsx
@@ -3,12 +3,13 @@ import { getSpaceSettingsValues } from '@/lib/data/db/space-settings';
import { notFound } from 'next/navigation';
import { getCurrentEnvironment } from '@/components/auth';
import { getMSConfig } from '@/lib/ms-config/ms-config';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
-type DocumentationLayoutProps = {
+type TaskEditorLayoutProps = {
params: Promise<{ environmentId: string }>;
} & React.PropsWithChildren;
-const TaskEditorLayout: React.FC = async (props) => {
+const TaskEditorLayout: React.FC = async (props) => {
const params = await props.params;
const { children } = props;
@@ -18,14 +19,24 @@ const TaskEditorLayout: React.FC = async (props) => {
return notFound();
}
- const { activeEnvironment } = await getCurrentEnvironment(params.environmentId);
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
+ const { activeEnvironment } = currentSpace.value;
const automationSettings = await getSpaceSettingsValues(
activeEnvironment.spaceId,
'process-automation',
);
+ if (automationSettings.isErr()) {
+ return errorResponse(automationSettings);
+ }
- if (automationSettings.active === false || automationSettings.task_editor?.active === false) {
+ if (
+ automationSettings.value.active === false ||
+ automationSettings.value.task_editor?.active === false
+ ) {
return notFound();
}
diff --git a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/page.tsx b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/page.tsx
index eeba40c55..e11ccbd96 100644
--- a/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/page.tsx
+++ b/src/management-system-v2/app/(dashboard)/[environmentId]/tasks/page.tsx
@@ -5,16 +5,27 @@ import { Result, Space } from 'antd';
import { notFound } from 'next/navigation';
import FormList from './form-list';
import { getHtmlForms } from '@/lib/data/html-forms';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const FormsPage = async (props: { params: Promise<{ environmentId: string }> }) => {
const params = await props.params;
+ const currentSpace = await getCurrentEnvironment(params.environmentId);
+ if (currentSpace.isErr()) {
+ return errorResponse(currentSpace);
+ }
const {
activeEnvironment: { spaceId },
- } = await getCurrentEnvironment(params.environmentId);
+ } = currentSpace.value;
const automationSettings = await getSpaceSettingsValues(spaceId, 'process-automation');
+ if (automationSettings.isErr()) {
+ return errorResponse(automationSettings);
+ }
- if (automationSettings.active === false || automationSettings.tasklist?.active === false) {
+ if (
+ automationSettings.value.active === false ||
+ automationSettings.value.tasklist?.active === false
+ ) {
return notFound();
}
diff --git a/src/management-system-v2/app/accept-invitation/page.tsx b/src/management-system-v2/app/accept-invitation/page.tsx
index ce70b3fe2..a00ff33bc 100644
--- a/src/management-system-v2/app/accept-invitation/page.tsx
+++ b/src/management-system-v2/app/accept-invitation/page.tsx
@@ -1,13 +1,9 @@
import { getCurrentUser } from '@/components/auth';
import Content from '@/components/content';
-import { getEnvironmentById } from '@/lib/data/db/iam/environments';
-import { addMember, isMember } from '@/lib/data/db/iam/memberships';
-import { addRoleMappings } from '@/lib/data/db/iam/role-mappings';
-import { getRoleById } from '@/lib/data/db/iam/roles';
-import { getUserByEmail } from '@/lib/data/db/iam/users';
import { acceptInvitation, getInvitation as getInvitationFromToken } from '@/lib/invitation-tokens';
import { Result, ResultProps } from 'antd';
import { redirect } from 'next/navigation';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
function Error(props: ResultProps) {
return (
@@ -19,7 +15,11 @@ function Error(props: ResultProps) {
export default async function IvitationPage(props: { searchParams: Promise<{ token: string }> }) {
const searchParams = await props.searchParams;
- const { session } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { session } = currentUser.value;
if (!session)
redirect(
`/api/auth/signin?callbackUrl=${encodeURIComponent('/accept-invitation?token=' + searchParams.token)}`,
diff --git a/src/management-system-v2/app/admin/engines/[dbEngineId]/page.tsx b/src/management-system-v2/app/admin/engines/[dbEngineId]/page.tsx
index a1bde18f7..9fc34eba3 100644
--- a/src/management-system-v2/app/admin/engines/[dbEngineId]/page.tsx
+++ b/src/management-system-v2/app/admin/engines/[dbEngineId]/page.tsx
@@ -9,6 +9,7 @@ import { type Engine } from '@/lib/engines/machines';
import { getDbEngineById } from '@/lib/data/db/engines';
import { getMSConfig } from '@/lib/ms-config/ms-config';
import EngineDashboard from '@/components/engine-dashboard/server-component';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
export type TableEngine = Engine & { id: string };
@@ -22,11 +23,18 @@ export default async function EnginesPage(props: {
if (!msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE) return notFound();
const user = await getCurrentUser();
- if (!user.systemAdmin) redirect('/');
+ if (user.isErr()) {
+ return errorResponse(user);
+ }
+
+ if (!user.value.systemAdmin) redirect('/');
const dbEngineId = decodeURIComponent(params.dbEngineId);
const engineId = decodeURIComponent(searchParams.engineId || '');
const dbEngine = await getDbEngineById(dbEngineId, null, undefined, 'dont-check');
+ if (dbEngine.isErr()) {
+ return errorResponse(dbEngine);
+ }
return (
diff --git a/src/management-system-v2/app/admin/engines/page.tsx b/src/management-system-v2/app/admin/engines/page.tsx
index c44ba343d..4a6738e0f 100644
--- a/src/management-system-v2/app/admin/engines/page.tsx
+++ b/src/management-system-v2/app/admin/engines/page.tsx
@@ -8,6 +8,7 @@ import { Suspense } from 'react';
import { getMSConfig } from '@/lib/ms-config/ms-config';
import { savedEnginesToEngines } from '@/lib/engines/saved-engines-helpers';
import { Engine as DBEngine } from '@prisma/client';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const getEngineStatus = async (engine: DBEngine) => {
const engines = await savedEnginesToEngines([engine]);
@@ -23,12 +24,19 @@ const EnginesPage = async () => {
const msConfig = await getMSConfig();
if (!msConfig.PROCEED_PUBLIC_PROCESS_AUTOMATION_ACTIVE) return notFound();
- const { systemAdmin } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { systemAdmin } = currentUser.value;
if (!systemAdmin) return redirect('/');
const engines = await getDbEngines(null, undefined, systemAdmin);
+ if (engines.isErr()) {
+ return errorResponse(engines);
+ }
- const enginesWithStatus = engines.map((engine) => {
+ const enginesWithStatus = engines.value.map((engine) => {
return {
...engine,
status: (
diff --git a/src/management-system-v2/app/admin/ms-config/page.tsx b/src/management-system-v2/app/admin/ms-config/page.tsx
index b7173673c..e4322bddc 100644
--- a/src/management-system-v2/app/admin/ms-config/page.tsx
+++ b/src/management-system-v2/app/admin/ms-config/page.tsx
@@ -5,8 +5,9 @@ import { redirect } from 'next/navigation';
import { Suspense } from 'react';
import { getMSConfig, updateMSConfig, writeDefaultMSConfig } from '@/lib/ms-config/ms-config';
import MSConfigForm from './ms-config-form';
-import { userError } from '@/lib/user-error';
+import { userError } from '@/lib/server-error-handling/user-error';
import { SettingGroup } from '@/app/(dashboard)/[environmentId]/settings/type-util';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
async function saveConfig(newConfig: Record) {
'use server';
@@ -30,7 +31,10 @@ export type restoreDefaultValues = typeof restoreDefaultValues;
async function ConfigPage() {
const user = await getCurrentUser();
- if (!user.session || !user.systemAdmin) redirect('/');
+ if (user.isErr()) {
+ return errorResponse(user);
+ }
+ if (!user.value.session || !user.value.systemAdmin) redirect('/');
const _msConfig = await getMSConfig();
diff --git a/src/management-system-v2/app/admin/page.tsx b/src/management-system-v2/app/admin/page.tsx
index b5201dbe1..93e2674ce 100644
--- a/src/management-system-v2/app/admin/page.tsx
+++ b/src/management-system-v2/app/admin/page.tsx
@@ -5,13 +5,16 @@ import { Card, Space, Statistic } from 'antd';
import { redirect } from 'next/navigation';
import { CSSProperties } from 'react';
import db from '@/lib/data/db';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
export default async function AdminDashboard() {
const user = await getCurrentUser();
- if (!user.session) redirect('/');
+ if (user.isErr()) return errorResponse(user);
+ if (!user.value.session) redirect('/');
- const adminData = await getSystemAdminByUserId(user.userId);
- if (!adminData) redirect('/');
+ const adminData = await getSystemAdminByUserId(user.value.userId);
+ if (adminData.isErr()) return errorResponse(adminData);
+ if (!adminData.value) redirect('/');
// NOTE: this should be replaced to a more efficient count query
// when the data persistence layer is implemented
diff --git a/src/management-system-v2/app/admin/spaces/page.tsx b/src/management-system-v2/app/admin/spaces/page.tsx
index 552e8bbc3..12c09b09f 100644
--- a/src/management-system-v2/app/admin/spaces/page.tsx
+++ b/src/management-system-v2/app/admin/spaces/page.tsx
@@ -7,7 +7,7 @@ import {
import { getSystemAdminByUserId } from '@/lib/data/db/iam/system-admins';
import { redirect } from 'next/navigation';
import SpacesTable from './spaces-table';
-import { UserErrorType, userError } from '@/lib/user-error';
+import { UserErrorType, userError } from '@/lib/server-error-handling/user-error';
import Content from '@/components/content';
import { getSpaceRepresentation, getUserName } from './space-representation';
import { getUserOrganizationEnvironments } from '@/lib/data/db/iam/memberships';
@@ -17,10 +17,16 @@ import { ReactNode } from 'react';
import { LeftOutlined } from '@ant-design/icons';
import { User } from '@/lib/data/user-schema';
import { Environment } from '@/lib/data/environment-schema';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { Result } from 'neverthrow';
async function deleteSpace(spaceIds: string[]) {
'use server';
- const { systemAdmin } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { systemAdmin } = currentUser.value;
if (!systemAdmin) return userError('Not a system admin', UserErrorType.PermissionError);
// TODO: decide what to do if space is a personal space
@@ -31,9 +37,12 @@ export type deleteSpace = typeof deleteSpace;
export default async function SysteAdminDashboard(props: { params?: Promise<{ userId: string }> }) {
const params = await props.params;
const user = await getCurrentUser();
- if (!user.session) redirect('/');
- const adminData = getSystemAdminByUserId(user.userId);
- if (!adminData) redirect('/');
+ if (user.isErr()) return errorResponse(user);
+ if (!user.value.session) redirect('/');
+
+ const adminData = await getSystemAdminByUserId(user.value.userId);
+ if (adminData.isErr()) return errorResponse(adminData);
+ if (!adminData.value) redirect('/');
let spacesTableRepresentation;
let title: ReactNode = 'MS Spaces';
@@ -41,37 +50,52 @@ export default async function SysteAdminDashboard(props: { params?: Promise<{ us
if (params?.userId) {
const userId = decodeURIComponent(params.userId);
const user = await getUserById(userId, { throwIfNotFound: false });
- if (!user) redirect('/admin/spaces');
+ if (user.isErr()) {
+ return errorResponse(user);
+ }
+ if (!user.value) redirect('/admin/spaces');
title = (
} href="/admin/spaces">
Back to MS spaces
- {`${getUserName(user as User)}'s Spaces`}
+ {`${getUserName(user.value as User)}'s Spaces`}
);
- const userSpaces: any[] = [await getEnvironmentById(userId)];
+ const personalEnvironment = await getEnvironmentById(userId);
+ if (personalEnvironment.isErr()) return errorResponse(personalEnvironment);
+ const userSpaces: any[] = [personalEnvironment.value];
+
const userOrgEnvs = await getUserOrganizationEnvironments(userId);
- const orgEnvironmentsPromises = userOrgEnvs.map(async (environmentId) => {
+ if (userOrgEnvs.isErr()) return errorResponse(userOrgEnvs);
+ const orgEnvironmentsPromises = userOrgEnvs.value.map(async (environmentId) => {
return await getEnvironmentById(environmentId);
});
- const orgEnvironments = await Promise.all(orgEnvironmentsPromises);
+ const orgEnvironments = Result.combine(await Promise.all(orgEnvironmentsPromises));
+ if (orgEnvironments.isErr()) {
+ return errorResponse(orgEnvironments);
+ }
- userSpaces.push(...orgEnvironments);
+ userSpaces.push(...orgEnvironments.value);
spacesTableRepresentation = await getSpaceRepresentation(userSpaces);
} else {
- spacesTableRepresentation = await getSpaceRepresentation(
- (await getEnvironments()) as Environment[],
- );
+ const environments = await getEnvironments();
+ if (environments.isErr()) {
+ return errorResponse(environments);
+ }
+
+ spacesTableRepresentation = await getSpaceRepresentation(environments.value as Environment[]);
}
+ if (spacesTableRepresentation.isErr()) return errorResponse(spacesTableRepresentation);
+
return (
-
+
);
}
diff --git a/src/management-system-v2/app/admin/spaces/space-representation.ts b/src/management-system-v2/app/admin/spaces/space-representation.ts
index a5fb194de..4ffc27942 100644
--- a/src/management-system-v2/app/admin/spaces/space-representation.ts
+++ b/src/management-system-v2/app/admin/spaces/space-representation.ts
@@ -2,6 +2,7 @@ import 'server-only';
import { Environment } from '@/lib/data/environment-schema';
import { getUserById } from '@/lib/data/db/iam/users';
import { User } from '@/lib/data/user-schema';
+import { Result, err, ok } from 'neverthrow';
export function getUserName(user: User) {
if (user.isGuest) return 'Guest';
@@ -12,35 +13,41 @@ export function getUserName(user: User) {
}
export type SpaceRepresentation = { id: string; name: string; type: string; owner: string };
-export function getSpaceRepresentation(spaces: Environment[]): Promise {
- return Promise.all(
- spaces.map(async (space) => {
- if (space.isOrganization && !space.isActive)
- return {
- id: space.id,
- name: `${space.name}`,
- type: 'Organization',
- owner: 'None',
- };
+export async function getSpaceRepresentation(spaces: Environment[]) {
+ return Result.combine(
+ await Promise.all(
+ spaces.map(async (space) => {
+ if (space.isOrganization && !space.isActive) {
+ return ok({
+ id: space.id,
+ name: `${space.name}`,
+ type: 'Organization',
+ owner: 'None',
+ });
+ }
+
+ const user = await getUserById(space.isOrganization ? space.ownerId : space.id);
+ if (user.isErr()) return user;
+ if (!user.value) err(new Error('Space user not found'));
- const user = await getUserById(space.isOrganization ? space.ownerId : space.id);
- if (!user) throw new Error('Space user not found');
- const userName = getUserName(user as User);
+ const userName = getUserName(user.value as User);
- if (space.isOrganization)
- return {
+ if (space.isOrganization) {
+ return ok({
+ id: space.id,
+ name: `${space.name}`,
+ type: 'Organization',
+ owner: userName,
+ });
+ }
+
+ return ok({
id: space.id,
- name: `${space.name}`,
- type: 'Organization',
+ name: `Personal space: ${userName}`,
+ type: 'Personal space',
owner: userName,
- };
-
- return {
- id: space.id,
- name: `Personal space: ${userName}`,
- type: 'Personal space',
- owner: userName,
- };
- }),
+ });
+ }),
+ ),
);
}
diff --git a/src/management-system-v2/app/admin/systemadmins/page.tsx b/src/management-system-v2/app/admin/systemadmins/page.tsx
index c780385cb..0474caea3 100644
--- a/src/management-system-v2/app/admin/systemadmins/page.tsx
+++ b/src/management-system-v2/app/admin/systemadmins/page.tsx
@@ -9,24 +9,34 @@ import {
} from '@/lib/data/db/iam/system-admins';
import { getUserById, getUsers } from '@/lib/data/db/iam/users';
import { AuthenticatedUser } from '@/lib/data/user-schema';
-import { UserErrorType, userError } from '@/lib/user-error';
+import { UserErrorType, getErrorMessage, userError } from '@/lib/server-error-handling/user-error';
import { notFound, redirect } from 'next/navigation';
import SystemAdminsTable from './admins-table';
import { SystemAdminCreationInput } from '@/lib/data/system-admin-schema';
import { getMSConfig } from '@/lib/ms-config/ms-config';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
+import { Result, ok } from 'neverthrow';
async function deleteAdmins(userIds: string[]) {
'use server';
- const { systemAdmin } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { systemAdmin } = currentUser.value;
if (!systemAdmin || systemAdmin.role !== 'admin')
return userError('Not a system admin', UserErrorType.PermissionError);
try {
for (const userId of userIds) {
const adminMapping = await getSystemAdminByUserId(userId);
- if (!adminMapping) return userError('Admin not found');
+ if (adminMapping.isErr()) {
+ return userError(getErrorMessage(adminMapping.error));
+ }
+ if (!adminMapping.value) return userError('Admin not found');
- deleteSystemAdmin(adminMapping.id);
+ const res = await deleteSystemAdmin(adminMapping.value.id);
+ if (res.isErr()) return userError('Failed to remove admin rights from the user');
}
} catch (e) {
return userError('Something went wrong');
@@ -36,7 +46,11 @@ export type deleteAdmins = typeof deleteAdmins;
async function addAdmin(admins: SystemAdminCreationInput[]) {
'use server';
- const { systemAdmin } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { systemAdmin } = currentUser.value;
if (!systemAdmin || systemAdmin.role !== 'admin')
return userError('Not a system admin', UserErrorType.PermissionError);
@@ -52,16 +66,28 @@ export type addAdmin = typeof addAdmin;
async function getNonAdminUsers(page: number = 1, pageSize: number = 10) {
'use server';
- const { systemAdmin } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+
+ const { systemAdmin } = currentUser.value;
if (!systemAdmin || systemAdmin.role !== 'admin')
return userError('Not a system admin', UserErrorType.PermissionError);
try {
const systemAdmins = await getSystemAdmins();
- const { users, pagination } = await getUsers(page, pageSize);
+ if (systemAdmins.isErr()) {
+ return userError(getErrorMessage(systemAdmins.error));
+ }
+
+ const usersResult = await getUsers(page, pageSize);
+ if (usersResult.isErr()) return userError(getErrorMessage(usersResult.error));
+
+ const { users, pagination } = usersResult.value;
const filteredUsers = users.filter(
- (user) => !user.isGuest && !systemAdmins.some((admin) => admin.userId === user.id),
+ (user) => !user.isGuest && !systemAdmins.value.some((admin) => admin.userId === user.id),
) as AuthenticatedUser[];
const totalFilteredUsers = filteredUsers.length;
@@ -86,27 +112,45 @@ export default async function ManageAdminsPage() {
if (!msConfig.PROCEED_PUBLIC_IAM_ACTIVE) return notFound();
const user = await getCurrentUser();
- if (!user.session) redirect('/');
- const adminData = await getSystemAdminByUserId(user.userId);
- if (!adminData) redirect('/');
- if (adminData.role !== 'admin') return ;
+ if (user.isErr()) return errorResponse(user);
+ if (!user.value.session) redirect('/');
- const getFullSystemAdmins = async (): Promise<(AuthenticatedUser & { role: 'admin' })[]> => {
+ const adminData = await getSystemAdminByUserId(user.value.userId);
+ if (adminData.isErr()) {
+ return errorResponse(adminData);
+ }
+ if (!adminData.value) redirect('/');
+ if (adminData.value.role !== 'admin') return ;
+
+ const getFullSystemAdmins = async () => {
const admins = await getSystemAdmins();
- return Promise.all(
- admins.map(async (admin) => {
- const user = (await getUserById(admin.userId)) as AuthenticatedUser;
- return { ...user, role: admin.role };
- }),
+ if (admins.isErr()) return admins;
+
+ return Result.combine(
+ await Promise.all(
+ admins.value.map(async (admin) => {
+ const user = await getUserById(admin.userId);
+ if (user.isErr()) {
+ return user;
+ }
+
+ // TODO: handle that the user might not be found (can that happen?)
+
+ return ok({ ...(user.value as AuthenticatedUser), role: admin.role });
+ }),
+ ),
);
};
const adminsList = await getFullSystemAdmins();
+ if (adminsList.isErr()) {
+ return errorResponse(adminsList);
+ }
return (
{
- const orgs = (await getUserOrganizationEnvironments(user.id)).length;
- if (orgs > 0) {
- console.log(await getUserOrganizationEnvironments(user.id));
- }
- return user.isGuest
- ? {
- ...user,
- isGuest: false as const,
- email: '',
- username: 'Guest',
- firstName: 'Guest',
- lastName: '',
- orgs,
- }
- : { ...user, orgs };
- }),
+ const processedUsers = Result.combine(
+ await Promise.all(
+ paginatedUsers.map(async (user) => {
+ const userOrgs = await getUserOrganizationEnvironments(user.id);
+ if (userOrgs.isErr()) return userOrgs as Err;
+
+ const orgs = userOrgs.value.length;
+ const ret = user.isGuest
+ ? {
+ ...user,
+ isGuest: false as const,
+ email: '',
+ username: 'Guest',
+ firstName: 'Guest',
+ lastName: '',
+ orgs,
+ }
+ : { ...user, orgs };
+
+ return ok(ret);
+ }),
+ ),
);
+ if (processedUsers.isErr()) {
+ return processedUsers;
+ }
- return {
- users: processedUsers,
+ return ok({
+ users: processedUsers.value,
pagination,
- };
+ });
}
- const { users, pagination } = await getProcessedUsers();
+ const proceedUsers = await getProcessedUsers();
+ if (proceedUsers.isErr()) return errorResponse(proceedUsers);
+
+ const { users } = proceedUsers.value;
return (
diff --git a/src/management-system-v2/app/api/activateenvironment/route.ts b/src/management-system-v2/app/api/activateenvironment/route.ts
index 2f77433bc..238ed8e28 100644
--- a/src/management-system-v2/app/api/activateenvironment/route.ts
+++ b/src/management-system-v2/app/api/activateenvironment/route.ts
@@ -1,5 +1,5 @@
import { auth } from '@/lib/auth';
-import { activateEnvrionment } from '@/lib/data/db/iam/environments';
+import { activateEnvironment } from '@/lib/data/db/iam/environments';
import { UnauthorizedError } from '@/lib/ability/abilityHelper';
import { redirect } from 'next/navigation';
@@ -17,7 +17,11 @@ export const GET = async (req: Request) => {
if (!activationId)
return Response.json({ message: 'No activationId provided' }, { status: 400 });
- await activateEnvrionment(activationId, session.user.id);
+ const res = await activateEnvironment(activationId, session.user.id);
+
+ if (res.isErr()) {
+ return Response.json({ message: 'Error activating environment' }, { status: 500 });
+ }
} catch (e) {
console.error(e);
return Response.json({ message: 'Error activating environment' }, { status: 500 });
diff --git a/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/[imageFileName]/route.ts b/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/[imageFileName]/route.ts
index 14e149006..673bbbca0 100644
--- a/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/[imageFileName]/route.ts
+++ b/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/[imageFileName]/route.ts
@@ -13,137 +13,172 @@ import jwt from 'jsonwebtoken';
import { TokenPayload } from '@/lib/sharing/process-sharing';
import { invalidRequest, readImage } from '../../../../image-helpers';
import { v4 } from 'uuid';
+import { getErrorMessage } from '@/lib/server-error-handling/user-error';
export async function GET(
request: NextRequest,
props: { params: Promise<{ environmentId: string; processId: string; imageFileName: string }> },
) {
- const params = await props.params;
-
- const { environmentId, processId, imageFileName } = params;
-
- const processMeta = await getProcess(processId, false);
-
- if (!processMeta) {
- return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
- });
- }
-
- let canAccess = false;
-
- // if the user is not unauthenticated check if they have access to the process due to being an owner
- if (environmentId !== 'unauthenticated') {
- const { ability } = await getCurrentEnvironment(environmentId);
-
- canAccess = ability.can('view', toCaslResource('Process', processMeta));
- }
-
- // if the user is not an owner check if they have access if a share token is provided in the query data of the url
- const shareToken = request.nextUrl.searchParams.get('shareToken');
- if (!canAccess && shareToken) {
- const key = process.env.SHARING_ENCRYPTION_SECRET!;
- const {
- processId: shareProcessId,
- embeddedMode,
- timestamp,
- } = jwt.verify(shareToken, key!) as TokenPayload;
-
- canAccess =
- !embeddedMode && shareProcessId === processId && timestamp === processMeta.shareTimestamp;
- }
-
- if (!canAccess) {
- return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to view image in this process',
- });
- }
-
- const imageBuffer = await getProcessImage(processId, imageFileName);
-
- const fileType = await fileTypeFromBuffer(imageBuffer);
-
- if (!fileType) {
+ try {
+ const params = await props.params;
+
+ const { environmentId, processId, imageFileName } = params;
+
+ const processMeta = await getProcess(processId, false);
+ if (processMeta.isErr()) throw processMeta.error;
+
+ if (!processMeta.value) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
+
+ let canAccess = false;
+
+ // if the user is not unauthenticated check if they have access to the process due to being an owner
+ if (environmentId !== 'unauthenticated') {
+ const currentEnvironment = await getCurrentEnvironment(environmentId);
+ if (currentEnvironment.isErr()) throw currentEnvironment.error;
+ const { ability } = currentEnvironment.value;
+
+ canAccess = ability.can('view', toCaslResource('Process', processMeta.value));
+ }
+
+ // if the user is not an owner check if they have access if a share token is provided in the query data of the url
+ const shareToken = request.nextUrl.searchParams.get('shareToken');
+ if (!canAccess && shareToken) {
+ const key = process.env.SHARING_ENCRYPTION_SECRET!;
+ const {
+ processId: shareProcessId,
+ embeddedMode,
+ timestamp,
+ } = jwt.verify(shareToken, key!) as TokenPayload;
+
+ canAccess =
+ !embeddedMode &&
+ shareProcessId === processId &&
+ timestamp === processMeta.value.shareTimestamp;
+ }
+
+ if (!canAccess) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to view image in this process',
+ });
+ }
+
+ const imageBuffer = await getProcessImage(processId, imageFileName);
+ if (imageBuffer.isErr()) throw imageBuffer.error;
+
+ const fileType = await fileTypeFromBuffer(imageBuffer.value);
+
+ if (!fileType) {
+ return new NextResponse(null, {
+ status: 415,
+ statusText: 'Can not read file type of requested image',
+ });
+ }
+
+ const headers = new Headers();
+ headers.set('Content-Type', fileType.mime);
+
+ return new NextResponse(imageBuffer.value, { status: 200, statusText: 'OK', headers });
+ } catch (error) {
return new NextResponse(null, {
- status: 415,
- statusText: 'Can not read file type of requested image',
+ status: 500,
+ statusText: getErrorMessage(error),
});
}
-
- const headers = new Headers();
- headers.set('Content-Type', fileType.mime);
-
- return new NextResponse(imageBuffer, { status: 200, statusText: 'OK', headers });
}
export async function PUT(
request: NextRequest,
props: { params: Promise<{ environmentId: string; processId: string; imageFileName: string }> },
) {
- const params = await props.params;
+ try {
+ const params = await props.params;
- const { environmentId, processId, imageFileName } = params;
+ const { environmentId, processId, imageFileName } = params;
- const { ability } = await getCurrentEnvironment(environmentId);
+ const currentEnvironment = await getCurrentEnvironment(environmentId);
+ if (currentEnvironment.isErr()) throw currentEnvironment.error;
+ const { ability } = currentEnvironment.value;
- const process = await getProcess(processId, false);
+ const process = await getProcess(processId, false);
+ if (process.isErr()) throw process.error;
- if (!process) {
- return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
- });
- }
+ if (!process.value) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
- if (!ability.can('view', toCaslResource('Process', process))) {
- return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to view image in this process',
- });
- }
+ if (!ability.can('view', toCaslResource('Process', process.value))) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to view image in this process',
+ });
+ }
- const isInvalidRequest = invalidRequest(request);
- if (isInvalidRequest) return isInvalidRequest;
+ const isInvalidRequest = invalidRequest(request);
+ if (isInvalidRequest) return isInvalidRequest;
- const readImageResult = await readImage(request);
- if (readImageResult.error) return readImageResult.error;
+ const readImageResult = await readImage(request);
+ if (readImageResult.error) return readImageResult.error;
- const newImageFileName = `_image${v4()}.${readImageResult.fileType.ext}`;
+ const newImageFileName = `_image${v4()}.${readImageResult.fileType.ext}`;
- await saveProcessImage(processId, newImageFileName, readImageResult.buffer);
+ await saveProcessImage(processId, newImageFileName, readImageResult.buffer);
- return new NextResponse(newImageFileName, { status: 201, statusText: 'Created' });
+ return new NextResponse(newImageFileName, { status: 201, statusText: 'Created' });
+ } catch (error) {
+ return new NextResponse(null, {
+ status: 500,
+ statusText: getErrorMessage(error),
+ });
+ }
}
export async function DELETE(
request: NextRequest,
props: { params: Promise<{ environmentId: string; processId: string; imageFileName: string }> },
) {
- const params = await props.params;
+ try {
+ const params = await props.params;
- const { environmentId, processId, imageFileName } = params;
+ const { environmentId, processId, imageFileName } = params;
- const { ability } = await getCurrentEnvironment(environmentId);
+ const currentEnvironment = await getCurrentEnvironment(environmentId);
+ if (currentEnvironment.isErr()) throw currentEnvironment.error;
- const process = await getProcess(processId, false);
+ const { ability } = currentEnvironment.value;
- if (!process) {
- return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
- });
- }
+ const process = await getProcess(processId, false);
+ if (process.isErr()) throw process.error;
+
+ if (!process.value) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
- if (!ability.can('delete', toCaslResource('Process', process))) {
+ if (!ability.can('delete', toCaslResource('Process', process.value))) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to delete image in this process',
+ });
+ }
+
+ await deleteProcessImage(processId, imageFileName);
+
+ return new NextResponse(null, { status: 200, statusText: 'OK' });
+ } catch (error) {
return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to delete image in this process',
+ status: 500,
+ statusText: getErrorMessage(error),
});
}
-
- await deleteProcessImage(processId, imageFileName);
-
- return new NextResponse(null, { status: 200, statusText: 'OK' });
}
diff --git a/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/route.ts b/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/route.ts
index 52bb887b1..005ad6402 100644
--- a/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/route.ts
+++ b/src/management-system-v2/app/api/private/[environmentId]/processes/[processId]/images/route.ts
@@ -4,73 +4,94 @@ import { getProcess, getProcessImageFileNames, saveProcessImage } from '@/lib/da
import { NextRequest, NextResponse } from 'next/server';
import { v4 } from 'uuid';
import { invalidRequest, readImage } from '../../../image-helpers';
+import { getErrorMessage } from '@/lib/server-error-handling/user-error';
export async function GET(
request: NextRequest,
props: { params: Promise<{ environmentId: string; processId: string }> },
) {
- const params = await props.params;
+ try {
+ const params = await props.params;
- const { environmentId, processId } = params;
+ const { environmentId, processId } = params;
- const { ability } = await getCurrentEnvironment(environmentId);
+ const currentSpace = await getCurrentEnvironment(environmentId);
+ if (currentSpace.isErr()) throw currentSpace.error;
+ const { ability } = currentSpace.value;
- const process = await getProcess(processId, false);
+ const process = await getProcess(processId, false);
+ if (process.isErr()) throw process.error;
- if (!process) {
- return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
- });
- }
+ if (!process.value) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
+
+ if (!ability.can('view', toCaslResource('Process', process.value))) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to view image filenames in this process',
+ });
+ }
- if (!ability.can('view', toCaslResource('Process', process))) {
+ const fileNames = await getProcessImageFileNames(processId);
+
+ return NextResponse.json(fileNames);
+ } catch (error) {
return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to view image filenames in this process',
+ status: 500,
+ statusText: getErrorMessage(error),
});
}
-
- const fileNames = await getProcessImageFileNames(processId);
-
- return NextResponse.json(fileNames);
}
export async function POST(
request: NextRequest,
props: { params: Promise<{ environmentId: string; processId: string }> },
) {
- const params = await props.params;
+ try {
+ const params = await props.params;
- const { environmentId, processId } = params;
+ const { environmentId, processId } = params;
- const isInvalidRequest = invalidRequest(request);
- if (isInvalidRequest) return isInvalidRequest;
+ const isInvalidRequest = invalidRequest(request);
+ if (isInvalidRequest) return isInvalidRequest;
- const { ability } = await getCurrentEnvironment(environmentId);
+ const currentEnvironment = await getCurrentEnvironment(environmentId);
+ if (currentEnvironment.isErr()) throw currentEnvironment.error;
+ const { ability } = currentEnvironment.value;
- const process = await getProcess(processId, false);
+ const process = await getProcess(processId, false);
+ if (process.isErr()) throw process.error;
- if (!process) {
- return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
- });
- }
+ if (!process.value) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
- if (!ability.can('view', toCaslResource('Process', process))) {
- return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to view image in this process',
- });
- }
+ if (!ability.can('view', toCaslResource('Process', process.value))) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to view image in this process',
+ });
+ }
- const readImageResult = await readImage(request);
- if (readImageResult.error) return readImageResult.error;
+ const readImageResult = await readImage(request);
+ if (readImageResult.error) return readImageResult.error;
- const imageFileName = `_image${v4()}.${readImageResult.fileType.ext}`;
+ const imageFileName = `_image${v4()}.${readImageResult.fileType.ext}`;
- await saveProcessImage(processId, imageFileName, readImageResult.buffer);
+ await saveProcessImage(processId, imageFileName, readImageResult.buffer);
- return new NextResponse(imageFileName, { status: 201, statusText: 'Created' });
+ return new NextResponse(imageFileName, { status: 201, statusText: 'Created' });
+ } catch (error) {
+ return new NextResponse(null, {
+ status: 500,
+ statusText: getErrorMessage(error),
+ });
+ }
}
diff --git a/src/management-system-v2/app/api/private/delete-inactive-guests/route.ts b/src/management-system-v2/app/api/private/delete-inactive-guests/route.ts
index 3bc7cf608..5eded320a 100644
--- a/src/management-system-v2/app/api/private/delete-inactive-guests/route.ts
+++ b/src/management-system-v2/app/api/private/delete-inactive-guests/route.ts
@@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from 'next/server';
import { deleteInactiveGuestUsers } from '@/lib/data/db/iam/users';
// TODO: get this time from the database
-const GUESET_INACTIVE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days
+const GUEST_INACTIVE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days
export async function POST(request: NextRequest) {
try {
@@ -18,11 +18,12 @@ export async function POST(request: NextRequest) {
return NextResponse.json({ error: 'Unauthorized: Invalid Bearer token' }, { status: 403 });
}
- const { count } = await deleteInactiveGuestUsers(GUESET_INACTIVE_TIME);
+ const result = await deleteInactiveGuestUsers(GUEST_INACTIVE_TIME);
+ if (result.isErr()) throw result.error;
return NextResponse.json(
{
- message: `${count} guest users deleted`,
+ message: `${result.value.count} guest users deleted`,
},
{ status: 200 },
);
diff --git a/src/management-system-v2/app/api/private/file-manager/route.ts b/src/management-system-v2/app/api/private/file-manager/route.ts
index 77bf5c752..5d48f4ba7 100644
--- a/src/management-system-v2/app/api/private/file-manager/route.ts
+++ b/src/management-system-v2/app/api/private/file-manager/route.ts
@@ -3,7 +3,6 @@ import { getCurrentEnvironment } from '@/components/auth';
import { toCaslResource } from '@/lib/ability/caslAbility';
import { NextRequest, NextResponse } from 'next/server';
import { Readable } from 'node:stream';
-import type { ReadableStream } from 'node:stream/web';
import jwt from 'jsonwebtoken';
import { TokenPayload } from '@/lib/sharing/process-sharing';
import { getProcess } from '@/lib/data/processes';
@@ -13,244 +12,271 @@ import {
retrieveEntityFile,
saveEntityFileOrGetPresignedUrl,
} from '@/lib/data/file-manager-facade';
+import { getErrorMessage, userError } from '@/lib/server-error-handling/user-error';
const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
const MAX_IMAGE_SIZE = 2 * 1024 * 1024; // 2 MB
export async function GET(request: NextRequest) {
- const searchParams = request.nextUrl.searchParams;
- const entityId = searchParams.get('entityId');
- const entityType = searchParams.get('entityType');
- const environmentId = searchParams.get('environmentId') || 'unauthenticated';
- const filePath = searchParams.get('filePath') || undefined;
- if (
- !entityId ||
- !entityType ||
- !environmentId ||
- (entityType === EntityType.PROCESS && !filePath)
- ) {
- return new NextResponse(null, {
- status: 400,
- statusText: 'entityId, entityType, environmentId and filePath required as URL search params',
- });
- }
-
- if (entityType === EntityType.PROCESS) {
- let canAccess = false;
-
- const processMeta = await getProcess(entityId, environmentId, true); // true --> skip the validity check as it will be done below
- if (!processMeta || 'error' in processMeta) {
+ try {
+ const searchParams = request.nextUrl.searchParams;
+ const entityId = searchParams.get('entityId');
+ const entityType = searchParams.get('entityType');
+ const environmentId = searchParams.get('environmentId') || 'unauthenticated';
+ const filePath = searchParams.get('filePath') || undefined;
+ if (
+ !entityId ||
+ !entityType ||
+ !environmentId ||
+ (entityType === EntityType.PROCESS && !filePath)
+ ) {
return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
+ status: 400,
+ statusText:
+ 'entityId, entityType, environmentId and filePath required as URL search params',
});
}
- if (environmentId !== 'unauthenticated') {
- const { ability } = await getCurrentEnvironment(environmentId);
+ if (entityType === EntityType.PROCESS) {
+ let canAccess = false;
- canAccess = ability.can('view', toCaslResource('Process', processMeta));
- }
+ const processMeta = await getProcess(entityId, environmentId, true); // true --> skip the validity check as it will be done below
+ if (!processMeta || 'error' in processMeta) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
- // if the user is not an owner check if they have access if a share token is provided in the query data of the url
- const shareToken = searchParams.get('shareToken');
- if (!canAccess && shareToken) {
- const key = process.env.SHARING_ENCRYPTION_SECRET!;
- const {
- processId: shareProcessId,
- embeddedMode,
- timestamp,
- } = jwt.verify(shareToken, key!) as TokenPayload;
- canAccess =
- !embeddedMode && shareProcessId === entityId && timestamp === processMeta.shareTimestamp;
- }
+ if (environmentId !== 'unauthenticated') {
+ const currentEnvironment = await getCurrentEnvironment(environmentId);
+ if (currentEnvironment.isErr()) throw currentEnvironment.error;
+ const { ability } = currentEnvironment.value;
- if (!canAccess) {
- return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to access files in this process',
- });
- }
- }
+ canAccess = ability.can('view', toCaslResource('Process', processMeta));
+ }
- try {
- const data = await retrieveEntityFile(entityType as EntityType, entityId, filePath);
+ // if the user is not an owner check if they have access if a share token is provided in the query data of the url
+ const shareToken = searchParams.get('shareToken');
+ if (!canAccess && shareToken) {
+ const key = process.env.SHARING_ENCRYPTION_SECRET!;
+ const {
+ processId: shareProcessId,
+ embeddedMode,
+ timestamp,
+ } = jwt.verify(shareToken, key!) as TokenPayload;
+ canAccess =
+ !embeddedMode && shareProcessId === entityId && timestamp === processMeta.shareTimestamp;
+ }
- const fileType = await fileTypeFromBuffer(data as Buffer);
- if (!fileType) {
- return new NextResponse(null, {
- status: 415,
- statusText: 'Cannot read file type of requested file',
- });
+ if (!canAccess) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to access files in this process',
+ });
+ }
}
- let mimeType: string = fileType.mime;
-
- if (fileType.mime === 'application/xml' && filePath?.endsWith('.svg'))
- mimeType = 'image/svg+xml';
- const headers = new Headers();
- headers.set('Content-Type', mimeType);
- return new NextResponse(data, { status: 200, statusText: 'OK', headers });
- } catch (error: any) {
- console.error('Error retrieving file:', error);
+ try {
+ const data = await retrieveEntityFile(entityType as EntityType, entityId, filePath);
- if (error.message.includes('File') && error.message.includes('does not exist')) {
+ const fileType = await fileTypeFromBuffer(data as Buffer);
+ if (!fileType) {
+ return new NextResponse(null, {
+ status: 415,
+ statusText: 'Cannot read file type of requested file',
+ });
+ }
+ let mimeType: string = fileType.mime;
+
+ if (fileType.mime === 'application/xml' && filePath?.endsWith('.svg'))
+ mimeType = 'image/svg+xml';
+
+ const headers = new Headers();
+ headers.set('Content-Type', mimeType);
+ return new NextResponse(data, { status: 200, statusText: 'OK', headers });
+ } catch (error: any) {
+ console.error('Error retrieving file:', error);
+
+ if (error.message.includes('File') && error.message.includes('does not exist')) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'File not found',
+ });
+ }
return new NextResponse(null, {
- status: 404,
- statusText: 'File not found',
+ status: 500,
+ statusText: 'Internal Server Error',
});
}
+ } catch (error) {
return new NextResponse(null, {
status: 500,
- statusText: 'Internal Server Error',
+ statusText: getErrorMessage(error),
});
}
}
export async function PUT(request: NextRequest) {
- const searchParams = request.nextUrl.searchParams;
- const entityId = searchParams.get('entityId');
- const entityType = searchParams.get('entityType');
- const environmentId = searchParams.get('environmentId');
- const filePath = searchParams.get('filePath');
- const saveWithoutSavingReference = !!searchParams.get('saveWithoutSavingReference');
-
- if (!entityId || !environmentId || !entityType || !filePath) {
- return new NextResponse(null, {
- status: 400,
- statusText: 'entityId, entityType, environmentId and filePath required as URL search params',
- });
- }
-
- const body = request.body;
- if (!body)
- return new NextResponse(null, {
- status: 400,
- statusText: 'No file data provided in request body',
- });
-
- const { ability } = await getCurrentEnvironment(environmentId);
- if (entityType === EntityType.PROCESS) {
- const process = await getProcess(entityId, environmentId);
- if (!process) {
+ try {
+ const searchParams = request.nextUrl.searchParams;
+ const entityId = searchParams.get('entityId');
+ const entityType = searchParams.get('entityType');
+ const environmentId = searchParams.get('environmentId');
+ const filePath = searchParams.get('filePath');
+ const saveWithoutSavingReference = !!searchParams.get('saveWithoutSavingReference');
+
+ if (!entityId || !environmentId || !entityType || !filePath) {
return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
+ status: 400,
+ statusText:
+ 'entityId, entityType, environmentId and filePath required as URL search params',
});
}
- if (!ability.can('view', toCaslResource('Process', process))) {
+
+ const body = request.body;
+ if (!body)
return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to view image in this process',
+ status: 400,
+ statusText: 'No file data provided in request body',
});
- }
- }
-
- // NOTE: This may need changing
- // @ts-expect-error ReadableStream in next.js' request isn't quite compatible with Readable.fromWeb (node:stream)
- const reader = Readable.fromWeb(body);
- const chunks: Uint8Array[] = [];
- let totalLength = 0;
+ const currentEnvironment = await getCurrentEnvironment(environmentId);
+ if (currentEnvironment.isErr()) throw currentEnvironment.error;
+ const { ability } = currentEnvironment.value;
+
+ if (entityType === EntityType.PROCESS) {
+ const process = await getProcess(entityId, environmentId);
+ if (!process) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
+ if (!ability.can('view', toCaslResource('Process', process))) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to view image in this process',
+ });
+ }
+ }
- for await (const chunk of reader) {
- if (chunk) {
- chunks.push(chunk);
- totalLength += chunk.length;
- if (totalLength > MAX_FILE_SIZE) {
- // For some reason, after calling destroy the http response is not sent, causing the request to hang
- reader.pause();
+ // NOTE: This may need changing
+ // @ts-expect-error ReadableStream in next.js' request isn't quite compatible with Readable.fromWeb (node:stream)
+ const reader = Readable.fromWeb(body);
+
+ const chunks: Uint8Array[] = [];
+ let totalLength = 0;
+
+ for await (const chunk of reader) {
+ if (chunk) {
+ chunks.push(chunk);
+ totalLength += chunk.length;
+ if (totalLength > MAX_FILE_SIZE) {
+ // For some reason, after calling destroy the http response is not sent, causing the request to hang
+ reader.pause();
+ }
}
}
- }
- // The return doesn't work inside of the iterator for loop
- if (totalLength > MAX_FILE_SIZE)
- return new NextResponse(null, {
- status: 413,
- statusText: `Allowed file size of ${MAX_FILE_SIZE / (1024 * 1024)} MB exceeded`,
- });
+ // The return doesn't work inside of the iterator for loop
+ if (totalLength > MAX_FILE_SIZE)
+ return new NextResponse(null, {
+ status: 413,
+ statusText: `Allowed file size of ${MAX_FILE_SIZE / (1024 * 1024)} MB exceeded`,
+ });
- // Proceed with processing if the size limit is not exceeded
- const buffer = Buffer.concat(
- chunks.map((chunk) => Buffer.from(chunk)),
- totalLength,
- );
+ // Proceed with processing if the size limit is not exceeded
+ const buffer = Buffer.concat(
+ chunks.map((chunk) => Buffer.from(chunk)),
+ totalLength,
+ );
- const fileType = await fileTypeFromBuffer(buffer);
- if (!fileType) {
- return new NextResponse(null, {
- status: 415,
- statusText: 'Cannot store file with unknown file type',
- });
- }
+ const fileType = await fileTypeFromBuffer(buffer);
+ if (!fileType) {
+ return new NextResponse(null, {
+ status: 415,
+ statusText: 'Cannot store file with unknown file type',
+ });
+ }
- try {
- const res = await saveEntityFileOrGetPresignedUrl(
- entityType as EntityType,
- entityId,
- fileType.mime,
- filePath,
- buffer,
- { saveWithoutSavingReference },
- );
+ try {
+ const res = await saveEntityFileOrGetPresignedUrl(
+ entityType as EntityType,
+ entityId,
+ fileType.mime,
+ filePath,
+ buffer,
+ { saveWithoutSavingReference },
+ );
- if ('error' in res) throw new Error((res.error as any).message);
+ if ('error' in res) throw new Error((res.error as any).message);
- if (!res.filePath) {
- throw new Error('No file name returned');
- }
+ if (!res.filePath) {
+ throw new Error('No file name returned');
+ }
- const { filePath: newFileName } = res;
+ const { filePath: newFileName } = res;
- return new NextResponse(newFileName, {
- status: 200,
- statusText: 'OK',
- });
+ return new NextResponse(newFileName, {
+ status: 200,
+ statusText: 'OK',
+ });
+ } catch (error) {
+ console.error('Error saving file:', error);
+ return new NextResponse(null, { status: 500, statusText: 'Internal Server Error' });
+ }
} catch (error) {
- console.error('Error saving file:', error);
- return new NextResponse(null, { status: 500, statusText: 'Internal Server Error' });
+ return new NextResponse(null, { status: 500, statusText: getErrorMessage(error) });
}
}
export async function DELETE(request: NextRequest) {
- const searchParams = request.nextUrl.searchParams;
- const entityId = searchParams.get('entityId');
- const entityType = searchParams.get('entityType');
- const environmentId = searchParams.get('environmentId');
- const filePath = searchParams.get('filePath ');
-
- if (!entityId || !entityType || !environmentId || !filePath) {
- return new NextResponse(null, {
- status: 400,
- statusText: 'entityId, entityType, environmentId and filePath required as URL search params',
- });
- }
-
- const { ability } = await getCurrentEnvironment(environmentId);
- if (entityType === EntityType.PROCESS) {
- const process = await getProcess(entityId, environmentId);
+ try {
+ const searchParams = request.nextUrl.searchParams;
+ const entityId = searchParams.get('entityId');
+ const entityType = searchParams.get('entityType');
+ const environmentId = searchParams.get('environmentId');
+ const filePath = searchParams.get('filePath ');
- if (!process) {
+ if (!entityId || !entityType || !environmentId || !filePath) {
return new NextResponse(null, {
- status: 404,
- statusText: 'Process with this id does not exist.',
+ status: 400,
+ statusText:
+ 'entityId, entityType, environmentId and filePath required as URL search params',
});
}
- if (!ability.can('delete', toCaslResource('Process', process))) {
- return new NextResponse(null, {
- status: 403,
- statusText: 'Not allowed to delete image in this process',
- });
+ const currentEnvironment = await getCurrentEnvironment(environmentId);
+ if (currentEnvironment.isErr()) throw currentEnvironment.error;
+ const { ability } = currentEnvironment.value;
+
+ if (entityType === EntityType.PROCESS) {
+ const process = await getProcess(entityId, environmentId);
+
+ if (!process) {
+ return new NextResponse(null, {
+ status: 404,
+ statusText: 'Process with this id does not exist.',
+ });
+ }
+
+ if (!ability.can('delete', toCaslResource('Process', process))) {
+ return new NextResponse(null, {
+ status: 403,
+ statusText: 'Not allowed to delete image in this process',
+ });
+ }
}
- }
- try {
- await deleteEntityFile(entityType as EntityType, entityId, filePath);
- return new NextResponse(null, { status: 200, statusText: 'OK' });
+ try {
+ await deleteEntityFile(entityType as EntityType, entityId, filePath);
+ return new NextResponse(null, { status: 200, statusText: 'OK' });
+ } catch (error) {
+ console.error('Error deleting file:', error);
+ return new NextResponse(null, { status: 500, statusText: 'Internal Server Error' });
+ }
} catch (error) {
- console.error('Error deleting file:', error);
- return new NextResponse(null, { status: 500, statusText: 'Internal Server Error' });
+ return new NextResponse(null, { status: 500, statusText: getErrorMessage(error) });
}
}
diff --git a/src/management-system-v2/app/api/register-new-user/route.ts b/src/management-system-v2/app/api/register-new-user/route.ts
index e35fd41ff..5a6a7e528 100644
--- a/src/management-system-v2/app/api/register-new-user/route.ts
+++ b/src/management-system-v2/app/api/register-new-user/route.ts
@@ -7,6 +7,7 @@ import db from '@/lib/data/db';
import { addUser, setUserPassword } from '@/lib/data/db/iam/users';
import { getTokenHash, notExpired } from '@/lib/email-verification-tokens/utils';
import { env } from '@/lib/ms-config/env-vars';
+import { getErrorMessage } from '@/lib/server-error-handling/user-error';
// TODO: maybe add PRETTIER error handling
@@ -22,7 +23,12 @@ export const GET = async (req: Request) => {
const tokenHash = await getTokenHash(token);
- const verificationToken = await getEmailVerificationToken({ token: tokenHash, identifier });
+ const _verificationToken = await getEmailVerificationToken({ token: tokenHash, identifier });
+ if (_verificationToken.isErr()) throw _verificationToken.error;
+ if (!_verificationToken.value)
+ return Response.json({ message: 'Bad request' }, { status: 400 });
+ const verificationToken = _verificationToken.value!;
+
if (verificationToken?.type !== 'register_new_user')
return Response.json({ message: 'Bad request' }, { status: 400 });
@@ -42,9 +48,16 @@ export const GET = async (req: Request) => {
},
tx,
);
+ if (user.isErr()) throw user.error;
- if (verificationToken.passwordHash)
- await setUserPassword(user.id, verificationToken.passwordHash, tx);
+ if (verificationToken.passwordHash) {
+ const setPassword = await setUserPassword(
+ user.value.id,
+ verificationToken.passwordHash,
+ tx,
+ );
+ if (setPassword.isErr()) throw setPassword.error;
+ }
// We can't delete the token yet, because we need it to exist in the db for the redirect to
// nextAuth's email flow. We set the expiration to 5 minutes in the future, so that it can't
@@ -53,11 +66,12 @@ export const GET = async (req: Request) => {
// username & email, and if the user manages to use it again, nothing bad will happen, the
// user will just have 2 or more users in the db.
- await updateEmailVerificationTokenExpiration(
+ const updateToken = await updateEmailVerificationTokenExpiration(
{ token: tokenHash, identifier },
new Date(Date.now() + 5 * 60 * 1000),
tx,
);
+ if (updateToken.isErr()) throw updateToken.error;
});
// The user is already created, now we redirect to nextAuth, so that it can set the cookies
@@ -76,7 +90,7 @@ export const GET = async (req: Request) => {
redirectUrl = nextAuthEmailRedirect.toString();
} catch (e) {
console.error(e);
- return Response.json({ message: 'Error registeering user' }, { status: 500 });
+ return Response.json({ message: getErrorMessage(e) }, { status: 500 });
}
redirect(redirectUrl);
diff --git a/src/management-system-v2/app/api/spaces/route.ts b/src/management-system-v2/app/api/spaces/route.ts
index 7efbe5c7a..3120ff410 100644
--- a/src/management-system-v2/app/api/spaces/route.ts
+++ b/src/management-system-v2/app/api/spaces/route.ts
@@ -1,8 +1,8 @@
-import { NextRequest, NextResponse } from 'next/server';
+import { NextResponse } from 'next/server';
import db from '@/lib/data/db';
import { env } from '@/lib/ms-config/env-vars';
-export async function GET(request: NextRequest) {
+export async function GET() {
if (!env.PROCEED_PUBLIC_IAM_ACTIVE) {
return NextResponse.json([
{ id: 'proceed-default-no-iam-user', type: 'personal', name: 'Default User' },
diff --git a/src/management-system-v2/app/change-email/page.tsx b/src/management-system-v2/app/change-email/page.tsx
index f9acf489e..c33da2acb 100644
--- a/src/management-system-v2/app/change-email/page.tsx
+++ b/src/management-system-v2/app/change-email/page.tsx
@@ -7,6 +7,7 @@ import ChangeEmailCard from './change-email-card';
import { Card } from 'antd';
import Link from 'next/link';
import Content from '@/components/content';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
const searchParamsSchema = z.object({ email: z.string().email(), token: z.string() });
@@ -16,7 +17,11 @@ export default async function ChangeEmailPage(props: { searchParams: Promise {
return notFound();
}
- const { session } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { session } = currentUser.value;
const needsToAuthenticate = !session?.user || session?.user.isGuest;
let providers = getProviders();
diff --git a/src/management-system-v2/app/error.tsx b/src/management-system-v2/app/error.tsx
index c504ce625..84be1eab4 100644
--- a/src/management-system-v2/app/error.tsx
+++ b/src/management-system-v2/app/error.tsx
@@ -3,8 +3,8 @@
import Content from '@/components/content';
import UnauthorizedFallback from '@/components/unauthorized-fallback';
import { UnauthorizedError } from '@/lib/ability/abilityHelper';
-import { SpaceNotFoundError } from '@/lib/errors';
-import { UIError } from '@/lib/ui-error';
+import { SpaceNotFoundError } from '@/lib/server-error-handling/errors';
+// import { UIError } from '@/lib/ui-error';
import { Button, Result } from 'antd';
export default function Error({
@@ -17,8 +17,8 @@ export default function Error({
let title = 'Something went wrong!';
if (error.message.startsWith(UnauthorizedError.prefix)) {
return ;
- } else if (error.message.startsWith(UIError.prefix)) {
- title = error.message.substring(UIError.prefix.length + 2);
+ // } else if (error.message.startsWith(UIError.prefix)) {
+ // title = error.message.substring(UIError.prefix.length + 2);
}
const retryButton = (
@@ -36,9 +36,9 @@ export default function Error({
/>
);
- if (error.message.startsWith(SpaceNotFoundError.prefix)) {
- ;
- }
+ // if (error.message.startsWith(SpaceNotFoundError.prefix)) {
+ // ;
+ // }
return {feedback};
}
diff --git a/src/management-system-v2/app/shared-viewer/documentation-page.tsx b/src/management-system-v2/app/shared-viewer/documentation-page.tsx
index 86aa375ad..ae65613ad 100644
--- a/src/management-system-v2/app/shared-viewer/documentation-page.tsx
+++ b/src/management-system-v2/app/shared-viewer/documentation-page.tsx
@@ -14,14 +14,9 @@ import { Button, Tooltip, Typography, Space, Grid } from 'antd';
import { PrinterOutlined } from '@ant-design/icons';
import Content from '@/components/content';
-
-import { getProcess } from '@/lib/data/db/process';
import { useRouter } from 'next/navigation';
-
import { getSVGFromBPMN } from '@/lib/process-export/util';
-
import styles from './documentation-page.module.scss';
-
import { getRootFromElement, getDefinitionsVersionInformation } from '@proceed/bpmn-helper';
import SettingsModal, { settingsOptions, SettingsOption } from './settings-modal';
@@ -38,6 +33,7 @@ import {
getElementSVG,
} from './documentation-page-utils';
import { Environment } from '@/lib/data/environment-schema';
+import { Process } from '@/lib/data/process-schema';
/**
* Import the Editor asynchronously since it implicitly uses browser logic which leads to errors when this file is loaded on the server
@@ -53,7 +49,7 @@ const markdownEditor: Promise =
: (Promise.resolve(null) as any);
type BPMNSharedViewerProps = {
- processData: Awaited>;
+ processData: Process;
isOwner: boolean;
userWorkspaces: Environment[];
defaultSettings?: SettingsOption;
diff --git a/src/management-system-v2/app/shared-viewer/page.tsx b/src/management-system-v2/app/shared-viewer/page.tsx
index fb8b7a23d..a09ef135f 100644
--- a/src/management-system-v2/app/shared-viewer/page.tsx
+++ b/src/management-system-v2/app/shared-viewer/page.tsx
@@ -9,6 +9,7 @@ import { ImportsInfo } from './documentation-page-utils';
import BPMNCanvas from '@/components/bpmn-canvas';
import { Process } from '@/lib/data/process-schema';
import ErrorMessage from '../../components/error-message';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
import styles from './page.module.scss';
import Layout from '@/app/(dashboard)/[environmentId]/layout-client';
@@ -21,6 +22,12 @@ import { getDefinitionsAndProcessIdForEveryCallActivity } from '@proceed/bpmn-he
import { SettingsOption } from './settings-modal';
import { asyncMap } from '@/lib/helpers/javascriptHelpers';
import { env } from '@/lib/ms-config/env-vars';
+import {
+ getErrorMessage,
+ isUserErrorResponse,
+ userError,
+} from '@/lib/server-error-handling/user-error';
+import { Result } from 'neverthrow';
interface PageProps {
searchParams: Promise<{
@@ -45,20 +52,27 @@ const getProcessInfo = async (
isImport: boolean,
versionId?: string,
) => {
- const { session, userId } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) return userError(getErrorMessage(currentUser.error));
+ const { session } = currentUser.value;
let spaceId;
let isOwner = false;
let processData;
-
// check if there is a session (=> the user is already logged in)
if (session) {
- const { ability, activeEnvironment } = await getCurrentEnvironment(session?.user.id);
+ const currentSpace = await getCurrentEnvironment(session?.user.id);
+ if (currentSpace.isErr()) return userError(getErrorMessage(currentSpace.error));
+
+ const { ability, activeEnvironment } = currentSpace.value;
+
({ spaceId } = activeEnvironment);
// get all the processes the user has access to
const ownedProcesses = await getProcesses(spaceId, ability);
+ if (ownedProcesses.isErr()) return userError(getErrorMessage(ownedProcesses.error));
+
// check if the current user is the owner of the process(/has access to the process) => if yes give access regardless of sharing status
- isOwner = ownedProcesses.some((process) => process.id === definitionId);
+ isOwner = ownedProcesses.value.some((process) => process.id === definitionId);
}
if (isOwner) {
@@ -70,24 +84,26 @@ const getProcessInfo = async (
? await getProcessVersionBpmn(definitionId, versionId)
: await getProcessBpmn(definitionId);
- processData = { ...processMetaData, bpmn };
+ if (bpmn.isErr()) {
+ return userError(getErrorMessage(bpmn.error));
+ }
+
+ processData = { ...processMetaData, bpmn: bpmn.value };
}
} else {
// the user has no regular access to the process so get the process data from the sharing api
const res = await getSharedProcessWithBpmn(definitionId, versionId);
- if ('error' in res) {
- return ;
- } else {
- processData = res;
-
- if (
- // bypass the timestamp check for imports
- !isImport &&
- ((embeddedMode && timestamp !== processData.allowIframeTimestamp) ||
- (!embeddedMode && timestamp !== processData.shareTimestamp))
- ) {
- return ;
- }
+ if ('error' in res) return res;
+
+ processData = res;
+
+ if (
+ // bypass the timestamp check for imports
+ !isImport &&
+ ((embeddedMode && timestamp !== processData.allowIframeTimestamp) ||
+ (!embeddedMode && timestamp !== processData.shareTimestamp))
+ ) {
+ return userError('Token expired');
}
}
@@ -100,7 +116,7 @@ const getProcessInfo = async (
* @param bpmn the bpmn of the process to get the imports for
* @param knownInfos the object to put the bpmns into
*/
-const getImportInfos = async (bpmn: string, knownInfos: ImportsInfo) => {
+const getImportInfos = async (bpmn: string, knownInfos: ImportsInfo): Promise => {
// information which tasks reference which processes
const taskImportMap = await getDefinitionsAndProcessIdForEveryCallActivity(bpmn, true);
@@ -109,17 +125,15 @@ const getImportInfos = async (bpmn: string, knownInfos: ImportsInfo) => {
if (!(knownInfos[definitionId] && knownInfos[definitionId][versionId])) {
const processInfo = await getProcessInfo(definitionId, 0, false, true, versionId);
+ if (isUserErrorResponse(processInfo)) continue;
- // check if the return value is a valid process info (might also be a react component that signals an error => no isOwner)
- if ('isOwner' in processInfo && processInfo.processData) {
- const { bpmn: importBpmn } = processInfo.processData;
+ const { bpmn: importBpmn } = processInfo.processData;
- if (!knownInfos[definitionId]) knownInfos[definitionId] = {};
- knownInfos[definitionId][versionId] = importBpmn as string;
+ if (!knownInfos[definitionId]) knownInfos[definitionId] = {};
+ knownInfos[definitionId][versionId] = importBpmn as string;
- // recursively get the imports of the imports
- await getImportInfos(importBpmn as string, knownInfos);
- }
+ // recursively get the imports of the imports
+ await getImportInfos(importBpmn as string, knownInfos);
}
}
};
@@ -127,20 +141,32 @@ const getImportInfos = async (bpmn: string, knownInfos: ImportsInfo) => {
const SharedViewer = async (props: PageProps) => {
const searchParams = await props.searchParams;
const { token, version, settings } = searchParams;
- const { session, userId } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { session, userId } = currentUser.value;
if (typeof token !== 'string') {
return ;
}
- const userEnvironments: Environment[] = [(await getEnvironmentById(userId))!];
+ const personalEnvironment = await getEnvironmentById(userId);
+ if (personalEnvironment.isErr()) return errorResponse(personalEnvironment);
+
+ const userEnvironments: Environment[] = [personalEnvironment.value];
+
const userOrgEnvs = await getUserOrganizationEnvironments(userId);
+ if (userOrgEnvs.isErr()) return errorResponse(userOrgEnvs);
- const orgEnvironments = await asyncMap(
- userOrgEnvs,
- async (environmentId) => (await getEnvironmentById(environmentId))!,
+ const orgEnvironments = Result.combine(
+ await asyncMap(
+ userOrgEnvs.value,
+ async (environmentId) => (await getEnvironmentById(environmentId))!,
+ ),
);
+ if (orgEnvironments.isErr()) return errorResponse(orgEnvironments);
- userEnvironments.push(...orgEnvironments);
+ userEnvironments.push(...orgEnvironments.value);
let isOwner = false;
@@ -162,8 +188,8 @@ const SharedViewer = async (props: PageProps) => {
);
// the return value of getProcessInfo might be an error that should just be returned to the user
- if (!('isOwner' in processInfo)) {
- return processInfo;
+ if (isUserErrorResponse(processInfo)) {
+ return ;
}
({ isOwner, processData } = processInfo);
@@ -181,8 +207,10 @@ const SharedViewer = async (props: PageProps) => {
if (!iframeMode) {
try {
await getImportInfos(processData.bpmn, availableImports);
- } catch (err) {
- console.error('Failed to resolve the information for process imports: ', err);
+ } catch (error) {
+ console.error('Failed to resolve the information for process imports: ', error);
+
+ return ;
}
}
@@ -215,7 +243,7 @@ const SharedViewer = async (props: PageProps) => {
diff --git a/src/management-system-v2/app/shared-viewer/process-document.tsx b/src/management-system-v2/app/shared-viewer/process-document.tsx
index 1725fecb3..b35dc5490 100644
--- a/src/management-system-v2/app/shared-viewer/process-document.tsx
+++ b/src/management-system-v2/app/shared-viewer/process-document.tsx
@@ -2,8 +2,6 @@ import React, { useEffect, useState } from 'react';
import { useSearchParams } from 'next/navigation';
-import { getProcess } from '@/lib/data/db/process';
-
import { Typography, Table, Grid, Image, Spin } from 'antd';
const { Title } = Typography;
@@ -18,6 +16,7 @@ import { useEnvironment } from '@/components/auth-can';
import { EntityType } from '@/lib/helpers/fileManagerHelpers';
import { useFileManager } from '@/lib/useFileManager';
import { fromCustomUTCString } from '@/lib/helpers/timeHelper';
+import { Process } from '@/lib/data/process-schema';
import { generateDateString } from '@/lib/utils';
export type VersionInfo = {
@@ -28,7 +27,7 @@ export type VersionInfo = {
};
type ProcessDocumentProps = {
- processData: Awaited>;
+ processData: Process;
settings: ActiveSettings;
processHierarchy?: ElementInfo;
version: VersionInfo;
diff --git a/src/management-system-v2/app/shared-viewer/workspace-selection.tsx b/src/management-system-v2/app/shared-viewer/workspace-selection.tsx
index 7310452d4..000f3a64f 100644
--- a/src/management-system-v2/app/shared-viewer/workspace-selection.tsx
+++ b/src/management-system-v2/app/shared-viewer/workspace-selection.tsx
@@ -7,7 +7,6 @@ import { LaptopOutlined, InfoCircleOutlined } from '@ant-design/icons';
import { copyProcesses } from '@/lib/data/processes';
import { Environment } from '@/lib/data/environment-schema';
-import { getProcess } from '@/lib/data/db/process';
import { VersionInfo } from './process-document';
import styles from './workspace-selection.module.scss';
@@ -18,9 +17,11 @@ import { FolderTreeNode, getSpaceFolderTree } from '@/lib/data/folders';
import { useFileManager } from '@/lib/useFileManager';
import { EntityType } from '@/lib/helpers/fileManagerHelpers';
import { useSession } from '@/components/auth-can';
+import { Process } from '@/lib/data/process-schema';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
type WorkspaceSelectionProps = {
- processData: Awaited>;
+ processData: Process;
versionInfo: VersionInfo;
workspaces: Environment[];
};
@@ -65,7 +66,10 @@ const WorkspaceSelection: React.FC<
const handleWorkspaceClick = async (workspace: Environment) => {
setSelectedWorkspace(workspace);
onWorkspaceSelect(workspace);
+
const spaceFolderTree = await getSpaceFolderTree(workspace.id);
+ if (isUserErrorResponse(spaceFolderTree)) return;
+
setSelectedSpaceFolderTree(spaceFolderTree);
onFolderSelect(null);
};
diff --git a/src/management-system-v2/app/transfer-processes/page.tsx b/src/management-system-v2/app/transfer-processes/page.tsx
index 830545543..43589da5b 100644
--- a/src/management-system-v2/app/transfer-processes/page.tsx
+++ b/src/management-system-v2/app/transfer-processes/page.tsx
@@ -6,6 +6,7 @@ import { Card, Result } from 'antd';
import { redirect } from 'next/navigation';
import ProcessTransferButtons from './transfer-processes-confirmation-buttons';
import { getGuestReference } from '@/lib/reference-guest-user-token';
+import { errorResponse } from '@/lib/server-error-handling/page-error-response';
export default async function TransferProcessesPage(props: {
searchParams: Promise<{
@@ -14,7 +15,11 @@ export default async function TransferProcessesPage(props: {
}>;
}) {
const searchParams = await props.searchParams;
- const { userId, session } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return errorResponse(currentUser);
+ }
+ const { userId, session } = currentUser.value;
if (!session) redirect('api/auth/signin');
if (session.user.isGuest) redirect('/');
@@ -43,17 +48,23 @@ export default async function TransferProcessesPage(props: {
if (!guestId || guestId === userId) redirect(callbackUrl);
const possibleGuest = await getUserById(guestId);
+ if (possibleGuest.isErr()) {
+ return errorResponse(possibleGuest);
+ }
// possibleGuest might be a normal user, this would happen if the user signed in with an existing
// accocunt, generating the token above, and before using it, he signed in with a new account.
// We only go further then this redirect, if the user signed in with an account that was
// already linked to an existing user
- if (!possibleGuest || !possibleGuest.isGuest) redirect(callbackUrl);
+ if (!possibleGuest.value?.isGuest) redirect(callbackUrl);
// NOTE: this ignores folders
const guestProcesses = await getProcesses(guestId);
+ if (guestProcesses.isErr()) {
+ return errorResponse(guestProcesses);
+ }
// If the guest has no processes -> nothing to do
- if (guestProcesses.length === 0) redirect(callbackUrl);
+ if (guestProcesses.value.length === 0) redirect(callbackUrl);
return (
@@ -61,7 +72,8 @@ export default async function TransferProcessesPage(props: {
title="Would you like to transfer your processes?"
style={{ maxWidth: '70ch', margin: 'auto' }}
>
- Your guest account had {guestProcesses.length} process{guestProcesses.length !== 1 && 'es'}.
+ Your guest account had {guestProcesses.value.length} process
+ {guestProcesses.value.length !== 1 && 'es'}.
Would you like to transfer them to your account?
diff --git a/src/management-system-v2/app/transfer-processes/server-actions.ts b/src/management-system-v2/app/transfer-processes/server-actions.ts
index 4dd9e148c..f3a06a1ac 100644
--- a/src/management-system-v2/app/transfer-processes/server-actions.ts
+++ b/src/management-system-v2/app/transfer-processes/server-actions.ts
@@ -1,5 +1,4 @@
'use server';
-
import { getCurrentUser } from '@/components/auth';
import { Folder } from '@/lib/data/folder-schema';
import { getFolders, getRootFolder, moveFolder, updateFolderMetaData } from '@/lib/data/db/folders';
@@ -7,11 +6,16 @@ import { getProcesses, updateProcess } from '@/lib/data/db/process';
import { getUserById, deleteUser } from '@/lib/data/db/iam/users';
import { Process } from '@/lib/data/process-schema';
import { getGuestReference } from '@/lib/reference-guest-user-token';
-import { UserErrorType, userError } from '@/lib/user-error';
+import { UserErrorType, getErrorMessage, userError } from '@/lib/server-error-handling/user-error';
import { redirect } from 'next/navigation';
+import db from '@/lib/data/db';
export async function transferProcesses(referenceToken: string, callbackUrl: string = '/') {
- const { session } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { session } = currentUser.value;
if (!session) return userError("You're not signed in", UserErrorType.PermissionError);
if (session.user.isGuest)
return userError("You can't be a guest to transfer processes", UserErrorType.PermissionError);
@@ -23,44 +27,91 @@ export async function transferProcesses(referenceToken: string, callbackUrl: str
if (guestId === session.user.id) redirect(callbackUrl);
const possibleGuest = await getUserById(guestId);
- if (!possibleGuest || !possibleGuest.isGuest)
+ if (possibleGuest.isErr()) {
+ return userError(getErrorMessage(possibleGuest.error));
+ }
+ if (!possibleGuest.value || !possibleGuest.value.isGuest)
return userError('Invalid guest id', UserErrorType.PermissionError);
// Processes and folders under root folder of guest space guet their folderId changed to the
// root folder of the new owner space, for the rest we just update the environmentId
- const userRootFolderId = (await getRootFolder(session.user.id)).id;
- const guestRootFolderId = (await getRootFolder(guestId)).id;
+ const userRootFolder = await getRootFolder(session.user.id);
+ if (userRootFolder.isErr()) {
+ return userError(getErrorMessage(userRootFolder.error));
+ }
+
+ const guestRootFolder = await getRootFolder(guestId);
+ if (guestRootFolder.isErr()) {
+ return userError(getErrorMessage(guestRootFolder.error));
+ }
// no ability check necessary, owners of personal spaces can do anything
const guestProcesses = await getProcesses(guestId);
- for (const process of guestProcesses) {
- const processUpdate: Partial = {
- environmentId: session.user.id,
- creatorId: session.user.id,
- };
- if (process.folderId === guestRootFolderId) processUpdate.folderId = userRootFolderId;
- await updateProcess(process.id, processUpdate);
+ if (guestProcesses.isErr()) {
+ return userError(getErrorMessage(guestProcesses.error));
}
- const guestFolders = await getFolders(guestId);
- for (const folder of guestFolders) {
- if (folder.id === guestRootFolderId) continue;
-
- const folderData: Partial = { createdBy: session.user.id };
-
- if (folder.parentId === guestRootFolderId) moveFolder(folder.id, userRootFolderId);
- else folderData.environmentId = session.user.id;
-
- updateFolderMetaData(folder.id, folderData);
+ try {
+ await db.$transaction(async (tx) => {
+ for (const process of guestProcesses.value) {
+ const processUpdate: Partial = {
+ environmentId: session.user.id,
+ creatorId: session.user.id,
+ };
+
+ if (process.folderId === guestRootFolder.value.id) {
+ processUpdate.folderId = userRootFolder.value.id;
+ }
+ const result = await updateProcess(process.id, processUpdate, tx);
+ if (result.isErr()) {
+ throw result.error;
+ }
+ }
+
+ const guestFolders = await getFolders(guestId);
+ if (guestFolders.isErr()) {
+ throw guestFolders.error;
+ }
+
+ for (const folder of guestFolders.value) {
+ // skip the guest's root folder
+ if (folder.id === guestRootFolder.value.id) continue;
+
+ const folderData: Partial = { createdBy: session.user.id };
+
+ if (folder.parentId === guestRootFolder.value.id) {
+ const moveResult = await moveFolder(folder.id, userRootFolder.value.id, undefined, tx);
+ if (moveResult?.isErr()) {
+ throw moveResult.error;
+ }
+ } else {
+ folderData.environmentId = session.user.id;
+ }
+
+ const updateResult = await updateFolderMetaData(folder.id, folderData, undefined, tx);
+ if (updateResult.isErr()) {
+ throw updateResult.error;
+ }
+ }
+
+ const deleteResult = await deleteUser(guestId, tx);
+ if (deleteResult.isErr()) {
+ throw deleteResult.error;
+ }
+ });
+ } catch (error) {
+ return userError(getErrorMessage(error));
}
- deleteUser(guestId);
-
redirect(callbackUrl);
}
export async function discardProcesses(referenceToken: string, redirectUrl: string = '/') {
- const { session } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { session } = currentUser.value;
if (!session) return userError("You're not signed in", UserErrorType.PermissionError);
if (session.user.isGuest)
return userError("You can't be a guest to transfer processes", UserErrorType.PermissionError);
@@ -72,10 +123,17 @@ export async function discardProcesses(referenceToken: string, redirectUrl: stri
if (guestId === session.user.id) redirect(redirectUrl);
const possibleGuest = await getUserById(guestId);
- if (!possibleGuest || !possibleGuest.isGuest)
+ if (possibleGuest.isErr()) {
+ return userError(getErrorMessage(possibleGuest.error));
+ }
+
+ if (!possibleGuest.value || !possibleGuest.value.isGuest)
return userError('Invalid guest id', UserErrorType.PermissionError);
- deleteUser(guestId);
+ const deleteResult = await deleteUser(guestId);
+ if (deleteResult.isErr()) {
+ return userError(getErrorMessage(deleteResult.error));
+ }
redirect(redirectUrl);
}
diff --git a/src/management-system-v2/components/FolderTree.tsx b/src/management-system-v2/components/FolderTree.tsx
index b1993267c..4d2d20b60 100644
--- a/src/management-system-v2/components/FolderTree.tsx
+++ b/src/management-system-v2/components/FolderTree.tsx
@@ -6,7 +6,7 @@ import React, { ReactNode, SetStateAction, useCallback, useEffect, useRef, useSt
import { useEnvironment } from './auth-can';
import { ProcessListItemIcon } from './process-list';
import ProceedLoadingIndicator from './loading-proceed';
-import { UserError, isUserErrorResponse } from '@/lib/user-error';
+import { UserError, isUserErrorResponse } from '@/lib/server-error-handling/user-error';
type FolderChildren = {
id: string;
diff --git a/src/management-system-v2/components/auth-can.tsx b/src/management-system-v2/components/auth-can.tsx
index 68a3f8f98..8bf051721 100644
--- a/src/management-system-v2/components/auth-can.tsx
+++ b/src/management-system-v2/components/auth-can.tsx
@@ -11,7 +11,7 @@ import {
toCaslResource,
resourceAction,
} from '@/lib/ability/caslAbility';
-import { usePathname, useRouter } from 'next/navigation';
+import { useRouter } from 'next/navigation';
import { SpaceContext } from '@/app/(dashboard)/[environmentId]/layout-client';
import { EnvVarsContext } from './env-vars-context';
import { session } from '@/lib/no-iam-user';
diff --git a/src/management-system-v2/components/auth.tsx b/src/management-system-v2/components/auth.tsx
index 11b0c843c..3b7d858b4 100644
--- a/src/management-system-v2/components/auth.tsx
+++ b/src/management-system-v2/components/auth.tsx
@@ -15,17 +15,18 @@ import * as noIamUser from '@/lib/no-iam-user';
import { getUserById } from '@/lib/data/db/iam/users';
import { cookies } from 'next/headers';
import { getMSConfig } from '@/lib/ms-config/ms-config';
-import { UIError as UserUIError } from '@/lib/ui-error';
import { packedStaticRules } from '@/lib/authorization/caslRules';
+import { err, ok } from 'neverthrow';
+import { UserFacingError } from '@/lib/server-error-handling/user-error';
export const getCurrentUser = cache(async () => {
if (!env.PROCEED_PUBLIC_IAM_ACTIVE) {
- return {
+ return ok({
session: noIamUser.session,
userId: noIamUser.userId,
systemAdmin: noIamUser.systemAdmin,
user: noIamUser.user,
- };
+ });
}
const session = await auth();
@@ -35,12 +36,15 @@ export const getCurrentUser = cache(async () => {
userId !== '' ? getUserById(userId) : undefined,
]);
+ if (systemAdmin.isErr()) return systemAdmin;
+ if (user && user.isErr()) return user;
+
// Sign out user if the id doesn't correspond to a user in the db
// We need to reset the cookie that stores the user id, this isn't possible
// inside a server components, so we need to redirect the user to an endpoint
// that logs him out, this endpoint needs to csrf protected, for this we use
// the user's csrf token (which was added by next-auth)
- if (userId !== '' && !user) {
+ if (userId !== '' && !user?.value) {
const cookieStore = await cookies();
const csrfToken = cookieStore.get('proceed.csrf-token')!.value;
@@ -56,7 +60,7 @@ export const getCurrentUser = cache(async () => {
redirect(`/api/private/signout?${searchParams}`);
}
- return { session, userId, systemAdmin, user };
+ return ok({ session, userId, systemAdmin: systemAdmin.value, user: user?.value });
});
const systemAdminRulesForOrganizations = packedAdminRules
@@ -89,7 +93,12 @@ export const getCurrentEnvironment = cache(
permissionErrorHandling: { action: 'redirect' },
},
) => {
- const { userId, systemAdmin } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return err('Could not get the current user');
+ }
+
+ const { userId, systemAdmin } = currentUser.value;
const msConfig = await getMSConfig();
if (
@@ -107,16 +116,19 @@ export const getCurrentEnvironment = cache(
if (userId && !isOrganization && !env.PROCEED_PUBLIC_IAM_PERSONAL_SPACES_ACTIVE) {
// Note: will be undefined for not logged in users
const userOrgs = await getUserOrganizationEnvironments(userId);
+ if (userOrgs.isErr()) {
+ return userOrgs;
+ }
- if (userOrgs.length === 0) {
+ if (userOrgs.value.length === 0) {
if (env.PROCEED_PUBLIC_IAM_ONLY_ONE_ORGANIZATIONAL_SPACE) {
- throw new UserUIError('You are not part of an organization.');
+ return err(new UserFacingError('You are not part of an organization.'));
} else {
return redirect(`/create-organization`);
}
}
- activeSpace = userOrgs[0];
+ activeSpace = userOrgs.value[0];
isOrganization = true;
}
@@ -125,16 +137,18 @@ export const getCurrentEnvironment = cache(
if (systemAdmin || !msConfig.PROCEED_PUBLIC_IAM_ACTIVE) {
const rules = getSystemAdminRules(isOrganization);
- return {
+ return ok({
ability: new Ability(rules, activeSpace),
activeEnvironment: { spaceId: activeSpace, isOrganization },
- };
+ });
}
- if (!userId || !isMember(decodeURIComponent(spaceIdParam), userId)) {
+ const checkIsMember = await isMember(decodeURIComponent(spaceIdParam), userId);
+ if (checkIsMember.isErr()) return checkIsMember;
+ if (!userId || !checkIsMember.value) {
switch (opts?.permissionErrorHandling.action) {
case 'throw-error':
- throw new Error('User does not have access to this environment');
+ return err(new Error('User does not have access to this environment'));
case 'redirect':
default:
if (opts.permissionErrorHandling.redirectUrl)
@@ -146,10 +160,13 @@ export const getCurrentEnvironment = cache(
}
const ability = await getAbilityForUser(userId, activeSpace);
+ if (ability.isErr()) {
+ return ability;
+ }
- return {
- ability,
+ return ok({
+ ability: ability.value,
activeEnvironment: { spaceId: activeSpace, isOrganization },
- };
+ });
},
);
diff --git a/src/management-system-v2/components/bpmn-timeline/GanttSettingsModal.tsx b/src/management-system-v2/components/bpmn-timeline/GanttSettingsModal.tsx
index 4377b4ea5..9b44558e2 100644
--- a/src/management-system-v2/components/bpmn-timeline/GanttSettingsModal.tsx
+++ b/src/management-system-v2/components/bpmn-timeline/GanttSettingsModal.tsx
@@ -7,7 +7,7 @@ import { useEnvironment } from '@/components/auth-can';
import { SettingsGroup } from '../../app/(dashboard)/[environmentId]/settings/components';
import { debouncedSettingsUpdate } from '../../app/(dashboard)/[environmentId]/settings/utils';
import { getSpaceSettingsValues } from '@/lib/data/space-settings';
-import { isUserErrorResponse } from '@/lib/user-error';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
import { ganttViewSettingsDefinition } from './gantt-settings-definition';
import { createGanttSettingsRenderer } from './gantt-settings-utils';
import type { SettingGroup } from '../../app/(dashboard)/[environmentId]/settings/type-util';
diff --git a/src/management-system-v2/components/bpmn-timeline/index.tsx b/src/management-system-v2/components/bpmn-timeline/index.tsx
index 72ace0288..8b378ae3f 100644
--- a/src/management-system-v2/components/bpmn-timeline/index.tsx
+++ b/src/management-system-v2/components/bpmn-timeline/index.tsx
@@ -7,7 +7,7 @@ import { GanttChartCanvas } from '@/components/gantt-chart-canvas';
import type { GanttElementType, GanttDependency } from '@/components/gantt-chart-canvas/types';
import useTimelineViewStore from '@/lib/use-timeline-view-store';
import { getSpaceSettingsValues } from '@/lib/data/space-settings';
-import { isUserErrorResponse } from '@/lib/user-error';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
import { useEnvironment } from '@/components/auth-can';
import { moddle } from '@proceed/bpmn-helper';
import useModelerStateStore from '@/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/use-modeler-state-store';
diff --git a/src/management-system-v2/components/chatbot.tsx b/src/management-system-v2/components/chatbot.tsx
index 4c8a32f2f..ba90410a6 100644
--- a/src/management-system-v2/components/chatbot.tsx
+++ b/src/management-system-v2/components/chatbot.tsx
@@ -3,12 +3,11 @@ import { FC, useEffect, useMemo, useRef, useState } from 'react';
import styles from './chatbot.module.scss';
import Scrollbar from './scrollbar';
import Message from './chat-message';
-import { Button, Input } from 'antd';
+import { Button } from 'antd';
import { SendOutlined } from '@ant-design/icons';
import TextArea from 'antd/es/input/TextArea';
import { useChatStore } from '@/lib/chat-messages-store';
import cn from 'classnames';
-import { useIntervalLock } from '@/lib/useIntervalLock';
type ChatBotType = {};
diff --git a/src/management-system-v2/components/collapsible-card.tsx b/src/management-system-v2/components/collapsible-card.tsx
index cfa66822e..e6736a917 100644
--- a/src/management-system-v2/components/collapsible-card.tsx
+++ b/src/management-system-v2/components/collapsible-card.tsx
@@ -2,7 +2,7 @@
import { Card, Button } from 'antd';
import { DoubleRightOutlined, DoubleLeftOutlined } from '@ant-design/icons';
-import React, { FC, PropsWithChildren } from 'react';
+import { FC, PropsWithChildren } from 'react';
import classNames from 'classnames';
type CollapsibleCardProps = PropsWithChildren<{
diff --git a/src/management-system-v2/components/confirmation-button.tsx b/src/management-system-v2/components/confirmation-button.tsx
index b51ec20d5..360f26242 100644
--- a/src/management-system-v2/components/confirmation-button.tsx
+++ b/src/management-system-v2/components/confirmation-button.tsx
@@ -1,4 +1,4 @@
-import { ComponentProps, FC, PropsWithChildren, ReactNode, forwardRef, useState } from 'react';
+import { ComponentProps, PropsWithChildren, ReactNode, forwardRef, useState } from 'react';
import { Button, Modal, Tooltip, Typography } from 'antd';
import { useAddControlCallback } from '@/lib/controls-store';
@@ -36,6 +36,22 @@ const ConfirmationButton = forwardRef
const [modalOpen, setModalOpen] = useState(false);
const [loading, setLoading] = useState(false);
+ const clearModal = () => {
+ setModalOpen(false);
+ onExternalClose?.();
+ setLoading(false);
+ };
+
+ const onConfirmWrapper = async () => {
+ setLoading(true);
+
+ try {
+ await onConfirm();
+ } catch (err) {}
+
+ clearModal();
+ };
+
useAddControlCallback(
'process-list',
['selectall', 'esc', 'copy', 'paste', 'enter', 'cut', 'export', 'import', 'shift+enter'],
@@ -57,22 +73,6 @@ const ConfirmationButton = forwardRef
{ level: 2, blocking: externalOpen || modalOpen },
);
- const clearModal = () => {
- setModalOpen(false);
- onExternalClose?.();
- setLoading(false);
- };
-
- const onConfirmWrapper = async () => {
- setLoading(true);
-
- try {
- await onConfirm();
- } catch (err) {}
-
- clearModal();
- };
-
return (
<>
{
diff --git a/src/management-system-v2/components/folder-modal.tsx b/src/management-system-v2/components/folder-modal.tsx
index 97f480665..d08dcd18b 100644
--- a/src/management-system-v2/components/folder-modal.tsx
+++ b/src/management-system-v2/components/folder-modal.tsx
@@ -1,6 +1,6 @@
'use client';
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
import { Form, Input, Modal } from 'antd';
import type { ModalProps } from 'antd';
import useParseZodErrors, { antDesignInputProps } from '@/lib/useParseZodErrors';
diff --git a/src/management-system-v2/components/folder-move-modal.tsx b/src/management-system-v2/components/folder-move-modal.tsx
index 30e47f99c..9b0f0dc18 100644
--- a/src/management-system-v2/components/folder-move-modal.tsx
+++ b/src/management-system-v2/components/folder-move-modal.tsx
@@ -1,6 +1,6 @@
'use client';
-import React, { FC } from 'react';
+import { FC } from 'react';
import { FolderTree } from './FolderTree';
import { Button, Modal } from 'antd';
import { FolderChildren } from '@/lib/data/folders';
diff --git a/src/management-system-v2/components/html-form-editor/elements/CheckboxOrRadioGroup.tsx b/src/management-system-v2/components/html-form-editor/elements/CheckboxOrRadioGroup.tsx
index 5eea35d95..969392822 100644
--- a/src/management-system-v2/components/html-form-editor/elements/CheckboxOrRadioGroup.tsx
+++ b/src/management-system-v2/components/html-form-editor/elements/CheckboxOrRadioGroup.tsx
@@ -126,6 +126,7 @@ export const ExportCheckboxOrRadioGroup: React.FC = (
{data.map((entry) => (
= {
diff --git a/src/management-system-v2/components/loading-proceed.tsx b/src/management-system-v2/components/loading-proceed.tsx
index 2f278283c..005437ea1 100644
--- a/src/management-system-v2/components/loading-proceed.tsx
+++ b/src/management-system-v2/components/loading-proceed.tsx
@@ -1,4 +1,4 @@
-import React, { FC, useCallback, useRef, PropsWithChildren } from 'react';
+import { FC, useCallback, useRef, PropsWithChildren } from 'react';
import style from './loading-proceed.module.scss';
import { useLazyRendering } from './scrollbar';
import cn from 'classnames';
diff --git a/src/management-system-v2/components/process-icon-list.tsx b/src/management-system-v2/components/process-icon-list.tsx
index 8f58452fd..12668dfb2 100644
--- a/src/management-system-v2/components/process-icon-list.tsx
+++ b/src/management-system-v2/components/process-icon-list.tsx
@@ -1,6 +1,6 @@
'use client';
-import { Dispatch, FC, SetStateAction, Suspense } from 'react';
+import { Dispatch, FC, SetStateAction } from 'react';
import { InfoCircleOutlined, FolderOutlined } from '@ant-design/icons';
import { LazyBPMNViewer } from './bpmn-viewer';
diff --git a/src/management-system-v2/components/process-import.tsx b/src/management-system-v2/components/process-import.tsx
index 49a4b2045..9baf25ce5 100644
--- a/src/management-system-v2/components/process-import.tsx
+++ b/src/management-system-v2/components/process-import.tsx
@@ -6,9 +6,7 @@ import { Button, Modal, Upload } from 'antd';
import type { ButtonProps } from 'antd';
import {
- getDefinitionsId,
getDefinitionsInfos,
- getDefinitionsName,
getElementsByTagName,
getProcessDocumentation,
toBpmnObject,
diff --git a/src/management-system-v2/components/process-info-card.tsx b/src/management-system-v2/components/process-info-card.tsx
index e8a7fa942..613aa712e 100644
--- a/src/management-system-v2/components/process-info-card.tsx
+++ b/src/management-system-v2/components/process-info-card.tsx
@@ -1,13 +1,11 @@
'use client';
-import React, { useRef, useImperativeHandle, forwardRef } from 'react';
+import { useRef, useImperativeHandle, forwardRef } from 'react';
import CollapsibleCard from './collapsible-card';
import { useUserPreferences } from '@/lib/user-preferences';
import { ProcessListProcess } from './processes/types';
import ResizableElement, { ResizableElementRefType } from './ResizableElement';
import MetaDataContent from './process-info-card-content';
-import dynamic from 'next/dynamic';
-const TextViewer = dynamic(() => import('@/components/text-viewer'), { ssr: false });
type MetaDataType = {
selectedElement?: ProcessListProcess;
diff --git a/src/management-system-v2/components/process-list.tsx b/src/management-system-v2/components/process-list.tsx
index 251b9907e..a8ca2818c 100644
--- a/src/management-system-v2/components/process-list.tsx
+++ b/src/management-system-v2/components/process-list.tsx
@@ -1,15 +1,6 @@
'use client';
-import {
- Button,
- Grid,
- Row,
- TableColumnType,
- TableColumnsType,
- TableProps,
- Tooltip,
- Typography,
-} from 'antd';
+import { Button, Grid, Row, TableColumnType, TableColumnsType, TableProps, Tooltip } from 'antd';
import React, {
useCallback,
FC,
diff --git a/src/management-system-v2/components/process-modal.tsx b/src/management-system-v2/components/process-modal.tsx
index 4c2996456..5bcfa0bdf 100644
--- a/src/management-system-v2/components/process-modal.tsx
+++ b/src/management-system-v2/components/process-modal.tsx
@@ -18,7 +18,7 @@ import {
Skeleton,
} from 'antd';
import { MdArrowBackIos, MdArrowForwardIos } from 'react-icons/md';
-import { UserError } from '@/lib/user-error';
+import { UserError, isUserErrorResponse } from '@/lib/server-error-handling/user-error';
import { useAddControlCallback } from '@/lib/controls-store';
import { checkIfProcessExistsByName } from '@/lib/data/processes';
import { useEnvironment } from './auth-can';
@@ -110,6 +110,7 @@ const ProcessModal = <
spaceId: environment.spaceId,
userId: session.data?.user.id!,
});
+ if (isUserErrorResponse(existsResults)) return;
existsResults.forEach((exists, index) => {
if (exists) {
@@ -417,7 +418,7 @@ const ProcessInputs = ({ index, initialName, readonly = false }: ProcessInputsPr
folderId: currentFolderId,
});
- if (!exists) {
+ if (isUserErrorResponse(exists) || !exists) {
callback();
return;
}
diff --git a/src/management-system-v2/components/processes/index.tsx b/src/management-system-v2/components/processes/index.tsx
index 1335e25e5..3d5e430c4 100644
--- a/src/management-system-v2/components/processes/index.tsx
+++ b/src/management-system-v2/components/processes/index.tsx
@@ -22,7 +22,6 @@ import {
Card,
Badge,
Divider,
- MenuProps,
Typography,
} from 'antd';
import { InfoCircleOutlined } from '@ant-design/icons';
@@ -34,7 +33,6 @@ import {
AppstoreOutlined,
FolderOutlined,
FileOutlined,
- FolderFilled,
ShareAltOutlined,
} from '@ant-design/icons';
import IconView from '@/components/process-icon-list';
@@ -57,7 +55,7 @@ import {
import ProcessModal from '@/components/process-modal';
import ConfirmationButton from '@/components/confirmation-button';
import ProcessImportButton from '@/components/process-import';
-import { Process, ProcessMetadata } from '@/lib/data/process-schema';
+import { ProcessMetadata } from '@/lib/data/process-schema';
import MetaDataContent from '@/components/process-info-card-content';
import { useEnvironment } from '@/components/auth-can';
import { Folder } from '@/lib/data/folder-schema';
@@ -89,6 +87,7 @@ import { ContextActions, RowActions } from './types';
import { canDoActionOnResource } from './helpers';
import { useInitialisePotentialOwnerStore } from '@/app/(dashboard)/[environmentId]/processes/[mode]/[processId]/use-potentialOwner-store';
import { useSession } from 'next-auth/react';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
// TODO: improve ordering
export type ProcessActions = {
@@ -401,6 +400,13 @@ const Processes = ({
spaceId: space.spaceId,
userId: user?.id!,
});
+ if (isUserErrorResponse(existsResults)) {
+ const errorMessage = existsResults.error.message;
+ throw new Error(
+ typeof errorMessage === 'string' ? errorMessage : 'Something went wrong',
+ );
+ }
+
existsResults.forEach((exists, idx) => {
if (exists) {
throw new Error(
diff --git a/src/management-system-v2/components/saved-engines-list.tsx b/src/management-system-v2/components/saved-engines-list.tsx
index a75f1788a..0ec23a521 100644
--- a/src/management-system-v2/components/saved-engines-list.tsx
+++ b/src/management-system-v2/components/saved-engines-list.tsx
@@ -170,7 +170,10 @@ const SavedEnginesList = ({
if (!status.online) return;
return status.engines.map((engine) => (
-
+
{engine.id}
));
diff --git a/src/management-system-v2/components/scrollbar.tsx b/src/management-system-v2/components/scrollbar.tsx
index fb0a5fe2c..9cfed0072 100644
--- a/src/management-system-v2/components/scrollbar.tsx
+++ b/src/management-system-v2/components/scrollbar.tsx
@@ -1,5 +1,5 @@
import { useIntervalLock } from '@/lib/useIntervalLock';
-import React, { FC, useEffect, useState, useRef, useCallback, use, MouseEventHandler } from 'react';
+import React, { FC, useEffect, useState, useRef, useCallback, MouseEventHandler } from 'react';
import styles from './scrollbar.module.scss';
import classNames from 'classnames';
diff --git a/src/management-system-v2/components/share-modal/embed-in-web.tsx b/src/management-system-v2/components/share-modal/embed-in-web.tsx
index d03521dc7..cf1447032 100644
--- a/src/management-system-v2/components/share-modal/embed-in-web.tsx
+++ b/src/management-system-v2/components/share-modal/embed-in-web.tsx
@@ -135,7 +135,6 @@ const ModelerShareModalOptionEmdedInWeb = ({
diff --git a/src/management-system-v2/components/share-modal/export.tsx b/src/management-system-v2/components/share-modal/export.tsx
index d79626f99..43b7e3e07 100644
--- a/src/management-system-v2/components/share-modal/export.tsx
+++ b/src/management-system-v2/components/share-modal/export.tsx
@@ -14,7 +14,11 @@ import useModelerStateStore from '@/app/(dashboard)/[environmentId]/processes/[m
import { is as bpmnIs } from 'bpmn-js/lib/util/ModelUtil';
import { ProcessMetadata } from '@/lib/data/process-schema';
import useProcessVersion from './use-process-version';
-import { UserError, UserErrorType, isUserErrorResponse } from '@/lib/user-error';
+import {
+ UserError,
+ UserErrorType,
+ isUserErrorResponse,
+} from '@/lib/server-error-handling/user-error';
import { FaRegQuestionCircle } from 'react-icons/fa';
export type ProcessExportTypes = ProcessExportOptions['type'] | 'pdf';
diff --git a/src/management-system-v2/components/share-modal/share-helpers.ts b/src/management-system-v2/components/share-modal/share-helpers.ts
index 572f29d6c..21cedb316 100644
--- a/src/management-system-v2/components/share-modal/share-helpers.ts
+++ b/src/management-system-v2/components/share-modal/share-helpers.ts
@@ -4,7 +4,7 @@ import {
updateProcessGuestAccessRights,
} from '@/lib/sharing/process-sharing';
import { wrapServerCall } from '@/lib/wrap-server-call';
-import { isUserErrorResponse } from '@/lib/user-error';
+import { isUserErrorResponse } from '@/lib/server-error-handling/user-error';
export function updateShare(
{
diff --git a/src/management-system-v2/components/space-link.tsx b/src/management-system-v2/components/space-link.tsx
index 5bf71c891..39a6f46bb 100644
--- a/src/management-system-v2/components/space-link.tsx
+++ b/src/management-system-v2/components/space-link.tsx
@@ -21,4 +21,6 @@ const SpaceLink = forwardRef<
);
});
+SpaceLink.displayName = 'SpaceLink';
+
export default SpaceLink;
diff --git a/src/management-system-v2/components/text-viewer.tsx b/src/management-system-v2/components/text-viewer.tsx
index 60f52c13b..c69ff1877 100644
--- a/src/management-system-v2/components/text-viewer.tsx
+++ b/src/management-system-v2/components/text-viewer.tsx
@@ -1,5 +1,5 @@
import { Viewer, ViewerProps } from '@toast-ui/react-editor';
-import React, { useEffect, useRef } from 'react';
+import { useEffect, useRef } from 'react';
// IMPORTANT: This component is a wrapper around the Viewer component from
// @toast-ui/react-editor, which cannot be used directly since it uses
diff --git a/src/management-system-v2/components/tours.tsx b/src/management-system-v2/components/tours.tsx
index 7aac8379c..4775c2974 100644
--- a/src/management-system-v2/components/tours.tsx
+++ b/src/management-system-v2/components/tours.tsx
@@ -1,8 +1,8 @@
'use client';
-import { FC, useEffect, useState } from 'react';
+import { FC } from 'react';
import ScrollBar from './scrollbar';
-import { Button, Tour } from 'antd';
+import { Button } from 'antd';
import { useTourRefStore } from '@/lib/tourRefStore';
type TutorialTourType = {
diff --git a/src/management-system-v2/components/user-list.tsx b/src/management-system-v2/components/user-list.tsx
index 4b629fed5..21c75e839 100644
--- a/src/management-system-v2/components/user-list.tsx
+++ b/src/management-system-v2/components/user-list.tsx
@@ -1,13 +1,10 @@
'use client';
-import React, { ComponentProps, FC, ReactNode, useState } from 'react';
-import { Space, Button, Table, Grid } from 'antd';
-import { UnorderedListOutlined, AppstoreOutlined } from '@ant-design/icons';
+import { ComponentProps, FC, ReactNode, useState } from 'react';
+import { Space, Table, Grid } from 'antd';
import useFuzySearch, { ReplaceKeysWithHighlighted } from '@/lib/useFuzySearch';
import Bar from '@/components/bar';
-import styles from './user-list.module.scss';
import { useUserPreferences } from '@/lib/user-preferences';
-import cn from 'classnames';
import ElementList from './item-list-view';
import UserAvatar from './user-avatar';
import SelectionActions from './selection-actions';
diff --git a/src/management-system-v2/instrumentation.ts b/src/management-system-v2/instrumentation.ts
index 9c36abc9d..cc3073052 100644
--- a/src/management-system-v2/instrumentation.ts
+++ b/src/management-system-v2/instrumentation.ts
@@ -8,7 +8,8 @@ export async function register() {
// Register default admin user if IAM is not activated
const { userId, createUserArgs } = await import('./lib/no-iam-user');
const { addUser, getUserById } = await import('./lib/data/db/iam/users');
- if (!env.PROCEED_PUBLIC_IAM_ACTIVE && !(await getUserById(userId)))
+ const user = await getUserById(userId);
+ if (!env.PROCEED_PUBLIC_IAM_ACTIVE && (user.isErr() || !user.value))
await addUser(createUserArgs);
// Create personal spaces for users that don't have one
diff --git a/src/management-system-v2/lib/abilityStore.ts b/src/management-system-v2/lib/abilityStore.ts
index f3e6218e5..d186e05ca 100644
--- a/src/management-system-v2/lib/abilityStore.ts
+++ b/src/management-system-v2/lib/abilityStore.ts
@@ -5,7 +5,6 @@ import { PackRule, packRules } from '@casl/ability/extra';
import Ability from './ability/abilityHelper';
import { AbilityRule, TreeMap } from './ability/caslAbility';
import { useEffect } from 'react';
-import { AllowedResourcesForAdmins } from './authorization/globalRules';
type AbilityStoreType = {
ability: Ability;
diff --git a/src/management-system-v2/lib/auth-database-adapter.ts b/src/management-system-v2/lib/auth-database-adapter.ts
index d79cd5331..ab8dca9b6 100644
--- a/src/management-system-v2/lib/auth-database-adapter.ts
+++ b/src/management-system-v2/lib/auth-database-adapter.ts
@@ -17,56 +17,80 @@ const Adapter = {
createUser: async (
user: Omit | { email: string; emailVerified: Date },
) => {
- return addUser({
+ const newUser = await addUser({
...user,
profileImage: 'image' in user && typeof user.image === 'string' ? user.image : null,
isGuest: false,
emailVerifiedOn: null,
});
+
+ if (newUser.isErr()) throw newUser.error;
+
+ return newUser.value;
},
getUser: async (id: string) => {
- return getUserById(id);
+ const user = await getUserById(id);
+ if (user.isErr()) throw user.error;
+ return user.value;
},
updateUser: async (user: AuthenticatedUser) => {
- return updateUser(user.id, { ...user, isGuest: false });
+ const res = await updateUser(user.id, { ...user, isGuest: false });
+ if (res.isErr()) throw res.error;
+ return res.value;
},
getUserByEmail: async (email: string) => {
- return getUserByEmail(email) ?? null;
+ const user = await getUserByEmail(email);
+ if (user.isErr()) throw user.error;
+ return user.value;
},
createVerificationToken: async ({ expires, ...token }: VerificationToken) => {
- return await saveEmailVerificationToken({
+ const newToken = await saveEmailVerificationToken({
type: 'signin_with_email',
...token,
expires,
});
+ if (newToken.isErr()) throw newToken.error;
+ return newToken.value;
},
useVerificationToken: async (params: { identifier: string; token: string }) => {
try {
// next-auth checks if the token is expired
const token = await deleteEmailVerificationToken(params);
- if (token.type === 'signin_with_email' || token.type === 'register_new_user') return token;
+ if (token.isErr()) {
+ throw token;
+ }
+
+ if (token.value.type === 'signin_with_email' || token.value.type === 'register_new_user')
+ return token.value;
else return null;
} catch (_) {
return null;
}
},
linkAccount: async (account: AdapterAccount) => {
- return addOauthAccount({
+ const newAccount = await addOauthAccount({
userId: account.userId,
type: account.type,
provider: account.provider,
providerAccountId: account.providerAccountId,
});
+ if (newAccount.isErr()) throw newAccount.error;
+ return newAccount.value;
},
getUserByAccount: async (account: AdapterAccount) => {
const userAccount = await getOauthAccountByProviderId(
account.provider,
account.providerAccountId,
);
+ if (userAccount.isErr()) {
+ throw userAccount.error;
+ }
- if (!userAccount) return null;
+ if (!userAccount.value) return null;
- return getUserById(userAccount.userId) as unknown as AdapterAccount;
+ const user = await getUserById(userAccount.value.userId);
+ if (user.isErr()) throw user.error;
+ return user.value as unknown as AdapterAccount;
},
};
diff --git a/src/management-system-v2/lib/auth.ts b/src/management-system-v2/lib/auth.ts
index 660452a49..900f4582d 100644
--- a/src/management-system-v2/lib/auth.ts
+++ b/src/management-system-v2/lib/auth.ts
@@ -29,6 +29,7 @@ import db from './data/db';
import { createUserRegistrationToken } from './email-verification-tokens/utils';
import { saveEmailVerificationToken } from './data/db/iam/verification-tokens';
import { NextAuthEmailTakenError, NextAuthUsernameTakenError } from './authjs-error-message';
+import { NotFoundError } from './server-error-handling/errors';
const nextAuthOptions: NextAuthConfig = {
secret: env.NEXTAUTH_SECRET,
@@ -56,9 +57,16 @@ const nextAuthOptions: NextAuthConfig = {
return token;
}
- let user = _user as User | undefined;
+ let user = (_user as User | undefined) || null;
- if (trigger === 'update') user = (await getUserById(token.user.id)) as User;
+ if (trigger === 'update') {
+ const newUserData = await getUserById(token.user.id);
+ if (newUserData.isErr()) {
+ throw newUserData.error;
+ }
+
+ user = newUserData.value;
+ }
if (user) token.user = user;
@@ -86,11 +94,16 @@ const nextAuthOptions: NextAuthConfig = {
) {
// Check if the user's cookie is correct
const sessionUserInDb = await getUserById(sessionUser.id);
- if (!sessionUserInDb || !sessionUserInDb.isGuest) throw new Error('Something went wrong');
+ if (sessionUserInDb.isErr()) {
+ throw sessionUserInDb.error;
+ }
+ if (!sessionUserInDb.value?.isGuest) throw new Error('Something went wrong');
const userSigningIn = _user.id ? await getUserById(_user.id) : null;
- if (!userSigningIn) {
+ if (userSigningIn && userSigningIn.isErr()) throw new Error('Something went wrong');
+
+ if (!userSigningIn || !userSigningIn.value) {
const user = _user as Partial;
await updateUser(sessionUser.id, {
firstName: user.firstName ?? undefined,
@@ -114,13 +127,15 @@ const nextAuthOptions: NextAuthConfig = {
if (!token.user.isGuest) return;
const user = await getUserById(token.user.id);
- if (user) {
- if (!user.isGuest) {
+ if (user.isErr()) throw user.error;
+
+ if (user.value) {
+ if (!user.value.isGuest) {
console.warn('User with invalid session');
return;
}
- await deleteUser(user.id);
+ await deleteUser(user.value.id);
}
},
async session({ session }) {
@@ -226,7 +241,11 @@ if (env.PROCEED_PUBLIC_IAM_PERSONAL_SPACES_ACTIVE) {
id: 'guest-signin',
credentials: {},
async authorize() {
- return addUser({ isGuest: true });
+ const result = await addUser({ isGuest: true });
+ if (result.isErr()) {
+ throw result.error;
+ }
+ return result.value;
},
}),
);
@@ -257,16 +276,20 @@ if (env.NODE_ENV === 'development') {
},
},
async authorize(credentials) {
- let user: User | null = null;
+ let user;
if (credentials.username === 'johndoe') {
- user = await getUserByUsername('johndoe');
- if (!user) user = await addUser(johnDoeTemplate);
+ let u = await getUserByUsername('johndoe');
+ if (u.isOk() && !u.value) user = await addUser(johnDoeTemplate);
+ else user = u;
} else if (credentials.username === 'admin') {
user = await getUserByUsername('admin');
}
- return user;
+ if (!user) return null;
+ if (user.isErr()) throw user.error;
+
+ return user.value;
},
}),
);
@@ -307,23 +330,25 @@ if (env.PROCEED_PUBLIC_IAM_LOGIN_USER_PASSWORD_ACTIVE) {
},
authorize: async (credentials, req) => {
const userAndPassword = await getUserAndPasswordByUsername(credentials.username as string);
+ if (userAndPassword.isErr()) {
+ throw userAndPassword.error;
+ }
- if (!userAndPassword) return null;
+ if (!userAndPassword.value) return null;
const passwordIsCorrect = await comparePassword(
credentials.password as string,
- userAndPassword.passwordAccount.password,
+ userAndPassword.value.passwordAccount.password,
);
if (!passwordIsCorrect) return null;
- return userAndPassword as User;
+ return userAndPassword.value as User;
},
}),
);
}
if (env.PROCEED_PUBLIC_IAM_LOGIN_USER_PASSWORD_ACTIVE || env.PROCEED_PUBLIC_IAM_LOGIN_MAIL_ACTIVE) {
- //Vorname, Nachname und Username input feldern,
const credentials: Record = {
firstName: {
type: 'string',
@@ -381,10 +406,14 @@ if (env.PROCEED_PUBLIC_IAM_LOGIN_USER_PASSWORD_ACTIVE || env.PROCEED_PUBLIC_IAM_
getUserByUsername(credentials.username as string),
getUserByEmail(credentials.email as string),
]);
- if (existingUserUsername) {
+
+ if (existingUserUsername.isErr()) throw existingUserUsername.error;
+ if (existingUserMail.isErr()) throw existingUserMail.error;
+
+ if (existingUserUsername.value) {
throw new NextAuthUsernameTakenError();
}
- if (existingUserMail) {
+ if (existingUserMail.value) {
throw new NextAuthEmailTakenError();
}
@@ -400,7 +429,8 @@ if (env.PROCEED_PUBLIC_IAM_LOGIN_USER_PASSWORD_ACTIVE || env.PROCEED_PUBLIC_IAM_
const userRegistrationToken = await createUserRegistrationToken(tokenParams, callbackUrl);
- await saveEmailVerificationToken(userRegistrationToken.verificationToken);
+ const res = await saveEmailVerificationToken(userRegistrationToken.verificationToken);
+ if (res.isErr()) throw new Error('Something went wrong');
const signinMail = renderSigninLinkEmail({
signInLink: userRegistrationToken.redirectUrl,
@@ -421,7 +451,7 @@ if (env.PROCEED_PUBLIC_IAM_LOGIN_USER_PASSWORD_ACTIVE || env.PROCEED_PUBLIC_IAM_
} else {
// Only password is enabled -> immediately create user
await db.$transaction(async (tx) => {
- user = await addUser(
+ const addUserResult = await addUser(
{
username: credentials.username,
firstName: credentials.firstName,
@@ -431,9 +461,12 @@ if (env.PROCEED_PUBLIC_IAM_LOGIN_USER_PASSWORD_ACTIVE || env.PROCEED_PUBLIC_IAM_
},
tx,
);
+ if (addUserResult.isErr()) throw addUserResult.error;
+ user = addUserResult.value;
const hashedPassword = await hashPassword(credentials.password as string);
- await setUserPassword(user.id, hashedPassword, tx);
+ const setUserResult = await setUserPassword(user.id, hashedPassword, tx);
+ if (setUserResult.isErr()) throw setUserResult.error;
});
}
diff --git a/src/management-system-v2/lib/authorization/authorization.ts b/src/management-system-v2/lib/authorization/authorization.ts
index 2c250b1f7..05c885b6a 100644
--- a/src/management-system-v2/lib/authorization/authorization.ts
+++ b/src/management-system-v2/lib/authorization/authorization.ts
@@ -6,6 +6,7 @@ import { getFolders } from '../data/db/folders';
import { getEnvironmentById } from '../data/db/iam/environments';
import { getAppliedRolesForUser } from './organizationEnvironmentRolesHelper';
import { MSEnabledResources } from './globalRules';
+import { ok } from 'neverthrow';
type PackedRules = PackedRulesForUser['rules'];
@@ -52,11 +53,11 @@ export async function getSpaceFolderTree(spaceId: string) {
const tree: TreeMap = {};
const folders = await getFolders(spaceId);
- for (const folder of folders) {
+ for (const folder of folders.value) {
if (folder.parentId) tree[folder.id] = folder.parentId;
}
- return tree;
+ return ok(tree);
}
/**
@@ -70,38 +71,54 @@ export async function getUserRules(userId: string, environmentId: string) {
// cached rules aren't being correctly removed after roles are updated
let userRules = undefined;
- if (userRules) return userRules;
+ if (userRules) return ok(userRules);
const space = (await getEnvironmentById(environmentId))!;
+ if (space.isErr()) {
+ return space;
+ }
- if (!space.isOrganization) {
- const { rules, expiration } = computeRulesForUser({ userId, space });
+ if (!space.value.isOrganization) {
+ const { rules, expiration } = computeRulesForUser({ userId, space: space.value });
cacheRulesForUser(userId, environmentId, rules, expiration);
- return rules;
+ return ok(rules);
}
- if (space.isActive) {
+ if (space.value.isActive) {
const roles = await getAppliedRolesForUser(userId, environmentId);
+ if (roles.isErr()) {
+ return roles;
+ }
+
// TODO: get bough features from db
- const getPurhasedFeatures = (_: string) => [];
+ const getPurchasedFeatures = (_: string) => [];
- const purchasedResources = getPurhasedFeatures(environmentId).filter((resource) =>
+ const purchasedResources = getPurchasedFeatures(environmentId).filter((resource) =>
MSEnabledResources.includes(resource as any),
);
- const { rules, expiration } = computeRulesForUser({ userId, space, roles, purchasedResources });
+ const { rules, expiration } = computeRulesForUser({
+ userId,
+ space: space.value,
+ roles: roles.value,
+ purchasedResources,
+ });
cacheRulesForUser(userId, environmentId, rules, expiration);
- return rules;
+ return ok(rules);
}
// Non active organization
- return [];
+ return ok([]);
}
export async function getAbilityForUser(userId: string, environmentId: string) {
const spaceFolderTree = await getSpaceFolderTree(environmentId);
+
const userRules = await getUserRules(userId, environmentId);
+ if (userRules.isErr()) {
+ return userRules;
+ }
- return new Ability(userRules, environmentId, spaceFolderTree);
+ return ok(new Ability(userRules.value, environmentId, spaceFolderTree.value));
}
diff --git a/src/management-system-v2/lib/authorization/organizationEnvironmentRolesHelper.ts b/src/management-system-v2/lib/authorization/organizationEnvironmentRolesHelper.ts
index bbb5c978c..a53062b13 100644
--- a/src/management-system-v2/lib/authorization/organizationEnvironmentRolesHelper.ts
+++ b/src/management-system-v2/lib/authorization/organizationEnvironmentRolesHelper.ts
@@ -2,31 +2,45 @@ import { Role } from '../data/role-schema';
import { getRoleById, getRoles } from '../data/db/iam/roles';
import { isMember } from '../data/db/iam/memberships';
import { getRoleMappingByUserId } from '../data/db/iam/role-mappings';
+import { ok, err, Result } from 'neverthrow';
+import { truthyFilter } from '../typescript-utils';
/** Returns all roles that are applied to a user in a given organization environment */
-export async function getAppliedRolesForUser(
- userId: string,
- environmentId: string,
-): Promise {
+export async function getAppliedRolesForUser(userId: string, environmentId: string) {
// enforces environment to be an organization
- if (!isMember(environmentId, userId)) throw new Error('User is not a member of this environment');
+ const checkIsMember = await isMember(environmentId, userId);
+ if (checkIsMember.isErr()) return checkIsMember;
+ if (!checkIsMember.value) return err(new Error('User is not a member of this environment'));
const environmentRoles = await getRoles(environmentId);
+ if (environmentRoles.isErr()) {
+ return environmentRoles;
+ }
const userRoles: Role[] = [];
- const guestRole = environmentRoles.find((role: any) => role.name === '@guest') as Role;
+ const guestRole = environmentRoles.value.find((role: any) => role.name === '@guest') as Role;
userRoles.push(guestRole);
- if (userId === '') return userRoles;
+ if (userId === '') return ok(userRoles);
- const everyoneRole = environmentRoles.find(
+ const everyoneRole = environmentRoles.value.find(
(role: any) => role.default && role.name === '@everyone',
) as Role;
userRoles.push(everyoneRole);
+
const roleMappings = await getRoleMappingByUserId(userId, environmentId);
- const mappedRoles = await Promise.all(roleMappings.map((mapping) => getRoleById(mapping.roleId)));
- userRoles.push(...mappedRoles);
+ if (roleMappings.isErr()) {
+ return roleMappings;
+ }
+
+ const roleResults = Result.combine(
+ await Promise.all(roleMappings.value.map((mapping) => getRoleById(mapping.roleId))),
+ );
+
+ if (roleResults.isErr()) return roleResults;
+
+ roleResults.value.filter(truthyFilter).forEach((role) => userRoles.push(role));
- return userRoles.filter((e) => e !== undefined);
+ return ok(userRoles);
}
diff --git a/src/management-system-v2/lib/controls-store.ts b/src/management-system-v2/lib/controls-store.ts
index e656cdd62..087f0c60a 100644
--- a/src/management-system-v2/lib/controls-store.ts
+++ b/src/management-system-v2/lib/controls-store.ts
@@ -1,5 +1,5 @@
import { v4 as randomUUID } from 'uuid';
-import { KeyboardEventHandler, useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { create } from 'zustand';
import { immer } from 'zustand/middleware/immer';
@@ -178,14 +178,14 @@ type AddControlCallbackOptions = {
* The callback will be invoked in the order of priority.
* The callback can block other callbacks with lower priority from being invoked.
* The callback will be removed when the component is unmounted.
- *
+ *
* @param names The name or names of the control-area to add the callback to.
* @param eventname The event-type(s) to listen to, can be string or list of strings for multiple.
* @param callback The callback to invoke when the event is emitted.
* @param options : {
level?: 1 | 2 | 3 | 4 | 5; // The higher the number, the earlier the callback gets invoked
blocking?: boolean; // If true, the callback will block callbacks with lower priority from being invoked
- dependencies?: Array; // The dependencies to watch for changes to re-register the callback
+ dependencies?: Array; // The dependencies to watch for changes to re-register the callback
}
*/
export const useAddControlCallback = (
@@ -209,7 +209,7 @@ export const useAddControlCallback = (
controlStore.registerControls({
area: name,
actions: eventnames,
- }); /*
+ }); /*
This allows to register Callbacks to any control-area and event-type, even if they do not exist, yet.
This means, that callbacks registered to non-existing control-areas will never be invoked!
However, this enables an arbitrary order of registering a control-area and callbacks
@@ -259,28 +259,28 @@ type ControlEventListener = (event: T) => void;
/**
* Register a control-area with custom event-mapping.
- *
+ *
* @param name The name of the control-area to register.
- * @param eventChecker The event-checker, a function that determines, when a registered event for the area should be emitted. Defaults to
- *
+ * @param eventChecker The event-checker, a function that determines, when a registered event for the area should be emitted. Defaults to
+ *
* {
- *
+ *
selectall: (e) => (e.ctrlKey || e.metaKey) && e.key === 'a',
del: (e) => e.key === 'Delete',
-
+
esc: (e) => e.key === 'Escape',
-
+
copy: (e) => (e.ctrlKey || e.metaKey) && e.key === 'c',
-
+
paste: (e) => (e.ctrlKey || e.metaKey) && e.key === 'v',
-
+
controlenter: (e) => (e.ctrlKey || e.metaKey) && e.key === 'Enter',
-
+
enter: (e) => !(e.ctrlKey || e.metaKey) && e.key === 'Enter',
-
+
cut: (e) => (e.ctrlKey || e.metaKey) && e.key === 'x',
-
+
};
* @param element The element to listen on, for initial event (React Ref), defaults to window.
* @param eventType The event-type to listen to, defaults to "keydown" (Only generated by ,
The affected organizations are:
- {conflictingOrgsNames.map((name, idx) => (
- -
- {name}:{' '}
-
- manage roles here
-
+ {conflictingOrgs.map(({ name, id }) => (
+
-
+ {name}: manage roles here
))}
@@ -62,19 +66,31 @@ export async function deleteUser() {
}
return userError(message);
+ } catch (_) {
+ return userError('Something weng wrong');
}
}
export async function updateUser(newUserDataInput: AuthenticatedUserData) {
try {
- const { userId } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { userId } = currentUser.value;
+
const user = await getUserById(userId);
+ if (user.isErr()) {
+ return userError(getErrorMessage(user.error));
+ }
- if (user?.isGuest) {
+ if (user.value?.isGuest) {
return userError('Guest users cannot be updated');
}
- const newUserData = AuthenticatedUserDataSchema.parse(newUserDataInput);
+ const parseResult = AuthenticatedUserDataSchema.safeParse(newUserDataInput);
+ if (!parseResult.success) return userError('Malformed data');
+ const newUserData = parseResult.data;
await _updateUser(userId, { ...newUserData });
} catch (e) {
@@ -83,32 +99,50 @@ export async function updateUser(newUserDataInput: AuthenticatedUserData) {
}
}
-export async function getUsersFavourites(): Promise {
- const { userId } = await getCurrentUser();
+export async function getUsersFavourites() {
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { userId } = currentUser.value;
const user = await getUserById(userId);
+ if (user.isErr()) {
+ return userError(getErrorMessage(user.error));
+ }
- if (user?.isGuest) {
+ if (user.value?.isGuest) {
return []; // Guest users have no favourites
}
- return user?.favourites ?? [];
+ return user.value?.favourites ?? [];
}
export async function setUserPassword(newPassword: string) {
try {
- const { userId } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { userId } = currentUser.value;
+
const user = await getUserById(userId);
+ if (user.isErr()) {
+ return userError(getErrorMessage(user.error));
+ }
- if (!user) {
+ if (!user.value) {
return userError('Invalid session, please sign in again');
}
- if (user?.isGuest) {
+ if (user.value?.isGuest) {
return userError('Guest users cannot change their password');
}
const passwordHash = await hashPassword(newPassword);
- await _setUserPassword(userId, passwordHash);
+ const result = await _setUserPassword(userId, passwordHash);
+ if (result.isErr()) {
+ return userError(getErrorMessage(result.error));
+ }
} catch (e) {
const message = getErrorMessage(e);
return userError(message);
@@ -116,7 +150,7 @@ export async function setUserPassword(newPassword: string) {
}
// To avoid this endpoint from being abused there's not much we can do, but we do the following:
-// - Encoforce the user to be an admin of an org
+// - Enforce the user to be an admin of an org
// - Search query has to be at least 4 characters long
// - We only return 10 users
export async function queryUsers(organizationId: string, searchQuery: string) {
@@ -124,15 +158,26 @@ export async function queryUsers(organizationId: string, searchQuery: string) {
return userError('Unauthorized', UserErrorType.PermissionError);
}
- const { userId } = await getCurrentUser();
- const { activeEnvironment } = await getCurrentEnvironment(organizationId);
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { userId } = currentUser.value;
+
+ const currentEnvironment = await getCurrentEnvironment(organizationId);
+ if (currentEnvironment.isErr()) {
+ return userError(getErrorMessage(currentEnvironment.error));
+ }
+ const { activeEnvironment } = currentEnvironment.value;
if (!activeEnvironment.isOrganization) {
return userError('Unauthorized', UserErrorType.PermissionError);
}
const userRoles = await getAppliedRolesForUser(userId, organizationId);
- const isAdmin = userRoles.some((role) => role.name === '@admin');
+ if (userRoles.isErr()) return userError(getErrorMessage(userRoles.error));
+
+ const isAdmin = userRoles.value.some((role) => role.name === '@admin');
if (!isAdmin) {
return userError('Unauthorized', UserErrorType.PermissionError);
}
@@ -175,7 +220,11 @@ export async function setUserTemporaryPassword(
spaceId?: string,
) {
try {
- const { user, systemAdmin } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { user, systemAdmin } = currentUser.value;
let allowed = false;
if (systemAdmin) {
diff --git a/src/management-system-v2/lib/db-seed.ts b/src/management-system-v2/lib/db-seed.ts
index e1012e4df..4804920b6 100644
--- a/src/management-system-v2/lib/db-seed.ts
+++ b/src/management-system-v2/lib/db-seed.ts
@@ -5,7 +5,6 @@ import { addRoleMappings } from './data/db/iam/role-mappings';
import {
OrganizationEnvironment,
UserOrganizationEnvironmentInputSchema,
- environmentSchema,
} from './data/environment-schema';
import { addRole, getRoleById } from './data/db/iam/roles';
import { addEnvironment, getEnvironmentById } from './data/db/iam/environments';
@@ -166,6 +165,7 @@ function verifySeed(seed: DBSeed) {
* -----------------------------------------------------------------------------------------------*/
async function writeSeedToDb(seed: DBSeed) {
+ // We need to throw inside the transcation to cancel it
await db.$transaction(async (tx) => {
const seedVersion = new Date(seed.version);
const seedVersionDb = await tx.seedVersion.findUnique({
@@ -196,16 +196,20 @@ async function writeSeedToDb(seed: DBSeed) {
const usernameToId = new Map();
for (const user of seed.users) {
const existingUser = await getUserById(user.id);
- if (existingUser) {
+ if (existingUser.isErr()) throw existingUser.error;
+
+ if (existingUser.value) {
// Use the username in seed-file instead of username in the db, as it may have changed
- usernameToId.set(user.username, existingUser.id);
+ usernameToId.set(user.username, existingUser.value.id);
continue;
}
const newUser = await addUser({ ...user, isGuest: false, emailVerifiedOn: null }, tx);
+ if (newUser.isErr()) throw newUser.error;
+
const hashedPassword = await hashPassword(user.initialPassword);
await setUserPassword(user.id, hashedPassword, tx, true);
- usernameToId.set(user.username, newUser.id);
+ usernameToId.set(user.username, newUser.value.id);
}
// Add system administrators
@@ -235,9 +239,13 @@ async function writeSeedToDb(seed: DBSeed) {
// Create / Update organizations
for (const organization of seed.organizations) {
// create org
- let org = await getEnvironmentById(organization.id);
+ const existingOrg = await getEnvironmentById(organization.id);
+ if (existingOrg.isErr()) throw existingOrg.error;
+
+ let org = existingOrg.value;
+
if (!org) {
- org = (await addEnvironment(
+ const newOrg = await addEnvironment(
{
id: organization.id,
ownerId: usernameToId.get(organization.owner)!,
@@ -251,22 +259,30 @@ async function writeSeedToDb(seed: DBSeed) {
},
undefined,
tx,
- )) as OrganizationEnvironment;
+ );
+ if (newOrg.isErr()) throw newOrg.error;
+
+ org = newOrg.value as OrganizationEnvironment;
}
// Add members + get their roles
const userRoleMappings = new Map();
for (const member of organization.members) {
const memberId = usernameToId.get(member)!;
- if (!(await isMember(org.id, memberId, tx))) {
- await addMember(org.id, memberId, undefined, tx);
+ const checkIsMember = await isMember(org.id, memberId, tx);
+ if (checkIsMember.isErr()) return checkIsMember;
+ if (!checkIsMember.value) {
+ const res = await addMember(org.id, memberId, undefined, tx);
+ if (res.isErr()) return res;
}
// get members role mappings
const userRoles = await getRoleMappingByUserId(memberId, org.id, undefined, undefined, tx);
+ if (userRoles.isErr()) throw userRoles.error;
+
userRoleMappings.set(
memberId,
- userRoles.map((role) => role.roleId),
+ userRoles.value.map((role) => role.roleId),
);
}
@@ -306,14 +322,17 @@ async function writeSeedToDb(seed: DBSeed) {
const roleMembers = roleInput.members;
delete (roleInput as any)['members'];
- let role = await getRoleById(roleInput.id, undefined, tx);
+ const existingRole = await getRoleById(roleInput.id, undefined, tx);
+ if (existingRole.isErr()) throw existingRole.error;
+
+ let role = existingRole.value;
if (!role) {
const rolePermissions: Partial> = {};
for (const [action, permissions] of Object.entries(roleInput.permissions)) {
rolePermissions[action as ResourceType] = permissionIdentifiersToNumber(permissions);
}
- role = await addRole(
+ const newRole = await addRole(
{
...roleInput,
permissions: rolePermissions,
@@ -322,6 +341,9 @@ async function writeSeedToDb(seed: DBSeed) {
undefined,
tx,
);
+ if (newRole.isErr()) throw newRole.error;
+
+ role = newRole.value;
}
for (const roleMember of roleMembers) {
diff --git a/src/management-system-v2/lib/email-verification-tokens/server-actions.ts b/src/management-system-v2/lib/email-verification-tokens/server-actions.ts
index 0b3160620..09dfab366 100644
--- a/src/management-system-v2/lib/email-verification-tokens/server-actions.ts
+++ b/src/management-system-v2/lib/email-verification-tokens/server-actions.ts
@@ -1,7 +1,5 @@
'use server';
-
import { z } from 'zod';
-import { userError } from '../user-error';
import { createChangeEmailVerificationToken, getTokenHash, notExpired } from './utils';
import { getCurrentUser } from '@/components/auth';
import {
@@ -12,10 +10,16 @@ import {
import { updateUser } from '@/lib/data/db/iam/users';
import { sendEmail } from '../email/mailer';
import renderSigninLinkEmail from '../email/signin-link-email';
+import { getErrorMessage, userError } from '../server-error-handling/user-error';
export async function requestEmailChange(newEmail: string) {
try {
- const { session } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return userError(getErrorMessage(currentUser.error));
+ }
+ const { session } = currentUser.value;
+
if (!session || session.user.isGuest)
return userError('You must be signed in to change your email');
const userId = session.user.id;
@@ -54,21 +58,32 @@ export async function requestEmailChange(newEmail: string) {
}
export async function changeEmail(token: string, identifier: string, cancel: boolean = false) {
- const { session, userId } = await getCurrentUser();
+ const currentUser = await getCurrentUser();
+ if (currentUser.isErr()) {
+ return currentUser;
+ }
+ const { session, userId } = currentUser.value;
if (!session || session.user.isGuest)
return userError('You must be signed in to change your email');
const tokenParams = { identifier, token: await getTokenHash(token) };
const verificationToken = await getEmailVerificationToken(tokenParams);
+ if (verificationToken.isErr()) {
+ return userError(getErrorMessage(verificationToken.error));
+ }
+
if (
- !verificationToken ||
- verificationToken.type !== 'change_email' ||
- verificationToken.userId !== userId ||
- !(await notExpired(verificationToken))
+ !verificationToken.value ||
+ verificationToken.value.type !== 'change_email' ||
+ verificationToken.value.userId !== userId ||
+ !(await notExpired(verificationToken.value))
)
return userError('Invalid token');
- if (!cancel) updateUser(userId, { email: verificationToken.identifier, isGuest: false });
+ if (!cancel) updateUser(userId, { email: verificationToken.value.identifier, isGuest: false });
- await deleteEmailVerificationToken(tokenParams);
+ const deleteResult = await deleteEmailVerificationToken(tokenParams);
+ if (deleteResult.isErr()) {
+ return userError(getErrorMessage(deleteResult.error));
+ }
}
diff --git a/src/management-system-v2/lib/email/signin-link-email.tsx b/src/management-system-v2/lib/email/signin-link-email.tsx
index b2a2c2ad7..fa6be1fc3 100644
--- a/src/management-system-v2/lib/email/signin-link-email.tsx
+++ b/src/management-system-v2/lib/email/signin-link-email.tsx
@@ -13,7 +13,6 @@ import {
Text,
render,
} from '@react-email/components';
-import * as React from 'react';
import { env } from '../ms-config/env-vars';
const baseUrl = env.NEXTAUTH_URL;
diff --git a/src/management-system-v2/lib/engines/deployment.ts b/src/management-system-v2/lib/engines/deployment.ts
index d1796d8d3..d2beb940e 100644
--- a/src/management-system-v2/lib/engines/deployment.ts
+++ b/src/management-system-v2/lib/engines/deployment.ts
@@ -15,7 +15,7 @@ import { prepareExport } from '../process-export/export-preparation';
import { Prettify } from '../typescript-utils';
import { engineRequest } from './endpoints/index';
import { asyncForEach } from '../helpers/javascriptHelpers';
-import { UserFacingError } from '../user-error';
+import { UserFacingError } from '../server-error-handling/user-error';
type ProcessesExportData = Prettify>>;
diff --git a/src/management-system-v2/lib/engines/instances.ts b/src/management-system-v2/lib/engines/instances.ts
index ad52be383..7624e79a9 100644
--- a/src/management-system-v2/lib/engines/instances.ts
+++ b/src/management-system-v2/lib/engines/instances.ts
@@ -2,7 +2,7 @@
import { Engine } from './machines';
import { engineRequest } from './endpoints/index';
-import { userError } from '../user-error';
+import { userError } from '@/lib/server-error-handling/user-error';
export async function startInstanceOnMachine(
definitionId: string,
diff --git a/src/management-system-v2/lib/engines/server-actions.ts b/src/management-system-v2/lib/engines/server-actions.ts
index 9020b7928..04ee953c2 100644
--- a/src/management-system-v2/lib/engines/server-actions.ts
+++ b/src/management-system-v2/lib/engines/server-actions.ts
@@ -1,6 +1,11 @@
'use server';
-import { UserFacingError, getErrorMessage, userError } from '../user-error';
+import {
+ UserFacingError,
+ getErrorMessage,
+ isUserErrorResponse,
+ userError,
+} from '../server-error-handling/user-error';
import {
DeployedProcessInfo,
deployProcess as _deployProcess,
@@ -43,25 +48,40 @@ import {
import { getFileFromMachine, submitFileToMachine, updateVariablesOnMachine } from './instances';
import { getProcessIds, getVariablesFromElementById } from '@proceed/bpmn-helper';
import { Variable } from '@proceed/bpmn-helper/src/getters';
-import Ability from '../ability/abilityHelper';
export async function getCorrectTargetEngines(
spaceId: string,
onlyProceedEngines = false,
validatorFunc?: (engine: Engine) => Promise,
) {
- const { ability } = await getCurrentEnvironment(spaceId);
+ const currentEnvironment = await getCurrentEnvironment(spaceId);
+ if (currentEnvironment.isErr()) {
+ return userError(getErrorMessage(currentEnvironment.error));
+ }
+ const { ability } = currentEnvironment.value;
let engines: Engine[] = [];
if (onlyProceedEngines) {
// force that only proceed engines are supposed to be used
const proceedSavedEngines = await getDbEngines(null, undefined, 'dont-check');
- engines = await savedEnginesToEngines(proceedSavedEngines);
+ if (proceedSavedEngines.isErr()) return userError(getErrorMessage(proceedSavedEngines.error));
+
+ engines = await savedEnginesToEngines(proceedSavedEngines.value);
} else {
// use all available engines
const [proceedEngines, spaceEngines] = await Promise.allSettled([
- getDbEngines(null, undefined, 'dont-check').then(savedEnginesToEngines),
- getDbEngines(spaceId, ability).then(savedEnginesToEngines),
+ (async () => {
+ const engines = await getDbEngines(null, undefined, 'dont-check');
+ if (engines.isErr()) throw engines.error;
+
+ return await savedEnginesToEngines(engines.value);
+ })(),
+ (async () => {
+ const engines = await getDbEngines(spaceId, ability);
+ if (engines.isErr()) throw engines.error;
+
+ return await savedEnginesToEngines(engines.value);
+ })(),
]);
if (proceedEngines.status === 'fulfilled') engines = proceedEngines.value;
@@ -88,15 +108,24 @@ export async function deployProcess(
let engines;
if (_forceEngine && _forceEngine !== 'PROCEED') {
// forcing a specific engine
- const { ability } = await getCurrentEnvironment(spaceId);
+ const currentEnvironment = await getCurrentEnvironment(spaceId);
+ if (currentEnvironment.isErr()) {
+ return userError(getErrorMessage(currentEnvironment.error));
+ }
+ const { ability } = currentEnvironment.value;
+
const address =
_forceEngine.type === 'http' ? _forceEngine.address : _forceEngine.brokerAddress;
+
const spaceEngine = await getDbEngineByAddress(address, spaceId, ability);
- if (!spaceEngine) throw new Error('No matching space engine found');
- engines = await savedEnginesToEngines([spaceEngine]);
+ if (spaceEngine.isErr()) return userError(getErrorMessage(spaceEngine.error));
+ if (!spaceEngine.value) throw new Error('No matching space engine found');
+
+ engines = await savedEnginesToEngines([spaceEngine.value]);
if (engines.length === 0) throw new Error("Engine couldn't be reached");
} else {
engines = await getCorrectTargetEngines(spaceId, _forceEngine === 'PROCEED');
+ if (isUserErrorResponse(engines)) return engines;
}
if (engines.length === 0) throw new UserFacingError('No fitting engine found.');
@@ -118,6 +147,8 @@ export async function removeDeployment(definitionId: string, spaceId: string) {
return deployments.some((deployment) => deployment.definitionId === definitionId);
});
+ if (isUserErrorResponse(engines)) return engines;
+
await removeDeploymentFromMachines(engines, definitionId);
} catch (e) {
const message = getErrorMessage(e);
@@ -131,6 +162,7 @@ export async function getAvailableTaskListEntries(spaceId: string) {
throw new Error('getAvailableTaskListEntries only available with enableUseDB');
const engines = await getCorrectTargetEngines(spaceId);
+ if (isUserErrorResponse(engines)) return engines;
let stored = await getUserTasks();
@@ -242,7 +274,6 @@ export async function getTasklistEntryHTML(spaceId: string, userTaskId: string,
state: storedState,
} = storedUserTask;
const [taskId, instanceId, startTimeString] = userTaskId.split('|');
- const [definitionId] = instanceId.split('-_');
if (!html || !milestones || !initialVariables) {
const startTime = parseInt(startTimeString);
@@ -250,6 +281,8 @@ export async function getTasklistEntryHTML(spaceId: string, userTaskId: string,
const definitionId = instanceId.split('-_')[0];
let engines = await getCorrectTargetEngines(spaceId);
+ if (isUserErrorResponse(engines)) return engines;
+
let deployments = await asyncMap(engines, async (engine) => {
return [engine, await fetchDeployments([engine])] as [Engine, DeployedProcessInfo[]];
});
@@ -327,7 +360,8 @@ export async function getTasklistEntryHTML(spaceId: string, userTaskId: string,
// maps relative urls used to get resources on the engine to the MS api to allow them to work here as well
function mapResourceUrls(variables: Record) {
- if (!variables) return variables;
+ if (!instanceId || !variables) return variables;
+ const definitionId = instanceId.split('-_')[0];
return Object.fromEntries(
Object.entries(variables).map(([key, value]) => {
@@ -385,6 +419,8 @@ export async function addOwnerToTaskListEntry(spaceId: string, userTaskId: strin
return instance.tokens.some((token) => token.currentFlowElementId === taskId);
});
+ if (isUserErrorResponse(engines)) return engines;
+
if (engines.length) {
return await addOwnerToTaskListEntryOnMachine(engines[0], instanceId, taskId, owner);
}
@@ -434,6 +470,8 @@ export async function setTasklistEntryVariableValues(
return instance.tokens.some((token) => token.currentFlowElementId === taskId);
});
+ if (isUserErrorResponse(engines)) return engines;
+
if (engines.length) {
await setTasklistEntryVariableValuesOnMachine(engines[0], instanceId, taskId, variables);
}
@@ -481,6 +519,8 @@ export async function setTasklistMilestoneValues(
return instance.tokens.some((token) => token.currentFlowElementId === taskId);
});
+ if (isUserErrorResponse(engines)) return engines;
+
if (engines.length) {
await setTasklistEntryMilestoneValuesOnMachine(engines[0], instanceId, taskId, milestones);
}
@@ -526,6 +566,8 @@ export async function completeTasklistEntry(
return instance.tokens.some((token) => token.currentFlowElementId === taskId);
});
+ if (isUserErrorResponse(engines)) return engines;
+
if (!engines.length)
throw new Error('Failed to find the engine the user task is running on!');
@@ -575,6 +617,8 @@ export async function updateVariables(
);
});
+ if (isUserErrorResponse(engines)) return engines;
+
await asyncForEach(
engines,
async (engine) => await updateVariablesOnMachine(definitionId, instanceId, engine, variables),
@@ -593,7 +637,11 @@ export async function submitFile(
file: Buffer,
) {
try {
- const { ability } = await getCurrentEnvironment(spaceId);
+ const currentEnvironment = await getCurrentEnvironment(spaceId);
+ if (currentEnvironment.isErr()) {
+ return userError(getErrorMessage(currentEnvironment.error));
+ }
+ const { ability } = currentEnvironment.value;
const [taskId, instanceId] = userTaskId.split('|');
const [definitionId] = instanceId.split('-_');
@@ -611,10 +659,12 @@ export async function submitFile(
return instance.tokens.some((token) => token.currentFlowElementId === taskId);
});
+ if (isUserErrorResponse(engines)) return engines;
+
engines = ability ? ability.filter('view', 'Machine', engines) : engines;
if (!engines.length) {
- throw new UserFacingError('Failed to find the engine the user task is running on!');
+ return userError('Failed to find the engine the user task is running on!');
}
const res = await submitFileToMachine(
@@ -639,7 +689,11 @@ export async function getFile(
instanceId: string,
fileName: string,
) {
- const { ability } = await getCurrentEnvironment(spaceId);
+ const currentEnvironment = await getCurrentEnvironment(spaceId);
+ if (currentEnvironment.isErr()) {
+ return userError(getErrorMessage(currentEnvironment.error));
+ }
+ const { ability } = currentEnvironment.value;
try {
// find the engine the instance is running on
@@ -651,10 +705,12 @@ export async function getFile(
);
});
+ if (isUserErrorResponse(engines)) return engines;
+
engines = ability ? ability.filter('view', 'Machine', engines) : engines;
if (!engines.length) {
- throw new UserFacingError('Failed to find the engine the instance is running on!');
+ return userError('Failed to find the engine the instance is running on!');
}
return await getFileFromMachine(definitionId, instanceId, fileName, engines[0]);
@@ -670,9 +726,16 @@ export async function getAvailableSpaceEngines(spaceId: string) {
if (!enableUseDB)
throw new Error('getAvailableEnginesForSpace only available with enableUseDB');
- const { ability } = await getCurrentEnvironment(spaceId);
+ const currentEnvironment = await getCurrentEnvironment(spaceId);
+ if (currentEnvironment.isErr()) {
+ return userError(getErrorMessage(currentEnvironment.error));
+ }
+ const { ability } = currentEnvironment.value;
+
const spaceEngines = await getDbEngines(spaceId, ability);
- return (await savedEnginesToEngines(spaceEngines)) as SpaceEngine[];
+ if (spaceEngines.isErr()) return userError(getErrorMessage(spaceEngines.error));
+
+ return (await savedEnginesToEngines(spaceEngines.value)) as SpaceEngine[];
} catch (e) {
const message = getErrorMessage(e);
return userError(message);
@@ -681,6 +744,7 @@ export async function getAvailableSpaceEngines(spaceId: string) {
export async function getDeployment(spaceId: string, definitionId: string) {
const engines = await getCorrectTargetEngines(spaceId);
+ if (isUserErrorResponse(engines)) return engines;
const deployments = await fetchDeployments(engines);
@@ -700,6 +764,8 @@ export async function getProcessImage(spaceId: string, definitionId: string, fil
return deployments.some((deployment) => deployment.definitionId === definitionId);
});
+ if (isUserErrorResponse(engines)) return engines;
+
if (!engines.length) throw new Error('Failed to an engine the process was deployed to!');
return await getProcessImageFromMachine(engines[0], definitionId, fileName);
diff --git a/src/management-system-v2/lib/engines/use-engines.tsx b/src/management-system-v2/lib/engines/use-engines.tsx
index 4c8d8e7a4..a07cfa56d 100644
--- a/src/management-system-v2/lib/engines/use-engines.tsx
+++ b/src/management-system-v2/lib/engines/use-engines.tsx
@@ -1,17 +1,11 @@
import { useEnvironment } from '@/components/auth-can';
-import {
- Engine,
- HttpEngine,
- MqttEngine,
- SpaceEngine,
- isHttpEngine,
- isMqttEngine,
-} from './machines';
+import { Engine, HttpEngine, MqttEngine, isHttpEngine, isMqttEngine } from './machines';
import { useCallback } from 'react';
import { getCorrectTargetEngines } from './server-actions';
import { useQuery } from '@tanstack/react-query';
import { asyncFilter } from '../helpers/javascriptHelpers';
import { truthyFilter } from '../typescript-utils';
+import { isUserErrorResponse } from '../server-error-handling/user-error';
function useEngines(
filter: { key: any[]; fn: (engine: Engine) => Promise } = {
@@ -24,6 +18,8 @@ function useEngines(
const queryFn = useCallback(async () => {
if (space.spaceId) {
let res = await getCorrectTargetEngines(space.spaceId);
+ if (isUserErrorResponse(res)) throw res.error;
+
const knownEngines: Record = {};
res = await asyncFilter(res, filter.fn);
diff --git a/src/management-system-v2/lib/errors.ts b/src/management-system-v2/lib/errors.ts
deleted file mode 100644
index 86c08b20f..000000000
--- a/src/management-system-v2/lib/errors.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { UserFacingError } from './user-error';
-
-export class SpaceNotFoundError extends UserFacingError {
- static prefix = '404' as const;
- constructor(message?: string) {
- super(`${SpaceNotFoundError.prefix}: ${message || 'Space not found'}`);
- }
-}
diff --git a/src/management-system-v2/lib/helpers/processHelpers.ts b/src/management-system-v2/lib/helpers/processHelpers.ts
index 86c675999..5a0df31aa 100644
--- a/src/management-system-v2/lib/helpers/processHelpers.ts
+++ b/src/management-system-v2/lib/helpers/processHelpers.ts
@@ -18,20 +18,13 @@ import {
getIdentifyingInfos,
addDocumentation,
setDefinitionsVersionInformation,
- getUserTaskFileNameMapping,
- setUserTaskData,
- getScriptTaskFileNameMapping,
- setScriptTaskData,
updateBpmnCreatorAttributes,
updateBpmnOriginalAttributes,
- getStartFormFileNameMapping,
- setStartFormFileName,
getAllElements,
setExecutableProperties,
} from '@proceed/bpmn-helper';
import { ProcessInput, ProcessInputSchema, ProcessMetadata } from '../data/process-schema';
import { WithRequired } from '../typescript-utils';
-import { asyncForEach } from './javascriptHelpers';
import { XMLAttrDBProcessTableColsMap } from './xmlAttr-db-process-cols-map';
interface ProcessInfo {
diff --git a/src/management-system-v2/lib/helpers/processVersioning.ts b/src/management-system-v2/lib/helpers/processVersioning.ts
index c70a60aa4..ed3e1eadf 100644
--- a/src/management-system-v2/lib/helpers/processVersioning.ts
+++ b/src/management-system-v2/lib/helpers/processVersioning.ts
@@ -27,7 +27,7 @@ import {
getProcessHtmlFormJSON,
getHtmlForm,
} from '@/lib/data/db/process';
-import { getProcessHtmlFormHTML } from '../data/processes';
+import { getErrorMessage, userError } from '../server-error-handling/user-error';
const { diff } = require('bpmn-js-differ');
// TODO: This used to be a helper file in the old management system. It used
@@ -159,14 +159,20 @@ export async function versionStartForm(
if (!dryRun) {
const startFormHtml = await getHtmlForm(processInfo.id, fileName);
+ if (startFormHtml.isErr()) return userError(getErrorMessage(startFormHtml.error));
+
const startFormData = await getProcessHtmlFormJSON(processInfo.id, fileName);
- await saveProcessHtmlForm(
+ if (startFormData.isErr()) return userError(getErrorMessage(startFormData.error));
+
+ const res = await saveProcessHtmlForm(
processInfo.id,
versionFileName,
- startFormData!,
- startFormHtml!,
+ startFormData.value!,
+ startFormHtml.value!,
versionCreatedOn,
);
+
+ if (res.isErr()) return userError(getErrorMessage(res.error));
}
// update ref for the artifacts referenced by the versioned start form
@@ -204,14 +210,19 @@ export async function versionUserTasks(
if (!dryRun) {
const userTaskHtml = await getHtmlForm(processInfo.id, fileName);
+ if (userTaskHtml.isErr()) return userError(getErrorMessage(userTaskHtml.error));
+
const userTaskData = await getProcessHtmlFormJSON(processInfo.id, fileName);
- await saveProcessHtmlForm(
+ if (userTaskData.isErr()) return userError(getErrorMessage(userTaskData.error));
+
+ const res = await saveProcessHtmlForm(
processInfo.id,
versionFileName,
- userTaskData!,
- userTaskHtml!,
+ userTaskData.value!,
+ userTaskHtml.value!,
versionCreatedOn,
);
+ if (res.isErr()) return userError(getErrorMessage(res.error));
}
// update ref for the artifacts referenced by the versioned user task
@@ -247,35 +258,38 @@ export async function versionScriptTasks(
if (!dryRun) {
try {
const scriptTaskJS = await getProcessScriptTaskScript(processInfo.id, fileName + '.js');
+ if (scriptTaskJS.isErr()) return userError(getErrorMessage(scriptTaskJS.error));
await saveProcessScriptTask(
processInfo.id,
versionFileName + '.js',
- scriptTaskJS,
+ scriptTaskJS.value,
versionCreatedOn,
);
} catch (err) {}
try {
const scriptTaskTS = await getProcessScriptTaskScript(processInfo.id, fileName + '.ts');
-
- await saveProcessScriptTask(
- processInfo.id,
- versionFileName + '.ts',
- scriptTaskTS,
- versionCreatedOn,
- );
+ if (scriptTaskTS.isOk()) {
+ await saveProcessScriptTask(
+ processInfo.id,
+ versionFileName + '.ts',
+ scriptTaskTS.value,
+ versionCreatedOn,
+ );
+ }
} catch (err) {}
try {
const scriptTaskXML = await getProcessScriptTaskScript(processInfo.id, fileName + '.xml');
-
- await saveProcessScriptTask(
- processInfo.id,
- versionFileName + '.xml',
- scriptTaskXML,
- versionCreatedOn,
- );
+ if (scriptTaskXML.isOk()) {
+ await saveProcessScriptTask(
+ processInfo.id,
+ versionFileName + '.xml',
+ scriptTaskXML.value,
+ versionCreatedOn,
+ );
+ }
} catch (err) {}
}
@@ -346,18 +360,20 @@ const getUsedStartFormFileNames = async (bpmn: string) => {
};
export async function selectAsLatestVersion(processId: string, versionId: string) {
- const versionBpmn = (await getProcessVersionBpmn(processId, versionId)) as string;
+ const versionBpmn = await getProcessVersionBpmn(processId, versionId);
+ if (versionBpmn.isErr()) return userError(getErrorMessage(versionBpmn.error));
const {
bpmn: convertedBpmn,
changedStartFormTaskFileNames,
changedScriptTaskFileNames,
changedUserTaskFileNames,
- } = await convertToEditableBpmn(versionBpmn);
+ } = await convertToEditableBpmn(versionBpmn.value);
- const editableBpmn = (await getProcessBpmn(processId)) as string;
+ const editableBpmn = await getProcessBpmn(processId);
+ if (editableBpmn.isErr()) return userError(getErrorMessage(editableBpmn.error));
- const startFormFileNameInEditableVersion = await getUsedStartFormFileNames(editableBpmn);
+ const startFormFileNameInEditableVersion = await getUsedStartFormFileNames(editableBpmn.value);
await asyncForEach(startFormFileNameInEditableVersion, async (processFileName) => {
await deleteHtmlForm(processId, processFileName);
@@ -365,12 +381,16 @@ export async function selectAsLatestVersion(processId: string, versionId: string
await asyncForEach(Object.entries(changedStartFormTaskFileNames), async ([oldName, newName]) => {
const json = await getProcessHtmlFormJSON(processId, oldName);
+ if (json.isErr()) return;
+
const html = await getHtmlForm(processId, oldName);
+ if (html.isErr()) return;
- if (json && html) await saveProcessHtmlForm(processId, newName, json, html);
+ if (json.value && html.value)
+ await saveProcessHtmlForm(processId, newName, json.value, html.value);
});
- const scriptFileNamesinEditableVersion = await getUsedScriptTaskFileNames(editableBpmn);
+ const scriptFileNamesinEditableVersion = await getUsedScriptTaskFileNames(editableBpmn.value);
// delete scripts stored for latest version
await asyncForEach(scriptFileNamesinEditableVersion, async (taskFileName) => {
@@ -384,12 +404,14 @@ export async function selectAsLatestVersion(processId: string, versionId: string
for (const type of ['js', 'ts', 'xml']) {
try {
const fileContent = await getProcessScriptTaskScript(processId, oldName + '.' + type);
- await saveProcessScriptTask(processId, newName + '.' + type, fileContent);
+ if (fileContent.isErr()) return;
+
+ await saveProcessScriptTask(processId, newName + '.' + type, fileContent.value);
} catch (err) {}
}
});
- const userTaskFileNamesinEditableVersion = await getUsedUserTaskFileNames(editableBpmn);
+ const userTaskFileNamesinEditableVersion = await getUsedUserTaskFileNames(editableBpmn.value);
// Delete UserTasks stored for latest version
await asyncForEach(userTaskFileNamesinEditableVersion, async (taskFileName) => {
@@ -399,9 +421,13 @@ export async function selectAsLatestVersion(processId: string, versionId: string
// Store UserTasks from this version as UserTasks from latest version
await asyncForEach(Object.entries(changedUserTaskFileNames), async ([oldName, newName]) => {
const json = await getProcessHtmlFormJSON(processId, oldName);
+ if (json.isErr()) return;
+
const html = await getHtmlForm(processId, oldName);
+ if (html.isErr()) return;
- if (json && html) await saveProcessHtmlForm(processId, newName, json, html);
+ if (json.value && html.value)
+ await saveProcessHtmlForm(processId, newName, json.value, html.value);
});
// Store bpmn from this version as latest version
diff --git a/src/management-system-v2/lib/invitation-tokens.ts b/src/management-system-v2/lib/invitation-tokens.ts
index e4d144213..ca318bd12 100644
--- a/src/management-system-v2/lib/invitation-tokens.ts
+++ b/src/management-system-v2/lib/invitation-tokens.ts
@@ -8,6 +8,7 @@ import { addMember, isMember } from './data/db/iam/memberships';
import { getUserByEmail } from './data/db/iam/users';
import { getRoleById } from './data/db/iam/roles';
import { addRoleMappings } from './data/db/iam/role-mappings';
+import { getErrorMessage, userError } from './server-error-handling/user-error';
const baseInvitationSchema = {
spaceId: z.string(),
@@ -40,34 +41,52 @@ export function getInvitation(token: string) {
}
export async function acceptInvitation(invite: Invitation, userIdAcceptingInvite?: string) {
- const organization = await getEnvironmentById(invite.spaceId);
+ const _organization = await getEnvironmentById(invite.spaceId);
+ if (_organization.isErr()) return userError(getErrorMessage(_organization.error));
+ const organization = _organization.value;
+
if (!organization || !organization.isOrganization || !organization.isActive)
return { error: 'InvalidOrganization' as const };
- const userId = 'userId' in invite ? invite.userId : (await getUserByEmail(invite.email))?.id;
+ let userId;
+ if ('userId' in invite) {
+ userId = invite.userId;
+ } else {
+ const userByEmail = await getUserByEmail(invite.email);
+ if (userByEmail.isErr()) return userError(getErrorMessage(userByEmail.error));
+ if (!userByEmail.value) return userError('User not found');
+
+ userId = userByEmail.value.id;
+ }
if (!userId) return { error: 'UserNotFound' as const };
if (userIdAcceptingInvite && userIdAcceptingInvite !== userId)
return { error: 'WrongUser' as const };
- if (!(await isMember(invite.spaceId, userId))) {
- addMember(invite.spaceId, userId);
+ const userIsMember = await isMember(invite.spaceId, userId);
+ if (userIsMember.isErr()) return userError(getErrorMessage(userIsMember.error));
+
+ if (!userIsMember.value) {
+ const memberAdded = await addMember(invite.spaceId, userId);
+ if (memberAdded.isErr()) return userError(getErrorMessage(memberAdded.error));
if (invite.roleIds) {
const validRoles = [];
for (const roleId of invite.roleIds) {
// skip roles that have been deleted
- if (await getRoleById(roleId)) validRoles.push(roleId);
+ const role = await getRoleById(roleId);
+ if (role.isOk() && role.value) validRoles.push(roleId);
}
- await addRoleMappings(
+ const result = await addRoleMappings(
validRoles.map((roleId) => ({
environmentId: invite.spaceId,
roleId,
userId,
})),
);
+ if (result.isErr()) return userError(getErrorMessage(result.error));
}
}
}
diff --git a/src/management-system-v2/lib/process-export/export-preparation.ts b/src/management-system-v2/lib/process-export/export-preparation.ts
index f6ca4863a..1b7d7480e 100644
--- a/src/management-system-v2/lib/process-export/export-preparation.ts
+++ b/src/management-system-v2/lib/process-export/export-preparation.ts
@@ -31,7 +31,7 @@ import { is as bpmnIs } from 'bpmn-js/lib/util/ModelUtil';
import { ArrayEntryType, truthyFilter } from '../typescript-utils';
import { SerializedNode } from '@craftjs/core';
-import { UserError } from '../user-error';
+import { UserError } from '../server-error-handling/user-error';
/**
* The options that can be used to select what should be exported
diff --git a/src/management-system-v2/lib/process-export/image-export.ts b/src/management-system-v2/lib/process-export/image-export.ts
index 2aadf73de..be8ee8789 100644
--- a/src/management-system-v2/lib/process-export/image-export.ts
+++ b/src/management-system-v2/lib/process-export/image-export.ts
@@ -1,12 +1,7 @@
import jsZip from 'jszip';
import { ProcessesExportData, ProcessExportData, ProcessExportOptions } from './export-preparation';
-import {
- getProcessFilePathName,
- getSVGFromBPMN,
- getImageDimensions,
- handleExportMethod,
-} from './util';
+import { getProcessFilePathName, getSVGFromBPMN, getImageDimensions } from './util';
/**
* Executes the logic that adds the file for a specific process version/collapsed subprocess
diff --git a/src/management-system-v2/lib/server-error-handling/errors.ts b/src/management-system-v2/lib/server-error-handling/errors.ts
new file mode 100644
index 000000000..e4ba76bf5
--- /dev/null
+++ b/src/management-system-v2/lib/server-error-handling/errors.ts
@@ -0,0 +1,12 @@
+import { UserFacingError } from './user-error';
+
+export class NotFoundError extends UserFacingError {
+ constructor(message?: string) {
+ super(`${message || 'Not found'}`);
+ }
+}
+export class SpaceNotFoundError extends UserFacingError {
+ constructor(message?: string) {
+ super(`${message || 'Space not found'}`);
+ }
+}
diff --git a/src/management-system-v2/lib/server-error-handling/page-error-response.tsx b/src/management-system-v2/lib/server-error-handling/page-error-response.tsx
new file mode 100644
index 000000000..7cd2ee2ca
--- /dev/null
+++ b/src/management-system-v2/lib/server-error-handling/page-error-response.tsx
@@ -0,0 +1,32 @@
+import { Err } from 'neverthrow';
+import { UserFacingError } from './user-error';
+import Content from '@/components/content';
+import { NotFoundError, SpaceNotFoundError } from '@/lib/server-error-handling/errors';
+import { Result, ResultProps } from 'antd';
+import { UnauthorizedError } from '../ability/abilityHelper';
+import RetryButton from './retry-button';
+
+export function errorResponse(
+ result: Err | unknown,
+) {
+ const error = result instanceof Err ? result.error : undefined;
+
+ let title = 'Something Went wrong';
+ let status: ResultProps['status'] = 'warning';
+
+ if (error instanceof UserFacingError) {
+ title = error.message;
+ if (error instanceof NotFoundError || error instanceof SpaceNotFoundError) {
+ status = '404';
+ }
+ } else if (error instanceof UnauthorizedError) {
+ title = 'Not allowed';
+ status = '403';
+ }
+
+ return (
+
+ } />
+
+ );
+}
diff --git a/src/management-system-v2/lib/server-error-handling/retry-button.tsx b/src/management-system-v2/lib/server-error-handling/retry-button.tsx
new file mode 100644
index 000000000..3ae906cc2
--- /dev/null
+++ b/src/management-system-v2/lib/server-error-handling/retry-button.tsx
@@ -0,0 +1,14 @@
+'use client';
+
+import { Button, ButtonProps } from 'antd';
+import { useRouter } from 'next/navigation';
+
+export default function RetryButton(props: ButtonProps) {
+ const router = useRouter();
+
+ return (
+
+ );
+}
diff --git a/src/management-system-v2/lib/user-error.ts b/src/management-system-v2/lib/server-error-handling/user-error.ts
similarity index 100%
rename from src/management-system-v2/lib/user-error.ts
rename to src/management-system-v2/lib/server-error-handling/user-error.ts
diff --git a/src/management-system-v2/lib/sharing/process-sharing.ts b/src/management-system-v2/lib/sharing/process-sharing.ts
index 8fed21182..b7b0b44d7 100644
--- a/src/management-system-v2/lib/sharing/process-sharing.ts
+++ b/src/management-system-v2/lib/sharing/process-sharing.ts
@@ -3,12 +3,7 @@
import jwt from 'jsonwebtoken';
import { updateProcessShareInfo } from '../data/processes';
import { headers } from 'next/headers';
-import { Environment } from '../data/environment-schema';
-import { getEnvironmentById } from '@/lib/data/db/iam/environments';
-import { getUserOrganizationEnvironments } from '@/lib/data/db/iam/memberships';
-import { asyncMap } from '../helpers/javascriptHelpers';
-import Ability from '../ability/abilityHelper';
-import { UserErrorType, userError } from '../user-error';
+import { UserErrorType, userError } from '../server-error-handling/user-error';
import { env } from '../ms-config/env-vars';
export interface TokenPayload {
@@ -76,16 +71,3 @@ export async function generateSharedViewerUrl(
return userError('Something went wrong');
}
}
-
-export async function getAllUserWorkspaces(userId: string, ability?: Ability) {
- // if (ability && !ability.can('delete', 'Environment')) throw new UnauthorizedError();
-
- const userEnvironments: Environment[] = [(await getEnvironmentById(userId))!];
- const userOrgEnvs = await getUserOrganizationEnvironments(userId);
- const orgEnvironments = (await asyncMap(userOrgEnvs, (environmentId) =>
- getEnvironmentById(environmentId),
- )) as Environment[];
-
- userEnvironments.push(...orgEnvironments);
- return userEnvironments;
-}
diff --git a/src/management-system-v2/lib/ui-error.ts b/src/management-system-v2/lib/ui-error.ts
deleted file mode 100644
index b55201f0b..000000000
--- a/src/management-system-v2/lib/ui-error.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { UserFacingError } from './user-error';
-
-/**
- * If thrown in a server component, the message will be displayed to the user in the ui through the
- * error boundary.
- * If thrown in a server action, the error message will be sent back as a userError
- * (if the server action implements the right functions)
- */
-export class UIError extends UserFacingError {
- static prefix = '500';
- constructor(message?: string) {
- super(`${UIError.prefix}: ${message || 'Something went wrong'}`);
- this.name = 'UserFacingError';
- }
-}
diff --git a/src/management-system-v2/lib/useFavouriteProcesses.ts b/src/management-system-v2/lib/useFavouriteProcesses.ts
index 266af56c6..d252634ae 100644
--- a/src/management-system-v2/lib/useFavouriteProcesses.ts
+++ b/src/management-system-v2/lib/useFavouriteProcesses.ts
@@ -2,8 +2,7 @@ import { useEffect } from 'react';
import { updateUser } from './data/users';
import { create } from 'zustand';
import { immer } from 'zustand/middleware/immer';
-import { wrapServerCall } from './wrap-server-call';
-import { isUserErrorResponse } from './user-error';
+import { isUserErrorResponse } from './server-error-handling/user-error';
type FavouritesStore = {
favourites: string[];
diff --git a/src/management-system-v2/lib/useFileManager.ts b/src/management-system-v2/lib/useFileManager.ts
index bfdc6d4ea..323e94f5f 100644
--- a/src/management-system-v2/lib/useFileManager.ts
+++ b/src/management-system-v2/lib/useFileManager.ts
@@ -1,4 +1,4 @@
-import { use, useCallback, useState } from 'react';
+import { use, useState } from 'react';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useEnvironment } from '@/components/auth-can';
import {
@@ -8,7 +8,7 @@ import {
saveEntityFileOrGetPresignedUrl,
updateFileDeletableStatus,
} from './data/file-manager-facade';
-import { EntityType, getNewFileName } from '@/lib/helpers/fileManagerHelpers';
+import { EntityType } from '@/lib/helpers/fileManagerHelpers';
import { message } from 'antd';
import { EnvVarsContext } from '@/components/env-vars-context';
diff --git a/src/management-system-v2/lib/wrap-server-call.ts b/src/management-system-v2/lib/wrap-server-call.ts
index 71691750f..e3cdfab9e 100644
--- a/src/management-system-v2/lib/wrap-server-call.ts
+++ b/src/management-system-v2/lib/wrap-server-call.ts
@@ -1,6 +1,11 @@
import { notification, message } from 'antd';
import { ReactNode } from 'react';
-import { userError, UserError, isUserErrorResponse, isUserError } from './user-error';
+import {
+ userError,
+ UserError,
+ isUserErrorResponse,
+ isUserError,
+} from './server-error-handling/user-error';
import { useAppProps } from 'antd/es/app/context';
/**
diff --git a/src/management-system-v2/package.json b/src/management-system-v2/package.json
index 1ae04d6af..eb2e0ca54 100644
--- a/src/management-system-v2/package.json
+++ b/src/management-system-v2/package.json
@@ -74,7 +74,8 @@
"react-resizable": "^3.0.5",
"mqtt": "^5.10.1",
"bcryptjs": "3.0.2",
- "sharp": "0.34.3"
+ "sharp": "0.34.3",
+ "neverthrow": "^8.2.0"
},
"devDependencies": {
"@tanstack/eslint-plugin-query": "5.91.2",
diff --git a/yarn.lock b/yarn.lock
index 19fef9d9a..7f3ff3330 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -94,34 +94,34 @@
preact "10.11.3"
preact-render-to-string "5.2.3"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be"
- integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.28.6.tgz#72499312ec58b1e2245ba4a4f550c132be4982f7"
+ integrity sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==
dependencies:
- "@babel/helper-validator-identifier" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.28.5"
js-tokens "^4.0.0"
picocolors "^1.1.1"
-"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.5":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f"
- integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
+"@babel/compat-data@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.6.tgz#103f466803fa0f059e82ccac271475470570d74c"
+ integrity sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==
"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.5.0":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e"
- integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
- dependencies:
- "@babel/code-frame" "^7.27.1"
- "@babel/generator" "^7.28.5"
- "@babel/helper-compilation-targets" "^7.27.2"
- "@babel/helper-module-transforms" "^7.28.3"
- "@babel/helpers" "^7.28.4"
- "@babel/parser" "^7.28.5"
- "@babel/template" "^7.27.2"
- "@babel/traverse" "^7.28.5"
- "@babel/types" "^7.28.5"
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.6.tgz#531bf883a1126e53501ba46eb3bb414047af507f"
+ integrity sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==
+ dependencies:
+ "@babel/code-frame" "^7.28.6"
+ "@babel/generator" "^7.28.6"
+ "@babel/helper-compilation-targets" "^7.28.6"
+ "@babel/helper-module-transforms" "^7.28.6"
+ "@babel/helpers" "^7.28.6"
+ "@babel/parser" "^7.28.6"
+ "@babel/template" "^7.28.6"
+ "@babel/traverse" "^7.28.6"
+ "@babel/types" "^7.28.6"
"@jridgewell/remapping" "^2.3.5"
convert-source-map "^2.0.0"
debug "^4.1.0"
@@ -145,13 +145,13 @@
dependencies:
eslint-rule-composer "^0.3.0"
-"@babel/generator@^7.28.5", "@babel/generator@^7.7.2":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298"
- integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==
+"@babel/generator@^7.28.6", "@babel/generator@^7.7.2":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.6.tgz#48dcc65d98fcc8626a48f72b62e263d25fc3c3f1"
+ integrity sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==
dependencies:
- "@babel/parser" "^7.28.5"
- "@babel/types" "^7.28.5"
+ "@babel/parser" "^7.28.6"
+ "@babel/types" "^7.28.6"
"@jridgewell/gen-mapping" "^0.3.12"
"@jridgewell/trace-mapping" "^0.3.28"
jsesc "^3.0.2"
@@ -163,31 +163,31 @@
dependencies:
"@babel/types" "^7.27.3"
-"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2":
- version "7.27.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d"
- integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==
+"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25"
+ integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==
dependencies:
- "@babel/compat-data" "^7.27.2"
+ "@babel/compat-data" "^7.28.6"
"@babel/helper-validator-option" "^7.27.1"
browserslist "^4.24.0"
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz#472d0c28028850968979ad89f173594a6995da46"
- integrity sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb"
+ integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==
dependencies:
"@babel/helper-annotate-as-pure" "^7.27.3"
"@babel/helper-member-expression-to-functions" "^7.28.5"
"@babel/helper-optimise-call-expression" "^7.27.1"
- "@babel/helper-replace-supers" "^7.27.1"
+ "@babel/helper-replace-supers" "^7.28.6"
"@babel/helper-skip-transparent-expression-wrappers" "^7.27.1"
- "@babel/traverse" "^7.28.5"
+ "@babel/traverse" "^7.28.6"
semver "^6.3.1"
-"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1":
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1", "@babel/helper-create-regexp-features-plugin@^7.28.5":
version "7.28.5"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997"
integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==
@@ -196,23 +196,23 @@
regexpu-core "^6.3.1"
semver "^6.3.1"
-"@babel/helper-define-polyfill-provider@^0.6.5":
- version "0.6.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz#742ccf1cb003c07b48859fc9fa2c1bbe40e5f753"
- integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==
+"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.6":
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz#714dfe33d8bd710f556df59953720f6eeb6c1a14"
+ integrity sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==
dependencies:
- "@babel/helper-compilation-targets" "^7.27.2"
- "@babel/helper-plugin-utils" "^7.27.1"
- debug "^4.4.1"
+ "@babel/helper-compilation-targets" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
+ debug "^4.4.3"
lodash.debounce "^4.0.8"
- resolve "^1.22.10"
+ resolve "^1.22.11"
"@babel/helper-globals@^7.28.0":
version "7.28.0"
resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
-"@babel/helper-member-expression-to-functions@^7.27.1", "@babel/helper-member-expression-to-functions@^7.28.5":
+"@babel/helper-member-expression-to-functions@^7.28.5":
version "7.28.5"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150"
integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==
@@ -220,22 +220,22 @@
"@babel/traverse" "^7.28.5"
"@babel/types" "^7.28.5"
-"@babel/helper-module-imports@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204"
- integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==
+"@babel/helper-module-imports@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c"
+ integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==
dependencies:
- "@babel/traverse" "^7.27.1"
- "@babel/types" "^7.27.1"
+ "@babel/traverse" "^7.28.6"
+ "@babel/types" "^7.28.6"
-"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3":
- version "7.28.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6"
- integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==
+"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3", "@babel/helper-module-transforms@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e"
+ integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==
dependencies:
- "@babel/helper-module-imports" "^7.27.1"
- "@babel/helper-validator-identifier" "^7.27.1"
- "@babel/traverse" "^7.28.3"
+ "@babel/helper-module-imports" "^7.28.6"
+ "@babel/helper-validator-identifier" "^7.28.5"
+ "@babel/traverse" "^7.28.6"
"@babel/helper-optimise-call-expression@^7.27.1":
version "7.27.1"
@@ -244,10 +244,10 @@
dependencies:
"@babel/types" "^7.27.1"
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c"
- integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8"
+ integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==
"@babel/helper-remap-async-to-generator@^7.27.1":
version "7.27.1"
@@ -258,14 +258,14 @@
"@babel/helper-wrap-function" "^7.27.1"
"@babel/traverse" "^7.27.1"
-"@babel/helper-replace-supers@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0"
- integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==
+"@babel/helper-replace-supers@^7.27.1", "@babel/helper-replace-supers@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44"
+ integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.27.1"
+ "@babel/helper-member-expression-to-functions" "^7.28.5"
"@babel/helper-optimise-call-expression" "^7.27.1"
- "@babel/traverse" "^7.27.1"
+ "@babel/traverse" "^7.28.6"
"@babel/helper-skip-transparent-expression-wrappers@^7.27.1":
version "7.27.1"
@@ -280,7 +280,7 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
-"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5":
+"@babel/helper-validator-identifier@^7.28.5":
version "7.28.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4"
integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
@@ -291,28 +291,28 @@
integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
"@babel/helper-wrap-function@^7.27.1":
- version "7.28.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz#fe4872092bc1438ffd0ce579e6f699609f9d0a7a"
- integrity sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz#4e349ff9222dab69a93a019cc296cdd8442e279a"
+ integrity sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==
dependencies:
- "@babel/template" "^7.27.2"
- "@babel/traverse" "^7.28.3"
- "@babel/types" "^7.28.2"
+ "@babel/template" "^7.28.6"
+ "@babel/traverse" "^7.28.6"
+ "@babel/types" "^7.28.6"
-"@babel/helpers@^7.28.4":
- version "7.28.4"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827"
- integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==
+"@babel/helpers@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7"
+ integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==
dependencies:
- "@babel/template" "^7.27.2"
- "@babel/types" "^7.28.4"
+ "@babel/template" "^7.28.6"
+ "@babel/types" "^7.28.6"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5", "@babel/parser@^7.9.4":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08"
- integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.28.6", "@babel/parser@^7.9.4":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.6.tgz#f01a8885b7fa1e56dd8a155130226cd698ef13fd"
+ integrity sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==
dependencies:
- "@babel/types" "^7.28.5"
+ "@babel/types" "^7.28.6"
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5":
version "7.28.5"
@@ -345,13 +345,13 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.27.1"
"@babel/plugin-transform-optional-chaining" "^7.27.1"
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.3":
- version "7.28.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz#373f6e2de0016f73caf8f27004f61d167743742a"
- integrity sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz#0e8289cec28baaf05d54fd08d81ae3676065f69f"
+ integrity sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
- "@babel/traverse" "^7.28.3"
+ "@babel/helper-plugin-utils" "^7.28.6"
+ "@babel/traverse" "^7.28.6"
"@babel/plugin-proposal-class-properties@^7.5.0":
version "7.18.6"
@@ -394,19 +394,19 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-import-assertions@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz#88894aefd2b03b5ee6ad1562a7c8e1587496aecd"
- integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==
+"@babel/plugin-syntax-import-assertions@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz#ae9bc1923a6ba527b70104dd2191b0cd872c8507"
+ integrity sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07"
- integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==
+"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz#b71d5914665f60124e133696f17cd7669062c503"
+ integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-syntax-import-meta@^7.10.4":
version "7.10.4"
@@ -423,11 +423,11 @@
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-jsx@^7.7.2":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c"
- integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee"
+ integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
version "7.10.4"
@@ -486,11 +486,11 @@
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-typescript@^7.7.2":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18"
- integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2"
+ integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
version "7.18.6"
@@ -507,22 +507,22 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-async-generator-functions@^7.28.0":
- version "7.28.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz#1276e6c7285ab2cd1eccb0bc7356b7a69ff842c2"
- integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==
+"@babel/plugin-transform-async-generator-functions@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz#80cb86d3eaa2102e18ae90dd05ab87bdcad3877d"
+ integrity sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/helper-remap-async-to-generator" "^7.27.1"
- "@babel/traverse" "^7.28.0"
+ "@babel/traverse" "^7.28.6"
-"@babel/plugin-transform-async-to-generator@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz#9a93893b9379b39466c74474f55af03de78c66e7"
- integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==
+"@babel/plugin-transform-async-to-generator@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz#bd97b42237b2d1bc90d74bcb486c39be5b4d7e77"
+ integrity sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==
dependencies:
- "@babel/helper-module-imports" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-module-imports" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/helper-remap-async-to-generator" "^7.27.1"
"@babel/plugin-transform-block-scoped-functions@^7.27.1":
@@ -532,50 +532,50 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-block-scoping@^7.28.5":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz#e0d3af63bd8c80de2e567e690a54e84d85eb16f6"
- integrity sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==
+"@babel/plugin-transform-block-scoping@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99"
+ integrity sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-class-properties@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz#dd40a6a370dfd49d32362ae206ddaf2bb082a925"
- integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==
+"@babel/plugin-transform-class-properties@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz#d274a4478b6e782d9ea987fda09bdb6d28d66b72"
+ integrity sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-class-features-plugin" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-class-static-block@^7.28.3":
- version "7.28.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz#d1b8e69b54c9993bc558203e1f49bfc979bfd852"
- integrity sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==
+"@babel/plugin-transform-class-static-block@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70"
+ integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.28.3"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-class-features-plugin" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-classes@^7.28.4":
- version "7.28.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz#75d66175486788c56728a73424d67cbc7473495c"
- integrity sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==
+"@babel/plugin-transform-classes@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7"
+ integrity sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==
dependencies:
"@babel/helper-annotate-as-pure" "^7.27.3"
- "@babel/helper-compilation-targets" "^7.27.2"
+ "@babel/helper-compilation-targets" "^7.28.6"
"@babel/helper-globals" "^7.28.0"
- "@babel/helper-plugin-utils" "^7.27.1"
- "@babel/helper-replace-supers" "^7.27.1"
- "@babel/traverse" "^7.28.4"
+ "@babel/helper-plugin-utils" "^7.28.6"
+ "@babel/helper-replace-supers" "^7.28.6"
+ "@babel/traverse" "^7.28.6"
-"@babel/plugin-transform-computed-properties@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa"
- integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==
+"@babel/plugin-transform-computed-properties@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz#936824fc71c26cb5c433485776d79c8e7b0202d2"
+ integrity sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
- "@babel/template" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
+ "@babel/template" "^7.28.6"
-"@babel/plugin-transform-destructuring@^7.28.0", "@babel/plugin-transform-destructuring@^7.28.5":
+"@babel/plugin-transform-destructuring@^7.28.5":
version "7.28.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7"
integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==
@@ -583,13 +583,13 @@
"@babel/helper-plugin-utils" "^7.27.1"
"@babel/traverse" "^7.28.5"
-"@babel/plugin-transform-dotall-regex@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz#aa6821de864c528b1fecf286f0a174e38e826f4d"
- integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==
+"@babel/plugin-transform-dotall-regex@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz#def31ed84e0fb6e25c71e53c124e7b76a4ab8e61"
+ integrity sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin" "^7.28.5"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-duplicate-keys@^7.27.1":
version "7.27.1"
@@ -598,13 +598,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz#5043854ca620a94149372e69030ff8cb6a9eb0ec"
- integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz#e0c59ba54f1655dd682f2edf5f101b5910a8f6f3"
+ integrity sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin" "^7.28.5"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-dynamic-import@^7.27.1":
version "7.27.1"
@@ -613,20 +613,20 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-explicit-resource-management@^7.28.0":
- version "7.28.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz#45be6211b778dbf4b9d54c4e8a2b42fa72e09a1a"
- integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==
+"@babel/plugin-transform-explicit-resource-management@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz#dd6788f982c8b77e86779d1d029591e39d9d8be7"
+ integrity sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
- "@babel/plugin-transform-destructuring" "^7.28.0"
+ "@babel/helper-plugin-utils" "^7.28.6"
+ "@babel/plugin-transform-destructuring" "^7.28.5"
-"@babel/plugin-transform-exponentiation-operator@^7.28.5":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz#7cc90a8170e83532676cfa505278e147056e94fe"
- integrity sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==
+"@babel/plugin-transform-exponentiation-operator@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz#5e477eb7eafaf2ab5537a04aaafcf37e2d7f1091"
+ integrity sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-export-namespace-from@^7.27.1":
version "7.27.1"
@@ -652,12 +652,12 @@
"@babel/helper-plugin-utils" "^7.27.1"
"@babel/traverse" "^7.27.1"
-"@babel/plugin-transform-json-strings@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz#a2e0ce6ef256376bd527f290da023983527a4f4c"
- integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==
+"@babel/plugin-transform-json-strings@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz#4c8c15b2dc49e285d110a4cf3dac52fd2dfc3038"
+ integrity sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-literals@^7.27.1":
version "7.27.1"
@@ -666,12 +666,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-logical-assignment-operators@^7.28.5":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz#d028fd6db8c081dee4abebc812c2325e24a85b0e"
- integrity sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==
+"@babel/plugin-transform-logical-assignment-operators@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz#53028a3d77e33c50ef30a8fce5ca17065936e605"
+ integrity sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-member-expression-literals@^7.27.1":
version "7.27.1"
@@ -688,13 +688,13 @@
"@babel/helper-module-transforms" "^7.27.1"
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-modules-commonjs@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832"
- integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==
+"@babel/plugin-transform-modules-commonjs@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz#c0232e0dfe66a734cc4ad0d5e75fc3321b6fdef1"
+ integrity sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==
dependencies:
- "@babel/helper-module-transforms" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-module-transforms" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-modules-systemjs@^7.28.5":
version "7.28.5"
@@ -729,30 +729,30 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz#4f9d3153bf6782d73dd42785a9d22d03197bc91d"
- integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz#9bc62096e90ab7a887f3ca9c469f6adec5679757"
+ integrity sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-numeric-separator@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz#614e0b15cc800e5997dadd9bd6ea524ed6c819c6"
- integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==
+"@babel/plugin-transform-numeric-separator@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz#1310b0292762e7a4a335df5f580c3320ee7d9e9f"
+ integrity sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-object-rest-spread@^7.28.4":
- version "7.28.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz#9ee1ceca80b3e6c4bac9247b2149e36958f7f98d"
- integrity sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==
+"@babel/plugin-transform-object-rest-spread@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz#fdd4bc2d72480db6ca42aed5c051f148d7b067f7"
+ integrity sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==
dependencies:
- "@babel/helper-compilation-targets" "^7.27.2"
- "@babel/helper-plugin-utils" "^7.27.1"
- "@babel/plugin-transform-destructuring" "^7.28.0"
+ "@babel/helper-compilation-targets" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
+ "@babel/plugin-transform-destructuring" "^7.28.5"
"@babel/plugin-transform-parameters" "^7.27.7"
- "@babel/traverse" "^7.28.4"
+ "@babel/traverse" "^7.28.6"
"@babel/plugin-transform-object-super@^7.27.1":
version "7.27.1"
@@ -762,19 +762,19 @@
"@babel/helper-plugin-utils" "^7.27.1"
"@babel/helper-replace-supers" "^7.27.1"
-"@babel/plugin-transform-optional-catch-binding@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz#84c7341ebde35ccd36b137e9e45866825072a30c"
- integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==
+"@babel/plugin-transform-optional-catch-binding@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz#75107be14c78385978201a49c86414a150a20b4c"
+ integrity sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.5":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz#8238c785f9d5c1c515a90bf196efb50d075a4b26"
- integrity sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==
+"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz#926cf150bd421fc8362753e911b4a1b1ce4356cd"
+ integrity sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/helper-skip-transparent-expression-wrappers" "^7.27.1"
"@babel/plugin-transform-parameters@^7.27.7":
@@ -784,22 +784,22 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-private-methods@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz#fdacbab1c5ed81ec70dfdbb8b213d65da148b6af"
- integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==
+"@babel/plugin-transform-private-methods@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz#c76fbfef3b86c775db7f7c106fff544610bdb411"
+ integrity sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-class-features-plugin" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-private-property-in-object@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz#4dbbef283b5b2f01a21e81e299f76e35f900fb11"
- integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==
+"@babel/plugin-transform-private-property-in-object@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz#4fafef1e13129d79f1d75ac180c52aafefdb2811"
+ integrity sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.27.1"
- "@babel/helper-create-class-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-annotate-as-pure" "^7.27.3"
+ "@babel/helper-create-class-features-plugin" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-property-literals@^7.27.1":
version "7.27.1"
@@ -808,20 +808,20 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-regenerator@^7.28.4":
- version "7.28.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz#9d3fa3bebb48ddd0091ce5729139cd99c67cea51"
- integrity sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==
+"@babel/plugin-transform-regenerator@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz#6ca2ed5b76cff87980f96eaacfc2ce833e8e7a1b"
+ integrity sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
-"@babel/plugin-transform-regexp-modifiers@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz#df9ba5577c974e3f1449888b70b76169998a6d09"
- integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==
+"@babel/plugin-transform-regexp-modifiers@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz#7ef0163bd8b4a610481b2509c58cf217f065290b"
+ integrity sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin" "^7.28.5"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-reserved-words@^7.27.1":
version "7.27.1"
@@ -837,12 +837,12 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-spread@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz#1a264d5fc12750918f50e3fe3e24e437178abb08"
- integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==
+"@babel/plugin-transform-spread@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz#40a2b423f6db7b70f043ad027a58bcb44a9757b6"
+ integrity sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==
dependencies:
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/helper-skip-transparent-expression-wrappers" "^7.27.1"
"@babel/plugin-transform-sticky-regex@^7.27.1":
@@ -873,13 +873,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-unicode-property-regex@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz#bdfe2d3170c78c5691a3c3be934c8c0087525956"
- integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==
+"@babel/plugin-transform-unicode-property-regex@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz#63a7a6c21a0e75dae9b1861454111ea5caa22821"
+ integrity sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin" "^7.28.5"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/plugin-transform-unicode-regex@^7.27.1":
version "7.27.1"
@@ -889,83 +889,83 @@
"@babel/helper-create-regexp-features-plugin" "^7.27.1"
"@babel/helper-plugin-utils" "^7.27.1"
-"@babel/plugin-transform-unicode-sets-regex@^7.27.1":
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz#6ab706d10f801b5c72da8bb2548561fa04193cd1"
- integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==
+"@babel/plugin-transform-unicode-sets-regex@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz#924912914e5df9fe615ec472f88ff4788ce04d4e"
+ integrity sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.27.1"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin" "^7.28.5"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/preset-env@^7.5.2":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.5.tgz#82dd159d1563f219a1ce94324b3071eb89e280b0"
- integrity sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.6.tgz#b4586bb59d8c61be6c58997f4912e7ea6bd17178"
+ integrity sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==
dependencies:
- "@babel/compat-data" "^7.28.5"
- "@babel/helper-compilation-targets" "^7.27.2"
- "@babel/helper-plugin-utils" "^7.27.1"
+ "@babel/compat-data" "^7.28.6"
+ "@babel/helper-compilation-targets" "^7.28.6"
+ "@babel/helper-plugin-utils" "^7.28.6"
"@babel/helper-validator-option" "^7.27.1"
"@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5"
"@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1"
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1"
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1"
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.3"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.6"
"@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
- "@babel/plugin-syntax-import-assertions" "^7.27.1"
- "@babel/plugin-syntax-import-attributes" "^7.27.1"
+ "@babel/plugin-syntax-import-assertions" "^7.28.6"
+ "@babel/plugin-syntax-import-attributes" "^7.28.6"
"@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
"@babel/plugin-transform-arrow-functions" "^7.27.1"
- "@babel/plugin-transform-async-generator-functions" "^7.28.0"
- "@babel/plugin-transform-async-to-generator" "^7.27.1"
+ "@babel/plugin-transform-async-generator-functions" "^7.28.6"
+ "@babel/plugin-transform-async-to-generator" "^7.28.6"
"@babel/plugin-transform-block-scoped-functions" "^7.27.1"
- "@babel/plugin-transform-block-scoping" "^7.28.5"
- "@babel/plugin-transform-class-properties" "^7.27.1"
- "@babel/plugin-transform-class-static-block" "^7.28.3"
- "@babel/plugin-transform-classes" "^7.28.4"
- "@babel/plugin-transform-computed-properties" "^7.27.1"
+ "@babel/plugin-transform-block-scoping" "^7.28.6"
+ "@babel/plugin-transform-class-properties" "^7.28.6"
+ "@babel/plugin-transform-class-static-block" "^7.28.6"
+ "@babel/plugin-transform-classes" "^7.28.6"
+ "@babel/plugin-transform-computed-properties" "^7.28.6"
"@babel/plugin-transform-destructuring" "^7.28.5"
- "@babel/plugin-transform-dotall-regex" "^7.27.1"
+ "@babel/plugin-transform-dotall-regex" "^7.28.6"
"@babel/plugin-transform-duplicate-keys" "^7.27.1"
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1"
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.28.6"
"@babel/plugin-transform-dynamic-import" "^7.27.1"
- "@babel/plugin-transform-explicit-resource-management" "^7.28.0"
- "@babel/plugin-transform-exponentiation-operator" "^7.28.5"
+ "@babel/plugin-transform-explicit-resource-management" "^7.28.6"
+ "@babel/plugin-transform-exponentiation-operator" "^7.28.6"
"@babel/plugin-transform-export-namespace-from" "^7.27.1"
"@babel/plugin-transform-for-of" "^7.27.1"
"@babel/plugin-transform-function-name" "^7.27.1"
- "@babel/plugin-transform-json-strings" "^7.27.1"
+ "@babel/plugin-transform-json-strings" "^7.28.6"
"@babel/plugin-transform-literals" "^7.27.1"
- "@babel/plugin-transform-logical-assignment-operators" "^7.28.5"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.28.6"
"@babel/plugin-transform-member-expression-literals" "^7.27.1"
"@babel/plugin-transform-modules-amd" "^7.27.1"
- "@babel/plugin-transform-modules-commonjs" "^7.27.1"
+ "@babel/plugin-transform-modules-commonjs" "^7.28.6"
"@babel/plugin-transform-modules-systemjs" "^7.28.5"
"@babel/plugin-transform-modules-umd" "^7.27.1"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1"
"@babel/plugin-transform-new-target" "^7.27.1"
- "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1"
- "@babel/plugin-transform-numeric-separator" "^7.27.1"
- "@babel/plugin-transform-object-rest-spread" "^7.28.4"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6"
+ "@babel/plugin-transform-numeric-separator" "^7.28.6"
+ "@babel/plugin-transform-object-rest-spread" "^7.28.6"
"@babel/plugin-transform-object-super" "^7.27.1"
- "@babel/plugin-transform-optional-catch-binding" "^7.27.1"
- "@babel/plugin-transform-optional-chaining" "^7.28.5"
+ "@babel/plugin-transform-optional-catch-binding" "^7.28.6"
+ "@babel/plugin-transform-optional-chaining" "^7.28.6"
"@babel/plugin-transform-parameters" "^7.27.7"
- "@babel/plugin-transform-private-methods" "^7.27.1"
- "@babel/plugin-transform-private-property-in-object" "^7.27.1"
+ "@babel/plugin-transform-private-methods" "^7.28.6"
+ "@babel/plugin-transform-private-property-in-object" "^7.28.6"
"@babel/plugin-transform-property-literals" "^7.27.1"
- "@babel/plugin-transform-regenerator" "^7.28.4"
- "@babel/plugin-transform-regexp-modifiers" "^7.27.1"
+ "@babel/plugin-transform-regenerator" "^7.28.6"
+ "@babel/plugin-transform-regexp-modifiers" "^7.28.6"
"@babel/plugin-transform-reserved-words" "^7.27.1"
"@babel/plugin-transform-shorthand-properties" "^7.27.1"
- "@babel/plugin-transform-spread" "^7.27.1"
+ "@babel/plugin-transform-spread" "^7.28.6"
"@babel/plugin-transform-sticky-regex" "^7.27.1"
"@babel/plugin-transform-template-literals" "^7.27.1"
"@babel/plugin-transform-typeof-symbol" "^7.27.1"
"@babel/plugin-transform-unicode-escapes" "^7.27.1"
- "@babel/plugin-transform-unicode-property-regex" "^7.27.1"
+ "@babel/plugin-transform-unicode-property-regex" "^7.28.6"
"@babel/plugin-transform-unicode-regex" "^7.27.1"
- "@babel/plugin-transform-unicode-sets-regex" "^7.27.1"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.28.6"
"@babel/preset-modules" "0.1.6-no-external-plugins"
babel-plugin-polyfill-corejs2 "^0.4.14"
babel-plugin-polyfill-corejs3 "^0.13.0"
@@ -982,37 +982,37 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
-"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.28.4", "@babel/runtime@^7.9.2":
- version "7.28.4"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326"
- integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
+"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.28.6", "@babel/runtime@^7.9.2":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b"
+ integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==
-"@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3":
- version "7.27.2"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
- integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
+"@babel/template@^7.28.6", "@babel/template@^7.3.3":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57"
+ integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==
dependencies:
- "@babel/code-frame" "^7.27.1"
- "@babel/parser" "^7.27.2"
- "@babel/types" "^7.27.1"
+ "@babel/code-frame" "^7.28.6"
+ "@babel/parser" "^7.28.6"
+ "@babel/types" "^7.28.6"
-"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4", "@babel/traverse@^7.28.5":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b"
- integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==
+"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.6.tgz#871ddc79a80599a5030c53b1cc48cbe3a5583c2e"
+ integrity sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==
dependencies:
- "@babel/code-frame" "^7.27.1"
- "@babel/generator" "^7.28.5"
+ "@babel/code-frame" "^7.28.6"
+ "@babel/generator" "^7.28.6"
"@babel/helper-globals" "^7.28.0"
- "@babel/parser" "^7.28.5"
- "@babel/template" "^7.27.2"
- "@babel/types" "^7.28.5"
+ "@babel/parser" "^7.28.6"
+ "@babel/template" "^7.28.6"
+ "@babel/types" "^7.28.6"
debug "^4.3.1"
-"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b"
- integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.28.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.6.tgz#c3e9377f1b155005bcc4c46020e7e394e13089df"
+ integrity sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==
dependencies:
"@babel/helper-string-parser" "^7.27.1"
"@babel/helper-validator-identifier" "^7.28.5"
@@ -1161,17 +1161,17 @@
tslib "^2.0.0"
"@emnapi/core@^1.4.3":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.6.0.tgz#517f65d1c8270d5d5aa1aad660d5acb897430dca"
- integrity sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349"
+ integrity sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==
dependencies:
"@emnapi/wasi-threads" "1.1.0"
tslib "^2.4.0"
-"@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.4.4", "@emnapi/runtime@^1.5.0":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.6.0.tgz#8fe297e0090f6e89a57a1f31f1c440bdbc3c01d8"
- integrity sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==
+"@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.4.4", "@emnapi/runtime@^1.7.0":
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5"
+ integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==
dependencies:
tslib "^2.4.0"
@@ -1312,14 +1312,14 @@
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699"
integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==
-"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0":
- version "4.9.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3"
- integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1":
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595"
+ integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==
dependencies:
eslint-visitor-keys "^3.4.3"
-"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.6.1":
+"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.6.1":
version "4.12.2"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b"
integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==
@@ -1370,9 +1370,9 @@
strip-json-comments "^3.1.1"
"@eslint/eslintrc@^3.3.1":
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964"
- integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.3.tgz#26393a0806501b5e2b6a43aa588a4d8df67880ac"
+ integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
@@ -1380,7 +1380,7 @@
globals "^14.0.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
- js-yaml "^4.1.0"
+ js-yaml "^4.1.1"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
@@ -1431,9 +1431,9 @@
integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==
"@google-cloud/storage@^7.12.0":
- version "7.17.2"
- resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-7.17.2.tgz#dd6ed7a60c5f917612dd665f292541cb2624b243"
- integrity sha512-6xN0KNO8L/LIA5zu3CJwHkJiB6n65eykBLOb0E+RooiHYgX8CSao6lvQiKT9TBk2gL5g33LL3fmhDodZnt56rw==
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-7.18.0.tgz#1b0e7415633e97b8ce0364c3e3aac033a52cb318"
+ integrity sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==
dependencies:
"@google-cloud/paginator" "^5.0.0"
"@google-cloud/projectify" "^4.0.0"
@@ -1505,12 +1505,12 @@
optionalDependencies:
"@img/sharp-libvips-darwin-arm64" "1.2.0"
-"@img/sharp-darwin-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz#8a0dcac9e621ff533fbf2e830f6a977b38d67a0c"
- integrity sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==
+"@img/sharp-darwin-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz#6e0732dcade126b6670af7aa17060b926835ea86"
+ integrity sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==
optionalDependencies:
- "@img/sharp-libvips-darwin-arm64" "1.2.3"
+ "@img/sharp-libvips-darwin-arm64" "1.2.4"
"@img/sharp-darwin-x64@0.34.3":
version "0.34.3"
@@ -1519,102 +1519,107 @@
optionalDependencies:
"@img/sharp-libvips-darwin-x64" "1.2.0"
-"@img/sharp-darwin-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz#0ba2bd9dbf07f7300fab73305b787e66156f7752"
- integrity sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==
+"@img/sharp-darwin-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz#19bc1dd6eba6d5a96283498b9c9f401180ee9c7b"
+ integrity sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==
optionalDependencies:
- "@img/sharp-libvips-darwin-x64" "1.2.3"
+ "@img/sharp-libvips-darwin-x64" "1.2.4"
"@img/sharp-libvips-darwin-arm64@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz#e20e9041031acde1de19da121dc5162c7d2cf251"
integrity sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==
-"@img/sharp-libvips-darwin-arm64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz#f43c9aa3b74fd307e4318da63ebbe0ed4c34e744"
- integrity sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==
+"@img/sharp-libvips-darwin-arm64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz#2894c0cb87d42276c3889942e8e2db517a492c43"
+ integrity sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==
"@img/sharp-libvips-darwin-x64@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz#918ca81c5446f31114834cb908425a7532393185"
integrity sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==
-"@img/sharp-libvips-darwin-x64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz#c42ff786d4a1f42ef8929dba4a989dd5df6417f0"
- integrity sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==
+"@img/sharp-libvips-darwin-x64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz#e63681f4539a94af9cd17246ed8881734386f8cc"
+ integrity sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==
"@img/sharp-libvips-linux-arm64@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz#1a5beafc857b43f378c3030427aa981ee3edbc54"
integrity sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==
-"@img/sharp-libvips-linux-arm64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz#c9073e5c4b629ee417f777db21c552910d84ed77"
- integrity sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==
+"@img/sharp-libvips-linux-arm64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz#b1b288b36864b3bce545ad91fa6dadcf1a4ad318"
+ integrity sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==
"@img/sharp-libvips-linux-arm@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz#bff51182d5238ca35c5fe9e9f594a18ad6a5480d"
integrity sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==
-"@img/sharp-libvips-linux-arm@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz#3cbc333fd6b8f224a14d69b03a1dd11df897c799"
- integrity sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==
+"@img/sharp-libvips-linux-arm@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz#b9260dd1ebe6f9e3bdbcbdcac9d2ac125f35852d"
+ integrity sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==
"@img/sharp-libvips-linux-ppc64@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz#10c53ccf6f2d47d71fb3fa282697072c8fe9e40e"
integrity sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==
-"@img/sharp-libvips-linux-ppc64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz#68e0e0076299f43d838468675674fabcc7161d16"
- integrity sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==
+"@img/sharp-libvips-linux-ppc64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz#4b83ecf2a829057222b38848c7b022e7b4d07aa7"
+ integrity sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==
+
+"@img/sharp-libvips-linux-riscv64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz#880b4678009e5a2080af192332b00b0aaf8a48de"
+ integrity sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==
"@img/sharp-libvips-linux-s390x@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz#392fd7557ddc5c901f1bed7ab3c567c08833ef3b"
integrity sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==
-"@img/sharp-libvips-linux-s390x@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz#7da9ab11a50c0ca905979f0aae14a4ccffab27b2"
- integrity sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==
+"@img/sharp-libvips-linux-s390x@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz#74f343c8e10fad821b38f75ced30488939dc59ec"
+ integrity sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==
"@img/sharp-libvips-linux-x64@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz#9315cf90a2fdcdc0e29ea7663cbd8b0f15254400"
integrity sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==
-"@img/sharp-libvips-linux-x64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz#3b162d6b190cf77926819040e09fb15eec42135e"
- integrity sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==
+"@img/sharp-libvips-linux-x64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz#df4183e8bd8410f7d61b66859a35edeab0a531ce"
+ integrity sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==
"@img/sharp-libvips-linuxmusl-arm64@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz#705e03e67d477f6f842f37eb7f66285b1150dc06"
integrity sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==
-"@img/sharp-libvips-linuxmusl-arm64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz#ac99576630dd8e33cb598d7c4586f6e0655912ea"
- integrity sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==
+"@img/sharp-libvips-linuxmusl-arm64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz#c8d6b48211df67137541007ee8d1b7b1f8ca8e06"
+ integrity sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==
"@img/sharp-libvips-linuxmusl-x64@1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz#ec905071cc538df64848d5900e0d386d77c55f13"
integrity sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==
-"@img/sharp-libvips-linuxmusl-x64@1.2.3":
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz#93e9495af7bf6c4e0d41dd71d0196c35c3753a1c"
- integrity sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==
+"@img/sharp-libvips-linuxmusl-x64@1.2.4":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz#be11c75bee5b080cbee31a153a8779448f919f75"
+ integrity sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==
"@img/sharp-linux-arm64@0.34.3":
version "0.34.3"
@@ -1623,12 +1628,12 @@
optionalDependencies:
"@img/sharp-libvips-linux-arm64" "1.2.0"
-"@img/sharp-linux-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz#0570ff1a4fa6e1d6779456fca8b5e8c18a6a9cf2"
- integrity sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==
+"@img/sharp-linux-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz#7aa7764ef9c001f15e610546d42fce56911790cc"
+ integrity sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==
optionalDependencies:
- "@img/sharp-libvips-linux-arm64" "1.2.3"
+ "@img/sharp-libvips-linux-arm64" "1.2.4"
"@img/sharp-linux-arm@0.34.3":
version "0.34.3"
@@ -1637,12 +1642,12 @@
optionalDependencies:
"@img/sharp-libvips-linux-arm" "1.2.0"
-"@img/sharp-linux-arm@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz#5f020d933f54f3fc49203d32c3b7dd0ec11ffcdb"
- integrity sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==
+"@img/sharp-linux-arm@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz#5fb0c3695dd12522d39c3ff7a6bc816461780a0d"
+ integrity sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==
optionalDependencies:
- "@img/sharp-libvips-linux-arm" "1.2.3"
+ "@img/sharp-libvips-linux-arm" "1.2.4"
"@img/sharp-linux-ppc64@0.34.3":
version "0.34.3"
@@ -1651,12 +1656,19 @@
optionalDependencies:
"@img/sharp-libvips-linux-ppc64" "1.2.0"
-"@img/sharp-linux-ppc64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz#8d5775f6dc7e30ea3a1efa43798b7690bb5cb344"
- integrity sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==
+"@img/sharp-linux-ppc64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz#9c213a81520a20caf66978f3d4c07456ff2e0813"
+ integrity sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==
+ optionalDependencies:
+ "@img/sharp-libvips-linux-ppc64" "1.2.4"
+
+"@img/sharp-linux-riscv64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz#cdd28182774eadbe04f62675a16aabbccb833f60"
+ integrity sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==
optionalDependencies:
- "@img/sharp-libvips-linux-ppc64" "1.2.3"
+ "@img/sharp-libvips-linux-riscv64" "1.2.4"
"@img/sharp-linux-s390x@0.34.3":
version "0.34.3"
@@ -1665,12 +1677,12 @@
optionalDependencies:
"@img/sharp-libvips-linux-s390x" "1.2.0"
-"@img/sharp-linux-s390x@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz#740aa5b369188ee2c1913b1015e7f830f4dfdb50"
- integrity sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==
+"@img/sharp-linux-s390x@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz#93eac601b9f329bb27917e0e19098c722d630df7"
+ integrity sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==
optionalDependencies:
- "@img/sharp-libvips-linux-s390x" "1.2.3"
+ "@img/sharp-libvips-linux-s390x" "1.2.4"
"@img/sharp-linux-x64@0.34.3":
version "0.34.3"
@@ -1679,12 +1691,12 @@
optionalDependencies:
"@img/sharp-libvips-linux-x64" "1.2.0"
-"@img/sharp-linux-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz#573ce4196b2d0771bba32acc13a37b7adc9b6212"
- integrity sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==
+"@img/sharp-linux-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz#55abc7cd754ffca5002b6c2b719abdfc846819a8"
+ integrity sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==
optionalDependencies:
- "@img/sharp-libvips-linux-x64" "1.2.3"
+ "@img/sharp-libvips-linux-x64" "1.2.4"
"@img/sharp-linuxmusl-arm64@0.34.3":
version "0.34.3"
@@ -1693,12 +1705,12 @@
optionalDependencies:
"@img/sharp-libvips-linuxmusl-arm64" "1.2.0"
-"@img/sharp-linuxmusl-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz#3c91bc8348cc3b42b43c6fca14f9dbb5cb47bd0d"
- integrity sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==
+"@img/sharp-linuxmusl-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz#d6515ee971bb62f73001a4829b9d865a11b77086"
+ integrity sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==
optionalDependencies:
- "@img/sharp-libvips-linuxmusl-arm64" "1.2.3"
+ "@img/sharp-libvips-linuxmusl-arm64" "1.2.4"
"@img/sharp-linuxmusl-x64@0.34.3":
version "0.34.3"
@@ -1707,12 +1719,12 @@
optionalDependencies:
"@img/sharp-libvips-linuxmusl-x64" "1.2.0"
-"@img/sharp-linuxmusl-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz#33de7d476ac9e2db7ef654331b54cc679b806bda"
- integrity sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==
+"@img/sharp-linuxmusl-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz#d97978aec7c5212f999714f2f5b736457e12ee9f"
+ integrity sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==
optionalDependencies:
- "@img/sharp-libvips-linuxmusl-x64" "1.2.3"
+ "@img/sharp-libvips-linuxmusl-x64" "1.2.4"
"@img/sharp-wasm32@0.34.3":
version "0.34.3"
@@ -1721,42 +1733,42 @@
dependencies:
"@emnapi/runtime" "^1.4.4"
-"@img/sharp-wasm32@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz#d617f7b3f851f899802298f360667c20605c0198"
- integrity sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==
+"@img/sharp-wasm32@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz#2f15803aa626f8c59dd7c9d0bbc766f1ab52cfa0"
+ integrity sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==
dependencies:
- "@emnapi/runtime" "^1.5.0"
+ "@emnapi/runtime" "^1.7.0"
"@img/sharp-win32-arm64@0.34.3":
version "0.34.3"
resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz#3e8654e368bb349d45799a0d7aeb29db2298628e"
integrity sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==
-"@img/sharp-win32-arm64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz#38e2c8a88826eac647f7c3f99efefb39897a8f5c"
- integrity sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==
+"@img/sharp-win32-arm64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz#3706e9e3ac35fddfc1c87f94e849f1b75307ce0a"
+ integrity sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==
"@img/sharp-win32-ia32@0.34.3":
version "0.34.3"
resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz#9d4c105e8d5074a351a81a0b6d056e0af913bf76"
integrity sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==
-"@img/sharp-win32-ia32@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz#003a7eb0fdaba600790c3007cfd756e41a9cf749"
- integrity sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==
+"@img/sharp-win32-ia32@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz#0b71166599b049e032f085fb9263e02f4e4788de"
+ integrity sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==
"@img/sharp-win32-x64@0.34.3":
version "0.34.3"
resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz#d20c89bd41b1dd3d76d8575714aaaa3c43204b6a"
integrity sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==
-"@img/sharp-win32-x64@0.34.4":
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz#b19f1f88ace8bfc20784a0ad31767f3438e025d1"
- integrity sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==
+"@img/sharp-win32-x64@0.34.5":
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz#a81ffb00e69267cd0a1d626eaedb8a8430b2b2f8"
+ integrity sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==
"@isaacs/balanced-match@^4.0.1":
version "4.0.1"
@@ -2304,9 +2316,9 @@
lexical "0.17.1"
"@monaco-editor/loader@^1.4.0":
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.6.1.tgz#c99177d87765abf10de31a0086084e714acfbc0f"
- integrity sha512-w3tEnj9HYEC73wtjdpR089AqkUPskFRcdkxsiSFt3SoUc3OHpmu+leP94CXBm4mHfefmhsdfI0ZQu6qJ0wgtPg==
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.7.0.tgz#967aaa4601b19e913627688dfe8159d57549e793"
+ integrity sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==
dependencies:
state-local "^1.0.6"
@@ -2326,10 +2338,10 @@
"@emnapi/runtime" "^1.4.3"
"@tybys/wasm-util" "^0.10.0"
-"@next/env@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/env/-/env-16.1.4.tgz#1f5155b16bad9825432b5e398b83df687b7b86f9"
- integrity sha512-gkrXnZyxPUy0Gg6SrPQPccbNVLSP3vmW8LU5dwEttEEC1RwDivk8w4O+sZIjFvPrSICXyhQDCG+y3VmjlJf+9A==
+"@next/env@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-16.1.6.tgz#0f85979498249a94ef606ef535042a831f905e89"
+ integrity sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==
"@next/eslint-plugin-next@16.0.0":
version "16.0.0"
@@ -2338,45 +2350,45 @@
dependencies:
fast-glob "3.3.1"
-"@next/swc-darwin-arm64@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.4.tgz#2d5ee68da80c9b822edd06caa360aef1917d0f37"
- integrity sha512-T8atLKuvk13XQUdVLCv1ZzMPgLPW0+DWWbHSQXs0/3TjPrKNxTmUIhOEaoEyl3Z82k8h/gEtqyuoZGv6+Ugawg==
-
-"@next/swc-darwin-x64@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.4.tgz#2f8d4462f48d4cb3c927de1962ca7a7b2f8a5b03"
- integrity sha512-AKC/qVjUGUQDSPI6gESTx0xOnOPQ5gttogNS3o6bA83yiaSZJek0Am5yXy82F1KcZCx3DdOwdGPZpQCluonuxg==
-
-"@next/swc-linux-arm64-gnu@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.4.tgz#79fecac25ad4a0ee1081110f4c8863b87e754943"
- integrity sha512-POQ65+pnYOkZNdngWfMEt7r53bzWiKkVNbjpmCt1Zb3V6lxJNXSsjwRuTQ8P/kguxDC8LRkqaL3vvsFrce4dMQ==
-
-"@next/swc-linux-arm64-musl@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.4.tgz#e9a99b1ea9a68908c3d36a847a6fe367b4fc3855"
- integrity sha512-3Wm0zGYVCs6qDFAiSSDL+Z+r46EdtCv/2l+UlIdMbAq9hPJBvGu/rZOeuvCaIUjbArkmXac8HnTyQPJFzFWA0Q==
-
-"@next/swc-linux-x64-gnu@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.4.tgz#4804de5f42ac8333e0049ab538473cbd996507f6"
- integrity sha512-lWAYAezFinaJiD5Gv8HDidtsZdT3CDaCeqoPoJjeB57OqzvMajpIhlZFce5sCAH6VuX4mdkxCRqecCJFwfm2nQ==
-
-"@next/swc-linux-x64-musl@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.4.tgz#4aa01e59b0e0fd19ab493ee239e3904c42419ca6"
- integrity sha512-fHaIpT7x4gA6VQbdEpYUXRGyge/YbRrkG6DXM60XiBqDM2g2NcrsQaIuj375egnGFkJow4RHacgBOEsHfGbiUw==
-
-"@next/swc-win32-arm64-msvc@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.4.tgz#67652a5c57889f44c11e145d49f777ac2e6cde58"
- integrity sha512-MCrXxrTSE7jPN1NyXJr39E+aNFBrQZtO154LoCz7n99FuKqJDekgxipoodLNWdQP7/DZ5tKMc/efybx1l159hw==
-
-"@next/swc-win32-x64-msvc@16.1.4":
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.4.tgz#3c51597eb64a96b8fcade74ab3f21ef3ad278a33"
- integrity sha512-JSVlm9MDhmTXw/sO2PE/MRj+G6XOSMZB+BcZ0a7d6KwVFZVpkHcb2okyoYFBaco6LeiL53BBklRlOrDDbOeE5w==
+"@next/swc-darwin-arm64@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz#fbe1e360efdcc9ebd0a10301518275bc59e12a91"
+ integrity sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==
+
+"@next/swc-darwin-x64@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz#0e3781ef3abc8251c2a21addc733d9a87f44829b"
+ integrity sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==
+
+"@next/swc-linux-arm64-gnu@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz#b24511af2c6129f2deaf5c8c04d297fe09cd40d7"
+ integrity sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==
+
+"@next/swc-linux-arm64-musl@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz#9d4ed0565689fc6a867250f994736a5b8c542ccb"
+ integrity sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==
+
+"@next/swc-linux-x64-gnu@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz#cc757f4384e7eab7d3dba704a97f737518bae0d2"
+ integrity sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==
+
+"@next/swc-linux-x64-musl@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz#ef1341740f29717deea7c6ec27ae6269386e20d1"
+ integrity sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==
+
+"@next/swc-win32-arm64-msvc@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz#fee8719242aecf9c39c3a66f1f73821f7884dd16"
+ integrity sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==
+
+"@next/swc-win32-x64-msvc@16.1.6":
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz#60c27323c30f35722b20fd6d62449fbb768e46d9"
+ integrity sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==
"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
version "5.1.1-v1"
@@ -2505,9 +2517,9 @@
"@radix-ui/react-compose-refs" "1.0.1"
"@rc-component/async-validator@^5.0.3":
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz#5291ad92f00a14b6766fc81735c234277f83e948"
- integrity sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.1.0.tgz#e81f31e676d9cadc71e4310bbf1749c7a5882291"
+ integrity sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==
dependencies:
"@babel/runtime" "^7.24.4"
@@ -2574,9 +2586,9 @@
rc-util "^5.24.4"
"@rc-component/trigger@^2.0.0", "@rc-component/trigger@^2.1.1", "@rc-component/trigger@^2.3.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-2.3.0.tgz#9499ada078daca9dd99d01f0f0743ee1ab9e398b"
- integrity sha512-iwaxZyzOuK0D7lS+0AQEtW52zUWxoGqTGkke3dRyb8pYiShmRpCjB/8TzPI4R6YySCH7Vm9BZj/31VPiiQTLBg==
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-2.3.1.tgz#83fc0c4165a58fdc66bd9171082d08acf31be6bb"
+ integrity sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==
dependencies:
"@babel/runtime" "^7.23.2"
"@rc-component/portal" "^1.1.0"
@@ -2724,6 +2736,11 @@
resolved "https://registry.yarnpkg.com/@react-email/text/-/text-0.0.7.tgz#5e0a93cb52c943ada389161220c6d31b55d4a28f"
integrity sha512-eHCx0mdllGcgK9X7wiLKjNZCBRfxRVNjD3NNYRmOc3Icbl8M9JHriJIfxBuGCmGg2UAORK5P3KmaLQ8b99/pbA==
+"@rollup/rollup-linux-x64-gnu@^4.24.0":
+ version "4.57.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz#0da46a644c87e1d8b13da5e2901037193caea8d3"
+ integrity sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==
+
"@rtsao/scc@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
@@ -2780,9 +2797,9 @@
text-hex "1.0.x"
"@standard-schema/spec@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c"
- integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8"
+ integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==
"@swc/helpers@0.5.15":
version "0.5.15"
@@ -2854,9 +2871,9 @@
integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
"@tsconfig/node10@^1.0.7":
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
- integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4"
+ integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==
"@tsconfig/node12@^1.0.7":
version "1.0.11"
@@ -3032,9 +3049,9 @@
integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==
"@types/lodash@^4.14.175":
- version "4.17.20"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93"
- integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==
+ version "4.17.23"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.23.tgz#c1bb06db218acc8fc232da0447473fc2fb9d9841"
+ integrity sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==
"@types/markdown-it@^12.2.3":
version "12.2.3"
@@ -3062,9 +3079,9 @@
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
"@types/node@*":
- version "24.9.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.2.tgz#90ded2422dbfcafcf72080f28975adc21366148d"
- integrity sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==
+ version "25.0.10"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.10.tgz#4864459c3c9459376b8b75fd051315071c8213e7"
+ integrity sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==
dependencies:
undici-types "~7.16.0"
@@ -3104,7 +3121,14 @@
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@19.2.2":
+"@types/react@*":
+ version "19.2.10"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.10.tgz#f3ea799e6b4cebad6dfd231c238fc9de7652e2d2"
+ integrity sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==
+ dependencies:
+ csstype "^3.2.2"
+
+"@types/react@19.2.2":
version "19.2.2"
resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.2.tgz#ba123a75d4c2a51158697160a4ea2ff70aa6bf36"
integrity sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==
@@ -3112,9 +3136,9 @@
csstype "^3.0.2"
"@types/readable-stream@^4.0.0", "@types/readable-stream@^4.0.21":
- version "4.0.22"
- resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.22.tgz#882fda4f17b6580acb257df3f22ca69c05470b29"
- integrity sha512-/FFhJpfCLAPwAcN3mFycNUa77ddnr8jTgF5VmSNetaemWB2cIlfCA9t0YTM3JAT0wOcv8D4tjPo7pkDhK3EJIg==
+ version "4.0.23"
+ resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.23.tgz#fcd0f7472f45ceb43154f08f0083ccd1c76e53ce"
+ integrity sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==
dependencies:
"@types/node" "*"
@@ -3216,53 +3240,52 @@
"@types/yargs-parser" "*"
"@types/yargs@^15.0.0":
- version "15.0.19"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9"
- integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==
+ version "15.0.20"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.20.tgz#6d00a124c9f757427d4ca3cbc87daea778053c68"
+ integrity sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==
dependencies:
"@types/yargs-parser" "*"
"@types/yargs@^17.0.8":
- version "17.0.34"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.34.tgz#1c2f9635b71d5401827373a01ce2e8a7670ea839"
- integrity sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==
+ version "17.0.35"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24"
+ integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/eslint-plugin@8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz#dc4ab93ee3d7e6c8e38820a0d6c7c93c7183e2dc"
- integrity sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==
- dependencies:
- "@eslint-community/regexpp" "^4.10.0"
- "@typescript-eslint/scope-manager" "8.46.2"
- "@typescript-eslint/type-utils" "8.46.2"
- "@typescript-eslint/utils" "8.46.2"
- "@typescript-eslint/visitor-keys" "8.46.2"
- graphemer "^1.4.0"
- ignore "^7.0.0"
+"@typescript-eslint/eslint-plugin@8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz#d8899e5c2eccf5c4a20d01c036a193753748454d"
+ integrity sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==
+ dependencies:
+ "@eslint-community/regexpp" "^4.12.2"
+ "@typescript-eslint/scope-manager" "8.54.0"
+ "@typescript-eslint/type-utils" "8.54.0"
+ "@typescript-eslint/utils" "8.54.0"
+ "@typescript-eslint/visitor-keys" "8.54.0"
+ ignore "^7.0.5"
natural-compare "^1.4.0"
- ts-api-utils "^2.1.0"
+ ts-api-utils "^2.4.0"
-"@typescript-eslint/parser@8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.46.2.tgz#dd938d45d581ac8ffa9d8a418a50282b306f7ebf"
- integrity sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==
+"@typescript-eslint/parser@8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.54.0.tgz#3d01a6f54ed247deb9982621f70e7abf1810bd97"
+ integrity sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==
dependencies:
- "@typescript-eslint/scope-manager" "8.46.2"
- "@typescript-eslint/types" "8.46.2"
- "@typescript-eslint/typescript-estree" "8.46.2"
- "@typescript-eslint/visitor-keys" "8.46.2"
- debug "^4.3.4"
+ "@typescript-eslint/scope-manager" "8.54.0"
+ "@typescript-eslint/types" "8.54.0"
+ "@typescript-eslint/typescript-estree" "8.54.0"
+ "@typescript-eslint/visitor-keys" "8.54.0"
+ debug "^4.4.3"
-"@typescript-eslint/project-service@8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.46.2.tgz#ab2f02a0de4da6a7eeb885af5e059be57819d608"
- integrity sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==
+"@typescript-eslint/project-service@8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.54.0.tgz#f582aceb3d752544c8e1b11fea8d95d00cf9adc6"
+ integrity sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==
dependencies:
- "@typescript-eslint/tsconfig-utils" "^8.46.2"
- "@typescript-eslint/types" "^8.46.2"
- debug "^4.3.4"
+ "@typescript-eslint/tsconfig-utils" "^8.54.0"
+ "@typescript-eslint/types" "^8.54.0"
+ debug "^4.4.3"
"@typescript-eslint/scope-manager@5.62.0":
version "5.62.0"
@@ -3272,39 +3295,39 @@
"@typescript-eslint/types" "5.62.0"
"@typescript-eslint/visitor-keys" "5.62.0"
-"@typescript-eslint/scope-manager@8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz#7d37df2493c404450589acb3b5d0c69cc0670a88"
- integrity sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==
+"@typescript-eslint/scope-manager@8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz#307dc8cbd80157e2772c2d36216857415a71ab33"
+ integrity sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==
dependencies:
- "@typescript-eslint/types" "8.46.2"
- "@typescript-eslint/visitor-keys" "8.46.2"
+ "@typescript-eslint/types" "8.54.0"
+ "@typescript-eslint/visitor-keys" "8.54.0"
-"@typescript-eslint/tsconfig-utils@8.46.2", "@typescript-eslint/tsconfig-utils@^8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz#d110451cb93bbd189865206ea37ef677c196828c"
- integrity sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==
+"@typescript-eslint/tsconfig-utils@8.54.0", "@typescript-eslint/tsconfig-utils@^8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz#71dd7ba1674bd48b172fc4c85b2f734b0eae3dbc"
+ integrity sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==
-"@typescript-eslint/type-utils@8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz#802d027864e6fb752e65425ed09f3e089fb4d384"
- integrity sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==
+"@typescript-eslint/type-utils@8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz#64965317dd4118346c2fa5ee94492892200e9fb9"
+ integrity sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==
dependencies:
- "@typescript-eslint/types" "8.46.2"
- "@typescript-eslint/typescript-estree" "8.46.2"
- "@typescript-eslint/utils" "8.46.2"
- debug "^4.3.4"
- ts-api-utils "^2.1.0"
+ "@typescript-eslint/types" "8.54.0"
+ "@typescript-eslint/typescript-estree" "8.54.0"
+ "@typescript-eslint/utils" "8.54.0"
+ debug "^4.4.3"
+ ts-api-utils "^2.4.0"
"@typescript-eslint/types@5.62.0":
version "5.62.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
-"@typescript-eslint/types@8.46.2", "@typescript-eslint/types@^8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.2.tgz#2bad7348511b31e6e42579820e62b73145635763"
- integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==
+"@typescript-eslint/types@8.54.0", "@typescript-eslint/types@^8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.54.0.tgz#c12d41f67a2e15a8a96fbc5f2d07b17331130889"
+ integrity sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==
"@typescript-eslint/typescript-estree@5.62.0":
version "5.62.0"
@@ -3319,31 +3342,30 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/typescript-estree@8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz#ab547a27e4222bb6a3281cb7e98705272e2c7d08"
- integrity sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==
- dependencies:
- "@typescript-eslint/project-service" "8.46.2"
- "@typescript-eslint/tsconfig-utils" "8.46.2"
- "@typescript-eslint/types" "8.46.2"
- "@typescript-eslint/visitor-keys" "8.46.2"
- debug "^4.3.4"
- fast-glob "^3.3.2"
- is-glob "^4.0.3"
- minimatch "^9.0.4"
- semver "^7.6.0"
- ts-api-utils "^2.1.0"
-
-"@typescript-eslint/utils@8.46.2", "@typescript-eslint/utils@^8.44.1":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.46.2.tgz#b313d33d67f9918583af205bd7bcebf20f231732"
- integrity sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==
- dependencies:
- "@eslint-community/eslint-utils" "^4.7.0"
- "@typescript-eslint/scope-manager" "8.46.2"
- "@typescript-eslint/types" "8.46.2"
- "@typescript-eslint/typescript-estree" "8.46.2"
+"@typescript-eslint/typescript-estree@8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz#3c7716905b2b811fadbd2114804047d1bfc86527"
+ integrity sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==
+ dependencies:
+ "@typescript-eslint/project-service" "8.54.0"
+ "@typescript-eslint/tsconfig-utils" "8.54.0"
+ "@typescript-eslint/types" "8.54.0"
+ "@typescript-eslint/visitor-keys" "8.54.0"
+ debug "^4.4.3"
+ minimatch "^9.0.5"
+ semver "^7.7.3"
+ tinyglobby "^0.2.15"
+ ts-api-utils "^2.4.0"
+
+"@typescript-eslint/utils@8.54.0", "@typescript-eslint/utils@^8.44.1":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.54.0.tgz#c79a4bcbeebb4f571278c0183ed1cb601d84c6c8"
+ integrity sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.9.1"
+ "@typescript-eslint/scope-manager" "8.54.0"
+ "@typescript-eslint/types" "8.54.0"
+ "@typescript-eslint/typescript-estree" "8.54.0"
"@typescript-eslint/utils@^5.10.0":
version "5.62.0"
@@ -3367,12 +3389,12 @@
"@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
-"@typescript-eslint/visitor-keys@8.46.2":
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz#803fa298948c39acf810af21bdce6f8babfa9738"
- integrity sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==
+"@typescript-eslint/visitor-keys@8.54.0":
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz#0e4b50124b210b8600b245dd66cbad52deb15590"
+ integrity sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==
dependencies:
- "@typescript-eslint/types" "8.46.2"
+ "@typescript-eslint/types" "8.54.0"
eslint-visitor-keys "^4.2.1"
"@ucast/core@^1.0.0", "@ucast/core@^1.4.1", "@ucast/core@^1.6.1":
@@ -4048,7 +4070,7 @@ array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3:
es-abstract "^1.23.5"
es-shim-unscopables "^1.0.2"
-array.prototype.reduce@^1.0.6:
+array.prototype.reduce@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz#42f97f5078daedca687d4463fd3c05cbfd83da57"
integrity sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==
@@ -4195,9 +4217,9 @@ aws4@^1.8.0:
integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
axe-core@^4.10.0:
- version "4.11.0"
- resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.11.0.tgz#16f74d6482e343ff263d4f4503829e9ee91a86b6"
- integrity sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==
+ version "4.11.1"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.11.1.tgz#052ff9b2cbf543f5595028b583e4763b40c78ea7"
+ integrity sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==
axobject-query@^4.1.0:
version "4.1.0"
@@ -4249,12 +4271,12 @@ babel-plugin-jest-hoist@^29.6.3:
"@types/babel__traverse" "^7.0.6"
babel-plugin-polyfill-corejs2@^0.4.14:
- version "0.4.14"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz#8101b82b769c568835611542488d463395c2ef8f"
- integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==
+ version "0.4.15"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz#808fa349686eea4741807cfaaa2aa3aa57ce120a"
+ integrity sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==
dependencies:
- "@babel/compat-data" "^7.27.7"
- "@babel/helper-define-polyfill-provider" "^0.6.5"
+ "@babel/compat-data" "^7.28.6"
+ "@babel/helper-define-polyfill-provider" "^0.6.6"
semver "^6.3.1"
babel-plugin-polyfill-corejs3@^0.13.0:
@@ -4266,11 +4288,11 @@ babel-plugin-polyfill-corejs3@^0.13.0:
core-js-compat "^3.43.0"
babel-plugin-polyfill-regenerator@^0.6.5:
- version "0.6.5"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz#32752e38ab6f6767b92650347bf26a31b16ae8c5"
- integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz#69f5dd263cab933c42fe5ea05e83443b374bd4bf"
+ integrity sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.6.5"
+ "@babel/helper-define-polyfill-provider" "^0.6.6"
babel-preset-current-node-syntax@^1.0.0:
version "1.2.0"
@@ -4344,15 +4366,10 @@ base@^0.11.1:
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
-baseline-browser-mapping@^2.8.19:
- version "2.8.21"
- resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz#2f9cccde871bfa4aec9dbf92d0ee746e4f1892e4"
- integrity sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==
-
-baseline-browser-mapping@^2.8.3:
- version "2.9.16"
- resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.16.tgz#da1e893fd13aa6e8b6349b64b06399a0644c14b5"
- integrity sha512-KeUZdBuxngy825i8xvzaK1Ncnkx0tBmb3k8DkEuqjKRkmtvNTjey2ZsNeh8Dw4lfKvbCOu9oeNx2TKm2vHqcRw==
+baseline-browser-mapping@^2.8.3, baseline-browser-mapping@^2.9.0:
+ version "2.9.18"
+ resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz#c8281693035a9261b10d662a5379650a6c2d1ff7"
+ integrity sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==
batch@0.6.1:
version "0.6.1"
@@ -4413,9 +4430,9 @@ bl@^4.0.3:
readable-stream "^3.4.0"
bl@^6.0.8:
- version "6.1.4"
- resolved "https://registry.yarnpkg.com/bl/-/bl-6.1.4.tgz#107fb9c9a4d0507d8c064b50ba7036deee9fcfa6"
- integrity sha512-ZV/9asSuknOExbM/zPPA8z00lc1ihPKWaStHkkQrxHNeYx+yY+TmF+v80dpv2G0mv3HVXBu7ryoAsxbFFhf4eg==
+ version "6.1.6"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-6.1.6.tgz#b40f3aea6963c6742616a957efb742c4fb87ecbb"
+ integrity sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==
dependencies:
"@types/readable-stream" "^4.0.0"
buffer "^6.0.3"
@@ -4449,23 +4466,23 @@ bn.js@^5.2.1, bn.js@^5.2.2:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566"
integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==
-body-parser@1.20.3, body-parser@^1.19.0:
- version "1.20.3"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
- integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
+body-parser@^1.19.0, body-parser@~1.20.3:
+ version "1.20.4"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f"
+ integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==
dependencies:
- bytes "3.1.2"
+ bytes "~3.1.2"
content-type "~1.0.5"
debug "2.6.9"
depd "2.0.0"
- destroy "1.2.0"
- http-errors "2.0.0"
- iconv-lite "0.4.24"
- on-finished "2.4.1"
- qs "6.13.0"
- raw-body "2.5.2"
+ destroy "~1.2.0"
+ http-errors "~2.0.1"
+ iconv-lite "~0.4.24"
+ on-finished "~2.4.1"
+ qs "~6.14.0"
+ raw-body "~2.5.3"
type-is "~1.6.18"
- unpipe "1.0.0"
+ unpipe "~1.0.0"
bonjour-service@1.1.1:
version "1.1.1"
@@ -4586,15 +4603,15 @@ braces@^3.0.2, braces@^3.0.3, braces@~3.0.2:
dependencies:
fill-range "^7.1.1"
-broker-factory@^3.1.10:
- version "3.1.10"
- resolved "https://registry.yarnpkg.com/broker-factory/-/broker-factory-3.1.10.tgz#583005d7bca34c32d828dfcadc51badf5d9a376b"
- integrity sha512-BzqK5GYFhvVFvO13uzPN0SCiOsOQuhMUbsGvTXDJMA2/N4GvIlFdxEuueE+60Zk841bBU5G3+fl2cqYEo0wgGg==
+broker-factory@^3.1.13:
+ version "3.1.13"
+ resolved "https://registry.yarnpkg.com/broker-factory/-/broker-factory-3.1.13.tgz#fd0d32e5793879c1e94c5d71a63e8733709d6a43"
+ integrity sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==
dependencies:
- "@babel/runtime" "^7.28.4"
- fast-unique-numbers "^9.0.24"
+ "@babel/runtime" "^7.28.6"
+ fast-unique-numbers "^9.0.26"
tslib "^2.8.1"
- worker-factory "^7.0.46"
+ worker-factory "^7.0.48"
brorand@^1.0.1, brorand@^1.1.0:
version "1.1.0"
@@ -4668,16 +4685,16 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.0.0, browserslist@^4.24.0, browserslist@^4.26.3:
- version "4.27.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.27.0.tgz#755654744feae978fbb123718b2f139bc0fa6697"
- integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==
+browserslist@^4.0.0, browserslist@^4.24.0, browserslist@^4.28.1:
+ version "4.28.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95"
+ integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
dependencies:
- baseline-browser-mapping "^2.8.19"
- caniuse-lite "^1.0.30001751"
- electron-to-chromium "^1.5.238"
- node-releases "^2.0.26"
- update-browserslist-db "^1.1.4"
+ baseline-browser-mapping "^2.9.0"
+ caniuse-lite "^1.0.30001759"
+ electron-to-chromium "^1.5.263"
+ node-releases "^2.0.27"
+ update-browserslist-db "^1.2.0"
bs-logger@0.x:
version "0.2.6"
@@ -4765,7 +4782,7 @@ busboy@0.3.1, busboy@^0.3.1:
dependencies:
dicer "0.3.0"
-bytes@3.1.2:
+bytes@3.1.2, bytes@~3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
@@ -4910,10 +4927,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001751:
- version "1.0.30001751"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz#dacd5d9f4baeea841641640139d2b2a4df4226ad"
- integrity sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001759:
+ version "1.0.30001766"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz#b6f6b55cb25a2d888d9393104d14751c6a7d6f7a"
+ integrity sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==
canonicalize@^1.0.1:
version "1.0.8"
@@ -5053,6 +5070,11 @@ citty@^0.1.6:
dependencies:
consola "^3.2.3"
+citty@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/citty/-/citty-0.2.0.tgz#2426b145c4bf2a2c5c33bd66a634dfe3d5ea67ea"
+ integrity sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==
+
cjs-module-lexer@^1.0.0:
version "1.4.3"
resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d"
@@ -5190,10 +5212,10 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
-color-convert@^3.0.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-3.1.2.tgz#cef9e0fd4cb90b07c14697b3fa70af9d7f4870f1"
- integrity sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==
+color-convert@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-3.1.3.tgz#db6627b97181cb8facdfce755ae26f97ab0711f1"
+ integrity sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==
dependencies:
color-name "^2.0.0"
@@ -5208,9 +5230,9 @@ color-name@^1.0.0, color-name@~1.1.4:
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-name@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-2.0.2.tgz#85054825a23e6d6f81d3503f660c4c4a2a15f04f"
- integrity sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-2.1.0.tgz#0b677385c1c4b4edfdeaf77e38fa338e3a40b693"
+ integrity sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==
color-string@^1.6.0, color-string@^1.9.0:
version "1.9.1"
@@ -5220,10 +5242,10 @@ color-string@^1.6.0, color-string@^1.9.0:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
-color-string@^2.0.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-2.1.2.tgz#db1dd52414cc9037ada8fa7d936b8e9f6c3366c9"
- integrity sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==
+color-string@^2.1.3:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-2.1.4.tgz#9dcf566ff976e23368c8bd673f5c35103ab41058"
+ integrity sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==
dependencies:
color-name "^2.0.0"
@@ -5244,12 +5266,12 @@ color@^4.2.3:
color-string "^1.9.0"
color@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/color/-/color-5.0.2.tgz#712ec894007ab27b37207732d182784e001b4a3d"
- integrity sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/color/-/color-5.0.3.tgz#f79390b1b778e222ffbb54304d3dbeaef633f97f"
+ integrity sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==
dependencies:
- color-convert "^3.0.1"
- color-string "^2.0.0"
+ color-convert "^3.1.3"
+ color-string "^2.1.3"
colorette@^2.0.20:
version "2.0.20"
@@ -5412,7 +5434,7 @@ connect-history-api-fallback@^1.6.0:
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
-consola@^3.2.3, consola@^3.4.0, consola@^3.4.2:
+consola@^3.2.3, consola@^3.4.0:
version "3.4.2"
resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7"
integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==
@@ -5427,7 +5449,7 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==
-content-disposition@0.5.4, content-disposition@~0.5.2:
+content-disposition@~0.5.2, content-disposition@~0.5.4:
version "0.5.4"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
@@ -5444,10 +5466,10 @@ convert-source-map@^2.0.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
-cookie-signature@1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
- integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+cookie-signature@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454"
+ integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==
cookie@0.7.1:
version "0.7.1"
@@ -5459,6 +5481,11 @@ cookie@~0.4.1:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
+cookie@~0.7.1:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
+ integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==
+
cookiejar@^2.1.0:
version "2.1.4"
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b"
@@ -5502,16 +5529,16 @@ copy-to@^2.0.1:
integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==
core-js-compat@^3.43.0:
- version "3.46.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.46.0.tgz#0c87126a19a1af00371e12b02a2b088a40f3c6f7"
- integrity sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==
+ version "3.48.0"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6"
+ integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==
dependencies:
- browserslist "^4.26.3"
+ browserslist "^4.28.1"
core-js@^3.6.0, core-js@^3.8.3:
- version "3.46.0"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.46.0.tgz#323a092b96381a9184d0cd49ee9083b2f93373bb"
- integrity sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==
+ version "3.48.0"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.48.0.tgz#1f813220a47bbf0e667e3885c36cd6f0593bf14d"
+ integrity sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==
core-util-is@1.0.2:
version "1.0.2"
@@ -5524,9 +5551,9 @@ core-util-is@~1.0.0:
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
cors@^2.8.5:
- version "2.8.5"
- resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
- integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ version "2.8.6"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96"
+ integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==
dependencies:
object-assign "^4"
vary "^1"
@@ -5819,10 +5846,10 @@ cssstyle@^4.2.1:
"@asamuzakjp/css-color" "^3.2.0"
rrweb-cssom "^0.8.0"
-csstype@^3.0.2, csstype@^3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
- integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+csstype@^3.0.2, csstype@^3.1.3, csstype@^3.2.2:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a"
+ integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
cyclist@^1.0.1:
version "1.0.2"
@@ -5877,9 +5904,9 @@ data-view-byte-offset@^1.0.1:
is-data-view "^1.0.1"
dayjs@^1.11.11:
- version "1.11.18"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.18.tgz#835fa712aac52ab9dec8b1494098774ed7070a11"
- integrity sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==
+ version "1.11.19"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938"
+ integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==
debounce-fn@^3.0.1:
version "3.0.1"
@@ -5900,7 +5927,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6, debug@^4.4.0, debug@^4.4.1:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3:
version "4.4.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
@@ -5958,9 +5985,9 @@ decompress-response@^6.0.0:
mimic-response "^3.1.0"
dedent@^1.0.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.0.tgz#c1f9445335f0175a96587be245a282ff451446ca"
- integrity sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.1.tgz#364661eea3d73f3faba7089214420ec2f8f13e15"
+ integrity sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==
deep-equal@^1.0.1:
version "1.1.2"
@@ -6098,7 +6125,7 @@ destr@^2.0.3:
resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb"
integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==
-destroy@1.2.0, destroy@^1.0.4:
+destroy@1.2.0, destroy@^1.0.4, destroy@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
@@ -6108,7 +6135,7 @@ detect-file@^1.0.0:
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==
-detect-libc@^2.0.0, detect-libc@^2.0.4, detect-libc@^2.1.0:
+detect-libc@^2.0.0, detect-libc@^2.0.4, detect-libc@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad"
integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
@@ -6184,9 +6211,9 @@ diff-sequences@^29.6.3:
integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
diff@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
- integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d"
+ integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==
diffie-hellman@^5.0.3:
version "5.0.3"
@@ -6449,10 +6476,10 @@ effect@3.18.4:
"@standard-schema/spec" "^1.0.0"
fast-check "^3.23.1"
-electron-to-chromium@^1.5.238:
- version "1.5.243"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz#b13b4a046f49f46574d643d4e2ec2ea33ce8cfe7"
- integrity sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==
+electron-to-chromium@^1.5.263:
+ version "1.5.279"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz#67dfdeb22fd81412d0d18d1d9b2c749e9b8945cb"
+ integrity sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==
elliptic@^6.5.3, elliptic@^6.6.1:
version "6.6.1"
@@ -6507,7 +6534,7 @@ enabled@2.0.x:
resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
-encodeurl@^1.0.2, encodeurl@~1.0.2:
+encodeurl@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
@@ -6525,9 +6552,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
once "^1.4.0"
engine.io-client@~3.5.0:
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.4.tgz#5b40d7381772ba05c0881be5735a318424a07fc6"
- integrity sha512-ydc8uuMMDxC5KCKNJN3zZKYJk2sgyTuTZQ7Aj1DJSsLKAcizA/PzWivw8fZMIjJVBo2CJOYzntv4FSjY/Lr//g==
+ version "3.5.6"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.6.tgz#0cb6b41f36b34c524b0385f78a0d91eed90007f9"
+ integrity sha512-2fDMKiXSU7bGRDCWEw9cHEdRNfoU8cpP6lt+nwJhv72tSJpO7YBsqMqYZ63eVvwX3l9prPl2k/mxhfVhY+SDWg==
dependencies:
component-emitter "~1.3.0"
component-inherit "0.0.3"
@@ -6612,10 +6639,10 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0:
- version "1.24.0"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328"
- integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==
+es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899"
+ integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==
dependencies:
array-buffer-byte-length "^1.0.2"
arraybuffer.prototype.slice "^1.0.4"
@@ -6688,25 +6715,25 @@ es-errors@^1.3.0:
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-iterator-helpers@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75"
- integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz#d979a9f686e2b0b72f88dbead7229924544720bc"
+ integrity sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==
dependencies:
call-bind "^1.0.8"
- call-bound "^1.0.3"
+ call-bound "^1.0.4"
define-properties "^1.2.1"
- es-abstract "^1.23.6"
+ es-abstract "^1.24.1"
es-errors "^1.3.0"
- es-set-tostringtag "^2.0.3"
+ es-set-tostringtag "^2.1.0"
function-bind "^1.1.2"
- get-intrinsic "^1.2.6"
+ get-intrinsic "^1.3.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"
internal-slot "^1.1.0"
- iterator.prototype "^1.1.4"
+ iterator.prototype "^1.1.5"
safe-array-concat "^1.1.3"
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
@@ -6716,7 +6743,7 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
dependencies:
es-errors "^1.3.0"
-es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0:
+es-set-tostringtag@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
@@ -7159,9 +7186,9 @@ esprima@~3.1.0:
integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==
esquery@^1.4.2, esquery@^1.5.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
- integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d"
+ integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==
dependencies:
estraverse "^5.1.0"
@@ -7203,9 +7230,9 @@ eventemitter3@^4.0.0:
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
eventemitter3@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
- integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb"
+ integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==
events@^3.0.0, events@^3.3.0:
version "3.3.0"
@@ -7340,46 +7367,46 @@ expect@^29.0.0, expect@^29.7.0:
jest-util "^29.7.0"
express@^4.17.0, express@^4.17.1:
- version "4.21.2"
- resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32"
- integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069"
+ integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==
dependencies:
accepts "~1.3.8"
array-flatten "1.1.1"
- body-parser "1.20.3"
- content-disposition "0.5.4"
+ body-parser "~1.20.3"
+ content-disposition "~0.5.4"
content-type "~1.0.4"
- cookie "0.7.1"
- cookie-signature "1.0.6"
+ cookie "~0.7.1"
+ cookie-signature "~1.0.6"
debug "2.6.9"
depd "2.0.0"
encodeurl "~2.0.0"
escape-html "~1.0.3"
etag "~1.8.1"
- finalhandler "1.3.1"
- fresh "0.5.2"
- http-errors "2.0.0"
+ finalhandler "~1.3.1"
+ fresh "~0.5.2"
+ http-errors "~2.0.0"
merge-descriptors "1.0.3"
methods "~1.1.2"
- on-finished "2.4.1"
+ on-finished "~2.4.1"
parseurl "~1.3.3"
- path-to-regexp "0.1.12"
+ path-to-regexp "~0.1.12"
proxy-addr "~2.0.7"
- qs "6.13.0"
+ qs "~6.14.0"
range-parser "~1.2.1"
safe-buffer "5.2.1"
- send "0.19.0"
- serve-static "1.16.2"
+ send "~0.19.0"
+ serve-static "~1.16.2"
setprototypeof "1.2.0"
- statuses "2.0.1"
+ statuses "~2.0.1"
type-is "~1.6.18"
utils-merge "1.0.1"
vary "~1.1.2"
exsolve@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.7.tgz#3b74e4c7ca5c5f9a19c3626ca857309fa99f9e9e"
- integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.8.tgz#7f5e34da61cd1116deda5136e62292c096f50613"
+ integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==
extend-shallow@^2.0.1:
version "2.0.1"
@@ -7469,12 +7496,12 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
-fast-unique-numbers@^9.0.24:
- version "9.0.24"
- resolved "https://registry.yarnpkg.com/fast-unique-numbers/-/fast-unique-numbers-9.0.24.tgz#9f86bdbfa99b1b6546239202641196c78f81fd55"
- integrity sha512-Dv0BYn4waOWse94j16rsZ5w/0zoaCa74O3q6IZjMqaXbtT92Q+Sb6pPk+phGzD8Xh+nueQmSRI3tSCaHKidzKw==
+fast-unique-numbers@^9.0.26:
+ version "9.0.26"
+ resolved "https://registry.yarnpkg.com/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz#1f282c2e76c8efeb593c699e600be339ebe0f755"
+ integrity sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==
dependencies:
- "@babel/runtime" "^7.28.4"
+ "@babel/runtime" "^7.28.6"
tslib "^2.8.1"
fast-xml-parser@3.15.0:
@@ -7495,9 +7522,9 @@ fastparse@^1.1.1:
integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
fastq@^1.6.0:
- version "1.19.1"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5"
- integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==
+ version "1.20.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675"
+ integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==
dependencies:
reusify "^1.0.4"
@@ -7587,17 +7614,17 @@ fill-range@^7.1.1:
dependencies:
to-regex-range "^5.0.1"
-finalhandler@1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
- integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
+finalhandler@~1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88"
+ integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==
dependencies:
debug "2.6.9"
encodeurl "~2.0.0"
escape-html "~1.0.3"
- on-finished "2.4.1"
+ on-finished "~2.4.1"
parseurl "~1.3.3"
- statuses "2.0.1"
+ statuses "~2.0.2"
unpipe "~1.0.0"
find-cache-dir@^2.1.0:
@@ -7759,7 +7786,7 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
-fresh@0.5.2, fresh@~0.5.2:
+fresh@~0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
@@ -8007,9 +8034,9 @@ glob-parent@^6.0.2:
is-glob "^4.0.3"
glob@^10.4.2:
- version "10.4.5"
- resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
- integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
+ version "10.5.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c"
+ integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==
dependencies:
foreground-child "^3.1.0"
jackspeak "^3.1.2"
@@ -8493,17 +8520,6 @@ http-deceiver@^1.2.7:
resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
-http-errors@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
- integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
- dependencies:
- depd "2.0.0"
- inherits "2.0.4"
- setprototypeof "1.2.0"
- statuses "2.0.1"
- toidentifier "1.0.1"
-
http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0:
version "1.8.1"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c"
@@ -8515,15 +8531,16 @@ http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0:
statuses ">= 1.5.0 < 2"
toidentifier "1.0.1"
-http-errors@~1.6.2:
- version "1.6.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
- integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
+http-errors@~2.0.0, http-errors@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b"
+ integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==
dependencies:
- depd "~1.1.2"
- inherits "2.0.3"
- setprototypeof "1.1.0"
- statuses ">= 1.4.0 < 2"
+ depd "~2.0.0"
+ inherits "~2.0.4"
+ setprototypeof "~1.2.0"
+ statuses "~2.0.2"
+ toidentifier "~1.0.1"
http-parser-js@>=0.5.1:
version "0.5.10"
@@ -8616,13 +8633,6 @@ husky@^9.1.6:
resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d"
integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==
-iconv-lite@0.4.24:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
- integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
- dependencies:
- safer-buffer ">= 2.1.2 < 3"
-
iconv-lite@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
@@ -8630,6 +8640,13 @@ iconv-lite@0.6.3:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
+iconv-lite@~0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -8667,7 +8684,7 @@ ignore@^5.1.1, ignore@^5.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
-ignore@^7.0.0:
+ignore@^7.0.5:
version "7.0.5"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9"
integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==
@@ -8762,7 +8779,7 @@ inherits-browser@^0.1.0:
resolved "https://registry.yarnpkg.com/inherits-browser/-/inherits-browser-0.1.0.tgz#893a7c9cc78f2a1e18093aaa203bbb8cf5c30511"
integrity sha512-CJHHvW3jQ6q7lzsXPpapLdMx5hDpSF3FSh45pwsj6bKxJJ8Nl8v43i5yXnr3BdfOimGHKyniewQtnAIp3vyJJw==
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -8800,9 +8817,9 @@ interpret@^1.4.0:
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
ip-address@^10.0.1:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.0.1.tgz#a8180b783ce7788777d796286d61bce4276818ed"
- integrity sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.0.tgz#d8dcffb34d0e02eb241427444a6e23f5b0595aa4"
+ integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==
ip-regex@^2.1.0:
version "2.1.0"
@@ -9378,7 +9395,7 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
-iterator.prototype@^1.1.4:
+iterator.prototype@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39"
integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==
@@ -9871,17 +9888,17 @@ js-sdsl@4.3.0:
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ version "3.14.2"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0"
+ integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
-js-yaml@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
- integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+js-yaml@^4.1.0, js-yaml@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b"
+ integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==
dependencies:
argparse "^2.0.1"
@@ -10108,7 +10125,7 @@ jszip@3.10.1:
readable-stream "~2.3.6"
setimmediate "^1.0.5"
-jwa@^1.4.1:
+jwa@^1.4.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9"
integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==
@@ -10117,7 +10134,7 @@ jwa@^1.4.1:
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"
-jwa@^2.0.0:
+jwa@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804"
integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==
@@ -10127,19 +10144,19 @@ jwa@^2.0.0:
safe-buffer "^5.0.1"
jws@^3.2.2:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
- integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.3.tgz#5ac0690b460900a27265de24520526853c0b8ca1"
+ integrity sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==
dependencies:
- jwa "^1.4.1"
+ jwa "^1.4.2"
safe-buffer "^5.0.1"
jws@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4"
- integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690"
+ integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==
dependencies:
- jwa "^2.0.0"
+ jwa "^2.0.1"
safe-buffer "^5.0.1"
keygrip@~1.1.0:
@@ -10292,9 +10309,9 @@ lexical@0.17.1:
integrity sha512-72/MhR7jqmyqD10bmJw8gztlCm4KDDT+TPtU4elqXrEvHoO5XENi34YAEUD9gIkPfqSwyLa9mwAX1nKzIr5xEA==
libphonenumber-js@^1.11.1:
- version "1.12.25"
- resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.12.25.tgz#1af48b816082100bf88f47d342387fbac1f1a773"
- integrity sha512-u90tUu/SEF8b+RaDKCoW7ZNFDakyBtFlX1ex3J+VH+ElWes/UaitJLt/w4jGu8uAE41lltV/s+kMVtywcMEg7g==
+ version "1.12.35"
+ resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.12.35.tgz#149d4a66b2a7a518998c430c6d33465abaed23c4"
+ integrity sha512-T/Cz6iLcsZdb5jDncDcUNhSAJ0VlSC9TnsqtBNdpkaAmy24/R1RhErtNWVWBrcUZKs9hSgaVsBkc7HxYnazIfw==
lie@~3.3.0:
version "3.3.0"
@@ -10404,9 +10421,9 @@ locate-path@^6.0.0:
p-locate "^5.0.0"
lodash-es@^4.17.21:
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
- integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+ version "4.17.23"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.23.tgz#58c4360fd1b5d33afc6c0bbd3d1149349b1138e0"
+ integrity sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==
lodash.debounce@^4.0.8:
version "4.0.8"
@@ -10469,9 +10486,9 @@ lodash.uniq@^4.5.0:
integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.5:
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+ version "4.17.23"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a"
+ integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==
log-update@^5.0.1:
version "5.0.1"
@@ -10734,7 +10751,7 @@ mime-db@1.52.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
-mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
+mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.35, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34, mime-types@~2.1.35:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@@ -10831,7 +10848,7 @@ minimatch@9.0.1:
dependencies:
brace-expansion "^2.0.1"
-minimatch@^9.0.4:
+minimatch@^9.0.4, minimatch@^9.0.5:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
@@ -11041,9 +11058,9 @@ mv@~2:
rimraf "~2.4.0"
nan@^2.12.1, nan@^2.14.0:
- version "2.23.0"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.23.0.tgz#24aa4ddffcc37613a2d2935b97683c1ec96093c6"
- integrity sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==
+ version "2.25.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.25.0.tgz#937ed345e63d9481362a7942d49c4860d27eeabd"
+ integrity sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==
nanoclone@^0.2.1:
version "0.2.1"
@@ -11119,6 +11136,13 @@ neo-bpmn-engine@^8.3.2:
rxjs "^6.5.1"
uuid "^3.3.2"
+neverthrow@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/neverthrow/-/neverthrow-8.2.0.tgz#925d988295758534d01fb7468f998680b62064f2"
+ integrity sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ==
+ optionalDependencies:
+ "@rollup/rollup-linux-x64-gnu" "^4.24.0"
+
next-auth@5.0.0-beta.25:
version "5.0.0-beta.25"
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-5.0.0-beta.25.tgz#3a9f9734e1d8fa5ced545360f1afc24862cb92d5"
@@ -11127,25 +11151,25 @@ next-auth@5.0.0-beta.25:
"@auth/core" "0.37.2"
next@^16.1.4:
- version "16.1.4"
- resolved "https://registry.yarnpkg.com/next/-/next-16.1.4.tgz#d024bace2d52a2bea1dec33149b8bbd0852632c5"
- integrity sha512-gKSecROqisnV7Buen5BfjmXAm7Xlpx9o2ueVQRo5DxQcjC8d330dOM1xiGWc2k3Dcnz0In3VybyRPOsudwgiqQ==
+ version "16.1.6"
+ resolved "https://registry.yarnpkg.com/next/-/next-16.1.6.tgz#24a861371cbe211be7760d9a89ddf2415e3824de"
+ integrity sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==
dependencies:
- "@next/env" "16.1.4"
+ "@next/env" "16.1.6"
"@swc/helpers" "0.5.15"
baseline-browser-mapping "^2.8.3"
caniuse-lite "^1.0.30001579"
postcss "8.4.31"
styled-jsx "5.1.6"
optionalDependencies:
- "@next/swc-darwin-arm64" "16.1.4"
- "@next/swc-darwin-x64" "16.1.4"
- "@next/swc-linux-arm64-gnu" "16.1.4"
- "@next/swc-linux-arm64-musl" "16.1.4"
- "@next/swc-linux-x64-gnu" "16.1.4"
- "@next/swc-linux-x64-musl" "16.1.4"
- "@next/swc-win32-arm64-msvc" "16.1.4"
- "@next/swc-win32-x64-msvc" "16.1.4"
+ "@next/swc-darwin-arm64" "16.1.6"
+ "@next/swc-darwin-x64" "16.1.6"
+ "@next/swc-linux-arm64-gnu" "16.1.6"
+ "@next/swc-linux-arm64-musl" "16.1.6"
+ "@next/swc-linux-x64-gnu" "16.1.6"
+ "@next/swc-linux-x64-musl" "16.1.6"
+ "@next/swc-win32-arm64-msvc" "16.1.6"
+ "@next/swc-win32-x64-msvc" "16.1.6"
sharp "^0.34.4"
nice-try@^1.0.4:
@@ -11161,9 +11185,9 @@ no-case@^2.2.0:
lower-case "^1.1.1"
node-abi@^3.3.0:
- version "3.79.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.79.0.tgz#a5d9129828898f99366ee39c1d9c6ef74f2f1076"
- integrity sha512-Pr/5KdBQGG8TirdkS0qN3B+f3eo8zTOfZQWAxHoJqopMz2/uvRnG+S4fWu/6AZxKei2CP2p/psdQ5HFC2Ap5BA==
+ version "3.87.0"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.87.0.tgz#423e28fea5c2f195fddd98acded9938c001ae6dd"
+ integrity sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==
dependencies:
semver "^7.3.5"
@@ -11238,7 +11262,7 @@ node-loader@^1.0.3:
loader-utils "^2.0.0"
schema-utils "^3.0.0"
-node-releases@^2.0.26:
+node-releases@^2.0.27:
version "2.0.27"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e"
integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==
@@ -11349,20 +11373,18 @@ number-allocator@^1.0.14:
js-sdsl "4.3.0"
nwsapi@^2.2.16:
- version "2.2.22"
- resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.22.tgz#109f9530cda6c156d6a713cdf5939e9f0de98b9d"
- integrity sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==
+ version "2.2.23"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c"
+ integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==
nypm@^0.6.0:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.6.2.tgz#467512024948398fafa73cea30a3ed9efc5af071"
- integrity sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==
+ version "0.6.4"
+ resolved "https://registry.yarnpkg.com/nypm/-/nypm-0.6.4.tgz#fc67e207e0c8acbc641c4ed5d56bec4372fad8a8"
+ integrity sha512-1TvCKjZyyklN+JJj2TS3P4uSQEInrM/HkkuSXsEzm1ApPgBffOn8gFguNnZf07r/1X6vlryfIqMUkJKQMzlZiw==
dependencies:
- citty "^0.1.6"
- consola "^3.4.2"
+ citty "^0.2.0"
pathe "^2.0.3"
- pkg-types "^2.3.0"
- tinyexec "^1.0.1"
+ tinyexec "^1.0.2"
oauth-sign@~0.9.0:
version "0.9.0"
@@ -11370,9 +11392,9 @@ oauth-sign@~0.9.0:
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
oauth4webapi@^3.0.0:
- version "3.8.2"
- resolved "https://registry.yarnpkg.com/oauth4webapi/-/oauth4webapi-3.8.2.tgz#500d1979038c14656f3f24ff1eb501ff3993115b"
- integrity sha512-FzZZ+bht5X0FKe7Mwz3DAVAmlH1BV5blSak/lHMBKz0/EBMhX6B10GlQYI51+oRp8ObJaX0g6pXrAxZh5s8rjw==
+ version "3.8.3"
+ resolved "https://registry.yarnpkg.com/oauth4webapi/-/oauth4webapi-3.8.3.tgz#8a3e36b88a52db5e619907f031bff3770b2ed1a4"
+ integrity sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==
object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
@@ -11451,17 +11473,17 @@ object.fromentries@^2.0.8:
es-object-atoms "^1.0.0"
object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923"
- integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==
+ version "2.1.9"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz#bf9e7520f14d50de88dee2b9c9eca841166322dc"
+ integrity sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==
dependencies:
- array.prototype.reduce "^1.0.6"
- call-bind "^1.0.7"
+ array.prototype.reduce "^1.0.8"
+ call-bind "^1.0.8"
define-properties "^1.2.1"
- es-abstract "^1.23.2"
- es-object-atoms "^1.0.0"
- gopd "^1.0.1"
- safe-array-concat "^1.1.2"
+ es-abstract "^1.24.0"
+ es-object-atoms "^1.1.1"
+ gopd "^1.2.0"
+ safe-array-concat "^1.1.3"
object.groupby@^1.0.3:
version "1.0.3"
@@ -11499,7 +11521,7 @@ ohash@^2.0.11:
resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b"
integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==
-on-finished@2.4.1, on-finished@^2.3.0:
+on-finished@^2.3.0, on-finished@~2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
@@ -11795,7 +11817,7 @@ parseuri@0.0.6:
resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a"
integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==
-parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3:
+parseurl@^1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
@@ -11868,11 +11890,6 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
-path-to-regexp@0.1.12:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
- integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
-
path-to-regexp@1.x:
version "1.9.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz#5dc0753acbf8521ca2e0f137b4578b917b10cf24"
@@ -11885,6 +11902,11 @@ path-to-regexp@^8.3.0:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.3.0.tgz#aa818a6981f99321003a08987d3cec9c3474cd1f"
integrity sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==
+path-to-regexp@~0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
+ integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
+
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
@@ -12001,7 +12023,7 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
-pkg-types@^2.2.0, pkg-types@^2.3.0:
+pkg-types@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.0.tgz#037f2c19bd5402966ff6810e32706558cb5b5726"
integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==
@@ -12389,9 +12411,9 @@ preact@10.11.3:
integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==
preact@^10.11.2:
- version "10.27.2"
- resolved "https://registry.yarnpkg.com/preact/-/preact-10.27.2.tgz#19b9009c1be801a76a0aaf0fe5ba665985a09312"
- integrity sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==
+ version "10.28.2"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.28.2.tgz#4b668383afa4b4a2546bbe4bd1747e02e2360138"
+ integrity sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==
prebuild-install@^7.1.2:
version "7.1.3"
@@ -12545,9 +12567,9 @@ prosemirror-commands@^1.1.9:
prosemirror-transform "^1.10.2"
prosemirror-history@^1.1.3:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.4.1.tgz#cc370a46fb629e83a33946a0e12612e934ab8b98"
- integrity sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.5.0.tgz#ee21fc5de85a1473e3e3752015ffd6d649a06859"
+ integrity sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==
dependencies:
prosemirror-state "^1.2.2"
prosemirror-transform "^1.0.0"
@@ -12587,16 +12609,16 @@ prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.4:
prosemirror-view "^1.27.0"
prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.10.2:
- version "1.10.4"
- resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz#56419eac14f9f56612c806ae46f9238648f3f02e"
- integrity sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.11.0.tgz#f5c5050354423dc83c6b083f6f1959ec86a3f9ba"
+ integrity sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==
dependencies:
prosemirror-model "^1.21.0"
prosemirror-view@^1.18.7, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0:
- version "1.41.3"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.41.3.tgz#753a37ebe172a3e313ad2c3d85496f9ed1b2c256"
- integrity sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==
+ version "1.41.5"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.41.5.tgz#3e152d14af633f2f5a73aba24e6130c63f643b2b"
+ integrity sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==
dependencies:
prosemirror-model "^1.20.0"
prosemirror-state "^1.0.0"
@@ -12689,17 +12711,10 @@ q@1.x, q@^1.1.2:
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
-qs@6.13.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
- integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
- dependencies:
- side-channel "^1.0.6"
-
-qs@^6.12.3, qs@^6.5.1, qs@^6.5.2:
- version "6.14.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930"
- integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==
+qs@^6.12.3, qs@^6.5.1, qs@^6.5.2, qs@~6.14.0:
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.1.tgz#a41d85b9d3902f31d27861790506294881871159"
+ integrity sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==
dependencies:
side-channel "^1.1.0"
@@ -12759,15 +12774,15 @@ range-parser@^1.2.1, range-parser@~1.2.1:
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-raw-body@2.5.2, raw-body@^2.3.3:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
- integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+raw-body@^2.3.3, raw-body@~2.5.3:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2"
+ integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==
dependencies:
- bytes "3.1.2"
- http-errors "2.0.0"
- iconv-lite "0.4.24"
- unpipe "1.0.0"
+ bytes "~3.1.2"
+ http-errors "~2.0.1"
+ iconv-lite "~0.4.24"
+ unpipe "~1.0.0"
rc-cascader@~3.34.0:
version "3.34.0"
@@ -12976,9 +12991,9 @@ rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1,
resize-observer-polyfill "^1.5.1"
rc-segmented@~2.7.0:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.7.0.tgz#f56c2044abf8f03958b3a9a9d32987f10dcc4fc4"
- integrity sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.7.1.tgz#08a598b14e755117c5b37d238955c2d50eaa5d33"
+ integrity sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==
dependencies:
"@babel/runtime" "^7.11.1"
classnames "^2.2.1"
@@ -13169,7 +13184,7 @@ react-dom@19.2.3:
dependencies:
scheduler "^0.27.0"
-react-draggable@^4.0.3:
+react-draggable@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.5.0.tgz#0b274ccb6965fcf97ed38fcf7e3cc223bc48cdf5"
integrity sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==
@@ -13205,12 +13220,12 @@ react-is@^18.0.0, react-is@^18.2.0:
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
react-resizable@^3.0.5:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-3.0.5.tgz#362721f2efbd094976f1780ae13f1ad7739786c1"
- integrity sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-3.1.3.tgz#b8c3f8aeffb7b0b2c2306bfc7a742462e58125fb"
+ integrity sha512-liJBNayhX7qA4tBJiBD321FDhJxgGTJ07uzH5zSORXoE8h7PyEZ8mLqmosST7ppf6C4zUsbd2gzDMmBCfFp9Lw==
dependencies:
prop-types "15.x"
- react-draggable "^4.0.3"
+ react-draggable "^4.5.0"
react@18.2.0:
version "18.2.0"
@@ -13523,7 +13538,7 @@ resolve.exports@^2.0.0:
resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f"
integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==
-resolve@^1.10.1, resolve@^1.20.0, resolve@^1.22.10, resolve@^1.22.4:
+resolve@^1.10.1, resolve@^1.20.0, resolve@^1.22.11, resolve@^1.22.4:
version "1.22.11"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262"
integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==
@@ -13658,7 +13673,7 @@ rxjs@^6.5.1:
dependencies:
tslib "^1.9.0"
-safe-array-concat@^1.1.2, safe-array-concat@^1.1.3:
+safe-array-concat@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3"
integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==
@@ -13826,7 +13841,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1, semver@^7.7.2:
+semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.7.1, semver@^7.7.2, semver@^7.7.3:
version "7.7.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946"
integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
@@ -13836,24 +13851,24 @@ semver@~7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-send@0.19.0:
- version "0.19.0"
- resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
- integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+send@~0.19.0, send@~0.19.1:
+ version "0.19.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29"
+ integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==
dependencies:
debug "2.6.9"
depd "2.0.0"
destroy "1.2.0"
- encodeurl "~1.0.2"
+ encodeurl "~2.0.0"
escape-html "~1.0.3"
etag "~1.8.1"
- fresh "0.5.2"
- http-errors "2.0.0"
+ fresh "~0.5.2"
+ http-errors "~2.0.1"
mime "1.6.0"
ms "2.1.3"
- on-finished "2.4.1"
+ on-finished "~2.4.1"
range-parser "~1.2.1"
- statuses "2.0.1"
+ statuses "~2.0.2"
serialize-javascript@^4.0.0:
version "4.0.0"
@@ -13863,27 +13878,27 @@ serialize-javascript@^4.0.0:
randombytes "^2.1.0"
serve-index@^1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
- integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.2.tgz#2988e3612106d78a5e4849ddff552ce7bd3d9bcb"
+ integrity sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==
dependencies:
- accepts "~1.3.4"
+ accepts "~1.3.8"
batch "0.6.1"
debug "2.6.9"
escape-html "~1.0.3"
- http-errors "~1.6.2"
- mime-types "~2.1.17"
- parseurl "~1.3.2"
+ http-errors "~1.8.0"
+ mime-types "~2.1.35"
+ parseurl "~1.3.3"
-serve-static@1.16.2:
- version "1.16.2"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
- integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
+serve-static@~1.16.2:
+ version "1.16.3"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9"
+ integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==
dependencies:
encodeurl "~2.0.0"
escape-html "~1.0.3"
parseurl "~1.3.3"
- send "0.19.0"
+ send "~0.19.1"
server-only@0.0.1:
version "0.0.1"
@@ -13941,12 +13956,7 @@ setimmediate@^1.0.4, setimmediate@^1.0.5:
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
-setprototypeof@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
- integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
-
-setprototypeof@1.2.0:
+setprototypeof@1.2.0, setprototypeof@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
@@ -13998,36 +14008,38 @@ sharp@0.34.3:
"@img/sharp-win32-x64" "0.34.3"
sharp@^0.34.4:
- version "0.34.4"
- resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.4.tgz#73c2c5a425e98250b8b927e5537f711da8966e38"
- integrity sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==
+ version "0.34.5"
+ resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0"
+ integrity sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==
dependencies:
"@img/colour" "^1.0.0"
- detect-libc "^2.1.0"
- semver "^7.7.2"
+ detect-libc "^2.1.2"
+ semver "^7.7.3"
optionalDependencies:
- "@img/sharp-darwin-arm64" "0.34.4"
- "@img/sharp-darwin-x64" "0.34.4"
- "@img/sharp-libvips-darwin-arm64" "1.2.3"
- "@img/sharp-libvips-darwin-x64" "1.2.3"
- "@img/sharp-libvips-linux-arm" "1.2.3"
- "@img/sharp-libvips-linux-arm64" "1.2.3"
- "@img/sharp-libvips-linux-ppc64" "1.2.3"
- "@img/sharp-libvips-linux-s390x" "1.2.3"
- "@img/sharp-libvips-linux-x64" "1.2.3"
- "@img/sharp-libvips-linuxmusl-arm64" "1.2.3"
- "@img/sharp-libvips-linuxmusl-x64" "1.2.3"
- "@img/sharp-linux-arm" "0.34.4"
- "@img/sharp-linux-arm64" "0.34.4"
- "@img/sharp-linux-ppc64" "0.34.4"
- "@img/sharp-linux-s390x" "0.34.4"
- "@img/sharp-linux-x64" "0.34.4"
- "@img/sharp-linuxmusl-arm64" "0.34.4"
- "@img/sharp-linuxmusl-x64" "0.34.4"
- "@img/sharp-wasm32" "0.34.4"
- "@img/sharp-win32-arm64" "0.34.4"
- "@img/sharp-win32-ia32" "0.34.4"
- "@img/sharp-win32-x64" "0.34.4"
+ "@img/sharp-darwin-arm64" "0.34.5"
+ "@img/sharp-darwin-x64" "0.34.5"
+ "@img/sharp-libvips-darwin-arm64" "1.2.4"
+ "@img/sharp-libvips-darwin-x64" "1.2.4"
+ "@img/sharp-libvips-linux-arm" "1.2.4"
+ "@img/sharp-libvips-linux-arm64" "1.2.4"
+ "@img/sharp-libvips-linux-ppc64" "1.2.4"
+ "@img/sharp-libvips-linux-riscv64" "1.2.4"
+ "@img/sharp-libvips-linux-s390x" "1.2.4"
+ "@img/sharp-libvips-linux-x64" "1.2.4"
+ "@img/sharp-libvips-linuxmusl-arm64" "1.2.4"
+ "@img/sharp-libvips-linuxmusl-x64" "1.2.4"
+ "@img/sharp-linux-arm" "0.34.5"
+ "@img/sharp-linux-arm64" "0.34.5"
+ "@img/sharp-linux-ppc64" "0.34.5"
+ "@img/sharp-linux-riscv64" "0.34.5"
+ "@img/sharp-linux-s390x" "0.34.5"
+ "@img/sharp-linux-x64" "0.34.5"
+ "@img/sharp-linuxmusl-arm64" "0.34.5"
+ "@img/sharp-linuxmusl-x64" "0.34.5"
+ "@img/sharp-wasm32" "0.34.5"
+ "@img/sharp-win32-arm64" "0.34.5"
+ "@img/sharp-win32-ia32" "0.34.5"
+ "@img/sharp-win32-x64" "0.34.5"
shebang-command@^1.2.0:
version "1.2.0"
@@ -14082,7 +14094,7 @@ side-channel-weakmap@^1.0.2:
object-inspect "^1.13.3"
side-channel-map "^1.0.1"
-side-channel@^1.0.6, side-channel@^1.1.0:
+side-channel@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
@@ -14452,16 +14464,16 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
-statuses@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
- integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
-
-"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0:
+"statuses@>= 1.5.0 < 2", statuses@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+statuses@~2.0.1, statuses@~2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382"
+ integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==
+
stop-iteration-iterator@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad"
@@ -14889,9 +14901,9 @@ symbol-tree@^3.2.4:
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
systeminformation@^5.27.6:
- version "5.27.11"
- resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.27.11.tgz#286c8eca3947cfde0da684221ee9afb2ae313441"
- integrity sha512-K3Lto/2m3K2twmKHdgx5B+0in9qhXK4YnoT9rIlgwN/4v7OV5c8IjbeAUkuky/6VzCQC7iKCAqi8rZathCdjHg==
+ version "5.30.6"
+ resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.30.6.tgz#c100cb632bbb955fc44ba033f624da22c3a6a5be"
+ integrity sha512-LEIyK1aEv5P3BhAPW3swdlIyCihxwEq/Gki+kcONieU4PIeRCSLDuGkk0Va/56PSBgjVgEksOM88dmY6YqOyfQ==
taffydb@2.6.2:
version "2.6.2"
@@ -15030,12 +15042,12 @@ tiny-svg@^3.0.0, tiny-svg@^3.1.2:
resolved "https://registry.yarnpkg.com/tiny-svg/-/tiny-svg-3.1.3.tgz#c1cc029908bb1473f41c35b6c305117a51bad668"
integrity sha512-9mwnPqXInRsBmH/DO6NMxBE++9LsqpVXQSSTZGc5bomoKKvL5OX/Hlotw7XVXP6XLRcHWIzZpxfovGqWKgCypQ==
-tinyexec@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.1.tgz#70c31ab7abbb4aea0a24f55d120e5990bfa1e0b1"
- integrity sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==
+tinyexec@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.2.tgz#bdd2737fe2ba40bd6f918ae26642f264b99ca251"
+ integrity sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==
-tinyglobby@^0.2.13:
+tinyglobby@^0.2.13, tinyglobby@^0.2.15:
version "0.2.15"
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2"
integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
@@ -15116,7 +15128,7 @@ toggle-selection@^1.0.6:
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
-toidentifier@1.0.1:
+toidentifier@1.0.1, toidentifier@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
@@ -15176,10 +15188,10 @@ triple-beam@^1.3.0:
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984"
integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==
-ts-api-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91"
- integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==
+ts-api-utils@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8"
+ integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==
ts-jest@29.1.1:
version "29.1.1"
@@ -15377,14 +15389,14 @@ typedarray@^0.0.6:
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
typescript-eslint@^8.46.0:
- version "8.46.2"
- resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.46.2.tgz#da1adec683ba93a1b6c3850a4efb0922ffbc627d"
- integrity sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==
+ version "8.54.0"
+ resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.54.0.tgz#f4ef3b8882a5ddc2a41968e014194c178ab23f6a"
+ integrity sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==
dependencies:
- "@typescript-eslint/eslint-plugin" "8.46.2"
- "@typescript-eslint/parser" "8.46.2"
- "@typescript-eslint/typescript-estree" "8.46.2"
- "@typescript-eslint/utils" "8.46.2"
+ "@typescript-eslint/eslint-plugin" "8.54.0"
+ "@typescript-eslint/parser" "8.54.0"
+ "@typescript-eslint/typescript-estree" "8.54.0"
+ "@typescript-eslint/utils" "8.54.0"
typescript@5.3.3:
version "5.3.3"
@@ -15518,7 +15530,7 @@ universalify@^2.0.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
-unpipe@1.0.0, unpipe@~1.0.0:
+unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@@ -15568,10 +15580,10 @@ upath@^1.1.1:
resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
-update-browserslist-db@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a"
- integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==
+update-browserslist-db@^1.2.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d"
+ integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==
dependencies:
escalade "^3.2.0"
picocolors "^1.1.1"
@@ -16000,9 +16012,9 @@ which-module@^2.0.0:
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
which-typed-array@^1.1.16, which-typed-array@^1.1.19:
- version "1.1.19"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956"
- integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==
+ version "1.1.20"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122"
+ integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==
dependencies:
available-typed-arrays "^1.0.7"
call-bind "^1.0.8"
@@ -16036,9 +16048,9 @@ winston-transport@^4.9.0:
triple-beam "^1.3.0"
winston@^3.3.3:
- version "3.18.3"
- resolved "https://registry.yarnpkg.com/winston/-/winston-3.18.3.tgz#93ac10808c8e1081d723bc8811cd2f445ddfdcd1"
- integrity sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==
+ version "3.19.0"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-3.19.0.tgz#cc1d1262f5f45946904085cfffe73efb4b7a581d"
+ integrity sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==
dependencies:
"@colors/colors" "^1.6.0"
"@dabh/diagnostics" "^2.0.8"
@@ -16062,13 +16074,13 @@ wordwrap@~0.0.2:
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==
-worker-factory@^7.0.46:
- version "7.0.46"
- resolved "https://registry.yarnpkg.com/worker-factory/-/worker-factory-7.0.46.tgz#452d18cabf629aaa5c1da78ecda42004da4a8558"
- integrity sha512-Sr1hq2FMgNa04UVhYQacsw+i58BtMimzDb4+CqYphZ97OfefRpURu0UZ+JxMr/H36VVJBfuVkxTK7MytsanC3w==
+worker-factory@^7.0.48:
+ version "7.0.48"
+ resolved "https://registry.yarnpkg.com/worker-factory/-/worker-factory-7.0.48.tgz#b5dcb887227044aebccc147bd38cdbbdaad8aac4"
+ integrity sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==
dependencies:
- "@babel/runtime" "^7.28.4"
- fast-unique-numbers "^9.0.24"
+ "@babel/runtime" "^7.28.6"
+ fast-unique-numbers "^9.0.26"
tslib "^2.8.1"
worker-farm@^1.7.0:
@@ -16078,35 +16090,35 @@ worker-farm@^1.7.0:
dependencies:
errno "~0.1.7"
-worker-timers-broker@^8.0.11:
- version "8.0.11"
- resolved "https://registry.yarnpkg.com/worker-timers-broker/-/worker-timers-broker-8.0.11.tgz#70fbb7eb299c53af895eff3edd21676888c6eb5e"
- integrity sha512-uwhxKru8BI9m2tsogxr2fB6POZ8LB2xH+Pu3R0mvQnAZLPgLD6K3IX4LNKPTEgTJ/j5VsuQPB+gLI1NBNKkPlg==
+worker-timers-broker@^8.0.15:
+ version "8.0.15"
+ resolved "https://registry.yarnpkg.com/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz#0a31714f120798c03a22b5494e5c3d6c7e7447e4"
+ integrity sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==
dependencies:
- "@babel/runtime" "^7.28.4"
- broker-factory "^3.1.10"
- fast-unique-numbers "^9.0.24"
+ "@babel/runtime" "^7.28.6"
+ broker-factory "^3.1.13"
+ fast-unique-numbers "^9.0.26"
tslib "^2.8.1"
- worker-timers-worker "^9.0.11"
+ worker-timers-worker "^9.0.13"
-worker-timers-worker@^9.0.11:
- version "9.0.11"
- resolved "https://registry.yarnpkg.com/worker-timers-worker/-/worker-timers-worker-9.0.11.tgz#ec479e0067f8aacc3e42524301e3a0d0d8b844d5"
- integrity sha512-pArb5xtgHWImYpXhjg1OFv7JFG0ubmccb73TFoXHXjG830fFj+16N57q9YeBnZX52dn+itRrMoJZ9HaZBVzDaA==
+worker-timers-worker@^9.0.13:
+ version "9.0.13"
+ resolved "https://registry.yarnpkg.com/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz#f9b6750a99a8eb6ec0a5aec6c6950c14c625a6c8"
+ integrity sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==
dependencies:
- "@babel/runtime" "^7.28.4"
+ "@babel/runtime" "^7.28.6"
tslib "^2.8.1"
- worker-factory "^7.0.46"
+ worker-factory "^7.0.48"
worker-timers@^8.0.23:
- version "8.0.25"
- resolved "https://registry.yarnpkg.com/worker-timers/-/worker-timers-8.0.25.tgz#261b1e9356fbf583c9debf28efa01a01982d6946"
- integrity sha512-X7Z5dmM6PlrEnaadtFQOyXHGD/IysPA3HZzaC2koqsU1VI+RvyGmjiiLiUBQixK8PH5R7ilkOzZupWskNRaXmA==
+ version "8.0.29"
+ resolved "https://registry.yarnpkg.com/worker-timers/-/worker-timers-8.0.29.tgz#4b9209891932c35a1327005b52f687c2ea8644f7"
+ integrity sha512-9jk0MWHhWAZ2xlJPXr45oe5UF/opdpfZrY0HtyPizWuJ+ce1M3IYk/4IIdGct3kn9Ncfs+tkZt3w1tU6KW2Fsg==
dependencies:
- "@babel/runtime" "^7.28.4"
+ "@babel/runtime" "^7.28.6"
tslib "^2.8.1"
- worker-timers-broker "^8.0.11"
- worker-timers-worker "^9.0.11"
+ worker-timers-broker "^8.0.15"
+ worker-timers-worker "^9.0.13"
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
@@ -16175,9 +16187,9 @@ ws@^6.2.1:
async-limiter "~1.0.0"
ws@^8.18.0, ws@^8.18.3:
- version "8.18.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
- integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==
+ version "8.19.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b"
+ integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==
ws@~7.5.10:
version "7.5.10"
@@ -16325,9 +16337,9 @@ zod@3.22.4:
integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==
"zod@^3.25.0 || ^4.0.0":
- version "4.1.12"
- resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.12.tgz#64f1ea53d00eab91853195653b5af9eee68970f0"
- integrity sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a"
+ integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==
zustand@4.5.2:
version "4.5.2"