From 7fdab836e4c62689744e6ef7d3d7f1ee7b8c6c74 Mon Sep 17 00:00:00 2001 From: Elia Cohen <111717714+maffiemaffie@users.noreply.github.com> Date: Wed, 27 Aug 2025 10:21:44 -0400 Subject: [PATCH 001/322] Update CODEOWNERS --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c96135448..c16bd517d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,2 @@ # PM master check, allows approval of any PR -* @mmr6424 +* @maffiemaffie From e9e295b3bb8c3c9b59ceded3ec1c22ea38f88ab4 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 27 Aug 2025 13:53:05 -0400 Subject: [PATCH 002/322] separation of the users folder --- .../{users => me}/add-follow-proj.ts | 4 +- .../{users => me}/add-follow-user.ts | 2 +- .../{users => me}/delete-follow-proj.ts | 2 +- .../{users => me}/delete-follow-user.ts | 2 +- .../controllers/{users => me}/delete-user.ts | 2 +- .../controllers/{users => me}/get-my-proj.ts | 2 +- .../controllers/{users => me}/update-info.ts | 2 +- server/src/api/routes/me.ts | 37 +++++++++++++++++++ server/src/api/routes/users.ts | 36 ------------------ .../services/{users => me}/add-follow-proj.ts | 0 .../services/{users => me}/add-follow-user.ts | 0 .../{users => me}/delete-follow-proj.ts | 0 .../{users => me}/delete-follow-user.ts | 0 .../src/services/{users => me}/delete-user.ts | 0 .../src/services/{users => me}/get-my-proj.ts | 0 .../src/services/{users => me}/update-info.ts | 0 server/src/services/users/update-username.ts | 22 ----------- server/src/services/users/update-vis.ts | 23 ------------ 18 files changed, 45 insertions(+), 89 deletions(-) rename server/src/api/controllers/{users => me}/add-follow-proj.ts (88%) rename server/src/api/controllers/{users => me}/add-follow-user.ts (95%) rename server/src/api/controllers/{users => me}/delete-follow-proj.ts (93%) rename server/src/api/controllers/{users => me}/delete-follow-user.ts (93%) rename server/src/api/controllers/{users => me}/delete-user.ts (93%) rename server/src/api/controllers/{users => me}/get-my-proj.ts (94%) rename server/src/api/controllers/{users => me}/update-info.ts (96%) create mode 100644 server/src/api/routes/me.ts rename server/src/services/{users => me}/add-follow-proj.ts (100%) rename server/src/services/{users => me}/add-follow-user.ts (100%) rename server/src/services/{users => me}/delete-follow-proj.ts (100%) rename server/src/services/{users => me}/delete-follow-user.ts (100%) rename server/src/services/{users => me}/delete-user.ts (100%) rename server/src/services/{users => me}/get-my-proj.ts (100%) rename server/src/services/{users => me}/update-info.ts (100%) delete mode 100644 server/src/services/users/update-username.ts delete mode 100644 server/src/services/users/update-vis.ts diff --git a/server/src/api/controllers/users/add-follow-proj.ts b/server/src/api/controllers/me/add-follow-proj.ts similarity index 88% rename from server/src/api/controllers/users/add-follow-proj.ts rename to server/src/api/controllers/me/add-follow-proj.ts index 13b101b5c..7219381c7 100644 --- a/server/src/api/controllers/users/add-follow-proj.ts +++ b/server/src/api/controllers/me/add-follow-proj.ts @@ -1,10 +1,10 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { addProjectFollowingService } from '#services/users/add-follow-proj.ts'; +import { addProjectFollowingService } from '#services/me/add-follow-proj.ts'; //add project to follow list export const addProjectFollowing = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); + const userId = parseInt(req.params.id); //shibboleth cookie would give us this but where would i get it from const projectId = parseInt(req.params.followId); //validate input diff --git a/server/src/api/controllers/users/add-follow-user.ts b/server/src/api/controllers/me/add-follow-user.ts similarity index 95% rename from server/src/api/controllers/users/add-follow-user.ts rename to server/src/api/controllers/me/add-follow-user.ts index d8c71f57a..dc82c375c 100644 --- a/server/src/api/controllers/users/add-follow-user.ts +++ b/server/src/api/controllers/me/add-follow-user.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { addUserFollowingService } from '#services/users/add-follow-user.ts'; +import { addUserFollowingService } from '#services/me/add-follow-user.ts'; //add user to follow list export const addUserFollowing = async (req: Request, res: Response): Promise => { diff --git a/server/src/api/controllers/users/delete-follow-proj.ts b/server/src/api/controllers/me/delete-follow-proj.ts similarity index 93% rename from server/src/api/controllers/users/delete-follow-proj.ts rename to server/src/api/controllers/me/delete-follow-proj.ts index f2e1f441a..ebd5d1409 100644 --- a/server/src/api/controllers/users/delete-follow-proj.ts +++ b/server/src/api/controllers/me/delete-follow-proj.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { deleteProjectFollowService } from '#services/users/delete-follow-proj.ts'; +import { deleteProjectFollowService } from '#services/me/delete-follow-proj.ts'; // delete a project from follow list export const deleteProjectFollowing = async (req: Request, res: Response): Promise => { diff --git a/server/src/api/controllers/users/delete-follow-user.ts b/server/src/api/controllers/me/delete-follow-user.ts similarity index 93% rename from server/src/api/controllers/users/delete-follow-user.ts rename to server/src/api/controllers/me/delete-follow-user.ts index 932f4403e..d2e5ba002 100644 --- a/server/src/api/controllers/users/delete-follow-user.ts +++ b/server/src/api/controllers/me/delete-follow-user.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { deleteUserFollowService } from '#services/users/delete-follow-user.ts'; +import { deleteUserFollowService } from '#services/me/delete-follow-user.ts'; // delete a user from follow list export const deleteUserFollowing = async (req: Request, res: Response): Promise => { diff --git a/server/src/api/controllers/users/delete-user.ts b/server/src/api/controllers/me/delete-user.ts similarity index 93% rename from server/src/api/controllers/users/delete-user.ts rename to server/src/api/controllers/me/delete-user.ts index de1f6488f..9afb392ac 100644 --- a/server/src/api/controllers/users/delete-user.ts +++ b/server/src/api/controllers/me/delete-user.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { deleteUserService } from '#services/users/delete-user.ts'; +import { deleteUserService } from '#services/me/delete-user.ts'; export const deleteUser = async (req: Request, res: Response): Promise => { const userId = parseInt(req.params.id); diff --git a/server/src/api/controllers/users/get-my-proj.ts b/server/src/api/controllers/me/get-my-proj.ts similarity index 94% rename from server/src/api/controllers/users/get-my-proj.ts rename to server/src/api/controllers/me/get-my-proj.ts index dd4507391..0c8c7617c 100644 --- a/server/src/api/controllers/users/get-my-proj.ts +++ b/server/src/api/controllers/me/get-my-proj.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { getMyProjectsService } from '#services/users/get-my-proj.ts'; +import { getMyProjectsService } from '#services/me/get-my-proj.ts'; // gets the current users projects export const getMyProjects = async (req: Request, res: Response): Promise => { diff --git a/server/src/api/controllers/users/update-info.ts b/server/src/api/controllers/me/update-info.ts similarity index 96% rename from server/src/api/controllers/users/update-info.ts rename to server/src/api/controllers/me/update-info.ts index 955dbe1a3..9e7b63210 100644 --- a/server/src/api/controllers/users/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -1,7 +1,7 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { RequestHandler } from 'express'; import type { UsersAcademicYear } from '#prisma-models/index.js'; -import { updateUserInfoService } from '#services/users/update-info.ts'; +import { updateUserInfoService } from '#services/me/update-info.ts'; interface UpdateUserInfo { firstName?: string; diff --git a/server/src/api/routes/me.ts b/server/src/api/routes/me.ts new file mode 100644 index 000000000..f2f6e69a4 --- /dev/null +++ b/server/src/api/routes/me.ts @@ -0,0 +1,37 @@ +import { Router } from 'express'; +import { addProjectFollowing } from '#controllers/me/add-follow-proj.ts'; +import { addUserFollowing } from '#controllers/me/add-follow-user.ts'; +import { deleteProjectFollowing } from '#controllers/me/delete-follow-proj.ts'; +import { deleteUserFollowing } from '#controllers/me/delete-follow-user.ts'; +import { deleteUser } from '#controllers/me/delete-user.ts'; +import { getMyProjects } from '#controllers/me/get-my-proj.ts'; +import { updateUserInfo } from '#controllers/me/update-info.ts'; +import requiresLogin from '../middleware/requires-login.ts'; + +const router = Router(); + +//Updates users information +router.put('/', requiresLogin, updateUserInfo); + +//Delete user +router.delete('/', requiresLogin, deleteUser); + +//Updates users profile images +//router.put('/profile-picture', requiresLogin, checkImageFile, updateProfilePicture); + +//Gets current user's projects +router.get('/projects', requiresLogin, getMyProjects); + +//Follows a project +router.post('/followings/projects/:followId', requiresLogin, addProjectFollowing); + +//Unfollows a project +router.delete('/followings/projects/:followId', requiresLogin, deleteProjectFollowing); + +//Follows a user +router.post('/followings/people/:followId', requiresLogin, addUserFollowing); + +//Unfollows a user +router.delete('/followings/people/:followId', requiresLogin, deleteUserFollowing); + +export default router; diff --git a/server/src/api/routes/users.ts b/server/src/api/routes/users.ts index 5e68c5fea..c97a023bc 100644 --- a/server/src/api/routes/users.ts +++ b/server/src/api/routes/users.ts @@ -1,22 +1,13 @@ import { Router } from 'express'; -import { addProjectFollowing } from '#controllers/users/add-follow-proj.ts'; -import { addUserFollowing } from '#controllers/users/add-follow-user.ts'; -import { deleteProjectFollowing } from '#controllers/users/delete-follow-proj.ts'; -import { deleteUserFollowing } from '#controllers/users/delete-follow-user.ts'; -import { deleteUser } from '#controllers/users/delete-user.ts'; import { getAccount } from '#controllers/users/get-acc.ts'; import { getAllUsers } from '#controllers/users/get-all.ts'; import { getUserByEmail } from '#controllers/users/get-by-email.ts'; import { getUsernameById } from '#controllers/users/get-by-id.ts'; import { getUserByUsername } from '#controllers/users/get-by-username.ts'; -import { getMyProjects } from '#controllers/users/get-my-proj.ts'; import { getProjectsFollowing } from '#controllers/users/get-proj-following.ts'; import { getUserFollowing } from '#controllers/users/get-user-following.ts'; import { getOtherUserProjects } from '#controllers/users/get-user-proj.ts'; import { getUsernameByShib } from '#controllers/users/get-username-shib.ts'; -import { updateUserInfo } from '#controllers/users/update-info.ts'; -import { updateUsername } from '#controllers/users/update-username.ts'; -import { updateVisibility } from '#controllers/users/update-vis.ts'; import requiresLogin from '../middleware/requires-login.ts'; const router = Router(); @@ -31,12 +22,6 @@ router.get('/', getAllUsers); //Gets users by id router.get('/:id', getUsernameById); -//Updates users information -router.put('/:id', requiresLogin, updateUserInfo); - -//Delete user -router.delete('/:id', deleteUser); - //Gets users by username router.get('/search-username/:username', getUserByUsername); @@ -49,34 +34,13 @@ router.get('/search-email/:email', getUserByEmail); //Gets user's account router.get('/:id/account', requiresLogin, getAccount); -//Updates users username -router.put('/:id/username', requiresLogin, updateUsername); - -//Updates users visibility -router.put('/:id/visibility', requiresLogin, updateVisibility); - -//Gets current user's projects -router.get('/:id/projects', requiresLogin, getMyProjects); - //Gets another user's projects router.get('/:id/projects/profile', getOtherUserProjects); //Gets projects user is following router.get('/:id/followings/projects', requiresLogin, getProjectsFollowing); -//Adds users following project -router.post('/:id/followings/projects/:followId', requiresLogin, addProjectFollowing); - -//Delete users following projects -router.delete('/:id/followings/projects/:followId', requiresLogin, deleteProjectFollowing); - //Gets users user is following router.get('/:id/followings/people', requiresLogin, getUserFollowing); -//Adds users following users -router.post('/:id/followings/people/:followId', requiresLogin, addUserFollowing); - -//Delete users following users -router.delete('/:id/followings/people/:followId', requiresLogin, deleteUserFollowing); - export default router; diff --git a/server/src/services/users/add-follow-proj.ts b/server/src/services/me/add-follow-proj.ts similarity index 100% rename from server/src/services/users/add-follow-proj.ts rename to server/src/services/me/add-follow-proj.ts diff --git a/server/src/services/users/add-follow-user.ts b/server/src/services/me/add-follow-user.ts similarity index 100% rename from server/src/services/users/add-follow-user.ts rename to server/src/services/me/add-follow-user.ts diff --git a/server/src/services/users/delete-follow-proj.ts b/server/src/services/me/delete-follow-proj.ts similarity index 100% rename from server/src/services/users/delete-follow-proj.ts rename to server/src/services/me/delete-follow-proj.ts diff --git a/server/src/services/users/delete-follow-user.ts b/server/src/services/me/delete-follow-user.ts similarity index 100% rename from server/src/services/users/delete-follow-user.ts rename to server/src/services/me/delete-follow-user.ts diff --git a/server/src/services/users/delete-user.ts b/server/src/services/me/delete-user.ts similarity index 100% rename from server/src/services/users/delete-user.ts rename to server/src/services/me/delete-user.ts diff --git a/server/src/services/users/get-my-proj.ts b/server/src/services/me/get-my-proj.ts similarity index 100% rename from server/src/services/users/get-my-proj.ts rename to server/src/services/me/get-my-proj.ts diff --git a/server/src/services/users/update-info.ts b/server/src/services/me/update-info.ts similarity index 100% rename from server/src/services/users/update-info.ts rename to server/src/services/me/update-info.ts diff --git a/server/src/services/users/update-username.ts b/server/src/services/users/update-username.ts deleted file mode 100644 index 907bfde3c..000000000 --- a/server/src/services/users/update-username.ts +++ /dev/null @@ -1,22 +0,0 @@ -import prisma from '#config/prisma.ts'; -import type { ServiceErrorSubset } from '#services/service-error.ts'; - -type UpdateUserServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; - -export const updateUserUsernameService = async ( - userId: number, - username: string, -): Promise<{ username: string } | UpdateUserServiceError> => { - try { - const user = await prisma.users.update({ - where: { userId }, - data: { username }, - select: { username: true }, - }); - - return { username: user.username }; - } catch (e) { - console.error('Error in updateUserUsernameService:', e); - return 'INTERNAL_ERROR'; - } -}; diff --git a/server/src/services/users/update-vis.ts b/server/src/services/users/update-vis.ts deleted file mode 100644 index e68036116..000000000 --- a/server/src/services/users/update-vis.ts +++ /dev/null @@ -1,23 +0,0 @@ -import prisma from '#config/prisma.ts'; -import type { ServiceErrorSubset } from '#services/service-error.ts'; - -type UpdateUserServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; - -//visibiliry might need to be changed to boolean -export const updateUserVisibilityService = async ( - userId: number, - visibility: number, -): Promise<{ visibility: number } | UpdateUserServiceError> => { - try { - const user = await prisma.users.update({ - where: { userId }, - data: { visibility }, - select: { visibility: true }, - }); - - return { visibility: user.visibility }; - } catch (e) { - console.error('Error in updateUserVisibilityService:', e); - return 'INTERNAL_ERROR'; - } -}; From e78f88d78ccecd23a0d87aaf7f0f6a02c71530aa Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 27 Aug 2025 13:56:50 -0400 Subject: [PATCH 003/322] deleted updateUsername and updateVis --- .../api/controllers/users/update-username.ts | 83 ------------------- .../src/api/controllers/users/update-vis.ts | 63 -------------- 2 files changed, 146 deletions(-) delete mode 100644 server/src/api/controllers/users/update-username.ts delete mode 100644 server/src/api/controllers/users/update-vis.ts diff --git a/server/src/api/controllers/users/update-username.ts b/server/src/api/controllers/users/update-username.ts deleted file mode 100644 index 89d20f25c..000000000 --- a/server/src/api/controllers/users/update-username.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { ApiResponse } from '@looking-for-group/shared'; -import type { RequestHandler } from 'express'; -import { getUserByUsernameService } from '#services/users/get-by-username.ts'; -import { updateUserUsernameService } from '#services/users/update-username.ts'; - -export const updateUsername: RequestHandler< - { id: string }, - unknown, - { username?: string } -> = async (req, res) => { - const { id } = req.params; - const { username: newUsername } = req.body; - - //validate ID - const userId = parseInt(id); - if (isNaN(userId)) { - const resBody: ApiResponse = { - status: 400, - error: 'Invalid user ID', - data: null, - memetype: 'application/json', - }; - res.status(400).json(resBody); - return; - } - - //validate new username - if (!newUsername || newUsername.trim() === '') { - const resBody: ApiResponse = { - status: 400, - error: 'New username not found', - data: null, - memetype: 'application/json', - }; - res.status(400).json(resBody); - return; - } - - //check if username exists - const userExist = await getUserByUsernameService(newUsername); - if (userExist !== 'NOT_FOUND' && userExist !== 'INTERNAL_ERROR' && userExist.userId !== userId) { - const resBody: ApiResponse = { - status: 409, - error: 'Username already taken', - data: null, - memetype: 'application/json', - }; - res.status(409).json(resBody); - return; - } - - //update username - const result = await updateUserUsernameService(userId, newUsername); - - if (result === 'NOT_FOUND') { - const resBody: ApiResponse = { - status: 404, - error: 'User not found', - data: null, - memetype: 'application/json', - }; - res.status(404).json(resBody); - return; - } - if (result === 'INTERNAL_ERROR') { - const resBody: ApiResponse = { - status: 500, - error: 'Internal Server Error', - data: null, - memetype: 'application/json', - }; - res.status(500).json(resBody); - return; - } - - const resBody: ApiResponse = { - status: 200, - error: null, - data: result, - memetype: 'application/json', - }; - res.status(200).json(resBody); -}; diff --git a/server/src/api/controllers/users/update-vis.ts b/server/src/api/controllers/users/update-vis.ts deleted file mode 100644 index 9eab97d40..000000000 --- a/server/src/api/controllers/users/update-vis.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { ApiResponse } from '@looking-for-group/shared'; -import type { RequestHandler } from 'express'; -import { updateUserVisibilityService } from '#services/users/update-vis.ts'; - -export const updateVisibility: RequestHandler< - { id: string }, - unknown, - { visibility?: number } -> = async (req, res) => { - const { id } = req.params; - const { visibility: newVisibility } = req.body; - - //validate ID - const userId = parseInt(id); - if (isNaN(userId)) { - res.status(400).json({ message: 'Invalid user ID' }); - return; - } - - //validate visibility num - if (typeof newVisibility !== 'number' || (newVisibility !== 0 && newVisibility !== 1)) { - const resBody: ApiResponse = { - status: 400, - error: 'Visibility must be 0 (private) or 1(public)', - data: null, - memetype: 'application/json', - }; - res.status(400).json(resBody); - return; - } - - //update username - const result = await updateUserVisibilityService(userId, newVisibility); - - if (result === 'NOT_FOUND') { - const resBody: ApiResponse = { - status: 404, - error: 'User not found', - data: null, - memetype: 'application/json', - }; - res.status(404).json(resBody); - return; - } - if (result === 'INTERNAL_ERROR') { - const resBody: ApiResponse = { - status: 500, - error: 'Internal Server Error', - data: null, - memetype: 'application/json', - }; - res.status(500).json(resBody); - return; - } - - const resBody: ApiResponse = { - status: 200, - error: null, - data: result, - memetype: 'application/json', - }; - res.status(200).json(resBody); -}; From 80089e7d242e27f7650a88a0f1c3f3febe0ea774 Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Wed, 27 Aug 2025 13:58:34 -0400 Subject: [PATCH 004/322] created image preloader to always serve at lease placeholder --- client/src/components/DiscoverCarousel.tsx | 10 +++---- client/src/components/ProjectCarousel.tsx | 2 +- client/src/components/ProjectPanel.tsx | 20 +++++--------- .../ProjectPostPageComponents/PostComment.tsx | 1 + .../src/components/pages/ProjectPostPage.tsx | 3 ++- .../projectPageComponents/GeneralSettings.tsx | 1 + .../projectPageComponents/MemberListing.tsx | 1 + .../projectPageComponents/ProjectInfo.tsx | 2 ++ .../ProjectInfoMember.tsx | 1 + .../projectPageComponents/ProjectMember.tsx | 1 + .../projectPageComponents/ProjectPost.tsx | 1 + client/src/functions/imageLoad.tsx | 26 +++++++++++++++++++ 12 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 client/src/functions/imageLoad.tsx diff --git a/client/src/components/DiscoverCarousel.tsx b/client/src/components/DiscoverCarousel.tsx index dfb4d81d6..f3ece5178 100644 --- a/client/src/components/DiscoverCarousel.tsx +++ b/client/src/components/DiscoverCarousel.tsx @@ -1,17 +1,17 @@ import { CarouselButton, CarouselTabs, CarouselContent, Carousel } from "./ImageCarouselNew"; import * as paths from '../constants/routes'; import placeholderThumbnail from '../images/project_temp.png'; +import usePreloadedImage from "../functions/imageLoad"; +import { Project } from "@looking-for-group/shared"; //backend base url for getting images const API_BASE = `http://localhost:8081`; export const DiscoverCarousel = ({ dataList = [] }) => { - // Creates HTML elements from data, passed into the carousel - const carouselContents = dataList.map((project) => { - const projectImg = (project.thumbnail !== null) - ? `${API_BASE}/images/thumbnails/${project.thumbnail}` - : placeholderThumbnail; + const projectImg = usePreloadedImage(`${API_BASE}/images/thumbnails/`, placeholderThumbnail); + // Creates HTML elements from data, passed into the carousel + const carouselContents = dataList.map((project: Project) => { return ( <>
diff --git a/client/src/components/ProjectCarousel.tsx b/client/src/components/ProjectCarousel.tsx index 5caff2c9b..8674548a0 100644 --- a/client/src/components/ProjectCarousel.tsx +++ b/client/src/components/ProjectCarousel.tsx @@ -1,5 +1,5 @@ import { CarouselButton, CarouselTabs, CarouselContent, Carousel } from "./ImageCarouselNew"; -import placeholderThumbnail from '../images/project_temp.png'; +import placeholderThumbnail from '../images/project_temp.png'; // if this gets used, use preloader function in /functions/imageLoad.tsx //backend base url for getting images const API_BASE = `http://localhost:8081`; diff --git a/client/src/components/ProjectPanel.tsx b/client/src/components/ProjectPanel.tsx index 5fe19dcb7..3ae6677fb 100644 --- a/client/src/components/ProjectPanel.tsx +++ b/client/src/components/ProjectPanel.tsx @@ -6,7 +6,7 @@ import { sendDelete, sendPost } from '../functions/fetch'; //import shares types import { Project, ProjectFollowers, ProjectGenres, ProjectTag } from '../../../shared/types.ts'; // wherever your types live - +import usePreloadedImage from '../functions/imageLoad.tsx'; //Component that will contain info about a project, used in the discovery page //Smaller and more concise than ProjectCard.tsx @@ -47,16 +47,11 @@ export const ProjectPanel = ({ project, userId }: ProjectPanelProps) => { return `${followerNum}`; }; - return ( //
{'project
{ // style={rightAlign ? { width: width, right: 0 } : { width: width }} > {'project {/*

{project.title}

*/}

{project.title}

-

+

{formatFollowCount(followCount)}

diff --git a/client/src/components/ProjectPostPageComponents/PostComment.tsx b/client/src/components/ProjectPostPageComponents/PostComment.tsx index 6de4cb03c..fda8de46b 100644 --- a/client/src/components/ProjectPostPageComponents/PostComment.tsx +++ b/client/src/components/ProjectPostPageComponents/PostComment.tsx @@ -80,6 +80,7 @@ export const PostComment = (props) => { const comment = comments.find((c) => c._id === props.commentId) || comments[0]; return (
+ {/* Get image of profile and use preloader function in functions/imageLoad.tsx */} profile
{
+ {/* Use preloader function in /functions/imageLoad.tsx if placeholder may be replaced */} project image

{projects[projectId].name}

@@ -196,7 +197,7 @@ const ProjectPostPage = () => {

{postData.title}

-
+ {/* Get image of profile and use preloader function in functions/imageLoad.tsx */} profilePlaceholder {props.name} {props.role} diff --git a/client/src/components/projectPageComponents/ProjectInfo.tsx b/client/src/components/projectPageComponents/ProjectInfo.tsx index 5e1689c19..05f51bda8 100644 --- a/client/src/components/projectPageComponents/ProjectInfo.tsx +++ b/client/src/components/projectPageComponents/ProjectInfo.tsx @@ -15,6 +15,7 @@ export const ProjectInfo = (props) => { let key = 0; //key is not required for functionality, but react will give an error without it when using the .map function later return (
+ {/* Get image of project and use preloader function in functions/imageLoad.tsx */} project picture
@@ -29,6 +30,7 @@ export const ProjectInfo = (props) => { {projectPageHelper.createMemberCount(props.projectData)}
+ {/* Get image of members and use preloader function in functions/imageLoad.tsx */} diff --git a/client/src/components/projectPageComponents/ProjectInfoMember.tsx b/client/src/components/projectPageComponents/ProjectInfoMember.tsx index 5d7cd9c5f..cebd9837f 100644 --- a/client/src/components/projectPageComponents/ProjectInfoMember.tsx +++ b/client/src/components/projectPageComponents/ProjectInfoMember.tsx @@ -328,6 +328,7 @@ export const ProjectInfoMember = (props) => { // html can also utilize useState and useEffect later to better represent data updates return (
+ {/* Get image of project and use preloader function in functions/imageLoad.tsx */} project picture
diff --git a/client/src/components/projectPageComponents/ProjectMember.tsx b/client/src/components/projectPageComponents/ProjectMember.tsx index e411f16e2..a26215701 100644 --- a/client/src/components/projectPageComponents/ProjectMember.tsx +++ b/client/src/components/projectPageComponents/ProjectMember.tsx @@ -23,6 +23,7 @@ export const ProjectMember = (props) => { return (
navigate(paths.routes.NEWPROFILE + pathQuery)}> + {/* Get image of profile and use preloader function in functions/imageLoad.tsx */} profile

(window.location.href = 'profile')}> {profile.name} diff --git a/client/src/components/projectPageComponents/ProjectPost.tsx b/client/src/components/projectPageComponents/ProjectPost.tsx index 58da970a0..b8987c1c8 100644 --- a/client/src/components/projectPageComponents/ProjectPost.tsx +++ b/client/src/components/projectPageComponents/ProjectPost.tsx @@ -24,6 +24,7 @@ export const ProjectPost = (props) => { return (
navigate(paths.routes.PROJECTPOST + pathQuery)}> + {/* Get image of post and use preloader function in functions/imageLoad.tsx */} post image
diff --git a/client/src/functions/imageLoad.tsx b/client/src/functions/imageLoad.tsx new file mode 100644 index 000000000..65298d018 --- /dev/null +++ b/client/src/functions/imageLoad.tsx @@ -0,0 +1,26 @@ +import { useState, useEffect } from 'react'; + +/** + * Reusable custom hook for preloading an image. + * @param expectedSrc - The expected image source URL. + * @param placeholder - The placeholder image source URL. + * @returns The current image source URL. + */ +const usePreloadedImage = (expectedSrc: string, placeholder: string) => { + const [imgSrc, setImgSrc] = useState(placeholder); + + useEffect(() => { + const img = new window.Image(); + + // Load handlers + img.onload = () => setImgSrc(expectedSrc); + img.onerror = () => setImgSrc(placeholder); + + // Starts loading process + img.src = expectedSrc; + }, [expectedSrc, placeholder]); + + return imgSrc; +}; + +export default usePreloadedImage; \ No newline at end of file From 2ef77a3a6bf1a69c179fe27e673d1851b1e03b19 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 14:43:23 -0400 Subject: [PATCH 005/322] requireslogin should 401 if the user is not logged in --- server/src/api/middleware/requires-login.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server/src/api/middleware/requires-login.ts b/server/src/api/middleware/requires-login.ts index 849cb4545..c5d85a890 100644 --- a/server/src/api/middleware/requires-login.ts +++ b/server/src/api/middleware/requires-login.ts @@ -1,3 +1,4 @@ +import { ApiResponse } from '@looking-for-group/shared'; import type { NextFunction, Request, Response } from 'express'; import { isLoggedInHeaderKey, uidHeaderKey } from '#config/constants.ts'; import envConfig from '#config/env.ts'; @@ -16,7 +17,13 @@ const requiresLogin = (request: Request, response: Response, next: NextFunction) return; } - response.json({ message: 'You must log in to access this resource' }); + const resBody: ApiResponse = { + status: 401, + error: 'User not logged in', + data: null, + memetype: 'application/json', + }; + response.status(401).json(resBody); return; }; From 4eba3810158d4ff6cedc32bd91419ca176ee30cb Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 14:57:36 -0400 Subject: [PATCH 006/322] fix requires login type import --- server/src/api/middleware/requires-login.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/api/middleware/requires-login.ts b/server/src/api/middleware/requires-login.ts index c5d85a890..dceae69c4 100644 --- a/server/src/api/middleware/requires-login.ts +++ b/server/src/api/middleware/requires-login.ts @@ -1,4 +1,4 @@ -import { ApiResponse } from '@looking-for-group/shared'; +import type { ApiResponse } from '@looking-for-group/shared'; import type { NextFunction, Request, Response } from 'express'; import { isLoggedInHeaderKey, uidHeaderKey } from '#config/constants.ts'; import envConfig from '#config/env.ts'; From 321c7247c6be35aa6f59445d7aac5a15cbb0da58 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 15:00:36 -0400 Subject: [PATCH 007/322] fix typo --- server/src/api/controllers/users/get-username-shib.ts | 4 ++-- server/src/services/users/get-user-shib.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/src/api/controllers/users/get-username-shib.ts b/server/src/api/controllers/users/get-username-shib.ts index 1419d3b6f..b041ad13c 100644 --- a/server/src/api/controllers/users/get-username-shib.ts +++ b/server/src/api/controllers/users/get-username-shib.ts @@ -1,7 +1,7 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; import { uidHeaderKey } from '#config/constants.ts'; -import { getUserByhibService } from '#services/users/get-user-shib.ts'; +import { getUserByShibService } from '#services/users/get-user-shib.ts'; //get username by shibbolth export const getUsernameByShib = async (req: Request, res: Response): Promise => { @@ -19,7 +19,7 @@ export const getUsernameByShib = async (req: Request, res: Response): Promise; //get username by shibboleth id -export const getUserByhibService = async ( +export const getUserByShibService = async ( universityId: string, ): Promise<{ username: string; userId: number } | GetUserServiceError> => { try { @@ -21,7 +21,7 @@ export const getUserByhibService = async ( return user; } catch (e) { - console.error(`Error in getUserByhibService: ${JSON.stringify(e)}`); + console.error(`Error in getUserByShibService: ${JSON.stringify(e)}`); return 'INTERNAL_ERROR'; } }; From 820d0ac51467440db42bb9c12e4647901dbc5303 Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Wed, 27 Aug 2025 15:09:28 -0400 Subject: [PATCH 008/322] switched to preloader on some profile pictures --- client/src/components/ProfileCard.tsx | 3 ++- client/src/components/ProfilePanel.tsx | 3 ++- client/src/components/pages/NewProfile.tsx | 7 ++----- client/src/functions/imageLoad.tsx | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/client/src/components/ProfileCard.tsx b/client/src/components/ProfileCard.tsx index b0a1b5a51..a45b702e0 100644 --- a/client/src/components/ProfileCard.tsx +++ b/client/src/components/ProfileCard.tsx @@ -7,6 +7,7 @@ import profilePicture from '../images/blue_frog.png'; import followPicture from '../images/heart.png'; import { projects } from '../constants/fakeData'; // FIXME: use data in db +import usePreloadedImage from '../functions/imageLoad'; //backend base url for getting images const API_BASE = `http://localhost:8081`; @@ -56,7 +57,7 @@ export const ProfileCard = ({ profile }: { profile: ProfileData }) => { return (
{'profile
diff --git a/client/src/components/ProfilePanel.tsx b/client/src/components/ProfilePanel.tsx index 1f0f6d31c..1f3716ba9 100644 --- a/client/src/components/ProfilePanel.tsx +++ b/client/src/components/ProfilePanel.tsx @@ -2,6 +2,7 @@ import profilePicture from '../images/blue_frog.png'; import { useNavigate } from 'react-router-dom'; import { ThemeIcon } from './ThemeIcon'; import * as paths from '../constants/routes'; +import usePreloadedImage from '../functions/imageLoad'; //backend base url for getting images const API_BASE = `http://localhost:8081`; @@ -30,7 +31,7 @@ export const ProfilePanel = ({ profileData }: ProfilePanelProps) => { return (
profile image { diff --git a/client/src/components/pages/NewProfile.tsx b/client/src/components/pages/NewProfile.tsx index edc2d0248..7644eb212 100644 --- a/client/src/components/pages/NewProfile.tsx +++ b/client/src/components/pages/NewProfile.tsx @@ -22,6 +22,7 @@ import { ThemeIcon } from "../ThemeIcon"; import { fetchUserID } from "../../functions/fetch"; import { ProfileInterests } from "../Profile/ProfileInterests"; import profilePicture from "../../images/blue_frog.png"; +import usePreloadedImage from "../../functions/imageLoad"; //backend base url for getting images const API_BASE = `http://localhost:8081`; @@ -366,11 +367,7 @@ const NewProfile = () => { {/* New profile display using css grid, will contain all info except for projects */}
profile image { diff --git a/client/src/functions/imageLoad.tsx b/client/src/functions/imageLoad.tsx index 65298d018..5cf3c1c05 100644 --- a/client/src/functions/imageLoad.tsx +++ b/client/src/functions/imageLoad.tsx @@ -17,7 +17,7 @@ const usePreloadedImage = (expectedSrc: string, placeholder: string) => { img.onerror = () => setImgSrc(placeholder); // Starts loading process - img.src = expectedSrc; + img.src = expectedSrc ?? placeholder; }, [expectedSrc, placeholder]); return imgSrc; From 4af027932f56280f64daa7f2afdb00ec6018c577 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 15:30:08 -0400 Subject: [PATCH 009/322] add current user as an optional string on requests --- shared/types.d.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/shared/types.d.ts b/shared/types.d.ts index 48ffa766f..02410c901 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -22,6 +22,16 @@ export type AcademicYear = export type Visibility = 0 | 1; +//API REQUEST + +declare global{ + namespace Express { + interface Request { + currentUser?: string + } + } +} + //API RESPONSE export interface ApiResponse<_data = any> { From 53841de303a0095c43081f76563aed8521d38504 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 15:31:43 -0400 Subject: [PATCH 010/322] middleware to pull current user from shibboleth and add it to the request --- .../src/api/middleware/inject-current-user.ts | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 server/src/api/middleware/inject-current-user.ts diff --git a/server/src/api/middleware/inject-current-user.ts b/server/src/api/middleware/inject-current-user.ts new file mode 100644 index 000000000..65ee9d62b --- /dev/null +++ b/server/src/api/middleware/inject-current-user.ts @@ -0,0 +1,50 @@ +import type { ApiResponse } from '@looking-for-group/shared'; +import type { NextFunction, Request, Response } from 'express'; +import { uidHeaderKey } from '#config/constants.ts'; +import { getUserByShibService } from '#services/users/get-user-shib.ts'; + +const injectCurrentUser = async (request: Request, response: Response, next: NextFunction) => { + const universityId = request.headers[uidHeaderKey] as string | undefined; + + //if no university id found + if (!universityId) { + const resBody: ApiResponse = { + status: 400, + error: 'Missing university ID in headers', + data: null, + memetype: 'application/json', + }; + response.status(400).json(resBody); + return; + } + + const result = await getUserByShibService(universityId); + + if (result === 'INTERNAL_ERROR') { + const resBody: ApiResponse = { + status: 500, + error: 'Internal Server Error', + data: null, + memetype: 'application/json', + }; + response.status(500).json(resBody); + return; + } + + if (result === 'NOT_FOUND') { + const resBody: ApiResponse = { + status: 404, + error: 'User not found', + data: null, + memetype: 'application/json', + }; + response.status(404).json(resBody); + return; + } + + const userID = result.userId; + request.currentUser = `${userID}`; + next(); +}; + +export default injectCurrentUser; From eab2bd43a3ba323c33205ca3e97abe662dae8096 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 15:32:10 -0400 Subject: [PATCH 011/322] add currentUser middleware to all /me routes --- server/src/api/routes/me.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/server/src/api/routes/me.ts b/server/src/api/routes/me.ts index f2f6e69a4..8c4aaf7cc 100644 --- a/server/src/api/routes/me.ts +++ b/server/src/api/routes/me.ts @@ -6,32 +6,36 @@ import { deleteUserFollowing } from '#controllers/me/delete-follow-user.ts'; import { deleteUser } from '#controllers/me/delete-user.ts'; import { getMyProjects } from '#controllers/me/get-my-proj.ts'; import { updateUserInfo } from '#controllers/me/update-info.ts'; +import injectCurrentUser from '../middleware/inject-current-user.ts'; import requiresLogin from '../middleware/requires-login.ts'; const router = Router(); +//All routes use requiresLogin and injectCurrentUser +router.use(requiresLogin, injectCurrentUser); + //Updates users information -router.put('/', requiresLogin, updateUserInfo); +router.put('/', updateUserInfo); //Delete user -router.delete('/', requiresLogin, deleteUser); +router.delete('/', deleteUser); //Updates users profile images -//router.put('/profile-picture', requiresLogin, checkImageFile, updateProfilePicture); +//router.put('/profile-picture', checkImageFile, updateProfilePicture); //Gets current user's projects -router.get('/projects', requiresLogin, getMyProjects); +router.get('/projects', getMyProjects); //Follows a project -router.post('/followings/projects/:followId', requiresLogin, addProjectFollowing); +router.post('/followings/projects/:id', addProjectFollowing); //Unfollows a project -router.delete('/followings/projects/:followId', requiresLogin, deleteProjectFollowing); +router.delete('/followings/projects/:id', deleteProjectFollowing); //Follows a user -router.post('/followings/people/:followId', requiresLogin, addUserFollowing); +router.post('/followings/people/:id', addUserFollowing); //Unfollows a user -router.delete('/followings/people/:followId', requiresLogin, deleteUserFollowing); +router.delete('/followings/people/:id', deleteUserFollowing); export default router; From dba377443fa7b61565621257ff2ca0ea4f7f5951 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 15:34:20 -0400 Subject: [PATCH 012/322] update all /me controllers to use currentUser parameter from Request object --- server/src/api/controllers/me/add-follow-proj.ts | 13 ++++++++++++- server/src/api/controllers/me/add-follow-user.ts | 13 ++++++++++++- server/src/api/controllers/me/delete-follow-proj.ts | 13 ++++++++++++- server/src/api/controllers/me/delete-follow-user.ts | 13 ++++++++++++- server/src/api/controllers/me/delete-user.ts | 13 ++++++++++++- server/src/api/controllers/me/get-my-proj.ts | 13 ++++++++++++- server/src/api/controllers/me/update-info.ts | 13 ++++++++++++- 7 files changed, 84 insertions(+), 7 deletions(-) diff --git a/server/src/api/controllers/me/add-follow-proj.ts b/server/src/api/controllers/me/add-follow-proj.ts index 7219381c7..1f10f6ebf 100644 --- a/server/src/api/controllers/me/add-follow-proj.ts +++ b/server/src/api/controllers/me/add-follow-proj.ts @@ -4,7 +4,18 @@ import { addProjectFollowingService } from '#services/me/add-follow-proj.ts'; //add project to follow list export const addProjectFollowing = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); //shibboleth cookie would give us this but where would i get it from + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const userId = parseInt(req.currentUser); const projectId = parseInt(req.params.followId); //validate input diff --git a/server/src/api/controllers/me/add-follow-user.ts b/server/src/api/controllers/me/add-follow-user.ts index dc82c375c..a12a8e1c2 100644 --- a/server/src/api/controllers/me/add-follow-user.ts +++ b/server/src/api/controllers/me/add-follow-user.ts @@ -4,7 +4,18 @@ import { addUserFollowingService } from '#services/me/add-follow-user.ts'; //add user to follow list export const addUserFollowing = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const userId = parseInt(req.currentUser); const followingId = parseInt(req.params.followId); //validate input diff --git a/server/src/api/controllers/me/delete-follow-proj.ts b/server/src/api/controllers/me/delete-follow-proj.ts index ebd5d1409..f584ad501 100644 --- a/server/src/api/controllers/me/delete-follow-proj.ts +++ b/server/src/api/controllers/me/delete-follow-proj.ts @@ -4,7 +4,18 @@ import { deleteProjectFollowService } from '#services/me/delete-follow-proj.ts'; // delete a project from follow list export const deleteProjectFollowing = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const userId = parseInt(req.currentUser); const projectId = parseInt(req.params.followId); //validate input diff --git a/server/src/api/controllers/me/delete-follow-user.ts b/server/src/api/controllers/me/delete-follow-user.ts index d2e5ba002..f10882e49 100644 --- a/server/src/api/controllers/me/delete-follow-user.ts +++ b/server/src/api/controllers/me/delete-follow-user.ts @@ -4,7 +4,18 @@ import { deleteUserFollowService } from '#services/me/delete-follow-user.ts'; // delete a user from follow list export const deleteUserFollowing = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const userId = parseInt(req.currentUser); const followingId = parseInt(req.params.followId); //validate input diff --git a/server/src/api/controllers/me/delete-user.ts b/server/src/api/controllers/me/delete-user.ts index 9afb392ac..a9a21ec93 100644 --- a/server/src/api/controllers/me/delete-user.ts +++ b/server/src/api/controllers/me/delete-user.ts @@ -3,7 +3,18 @@ import type { Request, Response } from 'express'; import { deleteUserService } from '#services/me/delete-user.ts'; export const deleteUser = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const userId = parseInt(req.currentUser); if (isNaN(userId)) { const resBody: ApiResponse = { diff --git a/server/src/api/controllers/me/get-my-proj.ts b/server/src/api/controllers/me/get-my-proj.ts index 0c8c7617c..c47d96e0e 100644 --- a/server/src/api/controllers/me/get-my-proj.ts +++ b/server/src/api/controllers/me/get-my-proj.ts @@ -4,8 +4,19 @@ import { getMyProjectsService } from '#services/me/get-my-proj.ts'; // gets the current users projects export const getMyProjects = async (req: Request, res: Response): Promise => { + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + //current user ID - const UserId = parseInt(req.params.id); + const UserId = parseInt(req.currentUser); //check if ID is number if (isNaN(UserId)) { diff --git a/server/src/api/controllers/me/update-info.ts b/server/src/api/controllers/me/update-info.ts index 9e7b63210..41716f21a 100644 --- a/server/src/api/controllers/me/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -20,7 +20,18 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI req, res, ) => { - const { id } = req.params; + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const id = req.currentUser; const updates = req.body; //validate ID From 2b31fa795d813f321f83d57f0b719b77a4c52f06 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Aug 2025 15:45:19 -0400 Subject: [PATCH 013/322] Updated swagger to have Me section --- server/docs/swagger.yaml | 180 ++++--------------- server/src/api/controllers/me/update-info.ts | 2 +- 2 files changed, 33 insertions(+), 149 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index ba57cca95..57d8c1c83 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -36,19 +36,19 @@ paths: memetype: type: string example: application/json - examples: - default: - summary: Example job titles list - value: - status: 200 - error: null - data: - - titleId: 1 - label: Full-Stack Developer - - titleId: 2 - label: Front-End Developer - - titleId: 3 - label: Back-End Developer + examples: + default: + summary: Example job titles list + value: + status: 200 + error: null + data: + - titleId: 1 + label: Full-Stack Developer + - titleId: 2 + label: Front-End Developer + - titleId: 3 + label: Back-End Developer '500': $ref: '#/components/responses/InternalServerError' @@ -400,7 +400,7 @@ paths: put: summary: Updates user profile information tags: - - Users + - Me security: - shibbolethAuth: [] parameters: @@ -479,7 +479,7 @@ paths: delete: summary: Delete a user by ID tags: - - Users + - Me security: - shibbolethAuth: [] parameters: @@ -632,130 +632,6 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/users/{id}/username: - put: - summary: Update a user's username (requires authentication) - tags: - - Users - security: - - shibbolethAuth: [] - parameters: - - in: path - name: id - required: true - schema: - type: integer - description: User ID - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - username - properties: - username: - type: string - description: New username - responses: - '200': - description: Username successfully updated - content: - application/json: - schema: - type: object - properties: - status: - type: integer - example: 200 - error: - type: string - nullable: true - example: null - data: - type: object - properties: - username: - type: string - example: newUsername - required: - - username - memetype: - type: string - example: application/json - examples: - default: - value: - status: 200 - error: null - data: - username: newUsername - memetype: application/json - '409': - $ref: '#/components/responses/Conflict' - '404': - $ref: '#/components/responses/NotFound' - '500': - $ref: '#/components/responses/InternalServerError' - - /api/users/{id}/visibility: - put: - summary: Update a user's visibility (requires authentication) - tags: - - Users - security: - - shibbolethAuth: [] - parameters: - - in: path - name: id - required: true - schema: - type: integer - description: User ID - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - visibility - properties: - visibility: - type: integer - enum: [0, 1] - description: visibility (0=private, 1=public) - responses: - '200': - description: Username successfully updated - content: - application/json: - schema: - type: object - properties: - status: - type: integer - example: 200 - error: - type: string - nullable: true - example: null - data: - type: object - properties: - visibility: - type: integer - enum: [0, 1] - example: 1 - memetype: - type: string - example: application/json - '404': - $ref: '#/components/responses/NotFound' - '500': - $ref: '#/components/responses/InternalServerError' - /api/users/{id}/projects: get: summary: Get current user's own projects @@ -891,7 +767,7 @@ paths: security: - shibbolethAuth: [] tags: - - Users + - Me parameters: - name: id in: path @@ -933,7 +809,7 @@ paths: security: - shibbolethAuth: [] tags: - - Users + - Me parameters: - name: id in: path @@ -1019,7 +895,7 @@ paths: security: - shibbolethAuth: [] tags: - - Users + - Me parameters: - name: id in: path @@ -1062,7 +938,7 @@ paths: security: - shibbolethAuth: [] tags: - - Users + - Me parameters: - name: id in: path @@ -1202,7 +1078,7 @@ paths: put: summary: Updates project information tags: - - Projects + - Me security: - shibbolethAuth: [] parameters: @@ -1264,7 +1140,7 @@ paths: summary: Delete a project by ID description: Deletes a project by its ID. tags: - - Projects + - Me security: - shibbolethAuth: [] parameters: @@ -1302,7 +1178,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /projects/{id}/thumbnail: + /api/projects/{id}/thumbnail: put: summary: Update the thumbnail image of a project description: Updates the thumbnail URL of a project by its ID. Only the thumbnail can be updated. @@ -1722,7 +1598,7 @@ paths: schema: type: integer description: Project ID - - in: query + - in: path name: userId required: true schema: @@ -1758,6 +1634,11 @@ paths: # COMPONANTS components: + securitySchemes: + shibbolethAuth: + type: http + scheme: bearer + bearerFormat: JWT schemas: JobTitle: type: object @@ -1788,6 +1669,9 @@ components: type: type: string + ProjectDetails: + type: string + ProjectGenre: type: object properties: @@ -2266,7 +2150,7 @@ components: type: string example: Internal Server Error data: - type: 'null' + type: string nullable: true example: null memetype: diff --git a/server/src/api/controllers/me/update-info.ts b/server/src/api/controllers/me/update-info.ts index 9e7b63210..ce184d3b9 100644 --- a/server/src/api/controllers/me/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -44,7 +44,7 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI 'pronouns', 'jobTitleId', 'majorId', - 'academic_year', + 'academicYear', 'location', 'funFact', 'bio', From 6b96bd308a322cd6beafcfe87715bea1abde399e Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 15:57:36 -0400 Subject: [PATCH 014/322] update all routes for requireslogin and injectcurrentuser middlewares --- server/src/api/routes/me.ts | 4 ++++ server/src/api/routes/projects.ts | 19 ++++++++++--------- server/src/api/routes/users.ts | 4 ---- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/server/src/api/routes/me.ts b/server/src/api/routes/me.ts index 8c4aaf7cc..9ff0ae88a 100644 --- a/server/src/api/routes/me.ts +++ b/server/src/api/routes/me.ts @@ -6,6 +6,7 @@ import { deleteUserFollowing } from '#controllers/me/delete-follow-user.ts'; import { deleteUser } from '#controllers/me/delete-user.ts'; import { getMyProjects } from '#controllers/me/get-my-proj.ts'; import { updateUserInfo } from '#controllers/me/update-info.ts'; +import { getAccount } from '#controllers/users/get-acc.ts'; import injectCurrentUser from '../middleware/inject-current-user.ts'; import requiresLogin from '../middleware/requires-login.ts'; @@ -14,6 +15,9 @@ const router = Router(); //All routes use requiresLogin and injectCurrentUser router.use(requiresLogin, injectCurrentUser); +//Gets user's account +router.get('/', getAccount); + //Updates users information router.put('/', updateUserInfo); diff --git a/server/src/api/routes/projects.ts b/server/src/api/routes/projects.ts index da8295b4b..3ed493aac 100644 --- a/server/src/api/routes/projects.ts +++ b/server/src/api/routes/projects.ts @@ -1,5 +1,6 @@ import { Router } from 'express'; import PROJECT from '#controllers/projects/index.ts'; +import injectCurrentUser from '../middleware/inject-current-user.ts'; import requiresLogin from '../middleware/requires-login.ts'; const router = Router(); @@ -8,39 +9,39 @@ const router = Router(); router.get('/', PROJECT.getProjects); //Create a new project -router.post('/', PROJECT.createProject); +router.post('/', requiresLogin, injectCurrentUser, PROJECT.createProject); //Get a specific project router.get('/:id', PROJECT.getProjectByID); //Edits a project through a specific id -router.put('/:id', requiresLogin, PROJECT.updateProject); +router.put('/:id', requiresLogin, injectCurrentUser, PROJECT.updateProject); //Deletes project through a specific id -router.delete('/:id', requiresLogin, PROJECT.deleteProject); +router.delete('/:id', requiresLogin, injectCurrentUser, PROJECT.deleteProject); //Edits a project thumbnail through a specific id -router.put('/:id/thumbnail', requiresLogin, PROJECT.updateThumbnail); +router.put('/:id/thumbnail', requiresLogin, injectCurrentUser, PROJECT.updateThumbnail); //Receives pictures from project through id router.get('/:id/pictures', PROJECT.getProjectPics); //Creates a new picture for a project -router.post('/:id/pictures', PROJECT.addImage); +router.post('/:id/pictures', requiresLogin, injectCurrentUser, PROJECT.addImage); //Changes a picture for a project -router.put('/:id/pictures/:picId', requiresLogin, PROJECT.updateImage); +router.put('/:id/pictures/:picId', requiresLogin, injectCurrentUser, PROJECT.updateImage); //Removes picture from a project // router.delete('/:id/pictures/:picId' /* deletePicture */); //Adds member to a specific project through id -router.post('/:id/members', PROJECT.addMember); +router.post('/:id/members', requiresLogin, injectCurrentUser, PROJECT.addMember); //Edits a member of a specific project through id -router.put('/:id/members/:userId', PROJECT.updateMember); +router.put('/:id/members/:userId', requiresLogin, injectCurrentUser, PROJECT.updateMember); //Removes a member from a specific project through project and user ID -router.delete('/:id/members/:userId', requiresLogin, PROJECT.deleteMember); +router.delete('/:id/members/:userId', requiresLogin, injectCurrentUser, PROJECT.deleteMember); export default router; diff --git a/server/src/api/routes/users.ts b/server/src/api/routes/users.ts index c97a023bc..504d4d558 100644 --- a/server/src/api/routes/users.ts +++ b/server/src/api/routes/users.ts @@ -1,5 +1,4 @@ import { Router } from 'express'; -import { getAccount } from '#controllers/users/get-acc.ts'; import { getAllUsers } from '#controllers/users/get-all.ts'; import { getUserByEmail } from '#controllers/users/get-by-email.ts'; import { getUsernameById } from '#controllers/users/get-by-id.ts'; @@ -31,9 +30,6 @@ router.get('/search-email/:email', getUserByEmail); //Updates users profile images //router.put('/:id/profile-picture', requiresLogin, checkImageFile, updateProfilePicture); -//Gets user's account -router.get('/:id/account', requiresLogin, getAccount); - //Gets another user's projects router.get('/:id/projects/profile', getOtherUserProjects); From 36db24bfc62b0e190927b76893c91d86e492d2d8 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 27 Aug 2025 16:36:08 -0400 Subject: [PATCH 015/322] changed title and major --- .../src/api/controllers/me/add-follow-proj.ts | 4 +- .../src/api/controllers/me/add-follow-user.ts | 6 +- server/src/api/controllers/me/update-info.ts | 16 ++-- .../api/controllers/users/update-username.ts | 83 +++++++++++++++++++ server/src/services/me/update-info.ts | 14 +++- server/src/services/users/update-username.ts | 22 +++++ 6 files changed, 131 insertions(+), 14 deletions(-) create mode 100644 server/src/api/controllers/users/update-username.ts create mode 100644 server/src/services/users/update-username.ts diff --git a/server/src/api/controllers/me/add-follow-proj.ts b/server/src/api/controllers/me/add-follow-proj.ts index 7219381c7..e7af9764b 100644 --- a/server/src/api/controllers/me/add-follow-proj.ts +++ b/server/src/api/controllers/me/add-follow-proj.ts @@ -4,7 +4,7 @@ import { addProjectFollowingService } from '#services/me/add-follow-proj.ts'; //add project to follow list export const addProjectFollowing = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); //shibboleth cookie would give us this but where would i get it from + const userId = parseInt(req.params.id); const projectId = parseInt(req.params.followId); //validate input @@ -24,7 +24,7 @@ export const addProjectFollowing = async (req: Request, res: Response): Promise< if (result === 'CONFLICT') { const resBody: ApiResponse = { status: 409, - error: 'Alredy following project', + error: 'Already following project', data: null, memetype: 'application/json', }; diff --git a/server/src/api/controllers/me/add-follow-user.ts b/server/src/api/controllers/me/add-follow-user.ts index dc82c375c..0399aa23b 100644 --- a/server/src/api/controllers/me/add-follow-user.ts +++ b/server/src/api/controllers/me/add-follow-user.ts @@ -11,7 +11,7 @@ export const addUserFollowing = async (req: Request, res: Response): Promise = async ( @@ -42,12 +45,15 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI 'lastName', 'headline', 'pronouns', - 'jobTitleId', - 'majorId', - 'academic_year', + 'title', + 'major', + 'academicYear', 'location', 'funFact', 'bio', + 'visibility', + 'username', + 'phoneNumber', ]; //validate update fields diff --git a/server/src/api/controllers/users/update-username.ts b/server/src/api/controllers/users/update-username.ts new file mode 100644 index 000000000..89d20f25c --- /dev/null +++ b/server/src/api/controllers/users/update-username.ts @@ -0,0 +1,83 @@ +import type { ApiResponse } from '@looking-for-group/shared'; +import type { RequestHandler } from 'express'; +import { getUserByUsernameService } from '#services/users/get-by-username.ts'; +import { updateUserUsernameService } from '#services/users/update-username.ts'; + +export const updateUsername: RequestHandler< + { id: string }, + unknown, + { username?: string } +> = async (req, res) => { + const { id } = req.params; + const { username: newUsername } = req.body; + + //validate ID + const userId = parseInt(id); + if (isNaN(userId)) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + //validate new username + if (!newUsername || newUsername.trim() === '') { + const resBody: ApiResponse = { + status: 400, + error: 'New username not found', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + //check if username exists + const userExist = await getUserByUsernameService(newUsername); + if (userExist !== 'NOT_FOUND' && userExist !== 'INTERNAL_ERROR' && userExist.userId !== userId) { + const resBody: ApiResponse = { + status: 409, + error: 'Username already taken', + data: null, + memetype: 'application/json', + }; + res.status(409).json(resBody); + return; + } + + //update username + const result = await updateUserUsernameService(userId, newUsername); + + if (result === 'NOT_FOUND') { + const resBody: ApiResponse = { + status: 404, + error: 'User not found', + data: null, + memetype: 'application/json', + }; + res.status(404).json(resBody); + return; + } + if (result === 'INTERNAL_ERROR') { + const resBody: ApiResponse = { + status: 500, + error: 'Internal Server Error', + data: null, + memetype: 'application/json', + }; + res.status(500).json(resBody); + return; + } + + const resBody: ApiResponse = { + status: 200, + error: null, + data: result, + memetype: 'application/json', + }; + res.status(200).json(resBody); +}; diff --git a/server/src/services/me/update-info.ts b/server/src/services/me/update-info.ts index bf541d558..ad185b999 100644 --- a/server/src/services/me/update-info.ts +++ b/server/src/services/me/update-info.ts @@ -12,12 +12,15 @@ type UpdatebleUserFields = Partial< | 'lastName' | 'headline' | 'pronouns' - | 'jobTitleId' - | 'majorId' + | 'title' + | 'major' | 'academicYear' | 'location' | 'funFact' | 'bio' + | 'visibility' + | 'username' + | 'phoneNumber' > >; @@ -30,16 +33,19 @@ export const updateUserInfoService = async ( where: { userId }, data: { ...updates }, select: { + username: true, firstName: true, lastName: true, headline: true, pronouns: true, - jobTitleId: true, - majorId: true, + title: true, + major: true, academicYear: true, location: true, funFact: true, bio: true, + visibility: true, + phoneNumber: true, }, }); diff --git a/server/src/services/users/update-username.ts b/server/src/services/users/update-username.ts new file mode 100644 index 000000000..907bfde3c --- /dev/null +++ b/server/src/services/users/update-username.ts @@ -0,0 +1,22 @@ +import prisma from '#config/prisma.ts'; +import type { ServiceErrorSubset } from '#services/service-error.ts'; + +type UpdateUserServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; + +export const updateUserUsernameService = async ( + userId: number, + username: string, +): Promise<{ username: string } | UpdateUserServiceError> => { + try { + const user = await prisma.users.update({ + where: { userId }, + data: { username }, + select: { username: true }, + }); + + return { username: user.username }; + } catch (e) { + console.error('Error in updateUserUsernameService:', e); + return 'INTERNAL_ERROR'; + } +}; From 35461364dab5fb0806f37a7673ffed68bf855c39 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 16:42:07 -0400 Subject: [PATCH 016/322] currentUser bypass for development --- server/src/api/middleware/inject-current-user.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/src/api/middleware/inject-current-user.ts b/server/src/api/middleware/inject-current-user.ts index 65ee9d62b..798cfd6f9 100644 --- a/server/src/api/middleware/inject-current-user.ts +++ b/server/src/api/middleware/inject-current-user.ts @@ -1,9 +1,21 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { NextFunction, Request, Response } from 'express'; import { uidHeaderKey } from '#config/constants.ts'; +import envConfig from '#config/env.ts'; import { getUserByShibService } from '#services/users/get-user-shib.ts'; const injectCurrentUser = async (request: Request, response: Response, next: NextFunction) => { + if (envConfig.env === 'development' || envConfig.env === 'test') { + /// Add currentUser for development + const devId = request.query.devId as string | undefined; + + if (devId) { + request.currentUser = devId; + next(); + return; + } + } + const universityId = request.headers[uidHeaderKey] as string | undefined; //if no university id found From ccbf40c7e5207ce9b19065cc03219ed6996de225 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Aug 2025 16:51:10 -0400 Subject: [PATCH 017/322] Updated Swagger Me section again --- server/docs/swagger.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 57d8c1c83..991d4032f 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -1001,7 +1001,7 @@ paths: summary: Create a new project description: Creates a new project using the request body tags: - - Projects + - Me security: - shibbolethAuth: [] requestBody: @@ -1183,7 +1183,7 @@ paths: summary: Update the thumbnail image of a project description: Updates the thumbnail URL of a project by its ID. Only the thumbnail can be updated. tags: - - Projects + - Me security: - shibbolethAuth: [] parameters: @@ -1275,7 +1275,7 @@ paths: summary: Add a new picture to a project description: Creates a new picture entry associated with a specific project. tags: - - Projects + - Me security: - shibbolethAuth: [] parameters: @@ -1351,7 +1351,7 @@ paths: summary: Update a pictures for a project description: Updates fields of an existing project picture by image ID. tags: - - Projects + - Me security: - shibbolethAuth: [] parameters: @@ -1411,7 +1411,7 @@ paths: delete: summary: Remove a picture from a project (NOT FINISHED) tags: - - Projects + - Me description: This endpoint is intended to remove a picture from a project by picture ID, but is not implemented yet. parameters: @@ -1453,7 +1453,7 @@ paths: post: summary: Add a member to a project tags: - - Projects + - Me security: - shibbolethAuth: [] description: Adds a new member to a project using the project ID. @@ -1524,7 +1524,7 @@ paths: security: - shibbolethAuth: [] tags: - - Projects + - Me description: Updates the role or other properties of a member in a project. parameters: - in: path @@ -1587,7 +1587,7 @@ paths: delete: summary: Remove a member from a project tags: - - Projects + - Me description: Deletes a member from a project by specifying the user ID in the query parameters. security: - shibbolethAuth: [] From d0f2130584decda73b5388455c378c2e30e342aa Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Aug 2025 17:13:44 -0400 Subject: [PATCH 018/322] Updated Swagger paths to point to /me --- server/docs/swagger.yaml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 991d4032f..783cd072b 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -362,7 +362,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/users/{id}: + /api/me: get: summary: Get a user by ID tags: @@ -720,7 +720,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/users/{id}/followings/projects: + /api/me/followings/projects: get: summary: Get projects a user is following tags: @@ -761,7 +761,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/users/{id}/followings/projects/{followId}: + /api/me/followings/projects/{followId}: post: summary: Follow a project security: @@ -837,7 +837,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/users/{id}/followings/people: + /api/me/followings/people: get: tags: - Users @@ -889,7 +889,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/users/{id}/followings/people/{followId}: + /api/me/followings/people/{followId}: post: summary: Follow another user security: @@ -1001,7 +1001,7 @@ paths: summary: Create a new project description: Creates a new project using the request body tags: - - Me + - Projects security: - shibbolethAuth: [] requestBody: @@ -1078,7 +1078,7 @@ paths: put: summary: Updates project information tags: - - Me + - Projects security: - shibbolethAuth: [] parameters: @@ -1140,7 +1140,7 @@ paths: summary: Delete a project by ID description: Deletes a project by its ID. tags: - - Me + - Projects security: - shibbolethAuth: [] parameters: @@ -1183,7 +1183,7 @@ paths: summary: Update the thumbnail image of a project description: Updates the thumbnail URL of a project by its ID. Only the thumbnail can be updated. tags: - - Me + - Projects security: - shibbolethAuth: [] parameters: @@ -1275,7 +1275,7 @@ paths: summary: Add a new picture to a project description: Creates a new picture entry associated with a specific project. tags: - - Me + - Projects security: - shibbolethAuth: [] parameters: @@ -1351,7 +1351,7 @@ paths: summary: Update a pictures for a project description: Updates fields of an existing project picture by image ID. tags: - - Me + - Projects security: - shibbolethAuth: [] parameters: @@ -1411,7 +1411,7 @@ paths: delete: summary: Remove a picture from a project (NOT FINISHED) tags: - - Me + - Projects description: This endpoint is intended to remove a picture from a project by picture ID, but is not implemented yet. parameters: @@ -1453,7 +1453,7 @@ paths: post: summary: Add a member to a project tags: - - Me + - Projects security: - shibbolethAuth: [] description: Adds a new member to a project using the project ID. @@ -1524,7 +1524,7 @@ paths: security: - shibbolethAuth: [] tags: - - Me + - Projects description: Updates the role or other properties of a member in a project. parameters: - in: path @@ -1587,7 +1587,7 @@ paths: delete: summary: Remove a member from a project tags: - - Me + - Projects description: Deletes a member from a project by specifying the user ID in the query parameters. security: - shibbolethAuth: [] From dcdf77d98db1d978b89185073f11c0704cd255e0 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 17:56:46 -0400 Subject: [PATCH 019/322] move get-acc.ts to /me folder and set it up with currentUser middleware --- .../src/api/controllers/{users => me}/get-acc.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) rename server/src/api/controllers/{users => me}/get-acc.ts (79%) diff --git a/server/src/api/controllers/users/get-acc.ts b/server/src/api/controllers/me/get-acc.ts similarity index 79% rename from server/src/api/controllers/users/get-acc.ts rename to server/src/api/controllers/me/get-acc.ts index 4cc162f24..24e0bb558 100644 --- a/server/src/api/controllers/users/get-acc.ts +++ b/server/src/api/controllers/me/get-acc.ts @@ -3,7 +3,19 @@ import type { Request, Response } from 'express'; import { getUserAccountService } from '#services/users/get-user-acc.ts'; export const getAccount = async (req: Request, res: Response): Promise => { - const userId = parseInt(req.params.id); + if (req.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + //current user ID + const userId = parseInt(req.currentUser); if (isNaN(userId)) { const resBody: ApiResponse = { From f7571cef89f7198a8ea5095becaa1ebda792768d Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 17:57:32 -0400 Subject: [PATCH 020/322] move get-user-acc.ts to me folder --- server/src/services/{users => me}/get-user-acc.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename server/src/services/{users => me}/get-user-acc.ts (100%) diff --git a/server/src/services/users/get-user-acc.ts b/server/src/services/me/get-user-acc.ts similarity index 100% rename from server/src/services/users/get-user-acc.ts rename to server/src/services/me/get-user-acc.ts From 9042a7af1e94cd05a10a6e19f855703da8618e37 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 17:58:17 -0400 Subject: [PATCH 021/322] update get-acc.ts import url --- server/src/api/controllers/me/get-acc.ts | 2 +- server/src/api/routes/me.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/api/controllers/me/get-acc.ts b/server/src/api/controllers/me/get-acc.ts index 24e0bb558..edb03eee2 100644 --- a/server/src/api/controllers/me/get-acc.ts +++ b/server/src/api/controllers/me/get-acc.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { getUserAccountService } from '#services/users/get-user-acc.ts'; +import { getUserAccountService } from '#services/me/get-user-acc.ts'; export const getAccount = async (req: Request, res: Response): Promise => { if (req.currentUser === undefined) { diff --git a/server/src/api/routes/me.ts b/server/src/api/routes/me.ts index 9ff0ae88a..82a67e2a6 100644 --- a/server/src/api/routes/me.ts +++ b/server/src/api/routes/me.ts @@ -4,9 +4,9 @@ import { addUserFollowing } from '#controllers/me/add-follow-user.ts'; import { deleteProjectFollowing } from '#controllers/me/delete-follow-proj.ts'; import { deleteUserFollowing } from '#controllers/me/delete-follow-user.ts'; import { deleteUser } from '#controllers/me/delete-user.ts'; +import { getAccount } from '#controllers/me/get-acc.ts'; import { getMyProjects } from '#controllers/me/get-my-proj.ts'; import { updateUserInfo } from '#controllers/me/update-info.ts'; -import { getAccount } from '#controllers/users/get-acc.ts'; import injectCurrentUser from '../middleware/inject-current-user.ts'; import requiresLogin from '../middleware/requires-login.ts'; From d11b4d8607e60bf92507bfca91750a92b04ce59c Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Aug 2025 18:32:09 -0400 Subject: [PATCH 022/322] Added devId parameter to all endpoints that use injectCurrentUser middleware. Also added shibboleth security to endpoints that need a login --- server/docs/swagger.yaml | 168 +++++++++++++++++++++++++-------------- 1 file changed, 110 insertions(+), 58 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 783cd072b..1d25a839f 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -364,16 +364,18 @@ paths: /api/me: get: - summary: Get a user by ID + summary: Gets the current user by ID tags: - - Users + - Me + security: + - shibbolethAuth: [] parameters: - - in: path - name: id + - in: query + name: devId schema: type: integer - required: true - description: The user ID + required: false + description: The user ID to be used as the current user responses: '200': description: A single user @@ -404,12 +406,12 @@ paths: security: - shibbolethAuth: [] parameters: - - in: path - name: id - required: true + - in: query + name: devId schema: type: integer - description: The user ID + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -483,12 +485,12 @@ paths: security: - shibbolethAuth: [] parameters: - - in: path - name: id - required: true + - in: query + name: devId schema: type: integer - description: The user ID + required: false + description: The user ID to be used as the current user responses: '200': description: User successfully deleted @@ -632,21 +634,21 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/users/{id}/projects: + /api/me/projects: get: summary: Get current user's own projects description: Returns the list of projects owned by the user identified by userID. tags: - - Users + - Me security: - shibbolethAuth: [] parameters: - - name: id - in: path - description: User ID to get projects for - required: true + - in: query + name: devId schema: type: integer + required: false + description: The user ID to be used as the current user responses: '200': description: List of projects owned by the user @@ -720,18 +722,11 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/me/followings/projects: + /api/users/{id}followings/projects: get: summary: Get projects a user is following tags: - Users - parameters: - - name: id - in: path - description: User ID to get followed projects for - required: true - schema: - type: integer responses: '200': description: List of projects the user is following @@ -761,7 +756,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/me/followings/projects/{followId}: + /api/me/followings/projects/{id}: post: summary: Follow a project security: @@ -772,15 +767,15 @@ paths: - name: id in: path required: true - description: ID of the user who is following the project + description: ID of the project to follow schema: type: integer - - name: followId - in: path - required: true - description: ID of the project to follow + - in: query + name: devId schema: type: integer + required: false + description: The user ID to be used as the current user responses: '201': description: Project followed successfully @@ -814,15 +809,15 @@ paths: - name: id in: path required: true - description: ID of the user who is unfollowing the project + description: ID of the project to unfollow schema: type: integer - - name: followId - in: path - required: true - description: ID of the project to unfollow + - in: query + name: devId schema: type: integer + required: false + description: The user ID to be used as the current user responses: '200': description: Project unfollowed successfully @@ -837,18 +832,11 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/me/followings/people: + /api/users/{id}/followings/people: get: tags: - Users summary: Get list of users that the specified user is following - parameters: - - name: id - in: path - required: true - description: ID of the user - schema: - type: integer responses: '200': description: List of users the current user is following @@ -889,7 +877,7 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/me/followings/people/{followId}: + /api/me/followings/people/{id}: post: summary: Follow another user security: @@ -900,15 +888,15 @@ paths: - name: id in: path required: true - description: ID of the user initiating the follow + description: ID of the user to be followed schema: type: integer - - name: followId - in: path - required: true - description: ID of the user to be followed + - in: query + name: devId schema: type: integer + required: false + description: The user ID to be used as the current user responses: '201': description: User followed successfully @@ -943,15 +931,15 @@ paths: - name: id in: path required: true - description: ID of the user who wants to unfollow another user + description: ID of the user to be unfollowed schema: type: integer - - name: followId - in: path - required: true - description: ID of the user to be unfollowed + - in: query + name: devId schema: type: integer + required: false + description: The user ID to be used as the current user responses: '200': description: User unfollowed successfully @@ -1004,6 +992,13 @@ paths: - Projects security: - shibbolethAuth: [] + parameters: + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -1046,6 +1041,12 @@ paths: schema: type: integer description: Project ID + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user responses: '200': description: Project found and returned @@ -1088,6 +1089,12 @@ paths: schema: type: integer description: The project ID + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -1150,6 +1157,12 @@ paths: description: The ID of the project to delete schema: type: integer + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user responses: '200': description: Project deleted successfully @@ -1194,6 +1207,12 @@ paths: schema: type: integer example: 1 + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -1286,6 +1305,12 @@ paths: schema: type: integer example: 42 + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -1369,6 +1394,12 @@ paths: schema: type: integer example: 1 + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -1414,6 +1445,8 @@ paths: - Projects description: This endpoint is intended to remove a picture from a project by picture ID, but is not implemented yet. + security: + - shibbolethAuth: [] parameters: - in: path name: id @@ -1427,6 +1460,12 @@ paths: schema: type: integer description: Picture ID to remove + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user responses: '501': description: NOT DONE @@ -1464,6 +1503,12 @@ paths: schema: type: integer description: Project ID to add the member to + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -1539,6 +1584,12 @@ paths: schema: type: integer description: The ID of the member to update + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user requestBody: required: true content: @@ -1636,6 +1687,7 @@ paths: components: securitySchemes: shibbolethAuth: + #Filler values need to be changed type: http scheme: bearer bearerFormat: JWT From 27b8200714b936d30180f2bb81bb62b260a22dc6 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Aug 2025 18:41:25 -0400 Subject: [PATCH 023/322] Hooked up Me to router --- server/src/app.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/src/app.ts b/server/src/app.ts index fc0cc717f..49e6ee461 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -2,6 +2,7 @@ import express, { type Request, type Response } from 'express'; import morgan from 'morgan'; import envConfig from '#config/env.ts'; import datasetsRouter from '#routes/datasets.ts'; +import meRouter from '#routes/me.ts'; import projectsRouter from '#routes/projects.ts'; import usersRouter from '#routes/users.ts'; @@ -25,6 +26,7 @@ if (envConfig.env === 'development') { app.use('/datasets', datasetsRouter); app.use('/users', usersRouter); app.use('/projects', projectsRouter); +app.use('/me', meRouter); app.get('', (_req: Request, res: Response) => { res.json({ message: 'You Reached The Looking For Group API' }); From 4125103c567605316ade3cafc90e8bdc2aa4f542 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 27 Aug 2025 19:06:31 -0400 Subject: [PATCH 024/322] create-user.ts file complete --- server/src/api/controllers/me/update-info.ts | 4 +- .../src/api/controllers/users/create-user.ts | 74 +++++++++++++++++++ .../src/api/middleware/inject-current-user.ts | 1 + server/src/services/me/update-info.ts | 4 +- server/src/services/users/create-user.ts | 3 +- 5 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 server/src/api/controllers/users/create-user.ts diff --git a/server/src/api/controllers/me/update-info.ts b/server/src/api/controllers/me/update-info.ts index 165ad1617..b714931e8 100644 --- a/server/src/api/controllers/me/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -9,7 +9,7 @@ interface UpdateUserInfo { headline?: string; pronouns?: string; title?: string; - major?: string; + majorId?: number; academic_year?: UsersAcademicYear | null; location?: string; funFact?: string; @@ -57,7 +57,7 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI 'headline', 'pronouns', 'title', - 'major', + 'majorId', 'academicYear', 'location', 'funFact', diff --git a/server/src/api/controllers/users/create-user.ts b/server/src/api/controllers/users/create-user.ts new file mode 100644 index 000000000..05f7f62ba --- /dev/null +++ b/server/src/api/controllers/users/create-user.ts @@ -0,0 +1,74 @@ +import type { ApiResponse } from '@looking-for-group/shared'; +import type { Request, Response } from 'express'; +import { + uidHeaderKey, + firstNameHeaderKey, + lastNameHeaderKey, + emailHeaderKey, +} from '#config/constants.ts'; +import createUserService from '#services/users/create-user.ts'; +import { getUserByUsernameService } from '#services/users/get-by-username.ts'; + +export const createUser = async (req: Request, res: Response): Promise => { + const uid = parseInt(req.headers[uidHeaderKey] as string); + const firstName = req.headers[firstNameHeaderKey] as string | undefined; + const lastName = req.headers[lastNameHeaderKey] as string; + const email = req.headers[emailHeaderKey] as string; + + if (!uid || !firstName || !lastName || !email) { + const resBody: ApiResponse = { + status: 400, + error: 'Missing information in headers', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const username = req.params.username; + + const userExist = await getUserByUsernameService(username); + if (userExist !== 'NOT_FOUND' && userExist !== 'INTERNAL_ERROR' && userExist.userId !== uid) { + const resBody: ApiResponse = { + status: 409, + error: 'Username already taken', + data: null, + memetype: 'application/json', + }; + res.status(409).json(resBody); + return; + } + + const result = await createUserService(uid, username, firstName, lastName, email); + + if (result === 'INTERNAL_ERROR') { + const resBody: ApiResponse = { + status: 500, + error: 'Internal Server Error', + data: null, + memetype: 'application/json', + }; + res.status(500).json(resBody); + return; + } + + if (result === 'CONFLICT') { + const resBody: ApiResponse = { + status: 409, + error: 'User already exists', + data: null, + memetype: 'application/json', + }; + res.status(409).json(resBody); + return; + } + + const resBody: ApiResponse = { + status: 201, + error: null, + data: result, + memetype: 'application/json', + }; + res.status(201).json(resBody); +}; diff --git a/server/src/api/middleware/inject-current-user.ts b/server/src/api/middleware/inject-current-user.ts index 798cfd6f9..a3b17f035 100644 --- a/server/src/api/middleware/inject-current-user.ts +++ b/server/src/api/middleware/inject-current-user.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/restrict-template-expressions */ import type { ApiResponse } from '@looking-for-group/shared'; import type { NextFunction, Request, Response } from 'express'; import { uidHeaderKey } from '#config/constants.ts'; diff --git a/server/src/services/me/update-info.ts b/server/src/services/me/update-info.ts index ad185b999..b867554b4 100644 --- a/server/src/services/me/update-info.ts +++ b/server/src/services/me/update-info.ts @@ -13,7 +13,7 @@ type UpdatebleUserFields = Partial< | 'headline' | 'pronouns' | 'title' - | 'major' + | 'majorId' | 'academicYear' | 'location' | 'funFact' @@ -39,7 +39,7 @@ export const updateUserInfoService = async ( headline: true, pronouns: true, title: true, - major: true, + majorId: true, academicYear: true, location: true, funFact: true, diff --git a/server/src/services/users/create-user.ts b/server/src/services/users/create-user.ts index 8fd99709d..85f7d5dc1 100644 --- a/server/src/services/users/create-user.ts +++ b/server/src/services/users/create-user.ts @@ -7,6 +7,7 @@ type CreateUserServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'CONFLICT'>; const createUserService = async ( uid: number, + username: string, firstName: string, lastName: string, email: string, @@ -15,7 +16,7 @@ const createUserService = async ( return await prisma.users.create({ data: { universityId: uid.toString(), - username: firstName, + username: username, firstName, lastName, ritEmail: email, From d83a6235c5f8469b44f607a5288aadace08b7518 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 27 Aug 2025 19:15:51 -0400 Subject: [PATCH 025/322] fixed unsafe argument things --- server/src/api/routes/users.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/src/api/routes/users.ts b/server/src/api/routes/users.ts index 504d4d558..556cf7398 100644 --- a/server/src/api/routes/users.ts +++ b/server/src/api/routes/users.ts @@ -1,4 +1,5 @@ import { Router } from 'express'; +import { createUser } from '#controllers/users/create-user.ts'; import { getAllUsers } from '#controllers/users/get-all.ts'; import { getUserByEmail } from '#controllers/users/get-by-email.ts'; import { getUsernameById } from '#controllers/users/get-by-id.ts'; @@ -39,4 +40,6 @@ router.get('/:id/followings/projects', requiresLogin, getProjectsFollowing); //Gets users user is following router.get('/:id/followings/people', requiresLogin, getUserFollowing); +router.post('/', requiresLogin, createUser); + export default router; From fda18a90a4545b3786c86503063c64e97a853d1a Mon Sep 17 00:00:00 2001 From: Rndomblitzer12 Date: Wed, 27 Aug 2025 17:22:17 -0600 Subject: [PATCH 026/322] Started work on replacing jobTitleID to role and title --- package-lock.json | 3326 ++++++++++-------- server/prisma/schema.prisma | 2 +- server/src/api/controllers/me/update-info.ts | 4 +- server/src/services/me/update-info.ts | 4 +- 4 files changed, 1850 insertions(+), 1486 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32768412b..b83b33b76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -274,66 +274,66 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.850.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.850.0.tgz", - "integrity": "sha512-tX5bUfqiLOh6jtAlaiAuOUKFYh8KDG9k9zFLUdgGplC5TP47AYTreUEg+deCTHo4DD3YCvrLuyZ8tIDgKu7neQ==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.876.0.tgz", + "integrity": "sha512-rrdrB0IlHfRaY+qxo87iSPJJxjCZ2WIV0wKi0EWz02yBpq17c0o6Vzc8f1+ksR+IZGkGttQnD2j4UpItMdLSKg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/credential-provider-node": "3.848.0", - "@aws-sdk/middleware-bucket-endpoint": "3.840.0", - "@aws-sdk/middleware-expect-continue": "3.840.0", - "@aws-sdk/middleware-flexible-checksums": "3.846.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-location-constraint": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-sdk-s3": "3.846.0", - "@aws-sdk/middleware-ssec": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/signature-v4-multi-region": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/eventstream-serde-browser": "^4.0.4", - "@smithy/eventstream-serde-config-resolver": "^4.1.2", - "@smithy/eventstream-serde-node": "^4.0.4", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-blob-browser": "^4.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/hash-stream-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/md5-js": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/credential-provider-node": "3.876.0", + "@aws-sdk/middleware-bucket-endpoint": "3.873.0", + "@aws-sdk/middleware-expect-continue": "3.873.0", + "@aws-sdk/middleware-flexible-checksums": "3.876.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-location-constraint": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-sdk-s3": "3.876.0", + "@aws-sdk/middleware-ssec": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/signature-v4-multi-region": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.873.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.876.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.8.0", + "@smithy/eventstream-serde-browser": "^4.0.5", + "@smithy/eventstream-serde-config-resolver": "^4.1.3", + "@smithy/eventstream-serde-node": "^4.0.5", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-blob-browser": "^4.0.5", + "@smithy/hash-node": "^4.0.5", + "@smithy/hash-stream-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/md5-js": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-stream": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.0.26", + "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.6", + "@smithy/util-waiter": "^4.0.7", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -343,47 +343,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", - "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.876.0.tgz", + "integrity": "sha512-Vf0PMF7HVpvllrfPODnBZmlz6kT/y2AvOt1RQG3+qD0VrHWzShc5nwgRZ+yyP3xkKVhZsQ3sJapfZTFnjqMOYA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.873.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.876.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.8.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.26", + "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -392,23 +392,23 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz", - "integrity": "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.876.0.tgz", + "integrity": "sha512-sVFBFkdoPOPyY13NaXO1E/R9O5J6ixzHnnRbqrbXYM2QQgLNPTKIiRtmVEuVoFV9YULg+/aKm7caix8m468y9w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/core": "^3.8.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-utf8": "^4.0.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" @@ -418,15 +418,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz", - "integrity": "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.876.0.tgz", + "integrity": "sha512-cof7lwp2AlrAfRs0pt4W2KMS2VMBvEmpcti1UOFfSJIqkn+cyJliMJ8LHg22GI+kUexjvxdAqSbf3M7OHvEW+w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -434,20 +434,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz", - "integrity": "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.876.0.tgz", + "integrity": "sha512-wzmef2NBp2+X1l8D4Q8hx1G8oI3+WdvLdPev9VnVpRYZxYGRWVPl++wvCBsCn/ZL0mdWopPkhHA3kFexQhMzvg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -455,23 +455,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz", - "integrity": "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.876.0.tgz", + "integrity": "sha512-JHbW6fqnJsVjGHCyko7B0NVPT1nEAPxkM3CGjUcVGsHgJBkxOLVCMQqTRyHcDdeHR2qeojlLoOHRz97xIHQjYw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/credential-provider-env": "3.846.0", - "@aws-sdk/credential-provider-http": "3.846.0", - "@aws-sdk/credential-provider-process": "3.846.0", - "@aws-sdk/credential-provider-sso": "3.848.0", - "@aws-sdk/credential-provider-web-identity": "3.848.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/credential-provider-env": "3.876.0", + "@aws-sdk/credential-provider-http": "3.876.0", + "@aws-sdk/credential-provider-process": "3.876.0", + "@aws-sdk/credential-provider-sso": "3.876.0", + "@aws-sdk/credential-provider-web-identity": "3.876.0", + "@aws-sdk/nested-clients": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -479,22 +479,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz", - "integrity": "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.876.0.tgz", + "integrity": "sha512-eHbNt1+Hi43e8ANnwf6toapLSxfMiyGq459y3Uh6i7NBOiWWKEsOVcgOfUC3RCoqeikxovt1tFM2cEElWUIOhg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.846.0", - "@aws-sdk/credential-provider-http": "3.846.0", - "@aws-sdk/credential-provider-ini": "3.848.0", - "@aws-sdk/credential-provider-process": "3.846.0", - "@aws-sdk/credential-provider-sso": "3.848.0", - "@aws-sdk/credential-provider-web-identity": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/credential-provider-env": "3.876.0", + "@aws-sdk/credential-provider-http": "3.876.0", + "@aws-sdk/credential-provider-ini": "3.876.0", + "@aws-sdk/credential-provider-process": "3.876.0", + "@aws-sdk/credential-provider-sso": "3.876.0", + "@aws-sdk/credential-provider-web-identity": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -502,16 +502,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz", - "integrity": "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.876.0.tgz", + "integrity": "sha512-SMX4OlHvspu3gF4hxe7WAnZFhxpiCye+WlBSVoWfW/i9XNhtrZS1JMr29MK34GlCTk9qO7FlRwds/Z5k7xPpHg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -519,18 +519,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz", - "integrity": "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.876.0.tgz", + "integrity": "sha512-iP5dz9XqwePbgnh7Bdrq5e1319JpCRKLyomUfHH1XVeXkIHmwIJdmTj1Upeo1J8L/5cLHmhXAN6CTN11bLo8SA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.848.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/token-providers": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/client-sso": "3.876.0", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/token-providers": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -538,16 +538,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz", - "integrity": "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.876.0.tgz", + "integrity": "sha512-q/XSCP1uae5aB9veM8zcm6Gqu6A4ckX9ZbhHgCzURXVJDwp+nINW1hM9vppMjGw3ND9Ibx/adR+KfTI0TDMzqw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/nested-clients": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -555,16 +555,16 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", - "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.873.0.tgz", + "integrity": "sha512-b4bvr0QdADeTUs+lPc9Z48kXzbKHXQKgTvxx/jXDgSW9tv4KmYPO1gIj6Z9dcrBkRWQuUtSW3Tu2S5n6pe+zeg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-arn-parser": "3.873.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, @@ -573,14 +573,14 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.840.0.tgz", - "integrity": "sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.873.0.tgz", + "integrity": "sha512-GIqoc8WgRcf/opBOZXFLmplJQKwOMjiOMmDz9gQkaJ8FiVJoAp8EGVmK2TOWZMQUYsavvHYsHaor5R2xwPoGVg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -588,22 +588,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.846.0.tgz", - "integrity": "sha512-CdkeVfkwt3+bDLhmOwBxvkUf6oY9iUhvosaUnqkoPsOqIiUEN54yTGOnO8A0wLz6mMsZ6aBlfFrQhFnxt3c+yw==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.876.0.tgz", + "integrity": "sha512-Xfb9/XP0WcQq/yJxUubfzMUF0AYSX10UUIRbCJog0/lnDNocEiGEIaarwuQzoxb9QW9TQ1l5dDc/5bOMa1YVGw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/types": "3.862.0", "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -612,14 +612,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -627,13 +627,13 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.840.0.tgz", - "integrity": "sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.873.0.tgz", + "integrity": "sha512-r+hIaORsW/8rq6wieDordXnA/eAu7xAPLue2InhoEX6ML7irP52BgiibHLpt9R0psiCzIHhju8qqKa4pJOrmiw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -641,13 +641,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -655,14 +655,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -670,23 +670,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.846.0.tgz", - "integrity": "sha512-jP9x+2Q87J5l8FOP+jlAd7vGLn0cC6G9QGmf386e5OslBPqxXKcl3RjqGLIOKKos2mVItY3ApP5xdXQx7jGTVA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.876.0.tgz", + "integrity": "sha512-h+TDs9EKAfXnrkogQpQz3o11zvs6Vh9+ehxyd35OcM7evnDeoV4GFjjnAKq+MxbBk/5Ewnvng+d6/WQDvMbj7Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-arn-parser": "3.873.0", + "@smithy/core": "^3.8.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -695,13 +695,13 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.840.0.tgz", - "integrity": "sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.873.0.tgz", + "integrity": "sha512-AF55J94BoiuzN7g3hahy0dXTVZahVi8XxRBLgzNp6yQf0KTng+hb/V9UQZVYY1GZaDczvvvnqC54RGe9OZZ9zQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -709,17 +709,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz", - "integrity": "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.876.0.tgz", + "integrity": "sha512-FR+8INfnbNv32QDQ5szxkWX6mB/QgezfNyx8LnAh1ErISZMmEFBxXXir+ZOfuV8vsmal1a6cy9qmnMNDaNnaNQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@smithy/core": "^3.7.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.873.0", + "@smithy/core": "^3.8.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -727,47 +727,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz", - "integrity": "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.876.0.tgz", + "integrity": "sha512-R4TZrkM2gUElTsotk8mt3y7iLG8TNi1LL1wgVdEEWSLOYTaFyglGdoNBMtEeP7lmXilaTy00AbYF6BakJvSTHg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.873.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.876.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.8.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.26", + "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -776,16 +776,16 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -793,16 +793,16 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.846.0.tgz", - "integrity": "sha512-ZMfIMxUljqZzPJGOcraC6erwq/z1puNMU35cO1a/WdhB+LdYknMn1lr7SJuH754QwNzzIlZbEgg4hoHw50+DpQ==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.876.0.tgz", + "integrity": "sha512-OMDcuaVlC2rbze92w4QcNfuEA0IeT2GsT1ByZCwe+Y9tZwxzj7fCiOOU0UmJfa+juuQ/YBzVYxnkrkz3Rg6DEw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-sdk-s3": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -810,17 +810,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz", - "integrity": "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.876.0.tgz", + "integrity": "sha512-iU08kaQbhXnY0CC2TBcr7y/2PqPwZP2CTWX/Rbq0NvhOyteikfh7ASC+bRfLUp0XMSHKvSb+w2dh8a0lvx4oHg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.876.0", + "@aws-sdk/nested-clients": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -828,12 +828,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -841,9 +841,9 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz", + "integrity": "sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -853,15 +853,15 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", - "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.873.0.tgz", + "integrity": "sha512-YByHrhjxYdjKRf/RQygRK1uh0As1FIi9+jXTcIEX/rBgN8mUByczr2u4QXBzw7ZdbdcOBMOkPnLRjNOWW1MkFg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-endpoints": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -869,9 +869,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", - "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", + "integrity": "sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -881,27 +881,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz", - "integrity": "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.876.0.tgz", + "integrity": "sha512-/ZIaeUt60JBdI0mNc7sZ8v3Tuzp8Pbe4gIAYnppGyF4KV8QA+Yu8tp2bGHfkKn150t1uvQ6P/4CwFfoGF34dzg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -917,12 +917,12 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", + "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -930,9 +930,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "dev": true, "funding": [ { @@ -974,9 +974,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "dev": true, "funding": [ { @@ -990,7 +990,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.2", + "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "engines": { @@ -1045,21 +1045,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", - "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", + "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.2", + "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", "dev": true, "license": "MIT", "optional": true, @@ -1068,9 +1068,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", - "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", + "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", "dev": true, "license": "MIT", "optional": true, @@ -1079,9 +1079,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", "cpu": [ "ppc64" ], @@ -1096,9 +1096,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", "cpu": [ "arm" ], @@ -1113,9 +1113,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", "cpu": [ "arm64" ], @@ -1130,9 +1130,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", "cpu": [ "x64" ], @@ -1147,9 +1147,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", "cpu": [ "arm64" ], @@ -1164,9 +1164,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", "cpu": [ "x64" ], @@ -1181,9 +1181,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", "cpu": [ "arm64" ], @@ -1198,9 +1198,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", "cpu": [ "x64" ], @@ -1215,9 +1215,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", "cpu": [ "arm" ], @@ -1232,9 +1232,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", "cpu": [ "arm64" ], @@ -1249,9 +1249,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", "cpu": [ "ia32" ], @@ -1266,9 +1266,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", "cpu": [ "loong64" ], @@ -1283,9 +1283,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", "cpu": [ "mips64el" ], @@ -1300,9 +1300,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", "cpu": [ "ppc64" ], @@ -1317,9 +1317,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", "cpu": [ "riscv64" ], @@ -1334,9 +1334,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", "cpu": [ "s390x" ], @@ -1351,9 +1351,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", "cpu": [ "x64" ], @@ -1368,9 +1368,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", "cpu": [ "arm64" ], @@ -1385,9 +1385,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", "cpu": [ "x64" ], @@ -1402,9 +1402,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", "cpu": [ "arm64" ], @@ -1419,9 +1419,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", "cpu": [ "x64" ], @@ -1435,10 +1435,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", "cpu": [ "x64" ], @@ -1453,9 +1470,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", "cpu": [ "arm64" ], @@ -1470,9 +1487,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", "cpu": [ "ia32" ], @@ -1487,9 +1504,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", "cpu": [ "x64" ], @@ -1522,19 +1539,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -1560,10 +1564,34 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1571,9 +1599,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1607,10 +1635,34 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", "dev": true, "license": "MIT", "engines": { @@ -1631,13 +1683,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -1711,9 +1763,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.3.tgz", - "integrity": "sha512-AiR5uKpFxP3PjO4R19kQGIMwxyRyPuXmKEEy301V1C0+1rVjS94EZQXf1QKZYN8Q0YM+estSPhmx5JwNftv6nw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, @@ -1730,16 +1782,16 @@ "link": true }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz", - "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.9.0" + "@tybys/wasm-util": "^0.10.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -1781,9 +1833,9 @@ } }, "node_modules/@prisma/client": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.11.0.tgz", - "integrity": "sha512-K9TkKepOYvCOg3qCuKz7ZHf6rf58BFKi08plKjU4qVv9y7/UxO6tLz7PlWcgODUZKURLPmRHjHERffIx/8az4w==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.15.0.tgz", + "integrity": "sha512-wR2LXUbOH4cL/WToatI/Y2c7uzni76oNFND7+23ypLllBmIS8e3ZHhO+nud9iXSXKFt1SoM3fTZvHawg63emZw==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -1803,63 +1855,66 @@ } }, "node_modules/@prisma/config": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.12.0.tgz", - "integrity": "sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.15.0.tgz", + "integrity": "sha512-KMEoec9b2u6zX0EbSEx/dRpx1oNLjqJEBZYyK0S3TTIbZ7GEGoVyGyFRk4C72+A38cuPLbfQGQvgOD+gBErKlA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "jiti": "2.4.2" + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.16.12", + "empathic": "2.0.0" } }, "node_modules/@prisma/debug": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.12.0.tgz", - "integrity": "sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.15.0.tgz", + "integrity": "sha512-y7cSeLuQmyt+A3hstAs6tsuAiVXSnw9T55ra77z0nbNkA8Lcq9rNcQg6PI00by/+WnE/aMRJ/W7sZWn2cgIy1g==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.12.0.tgz", - "integrity": "sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.15.0.tgz", + "integrity": "sha512-opITiR5ddFJ1N2iqa7mkRlohCZqVSsHhRcc29QXeldMljOf4FSellLT0J5goVb64EzRTKcIDeIsJBgmilNcKxA==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.12.0", - "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", - "@prisma/fetch-engine": "6.12.0", - "@prisma/get-platform": "6.12.0" + "@prisma/debug": "6.15.0", + "@prisma/engines-version": "6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb", + "@prisma/fetch-engine": "6.15.0", + "@prisma/get-platform": "6.15.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc.tgz", - "integrity": "sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ==", + "version": "6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb.tgz", + "integrity": "sha512-a/46aK5j6L3ePwilZYEgYDPrhBQ/n4gYjLxT5YncUTJJNRnTCVjPF86QdzUOLRdYjCLfhtZp9aum90W0J+trrg==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.12.0.tgz", - "integrity": "sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.15.0.tgz", + "integrity": "sha512-xcT5f6b+OWBq6vTUnRCc7qL+Im570CtwvgSj+0MTSGA1o9UDSKZ/WANvwtiRXdbYWECpyC3CukoG3A04VTAPHw==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.12.0", - "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", - "@prisma/get-platform": "6.12.0" + "@prisma/debug": "6.15.0", + "@prisma/engines-version": "6.15.0-5.85179d7826409ee107a6ba334b5e305ae3fba9fb", + "@prisma/get-platform": "6.15.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.12.0.tgz", - "integrity": "sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.15.0.tgz", + "integrity": "sha512-Jbb+Xbxyp05NSR1x2epabetHiXvpO8tdN2YNoWoA/ZsbYyxxu/CO/ROBauIFuMXs3Ti+W7N7SJtWsHGaWte9Rg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.12.0" + "@prisma/debug": "6.15.0" } }, "node_modules/@reduxjs/toolkit": { @@ -1889,9 +1944,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", - "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, "license": "MIT" }, @@ -1909,10 +1964,17 @@ "node": ">= 8.0.0" } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz", + "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==", "cpu": [ "arm" ], @@ -1924,9 +1986,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz", + "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==", "cpu": [ "arm64" ], @@ -1938,9 +2000,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz", + "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==", "cpu": [ "arm64" ], @@ -1952,9 +2014,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz", + "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==", "cpu": [ "x64" ], @@ -1966,9 +2028,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", - "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz", + "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==", "cpu": [ "arm64" ], @@ -1980,9 +2042,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", - "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz", + "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==", "cpu": [ "x64" ], @@ -1994,9 +2056,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz", + "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==", "cpu": [ "arm" ], @@ -2008,9 +2070,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz", + "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==", "cpu": [ "arm" ], @@ -2022,9 +2084,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz", + "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==", "cpu": [ "arm64" ], @@ -2036,9 +2098,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz", + "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==", "cpu": [ "arm64" ], @@ -2050,9 +2112,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", - "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz", + "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==", "cpu": [ "loong64" ], @@ -2063,10 +2125,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz", + "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==", "cpu": [ "ppc64" ], @@ -2078,9 +2140,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz", + "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==", "cpu": [ "riscv64" ], @@ -2092,9 +2154,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", - "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz", + "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==", "cpu": [ "riscv64" ], @@ -2106,9 +2168,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz", + "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==", "cpu": [ "s390x" ], @@ -2120,9 +2182,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz", + "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==", "cpu": [ "x64" ], @@ -2134,9 +2196,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz", + "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==", "cpu": [ "x64" ], @@ -2148,9 +2210,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz", + "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==", "cpu": [ "arm64" ], @@ -2162,9 +2224,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz", + "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==", "cpu": [ "ia32" ], @@ -2176,9 +2238,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz", + "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==", "cpu": [ "x64" ], @@ -2205,12 +2267,12 @@ "license": "Apache-2.0" }, "node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2243,15 +2305,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", + "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -2259,35 +2321,37 @@ } }, "node_modules/@smithy/core": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", - "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", + "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -2295,13 +2359,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz", - "integrity": "sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.5.tgz", + "integrity": "sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" }, @@ -2310,13 +2374,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz", - "integrity": "sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.5.tgz", + "integrity": "sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2324,12 +2388,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz", - "integrity": "sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.3.tgz", + "integrity": "sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2337,13 +2401,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz", - "integrity": "sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.5.tgz", + "integrity": "sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2351,13 +2415,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz", - "integrity": "sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.5.tgz", + "integrity": "sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-codec": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2365,14 +2429,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -2381,14 +2445,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", - "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.5.tgz", + "integrity": "sha512-F7MmCd3FH/Q2edhcKd+qulWkwfChHbc9nhguBlVjSUE6hVHhec3q6uPQ+0u69S6ppvLtR3eStfCuEKMXBXhvvA==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2396,12 +2460,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", + "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -2411,12 +2475,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", - "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.5.tgz", + "integrity": "sha512-IJuDS3+VfWB67UC0GU0uYBG/TA30w+PlOaSo0GPm9UHS88A6rCP6uZxNjNYiyRtOcjv7TXn/60cW8ox1yuZsLg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -2425,12 +2489,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", + "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2450,12 +2514,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", - "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.5.tgz", + "integrity": "sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -2464,13 +2528,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", + "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2478,18 +2542,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", - "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", + "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.8.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -2497,18 +2561,19 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", - "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz", + "integrity": "sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -2517,13 +2582,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2531,12 +2596,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2544,14 +2609,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2559,15 +2624,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2575,12 +2640,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2588,12 +2653,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2601,12 +2666,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -2615,12 +2680,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2628,24 +2693,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", + "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1" + "@smithy/types": "^4.3.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2653,16 +2718,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.3.tgz", + "integrity": "sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -2672,17 +2737,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", - "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", + "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@smithy/core": "^3.8.0", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -2690,9 +2755,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2702,13 +2767,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2779,14 +2844,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", - "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz", + "integrity": "sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -2795,17 +2860,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", - "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz", + "integrity": "sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", + "@smithy/config-resolver": "^4.1.5", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2813,13 +2878,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2839,12 +2904,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2852,13 +2917,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", + "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2866,14 +2931,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -2910,13 +2975,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz", - "integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.7.tgz", + "integrity": "sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2936,15 +3001,15 @@ "license": "MIT" }, "node_modules/@swc/core": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.9.tgz", - "integrity": "sha512-O+LfT2JlVMsIMWG9x+rdxg8GzpzeGtCZQfXV7cKc1PjIKUkLFf1QJ7okuseA4f/9vncu37dQ2ZcRrPKy0Ndd5g==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.5.tgz", + "integrity": "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.23" + "@swc/types": "^0.1.24" }, "engines": { "node": ">=10" @@ -2954,16 +3019,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.12.9", - "@swc/core-darwin-x64": "1.12.9", - "@swc/core-linux-arm-gnueabihf": "1.12.9", - "@swc/core-linux-arm64-gnu": "1.12.9", - "@swc/core-linux-arm64-musl": "1.12.9", - "@swc/core-linux-x64-gnu": "1.12.9", - "@swc/core-linux-x64-musl": "1.12.9", - "@swc/core-win32-arm64-msvc": "1.12.9", - "@swc/core-win32-ia32-msvc": "1.12.9", - "@swc/core-win32-x64-msvc": "1.12.9" + "@swc/core-darwin-arm64": "1.13.5", + "@swc/core-darwin-x64": "1.13.5", + "@swc/core-linux-arm-gnueabihf": "1.13.5", + "@swc/core-linux-arm64-gnu": "1.13.5", + "@swc/core-linux-arm64-musl": "1.13.5", + "@swc/core-linux-x64-gnu": "1.13.5", + "@swc/core-linux-x64-musl": "1.13.5", + "@swc/core-win32-arm64-msvc": "1.13.5", + "@swc/core-win32-ia32-msvc": "1.13.5", + "@swc/core-win32-x64-msvc": "1.13.5" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -2975,9 +3040,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.9.tgz", - "integrity": "sha512-GACFEp4nD6V+TZNR2JwbMZRHB+Yyvp14FrcmB6UCUYmhuNWjkxi+CLnEvdbuiKyQYv0zA+TRpCHZ+whEs6gwfA==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.5.tgz", + "integrity": "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==", "cpu": [ "arm64" ], @@ -2992,9 +3057,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.9.tgz", - "integrity": "sha512-hv2kls7Ilkm2EpeJz+I9MCil7pGS3z55ZAgZfxklEuYsxpICycxeH+RNRv4EraggN44ms+FWCjtZFu0LGg2V3g==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.5.tgz", + "integrity": "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==", "cpu": [ "x64" ], @@ -3009,9 +3074,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.9.tgz", - "integrity": "sha512-od9tDPiG+wMU9wKtd6y3nYJdNqgDOyLdgRRcrj1/hrbHoUPOM8wZQZdwQYGarw63iLXGgsw7t5HAF9Yc51ilFA==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.5.tgz", + "integrity": "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==", "cpu": [ "arm" ], @@ -3026,9 +3091,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.9.tgz", - "integrity": "sha512-6qx1ka9LHcLzxIgn2Mros+CZLkHK2TawlXzi/h7DJeNnzi8F1Hw0Yzjp8WimxNCg6s2n+o3jnmin1oXB7gg8rw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.5.tgz", + "integrity": "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==", "cpu": [ "arm64" ], @@ -3043,9 +3108,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.9.tgz", - "integrity": "sha512-yghFZWKPVVGbUdqiD7ft23G0JX6YFGDJPz9YbLLAwGuKZ9th3/jlWoQDAw1Naci31LQhVC+oIji6ozihSuwB2A==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.5.tgz", + "integrity": "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==", "cpu": [ "arm64" ], @@ -3060,9 +3125,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.9.tgz", - "integrity": "sha512-SFUxyhWLZRNL8QmgGNqdi2Q43PNyFVkRZ2zIif30SOGFSxnxcf2JNeSeBgKIGVgaLSuk6xFVVCtJ3KIeaStgRg==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.5.tgz", + "integrity": "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==", "cpu": [ "x64" ], @@ -3077,9 +3142,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.9.tgz", - "integrity": "sha512-9FB0wM+6idCGTI20YsBNBg9xSWtkDBymnpaTCsZM3qDc0l4uOpJMqbfWhQvp17x7r/ulZfb2QY8RDvQmCL6AcQ==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.5.tgz", + "integrity": "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==", "cpu": [ "x64" ], @@ -3094,9 +3159,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.9.tgz", - "integrity": "sha512-zHOusMVbOH9ik5RtRrMiGzLpKwxrPXgXkBm3SbUCa65HAdjV33NZ0/R9Rv1uPESALtEl2tzMYLUxYA5ECFDFhA==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.5.tgz", + "integrity": "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==", "cpu": [ "arm64" ], @@ -3111,9 +3176,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.9.tgz", - "integrity": "sha512-aWZf0PqE0ot7tCuhAjRkDFf41AzzSQO0x2xRfTbnhpROp57BRJ/N5eee1VULO/UA2PIJRG7GKQky5bSGBYlFug==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.5.tgz", + "integrity": "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==", "cpu": [ "ia32" ], @@ -3128,9 +3193,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.9.tgz", - "integrity": "sha512-C25fYftXOras3P3anSUeXXIpxmEkdAcsIL9yrr0j1xepTZ/yKwpnQ6g3coj8UXdeJy4GTVlR6+Ow/QiBgZQNOg==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.5.tgz", + "integrity": "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==", "cpu": [ "x64" ], @@ -3152,9 +3217,9 @@ "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", - "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.24.tgz", + "integrity": "sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3162,9 +3227,9 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", "dev": true, "license": "MIT", "optional": true, @@ -3241,9 +3306,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3302,13 +3367,13 @@ } }, "node_modules/@types/node": { - "version": "24.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.10.0" } }, "node_modules/@types/qs": { @@ -3326,9 +3391,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", - "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3336,9 +3401,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.1.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", - "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.8.tgz", + "integrity": "sha512-xG7xaBMJCpcK0RpN8jDbAACQo54ycO6h4dSSmgv8+fu6ZIAdANkx/WsawASUjVXYfy+J9AbUpRMNNEsXCDfDBQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3399,17 +3464,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", - "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", + "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/type-utils": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/type-utils": "8.41.0", + "@typescript-eslint/utils": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3423,9 +3488,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.38.0", + "@typescript-eslint/parser": "^8.41.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -3439,16 +3504,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", - "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", + "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", "debug": "^4.3.4" }, "engines": { @@ -3460,18 +3525,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", - "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", + "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.38.0", - "@typescript-eslint/types": "^8.38.0", + "@typescript-eslint/tsconfig-utils": "^8.41.0", + "@typescript-eslint/types": "^8.41.0", "debug": "^4.3.4" }, "engines": { @@ -3482,18 +3547,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", - "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", + "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0" + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3504,9 +3569,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", - "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", + "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", "dev": true, "license": "MIT", "engines": { @@ -3517,19 +3582,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", - "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", + "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/utils": "8.41.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3542,13 +3607,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", - "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", + "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", "dev": true, "license": "MIT", "engines": { @@ -3560,16 +3625,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", - "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", + "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/project-service": "8.41.0", + "@typescript-eslint/tsconfig-utils": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3585,46 +3650,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", - "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", + "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3635,17 +3674,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", - "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", + "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/types": "8.41.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3656,10 +3695,23 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz", - "integrity": "sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", "cpu": [ "arm" ], @@ -3671,9 +3723,9 @@ ] }, "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.2.tgz", - "integrity": "sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", "cpu": [ "arm64" ], @@ -3685,9 +3737,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.2.tgz", - "integrity": "sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", "cpu": [ "arm64" ], @@ -3699,9 +3751,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.2.tgz", - "integrity": "sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", "cpu": [ "x64" ], @@ -3713,9 +3765,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.2.tgz", - "integrity": "sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", "cpu": [ "x64" ], @@ -3727,9 +3779,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.2.tgz", - "integrity": "sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", "cpu": [ "arm" ], @@ -3741,9 +3793,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.2.tgz", - "integrity": "sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", "cpu": [ "arm" ], @@ -3755,9 +3807,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.2.tgz", - "integrity": "sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", "cpu": [ "arm64" ], @@ -3769,9 +3821,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.2.tgz", - "integrity": "sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", "cpu": [ "arm64" ], @@ -3783,9 +3835,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.2.tgz", - "integrity": "sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", "cpu": [ "ppc64" ], @@ -3797,9 +3849,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.2.tgz", - "integrity": "sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", "cpu": [ "riscv64" ], @@ -3811,9 +3863,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.2.tgz", - "integrity": "sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", "cpu": [ "riscv64" ], @@ -3825,9 +3877,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.2.tgz", - "integrity": "sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", "cpu": [ "s390x" ], @@ -3839,9 +3891,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.2.tgz", - "integrity": "sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", "cpu": [ "x64" ], @@ -3853,9 +3905,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.2.tgz", - "integrity": "sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", "cpu": [ "x64" ], @@ -3867,9 +3919,9 @@ ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.2.tgz", - "integrity": "sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", "cpu": [ "wasm32" ], @@ -3884,9 +3936,9 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.2.tgz", - "integrity": "sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", "cpu": [ "arm64" ], @@ -3898,9 +3950,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.2.tgz", - "integrity": "sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", "cpu": [ "ia32" ], @@ -3912,9 +3964,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.2.tgz", - "integrity": "sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", "cpu": [ "x64" ], @@ -3926,23 +3978,23 @@ ] }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.10.2.tgz", - "integrity": "sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.11.0.tgz", + "integrity": "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.11", - "@swc/core": "^1.11.31" + "@rolldown/pluginutils": "1.0.0-beta.27", + "@swc/core": "^1.12.11" }, "peerDependencies": { - "vite": "^4 || ^5 || ^6 || ^7.0.0-beta.0" + "vite": "^4 || ^5 || ^6 || ^7" } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.3.tgz", - "integrity": "sha512-zOB4T5f80JXfP5DC2yQl7azRYq8PmGqYle3uxh3a0NnbKc+EaSYSpEcrVAh2r5W97pi3BVv7oRb5NdEQy0cCXA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.4.tgz", + "integrity": "sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==", "dev": true, "license": "MIT", "dependencies": { @@ -4006,16 +4058,6 @@ } } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", @@ -4124,9 +4166,9 @@ } }, "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { @@ -4167,13 +4209,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -4436,20 +4481,19 @@ } }, "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -4491,6 +4535,65 @@ "node": ">= 0.8" } }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -4560,9 +4663,9 @@ } }, "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -4573,7 +4676,7 @@ "pathval": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/chalk": { @@ -4654,6 +4757,16 @@ "node": ">= 6" } }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -4687,73 +4800,92 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/color-convert": { @@ -4816,19 +4948,18 @@ } }, "node_modules/concurrently": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", - "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", @@ -4841,6 +4972,23 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -5021,9 +5169,9 @@ } }, "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true, "license": "MIT" }, @@ -5044,6 +5192,16 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -5080,6 +5238,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -5089,6 +5254,13 @@ "node": ">= 0.8" } }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "devOptional": true, + "license": "MIT" + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -5103,10 +5275,10 @@ } }, "node_modules/dotenv": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.0.tgz", - "integrity": "sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==", - "dev": true, + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -5131,19 +5303,6 @@ "dotenv": "cli.js" } }, - "node_modules/dotenv-cli/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dotenv-expand": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", @@ -5174,13 +5333,34 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/effect": { + "version": "3.16.12", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.16.12.tgz", + "integrity": "sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, "license": "MIT" }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -5370,9 +5550,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5383,31 +5563,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" } }, "node_modules/escalade": { @@ -5440,20 +5621,20 @@ } }, "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -5660,6 +5841,17 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -5670,6 +5862,19 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -5721,6 +5926,30 @@ } }, "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", @@ -5733,6 +5962,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -5751,6 +5993,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -5788,11 +6043,14 @@ } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -5821,9 +6079,9 @@ "license": "MIT" }, "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5872,6 +6130,36 @@ "url": "https://opencollective.com/express" } }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6219,6 +6507,24 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6254,6 +6560,30 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -6782,13 +7112,16 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { @@ -7049,9 +7382,9 @@ "license": "ISC" }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", "devOptional": true, "license": "MIT", "bin": { @@ -7190,22 +7523,22 @@ } }, "node_modules/lint-staged": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz", - "integrity": "sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==", + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.5.tgz", + "integrity": "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.4.1", + "chalk": "^5.5.0", "commander": "^14.0.0", "debug": "^4.4.1", "lilconfig": "^3.1.3", - "listr2": "^8.3.3", + "listr2": "^9.0.1", "micromatch": "^4.0.8", "nano-spawn": "^1.0.2", "pidtree": "^0.6.0", "string-argv": "^0.3.2", - "yaml": "^2.8.0" + "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -7218,9 +7551,9 @@ } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", + "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", "dev": true, "license": "MIT", "engines": { @@ -7231,9 +7564,9 @@ } }, "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.2.tgz", + "integrity": "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag==", "dev": true, "license": "MIT", "dependencies": { @@ -7245,92 +7578,7 @@ "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=20.0.0" } }, "node_modules/locate-path": { @@ -7349,13 +7597,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -7383,19 +7624,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -7409,13 +7637,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", @@ -7423,88 +7644,36 @@ "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" + "get-east-asian-width": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "is-fullwidth-code-point": "^5.0.0" }, "engines": { "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/loupe": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", - "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, @@ -7516,13 +7685,13 @@ "license": "ISC" }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/math-intrinsics": { @@ -7614,16 +7783,19 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -7790,9 +7962,9 @@ } }, "node_modules/napi-postinstall": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.5.tgz", - "integrity": "sha512-kmsgUvCRIJohHjbZ3V8avP0I1Pekw329MVAMDzVxsrkjgdnqiwvMX5XwR+hWV66vsAtZ+iM+fVnq8RTQawUmCQ==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", + "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", "dev": true, "license": "MIT", "bin": { @@ -7821,6 +7993,13 @@ "node": ">= 0.6" } }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "devOptional": true, + "license": "MIT" + }, "node_modules/nodemon": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", @@ -7850,6 +8029,17 @@ "url": "https://opencollective.com/nodemon" } }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -7860,6 +8050,19 @@ "node": ">=4" } }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -7884,12 +8087,32 @@ } }, "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", + "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", "dev": true, "license": "MIT" }, + "node_modules/nypm": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.1.tgz", + "integrity": "sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.2.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7995,6 +8218,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -8203,7 +8433,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/pathval": { @@ -8216,6 +8446,13 @@ "node": ">= 14.16" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "devOptional": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8249,6 +8486,18 @@ "node": ">=0.10" } }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -8315,15 +8564,15 @@ } }, "node_modules/prisma": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.12.0.tgz", - "integrity": "sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.15.0.tgz", + "integrity": "sha512-E6RCgOt+kUVtjtZgLQDBJ6md2tDItLJNExwI0XJeBc1FKL+Vwb+ovxXxuok9r8oBgsOXBA33fGDuE/0qDdCWqQ==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.12.0", - "@prisma/engines": "6.12.0" + "@prisma/config": "6.15.0", + "@prisma/engines": "6.15.0" }, "bin": { "prisma": "build/index.js" @@ -8370,6 +8619,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -8430,25 +8696,36 @@ "node": ">= 0.8" } }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", "license": "MIT", "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^19.1.0" + "react": "^19.1.1" } }, "node_modules/react-redux": { @@ -8475,9 +8752,9 @@ } }, "node_modules/react-router": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz", - "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.2.tgz", + "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -8497,12 +8774,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.3.tgz", - "integrity": "sha512-DiWJm9qdUAmiJrVWaeJdu4TKu13+iB/8IEi0EW/XgaHCjW/vWGrwzup0GVvaMteuZjKnh5bEvJP/K0MDnzawHw==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.8.2.tgz", + "integrity": "sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==", "license": "MIT", "dependencies": { - "react-router": "7.6.3" + "react-router": "7.8.2" }, "engines": { "node": ">=20.0.0" @@ -8700,9 +8977,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", - "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", + "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==", "dev": true, "license": "MIT", "dependencies": { @@ -8716,26 +8993,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.44.1", - "@rollup/rollup-android-arm64": "4.44.1", - "@rollup/rollup-darwin-arm64": "4.44.1", - "@rollup/rollup-darwin-x64": "4.44.1", - "@rollup/rollup-freebsd-arm64": "4.44.1", - "@rollup/rollup-freebsd-x64": "4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "4.44.1", - "@rollup/rollup-linux-arm64-gnu": "4.44.1", - "@rollup/rollup-linux-arm64-musl": "4.44.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "4.44.1", - "@rollup/rollup-linux-riscv64-musl": "4.44.1", - "@rollup/rollup-linux-s390x-gnu": "4.44.1", - "@rollup/rollup-linux-x64-gnu": "4.44.1", - "@rollup/rollup-linux-x64-musl": "4.44.1", - "@rollup/rollup-win32-arm64-msvc": "4.44.1", - "@rollup/rollup-win32-ia32-msvc": "4.44.1", - "@rollup/rollup-win32-x64-msvc": "4.44.1", + "@rollup/rollup-android-arm-eabi": "4.49.0", + "@rollup/rollup-android-arm64": "4.49.0", + "@rollup/rollup-darwin-arm64": "4.49.0", + "@rollup/rollup-darwin-x64": "4.49.0", + "@rollup/rollup-freebsd-arm64": "4.49.0", + "@rollup/rollup-freebsd-x64": "4.49.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.49.0", + "@rollup/rollup-linux-arm-musleabihf": "4.49.0", + "@rollup/rollup-linux-arm64-gnu": "4.49.0", + "@rollup/rollup-linux-arm64-musl": "4.49.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.49.0", + "@rollup/rollup-linux-ppc64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-musl": "4.49.0", + "@rollup/rollup-linux-s390x-gnu": "4.49.0", + "@rollup/rollup-linux-x64-gnu": "4.49.0", + "@rollup/rollup-linux-x64-musl": "4.49.0", + "@rollup/rollup-win32-arm64-msvc": "4.49.0", + "@rollup/rollup-win32-ia32-msvc": "4.49.0", + "@rollup/rollup-win32-x64-msvc": "4.49.0", "fsevents": "~2.3.2" } }, @@ -9178,19 +9455,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -9283,18 +9547,21 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string.prototype.trim": { @@ -9357,16 +9624,19 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-bom": { @@ -9447,9 +9717,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.25.4", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.25.4.tgz", - "integrity": "sha512-LV+1DBQKHQWA3UavW0CpEyb1+ZKIYQjE8dsGIH5J/sTZTQDWnaIMoTB26Tct0Lrv2FJW4mqti5U5lF391oQFbw==", + "version": "5.27.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.27.1.tgz", + "integrity": "sha512-oGtpYO3lnoaqyGtlJalvryl7TwzgRuxpOVWqEHx8af0YXI+Kt+4jMpLdgMtMcmWmuQ0QTCHLKExwrBFMSxvAUA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9487,10 +9757,10 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "devOptional": true, "license": "MIT" }, "node_modules/tinyglobby": { @@ -9511,11 +9781,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -9526,9 +9799,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -9800,9 +10073,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -9814,16 +10087,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", - "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.41.0.tgz", + "integrity": "sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.38.0", - "@typescript-eslint/parser": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0" + "@typescript-eslint/eslint-plugin": "8.41.0", + "@typescript-eslint/parser": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/utils": "8.41.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9834,7 +10107,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/unbox-primitive": { @@ -9864,9 +10137,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "dev": true, "license": "MIT" }, @@ -9880,38 +10153,38 @@ } }, "node_modules/unrs-resolver": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.2.tgz", - "integrity": "sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "napi-postinstall": "^0.2.4" + "napi-postinstall": "^0.3.0" }, "funding": { "url": "https://opencollective.com/unrs-resolver" }, "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.9.2", - "@unrs/resolver-binding-android-arm64": "1.9.2", - "@unrs/resolver-binding-darwin-arm64": "1.9.2", - "@unrs/resolver-binding-darwin-x64": "1.9.2", - "@unrs/resolver-binding-freebsd-x64": "1.9.2", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.2", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.2", - "@unrs/resolver-binding-linux-arm64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-arm64-musl": "1.9.2", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-riscv64-musl": "1.9.2", - "@unrs/resolver-binding-linux-s390x-gnu": "1.9.2", - "@unrs/resolver-binding-linux-x64-gnu": "1.9.2", - "@unrs/resolver-binding-linux-x64-musl": "1.9.2", - "@unrs/resolver-binding-wasm32-wasi": "1.9.2", - "@unrs/resolver-binding-win32-arm64-msvc": "1.9.2", - "@unrs/resolver-binding-win32-ia32-msvc": "1.9.2", - "@unrs/resolver-binding-win32-x64-msvc": "1.9.2" + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "node_modules/uri-js": { @@ -9971,17 +10244,17 @@ } }, "node_modules/vite": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz", - "integrity": "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", + "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", "postcss": "^8.5.6", - "rollup": "^4.40.0", + "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "bin": { @@ -10101,11 +10374,14 @@ } }, "node_modules/vite/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -10116,9 +10392,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -10202,9 +10478,9 @@ } }, "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -10214,6 +10490,13 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vitest/node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -10407,23 +10690,36 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -10489,9 +10785,9 @@ } }, "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, "license": "ISC", "bin": { @@ -10555,6 +10851,61 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -10603,6 +10954,19 @@ "yamljs": "^0.3.0" } }, + "server/node_modules/dotenv": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", + "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "shared": { "name": "@looking-for-group/shared", "version": "1.0.0" diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 08a9aebee..6cc14cdfc 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -220,7 +220,7 @@ model Users { profileImage String? @map("profile_image") @db.VarChar(100) headline String? @db.VarChar(100) pronouns String? @db.Text - jobTitleId Int? @map("job_title_id") + title String? @db.VarChar(50) majorId Int? @map("major_id") academicYear UsersAcademicYear? @map("academic_year") location String? @db.VarChar(150) diff --git a/server/src/api/controllers/me/update-info.ts b/server/src/api/controllers/me/update-info.ts index 2c622a59b..987ff76f5 100644 --- a/server/src/api/controllers/me/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -8,7 +8,7 @@ interface UpdateUserInfo { lastName?: string; headline?: string; pronouns?: string; - jobTitleId?: number; + tile?: string; majorId?: number; academic_year?: UsersAcademicYear | null; location?: string; @@ -53,7 +53,7 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI 'lastName', 'headline', 'pronouns', - 'jobTitleId', + 'role', 'majorId', 'academicYear', 'location', diff --git a/server/src/services/me/update-info.ts b/server/src/services/me/update-info.ts index bf541d558..070699d55 100644 --- a/server/src/services/me/update-info.ts +++ b/server/src/services/me/update-info.ts @@ -12,7 +12,7 @@ type UpdatebleUserFields = Partial< | 'lastName' | 'headline' | 'pronouns' - | 'jobTitleId' + | 'role' | 'majorId' | 'academicYear' | 'location' @@ -34,7 +34,7 @@ export const updateUserInfoService = async ( lastName: true, headline: true, pronouns: true, - jobTitleId: true, + role: true, majorId: true, academicYear: true, location: true, From 35ce402fb3d9ba8a68981afb917fda09101803d6 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 20:18:09 -0400 Subject: [PATCH 027/322] middleware that requires a user to be the owner of a project to make changes --- .../api/middleware/requires-project-owner.ts | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 server/src/api/middleware/requires-project-owner.ts diff --git a/server/src/api/middleware/requires-project-owner.ts b/server/src/api/middleware/requires-project-owner.ts new file mode 100644 index 000000000..2b6261a94 --- /dev/null +++ b/server/src/api/middleware/requires-project-owner.ts @@ -0,0 +1,84 @@ +import type { ApiResponse } from '@looking-for-group/shared'; +import type { NextFunction, Request, Response } from 'express'; +import getProjectByIdService from '#services/projects/get-proj-id.ts'; + +const requiresProjectOwner = async (request: Request, response: Response, next: NextFunction) => { + if (request.currentUser === undefined) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + response.status(400).json(resBody); + return; + } + + //current user ID + const userId = parseInt(request.currentUser); + + //check if ID is number + if (isNaN(userId)) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid user ID', + data: null, + memetype: 'application/json', + }; + response.status(400).json(resBody); + return; + } + + const projectId = parseInt(request.params.id); + + //check if project id is number + if (isNaN(projectId)) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid project ID', + data: null, + memetype: 'application/json', + }; + response.status(400).json(resBody); + return; + } + + const result = await getProjectByIdService(projectId); + + if (result === 'INTERNAL_ERROR') { + const resBody: ApiResponse = { + status: 500, + error: 'Internal Server Error', + data: null, + memetype: 'application/json', + }; + response.status(500).json(resBody); + return; + } + + if (result === 'NOT_FOUND') { + const resBody: ApiResponse = { + status: 404, + error: 'Project not found', + data: null, + memetype: 'application/json', + }; + response.status(404).json(resBody); + return; + } + + if (!result?.userId || result.userId !== userId) { + const resBody: ApiResponse = { + status: 403, + error: 'Insufficient permissions', + data: null, + memetype: 'application/json', + }; + response.status(403).json(resBody); + return; + } + + next(); +}; + +export default requiresProjectOwner; From a665191450ef9dc8075ddc9bc750ba2311ed8fd3 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 20:20:09 -0400 Subject: [PATCH 028/322] add middleware requiresProjectOwner to project routes that make changes --- server/src/api/routes/projects.ts | 59 ++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/server/src/api/routes/projects.ts b/server/src/api/routes/projects.ts index 3ed493aac..88b73ad9f 100644 --- a/server/src/api/routes/projects.ts +++ b/server/src/api/routes/projects.ts @@ -2,6 +2,7 @@ import { Router } from 'express'; import PROJECT from '#controllers/projects/index.ts'; import injectCurrentUser from '../middleware/inject-current-user.ts'; import requiresLogin from '../middleware/requires-login.ts'; +import requiresProjectOwner from '../middleware/requires-project-owner.ts'; const router = Router(); @@ -15,33 +16,75 @@ router.post('/', requiresLogin, injectCurrentUser, PROJECT.createProject); router.get('/:id', PROJECT.getProjectByID); //Edits a project through a specific id -router.put('/:id', requiresLogin, injectCurrentUser, PROJECT.updateProject); +router.put('/:id', requiresLogin, injectCurrentUser, requiresProjectOwner, PROJECT.updateProject); //Deletes project through a specific id -router.delete('/:id', requiresLogin, injectCurrentUser, PROJECT.deleteProject); +router.delete( + '/:id', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.deleteProject, +); //Edits a project thumbnail through a specific id -router.put('/:id/thumbnail', requiresLogin, injectCurrentUser, PROJECT.updateThumbnail); +router.put( + '/:id/thumbnail', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.updateThumbnail, +); //Receives pictures from project through id router.get('/:id/pictures', PROJECT.getProjectPics); //Creates a new picture for a project -router.post('/:id/pictures', requiresLogin, injectCurrentUser, PROJECT.addImage); +router.post( + '/:id/pictures', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.addImage, +); //Changes a picture for a project -router.put('/:id/pictures/:picId', requiresLogin, injectCurrentUser, PROJECT.updateImage); +router.put( + '/:id/pictures/:picId', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.updateImage, +); //Removes picture from a project // router.delete('/:id/pictures/:picId' /* deletePicture */); //Adds member to a specific project through id -router.post('/:id/members', requiresLogin, injectCurrentUser, PROJECT.addMember); +router.post( + '/:id/members', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.addMember, +); //Edits a member of a specific project through id -router.put('/:id/members/:userId', requiresLogin, injectCurrentUser, PROJECT.updateMember); +router.put( + '/:id/members/:userId', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.updateMember, +); //Removes a member from a specific project through project and user ID -router.delete('/:id/members/:userId', requiresLogin, injectCurrentUser, PROJECT.deleteMember); +router.delete( + '/:id/members/:userId', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.deleteMember, +); export default router; From 93bbdfb865d5677f26d8ba07f7f636d7dd1152c0 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 27 Aug 2025 20:23:20 -0400 Subject: [PATCH 029/322] update schema: projects require a userId and User --- server/prisma/schema.prisma | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 6cc14cdfc..9ebabb864 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -139,7 +139,7 @@ model Projects { purpose ProjectsPurpose? status ProjectsStatus audience String? @db.VarChar(300) - userId Int? @map("user_id") + userId Int @map("user_id") createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) jobs Jobs[] @@ -149,7 +149,7 @@ model Projects { projectImages ProjectImages[] projectSocials ProjectSocials[] projectTags ProjectTags[] - users Users? @relation(fields: [userId], references: [userId], map: "FK_user_id") + users Users @relation(fields: [userId], references: [userId], map: "FK_user_id") @@index([userId], map: "FK_user_id") @@map("projects") From ce3e70b21ca0bedf3a72e5a8ad114350ad849bc0 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Wed, 27 Aug 2025 22:02:24 -0400 Subject: [PATCH 030/322] Patched up add-member endpoint. revise needed when jobTitle relation in db is changed. --- .../api/controllers/projects/add-member.ts | 23 ++++++++++++++++++- .../api/controllers/projects/update-member.ts | 4 ++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/server/src/api/controllers/projects/add-member.ts b/server/src/api/controllers/projects/add-member.ts index c5a50bc04..31c0cffe5 100644 --- a/server/src/api/controllers/projects/add-member.ts +++ b/server/src/api/controllers/projects/add-member.ts @@ -4,7 +4,28 @@ import type { Prisma } from '#prisma-models/index.js'; import getService from '#services/projects/add-member.ts'; const addMemberController = async (_req: Request, res: Response) => { - const data: Prisma.MembersCreateInput = _req.body as Prisma.MembersCreateInput; + const projectId = parseInt(_req.params.id); + + if (isNaN(projectId)) { + const resBody: ApiResponse = { + status: 400, + error: 'Invalid project ID', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const { userId } = _req.body as { userId: number }; + + //currently just creating a new JobTitle record, + //should be changed to avoid duplicate records + const data: Prisma.MembersCreateInput = { + projects: { connect: { projectId } }, + users: { connect: { userId } }, + jobTitles: { create: { label: 'Member' } }, + }; const result = await getService(data); diff --git a/server/src/api/controllers/projects/update-member.ts b/server/src/api/controllers/projects/update-member.ts index 9d18b7363..515f1ac32 100644 --- a/server/src/api/controllers/projects/update-member.ts +++ b/server/src/api/controllers/projects/update-member.ts @@ -4,9 +4,9 @@ import type { Prisma } from '#prisma-models/index.js'; import getService from '#services/projects/update-member.ts'; const updateMemberController = async (_req: Request, res: Response) => { - const { userId, projectId } = _req.params; + const { userId, id } = _req.params; const userIdReal = parseInt(userId); - const projectIdReal = parseInt(projectId); + const projectIdReal = parseInt(id); if (isNaN(userIdReal) || isNaN(projectIdReal)) { const resBody: ApiResponse = { From f54c1e6ffc39136f970271f351e0e6cf7c87f593 Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Thu, 28 Aug 2025 11:17:25 -0400 Subject: [PATCH 031/322] updated project and profile image sources to use preloading logic --- client/src/components/Header.tsx | 20 +++++++++ client/src/components/ImageCarousel.tsx | 16 ++++++- .../components/Profile/ProfileEditButton.tsx | 4 +- .../src/components/Profile/tabs/AboutTab.tsx | 9 ++-- client/src/components/ProjectCarousel.tsx | 13 +++++- .../ProjectCreatorEditor/tabs/TeamTab.tsx | 42 +++++++++++++------ client/src/components/pages/NewProject.tsx | 26 +++++++++--- 7 files changed, 104 insertions(+), 26 deletions(-) diff --git a/client/src/components/Header.tsx b/client/src/components/Header.tsx index cafd2c3ce..2f28e9f06 100644 --- a/client/src/components/Header.tsx +++ b/client/src/components/Header.tsx @@ -20,6 +20,7 @@ import { sendPost } from '../functions/fetch'; import { ThemeIcon } from './ThemeIcon'; import { ThemeContext } from '../contexts/ThemeContext'; import { useLocation } from 'react-router-dom'; // Hook to access the current location +import profilePicture from '../../images/blue_frog.png'; //user utils import { getCurrentUsername } from '../api/users.ts'; @@ -136,6 +137,16 @@ export const Header = ({ dataSets, onSearch, hideSearchBar = false }) => { src={`${API_BASE}/images/profiles/${profileImg}`} id={'profile-img-icon'} className={'rounded'} + title={'Profile picture'} + // Cannot use usePreloadedImage function because this is in a callback + onLoad={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = `${API_BASE}/images/profiles/${profileImg}`; + }} + onError={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = profilePicture; + }} /> ) : ( { src={`${API_BASE}/images/profiles/${profileImg}`} className={'rounded'} alt={'profile'} + // Cannot use usePreloadedImage function because this is in a callback + onLoad={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = `${API_BASE}/images/profiles/${profileImg}`; + }} + onError={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = profilePicture; + }} /> ) : ( handleHover(false)} > {dataList.map((image, index) => { - const imageLink = runningServer ? `${API_BASE}/images/projects/${image}` : image; return (
- + {'project { + const projectImg = e.target as HTMLImageElement; + projectImg.src = `${API_BASE}/images/projects/${image}`; + }} + onError={(e) => { + const projectImg = e.target as HTMLImageElement; + projectImg.src = image; + }} + />
); })} diff --git a/client/src/components/Profile/ProfileEditButton.tsx b/client/src/components/Profile/ProfileEditButton.tsx index f98cacefb..ec5ae6ea5 100644 --- a/client/src/components/Profile/ProfileEditButton.tsx +++ b/client/src/components/Profile/ProfileEditButton.tsx @@ -1,6 +1,8 @@ import React, { useState, useEffect } from 'react'; import { PagePopup, openClosePopup } from '../PagePopup'; import { getByID } from '../../api/projects'; +import usePreloadedImage from '../../functions/imageLoad'; +import profilePicture from '../../images/blue_frog.png'; // import { Popup, PopupContent, PopupButton } from "../Popup"; // Unused because I got confused while trying to use it and couldn't get it to work @@ -59,7 +61,7 @@ const EditButton = ({ userData }) => { // const [currentPFPLink, setCurrentPFPLink] = useState(require(`../../../../server/images/profiles/${userData.profile_image}`)); const [currentPFPLink, setCurrentPFPLink] = useState( - `${API_BASE}/images/profiles/${userData.profileImage}` + usePreloadedImage(`${API_BASE}/images/profiles/${userData.profileImage}`, profilePicture) ); const [currentFirstName, setCurrentFirstName] = useState(userData.firstName); const [currentLastName, setCurrentLastName] = useState(userData.lastName); diff --git a/client/src/components/Profile/tabs/AboutTab.tsx b/client/src/components/Profile/tabs/AboutTab.tsx index a190151af..9c37f3a19 100644 --- a/client/src/components/Profile/tabs/AboutTab.tsx +++ b/client/src/components/Profile/tabs/AboutTab.tsx @@ -3,6 +3,8 @@ import { ProfileData } from '../ProfileEditPopup'; import { RoleSelector } from '../../RoleSelector'; import { MajorSelector } from '../../MajorSelector'; import { ImageUploader } from '../../ImageUploader'; +import profilePicture from '../../images/blue_frog.png'; +import usePreloadedImage from '../../../functions/imageLoad'; //backend base url for getting images const API_BASE = `http://localhost:8081`; @@ -85,7 +87,7 @@ export const AboutTab = ({profile, selectedImageFile, setSelectedImageFile}: { }) => { // Preview URL for profile image - const [previewUrl, setPreviewUrl] = useState(`${API_BASE}/images/profiles/${profile.profile_image}`); + const [previewUrl, setPreviewUrl] = useState(usePreloadedImage(`${API_BASE}/images/profiles/${profile.profile_image}`, profilePicture)); // Effects // Set up profile input on first load @@ -103,9 +105,10 @@ export const AboutTab = ({profile, selectedImageFile, setSelectedImageFile}: { setPreviewUrl(imgLink); return () => URL.revokeObjectURL(imgLink); } else { - setPreviewUrl(`${API_BASE}/images/profiles/${profile.profile_image}`); + // Maintain original preview URL + setPreviewUrl(previewUrl); } -}, [selectedImageFile, profile.profile_image]); +}, [selectedImageFile, profile.profile_image, previewUrl]); // Set new image when one is picked from uploader const handleFileSelected = (file: File) => { diff --git a/client/src/components/ProjectCarousel.tsx b/client/src/components/ProjectCarousel.tsx index 8674548a0..b2072a26e 100644 --- a/client/src/components/ProjectCarousel.tsx +++ b/client/src/components/ProjectCarousel.tsx @@ -24,7 +24,18 @@ export const ProjectCarousel = ({ project }: { project: ProjectData }) => { console.log(imageData); return ( - + { + const projectImg = e.target as HTMLImageElement; + projectImg.src = `${API_BASE}/images/projects/${imageData.image}`; + }} + onError={(e) => { + const projectImg = e.target as HTMLImageElement; + projectImg.src = placeholderThumbnail; + }} + /> ); }); } diff --git a/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx b/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx index 01bb32f6f..76cbbba6d 100644 --- a/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx +++ b/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx @@ -7,6 +7,7 @@ import { Dropdown, DropdownButton, DropdownContent } from "../../Dropdown"; import { ThemeIcon } from "../../ThemeIcon"; import { Select, SelectButton, SelectOptions } from "../../Select"; import { current } from "@reduxjs/toolkit"; +import usePreloadedImage from "../../../functions/imageLoad"; //backend base url for getting images const API_BASE = `http://localhost:8081`; @@ -562,13 +563,18 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se profile { - const profileImg = e.target as HTMLImageElement; - profileImg.src = profileImage; - }} + // Cannot use usePreloadedImage function because this is in a callback + onLoad={() => { + const profileImg = document.getElementById(`profile-image-${m.userId}`) as HTMLImageElement; + profileImg.src = `${API_BASE}/images/profiles/${m.profileImage}`; + }} + onError={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = profileImage; + }} /> {m.firstName} {m.lastName} @@ -796,9 +802,14 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se markup: ( <> profile { + const profileImg = e.target as HTMLImageElement; + profileImg.src = `${API_BASE}/images/profiles/${profileImg}`; + }} onError={(e) => { const profileImg = e.target as HTMLImageElement; profileImg.src = profileImage; @@ -901,13 +912,18 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se
profile image { - const profileImg = e.target as HTMLImageElement; - profileImg.src = profileImage; - }} + title={'Profile picture'} + // Cannot use usePreloadedImage function because this is in a callback + onLoad={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = `${API_BASE}/images/profiles/${profileImg}`; + }} + onError={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = profileImage; + }} />
diff --git a/client/src/components/pages/NewProject.tsx b/client/src/components/pages/NewProject.tsx index 7c6c4042c..7e3d9f87a 100644 --- a/client/src/components/pages/NewProject.tsx +++ b/client/src/components/pages/NewProject.tsx @@ -29,6 +29,7 @@ import { ThemeIcon } from '../ThemeIcon'; import { sendPost, sendDelete } from '../../functions/fetch'; import { getByID } from '../../api/projects'; import { getAccountInformation } from '../../api/users'; +import usePreloadedImage from '../../functions/imageLoad'; //backend base url for getting images const API_BASE = `http://localhost:8081`; @@ -95,6 +96,10 @@ const defaultProject = runningServer ], }; +function useProfileImage(user) { + return usePreloadedImage(`${API_BASE}/images/profiles/${user.profileImage}`, profilePicture); +} + //Main component for the project page const NewProject = () => { //Navigation hook @@ -344,17 +349,26 @@ const NewProject = () => { ); } - //FIXME: get profile image from API call - const imgSrc = (user.profileImage) ? `${API_BASE}/images/profiles/${user.profileImage}` : profilePicture; - //const imgSrc = profilePicture; // temporary - return (
navigate(`${paths.routes.NEWPROFILE}?userID=${user.userId}`)} > - contributor profile + contributor profile { + const profileImg = e.target as HTMLImageElement; + profileImg.src = `${API_BASE}/images/profiles/${user.profileImage}`; + }} + onError={(e) => { + const profileImg = e.target as HTMLImageElement; + profileImg.src = profileImage; + }} + />
{user.firstName} {user.lastName} @@ -376,7 +390,7 @@ const NewProject = () => { projectContributors.length > 0 ? ( <> {projectContributors.map((user) => { - const imgSrc = (user.profileImage) ? `${API_BASE}/images/profiles/${user.profileImage}` : profilePicture; + const imgSrc = useProfileImage(user); return (
Date: Thu, 28 Aug 2025 11:34:48 -0400 Subject: [PATCH 032/322] fixed broken imports --- client/src/components/Header.tsx | 2 +- client/src/components/Profile/tabs/AboutTab.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/Header.tsx b/client/src/components/Header.tsx index 2f28e9f06..75ecf3ce8 100644 --- a/client/src/components/Header.tsx +++ b/client/src/components/Header.tsx @@ -20,7 +20,7 @@ import { sendPost } from '../functions/fetch'; import { ThemeIcon } from './ThemeIcon'; import { ThemeContext } from '../contexts/ThemeContext'; import { useLocation } from 'react-router-dom'; // Hook to access the current location -import profilePicture from '../../images/blue_frog.png'; +import profilePicture from '../images/blue_frog.png'; //user utils import { getCurrentUsername } from '../api/users.ts'; diff --git a/client/src/components/Profile/tabs/AboutTab.tsx b/client/src/components/Profile/tabs/AboutTab.tsx index 9c37f3a19..0ea523168 100644 --- a/client/src/components/Profile/tabs/AboutTab.tsx +++ b/client/src/components/Profile/tabs/AboutTab.tsx @@ -3,7 +3,7 @@ import { ProfileData } from '../ProfileEditPopup'; import { RoleSelector } from '../../RoleSelector'; import { MajorSelector } from '../../MajorSelector'; import { ImageUploader } from '../../ImageUploader'; -import profilePicture from '../../images/blue_frog.png'; +import profilePicture from '../../../images/blue_frog.png'; import usePreloadedImage from '../../../functions/imageLoad'; //backend base url for getting images From 0275fa5d4a5ded5de22589c4b49980241f6ac070 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 12:46:49 -0400 Subject: [PATCH 033/322] fixed Users table to remove JobTitle --- server/prisma/schema.prisma | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 9ebabb864..3e3572ae2 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -238,10 +238,8 @@ model Users { userFollowingsUserFollowingsUserIdTousers UserFollowings[] @relation("user_followings_user_idTousers") userSkills UserSkills[] userSocials UserSocials[] - jobTitles JobTitles? @relation(fields: [jobTitleId], references: [titleId], onDelete: Restrict, map: "FK_users_job_titles") majors Majors? @relation(fields: [majorId], references: [majorId], onDelete: Restrict, map: "FK_users_majors") - @@index([jobTitleId], map: "FK_users_job_titles") @@index([majorId], map: "FK_users_majors") @@map("users") } From 2697606d632d1ecd0e965bf435c534fe05c41ae3 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Aug 2025 12:48:23 -0400 Subject: [PATCH 034/322] merge changes --- server/docs/swagger.yaml | 3 ++- server/prisma/schema.prisma | 2 +- server/src/app.ts | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 1d25a839f..0acb3c658 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -6,7 +6,6 @@ info: LFG API Documentation. This will showcase all the endpoints available and how to use them. Note: When accessed directly from the express app, the endpoints will have an additional "/api" prefix. Because of this, please use the vite proxy when reviewing the docs. - paths: # DATASETS /api/datasets/job-titles: @@ -403,6 +402,8 @@ paths: summary: Updates user profile information tags: - Me + x-middleware: + - injectCurrentUser security: - shibbolethAuth: [] parameters: diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 9ebabb864..72abbc956 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -220,7 +220,7 @@ model Users { profileImage String? @map("profile_image") @db.VarChar(100) headline String? @db.VarChar(100) pronouns String? @db.Text - title String? @db.VarChar(50) + title String? @db.VarChar(50) majorId Int? @map("major_id") academicYear UsersAcademicYear? @map("academic_year") location String? @db.VarChar(150) diff --git a/server/src/app.ts b/server/src/app.ts index 49e6ee461..95ac8b79b 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -17,7 +17,6 @@ if (envConfig.env === 'development') { const swaggerUi = (await import('swagger-ui-express')).default; const yaml = (await import('yamljs')).default; type JsonObject = typeof import('swagger-ui-express'); - const doc = yaml.load('./docs/swagger.yaml') as JsonObject; app.use('/docs', swaggerUi.serve, swaggerUi.setup(doc)); From a9fefa0a3a4e2bf2a4120ff01a826e482b22f103 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 12:49:15 -0400 Subject: [PATCH 035/322] Remove Users array from JobTitles db table --- server/prisma/schema.prisma | 1 - 1 file changed, 1 deletion(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 3e3572ae2..c27930aa0 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -21,7 +21,6 @@ model JobTitles { label String @db.VarChar(50) jobs Jobs[] members Members[] - users Users[] @@map("job_titles") } From 2381912205c5bd3146cd50fc48ead072c3a76955 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Thu, 28 Aug 2025 12:49:59 -0400 Subject: [PATCH 036/322] changed jobTitleId to title for users --- server/prisma/schema.prisma | 2 +- server/src/services/me/get-user-acc.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 9ebabb864..6737da241 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -220,7 +220,7 @@ model Users { profileImage String? @map("profile_image") @db.VarChar(100) headline String? @db.VarChar(100) pronouns String? @db.Text - title String? @db.VarChar(50) + title String? @db.VarChar(50) majorId Int? @map("major_id") academicYear UsersAcademicYear? @map("academic_year") location String? @db.VarChar(150) diff --git a/server/src/services/me/get-user-acc.ts b/server/src/services/me/get-user-acc.ts index f0e596df8..9d6ad00bf 100644 --- a/server/src/services/me/get-user-acc.ts +++ b/server/src/services/me/get-user-acc.ts @@ -20,7 +20,7 @@ export const getUserAccountService = async ( profileImage: true, headline: true, pronouns: true, - jobTitleId: true, + title: true, majorId: true, academicYear: true, location: true, From 88bf1fbfabbb3ed26ebed835a308b10881254e9b Mon Sep 17 00:00:00 2001 From: chum-bot Date: Thu, 28 Aug 2025 13:25:21 -0400 Subject: [PATCH 037/322] projects/profile is now gone --- server/src/api/routes/users.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/api/routes/users.ts b/server/src/api/routes/users.ts index 556cf7398..3823545b9 100644 --- a/server/src/api/routes/users.ts +++ b/server/src/api/routes/users.ts @@ -32,7 +32,7 @@ router.get('/search-email/:email', getUserByEmail); //router.put('/:id/profile-picture', requiresLogin, checkImageFile, updateProfilePicture); //Gets another user's projects -router.get('/:id/projects/profile', getOtherUserProjects); +router.get('/:id/projects/', getOtherUserProjects); //Gets projects user is following router.get('/:id/followings/projects', requiresLogin, getProjectsFollowing); From 105dcc848b739bb655199e2d59c98c949f32da05 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Aug 2025 13:46:51 -0400 Subject: [PATCH 038/322] added user put route to swagger --- server/docs/swagger.yaml | 309 ++++++++++++++++++++++----------------- 1 file changed, 171 insertions(+), 138 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 0acb3c658..3d8e9053f 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -360,141 +360,15 @@ paths: example: application/json '500': $ref: '#/components/responses/InternalServerError' - - /api/me: - get: - summary: Gets the current user by ID - tags: - - Me - security: - - shibbolethAuth: [] - parameters: - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user - responses: - '200': - description: A single user - content: - application/json: - schema: - type: object - properties: - status: - type: integer - example: 200 - error: - type: string - nullable: true - example: null - data: - $ref: '#/components/schemas/UserDetails' - memetype: - type: string - example: application/json - '500': - $ref: '#/components/responses/InternalServerError' - put: - summary: Updates user profile information + summary: Create a user tags: - - Me - x-middleware: - - injectCurrentUser - security: - - shibbolethAuth: [] - parameters: - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - firstName: - type: string - lastName: - type: string - headline: - type: string - pronouns: - type: string - jobTitleId: - type: integer - MajorId: - type: integer - academic_year: - type: string - enum: [Freshman, Sophmore, Junior, Senior, Graduate] - location: - type: string - funFact: - type: string - bio: - type: string - example: - firstName: Mistah - lastName: Bones - headline: Sigh.. - pronouns: they/them - jobTitleId: 1 - majorId: 2 - academic_year: Senior - location: Grave Yard - funFact: Bones - bio: AHHHHHHHH - - responses: - '200': - description: Update a single user - content: - application/json: - schema: - type: object - properties: - status: - type: integer - example: 200 - error: - type: string - nullable: true - example: null - data: - $ref: '#/components/schemas/UserDetails' - memetype: - type: string - example: application/json - '400': - $ref: '#/components/responses/BadRequest' - '404': - $ref: '#/components/responses/NotFound' - '500': - $ref: '#/components/responses/InternalServerError' - delete: - summary: Delete a user by ID - tags: - - Me + - Users security: - - shibbolethAuth: [] - parameters: - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user + shibbolethAuth: [] responses: - '200': - description: User successfully deleted + '201': + description: User Created content: application/json: schema: @@ -502,19 +376,20 @@ paths: properties: status: type: integer - example: 200 + example: 201 error: type: string nullable: true example: null data: - type: string - example: User deleted successfully + type: array + items: + $ref: '#/components/schemas/UserDetails' memetype: type: string example: application/json - '400': - $ref: '#/components/responses/BadRequest' + '409': + $ref: '#/components/responses/Conflict' '500': $ref: '#/components/responses/InternalServerError' @@ -955,6 +830,164 @@ paths: '500': $ref: '#/components/responses/InternalServerError' + # ME + /api/me: + get: + summary: Gets the current user by ID + tags: + - Me + security: + - shibbolethAuth: [] + parameters: + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + responses: + '200': + description: A single user + content: + application/json: + schema: + type: object + properties: + status: + type: integer + example: 200 + error: + type: string + nullable: true + example: null + data: + $ref: '#/components/schemas/UserDetails' + memetype: + type: string + example: application/json + '500': + $ref: '#/components/responses/InternalServerError' + + put: + summary: Updates user profile information + tags: + - Me + x-middleware: + - injectCurrentUser + security: + - shibbolethAuth: [] + parameters: + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + firstName: + type: string + lastName: + type: string + headline: + type: string + pronouns: + type: string + jobTitleId: + type: integer + MajorId: + type: integer + academic_year: + type: string + enum: [Freshman, Sophmore, Junior, Senior, Graduate] + location: + type: string + funFact: + type: string + bio: + type: string + example: + firstName: Mistah + lastName: Bones + headline: Sigh.. + pronouns: they/them + jobTitleId: 1 + majorId: 2 + academic_year: Senior + location: Grave Yard + funFact: Bones + bio: AHHHHHHHH + + responses: + '200': + description: Update a single user + content: + application/json: + schema: + type: object + properties: + status: + type: integer + example: 200 + error: + type: string + nullable: true + example: null + data: + $ref: '#/components/schemas/UserDetails' + memetype: + type: string + example: application/json + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' + delete: + summary: Delete a user by ID + tags: + - Me + security: + - shibbolethAuth: [] + parameters: + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + responses: + '200': + description: User successfully deleted + content: + application/json: + schema: + type: object + properties: + status: + type: integer + example: 200 + error: + type: string + nullable: true + example: null + data: + type: string + example: User deleted successfully + memetype: + type: string + example: application/json + '400': + $ref: '#/components/responses/BadRequest' + '500': + $ref: '#/components/responses/InternalServerError' + # PROJECTS /api/projects: get: @@ -1850,13 +1883,13 @@ components: pronouns: type: string nullable: true - jobTitle: + title: type: string nullable: true major: type: string nullable: true - academic_year: + academicYear: type: string nullable: true location: From ad3900dc4837aee96cda903c2b010def4ab5442f Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 13:53:11 -0400 Subject: [PATCH 039/322] add dev values for create user --- .../src/api/controllers/users/create-user.ts | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/server/src/api/controllers/users/create-user.ts b/server/src/api/controllers/users/create-user.ts index 05f7f62ba..97dae8f7e 100644 --- a/server/src/api/controllers/users/create-user.ts +++ b/server/src/api/controllers/users/create-user.ts @@ -6,14 +6,34 @@ import { lastNameHeaderKey, emailHeaderKey, } from '#config/constants.ts'; +import envConfig from '#config/env.ts'; import createUserService from '#services/users/create-user.ts'; import { getUserByUsernameService } from '#services/users/get-by-username.ts'; export const createUser = async (req: Request, res: Response): Promise => { const uid = parseInt(req.headers[uidHeaderKey] as string); - const firstName = req.headers[firstNameHeaderKey] as string | undefined; - const lastName = req.headers[lastNameHeaderKey] as string; - const email = req.headers[emailHeaderKey] as string; + let firstName = req.headers[firstNameHeaderKey] as string | undefined; + let lastName = req.headers[lastNameHeaderKey] as string; + let email = req.headers[emailHeaderKey] as string; + + if (envConfig.env === 'development' || envConfig.env === 'test') { + // Fudge values for development + const devFirstName = req.query.devFirstName as string | undefined; + const devLastName = req.query.devLastName as string | undefined; + const devEmail = req.query.devEmail as string | undefined; + + if (devFirstName) { + firstName = devFirstName; + } + + if (devLastName) { + lastName = devLastName; + } + + if (devEmail) { + email = devEmail; + } + } if (!uid || !firstName || !lastName || !email) { const resBody: ApiResponse = { From 5289eaf6e71de8404976ec3f49ebb00977c145a0 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 13:59:57 -0400 Subject: [PATCH 040/322] add dev query params to create user route --- server/src/api/controllers/users/create-user.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/server/src/api/controllers/users/create-user.ts b/server/src/api/controllers/users/create-user.ts index 97dae8f7e..7e143a788 100644 --- a/server/src/api/controllers/users/create-user.ts +++ b/server/src/api/controllers/users/create-user.ts @@ -11,16 +11,17 @@ import createUserService from '#services/users/create-user.ts'; import { getUserByUsernameService } from '#services/users/get-by-username.ts'; export const createUser = async (req: Request, res: Response): Promise => { - const uid = parseInt(req.headers[uidHeaderKey] as string); + let uid = parseInt(req.headers[uidHeaderKey] as string); let firstName = req.headers[firstNameHeaderKey] as string | undefined; let lastName = req.headers[lastNameHeaderKey] as string; let email = req.headers[emailHeaderKey] as string; if (envConfig.env === 'development' || envConfig.env === 'test') { - // Fudge values for development + /// Fudge for development const devFirstName = req.query.devFirstName as string | undefined; const devLastName = req.query.devLastName as string | undefined; const devEmail = req.query.devEmail as string | undefined; + const devUID = parseInt(req.query.devUID as string); if (devFirstName) { firstName = devFirstName; @@ -33,6 +34,10 @@ export const createUser = async (req: Request, res: Response): Promise => if (devEmail) { email = devEmail; } + + if (devUID && !isNaN(devUID)) { + uid = devUID; + } } if (!uid || !firstName || !lastName || !email) { From b77370b9a124e605e29f16374694e97b84832651 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Thu, 28 Aug 2025 14:02:48 -0400 Subject: [PATCH 041/322] added username checking to updateInfo --- server/src/api/controllers/me/update-info.ts | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/server/src/api/controllers/me/update-info.ts b/server/src/api/controllers/me/update-info.ts index b714931e8..c32dac66f 100644 --- a/server/src/api/controllers/me/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -2,6 +2,7 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { RequestHandler } from 'express'; import type { UsersAcademicYear } from '#prisma-models/index.js'; import { updateUserInfoService } from '#services/me/update-info.ts'; +import { getUserByUsernameService } from '#services/users/get-by-username.ts'; interface UpdateUserInfo { firstName?: string; @@ -81,6 +82,26 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI return; } + //check if username was updated, and only do this whole check if it was + if (updates['username']) { + const newUsername = updates['username']; + const userExist = await getUserByUsernameService(newUsername); + if ( + userExist !== 'NOT_FOUND' && + userExist !== 'INTERNAL_ERROR' && + userExist.userId !== userId + ) { + const resBody: ApiResponse = { + status: 409, + error: 'Username already taken', + data: null, + memetype: 'application/json', + }; + res.status(409).json(resBody); + return; + } + } + const result = await updateUserInfoService(userId, updates); if (result === 'NOT_FOUND') { From 60068aca6431c9448cbbd33e6c1a38606ef2fbec Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Aug 2025 14:03:07 -0400 Subject: [PATCH 042/322] added dev params to create user in swagger --- server/docs/swagger.yaml | 428 +++++++++++++++++++++------------------ 1 file changed, 228 insertions(+), 200 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 3d8e9053f..1621486dd 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -360,10 +360,38 @@ paths: example: application/json '500': $ref: '#/components/responses/InternalServerError' - put: + + /api/users/{username}: + post: summary: Create a user tags: - Users + parameters: + - in: query + name: devFirstName + required: false + schema: + type: integer + description: The first name to be used as the current first name + - in: query + name: devLastName + required: false + schema: + type: integer + description: The last name to be used as the current last name + - in: query + name: devEmail + required: false + schema: + type: integer + description: The email to be used as the current email + - in: query + name: devUID + required: false + schema: + type: integer + description: The UID to be used as the current UID + security: shibbolethAuth: [] responses: @@ -510,52 +538,6 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/me/projects: - get: - summary: Get current user's own projects - description: Returns the list of projects owned by the user identified by userID. - tags: - - Me - security: - - shibbolethAuth: [] - parameters: - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user - responses: - '200': - description: List of projects owned by the user - content: - application/json: - schema: - type: object - properties: - status: - type: integer - example: 200 - error: - type: string - nullable: true - example: null - data: - type: array - items: - $ref: '#/components/schemas/ProjectWithFollowers' - memetype: - type: string - example: application/json - '400': - $ref: '#/components/responses/BadRequest' - '404': - $ref: '#/components/responses/NotFound' - '401': - $ref: '#/components/responses/Unauthorized' - '500': - $ref: '#/components/responses/InternalServerError' - /api/users/{id}/projects/profile: get: summary: Get another user's projects @@ -632,82 +614,6 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/me/followings/projects/{id}: - post: - summary: Follow a project - security: - - shibbolethAuth: [] - tags: - - Me - parameters: - - name: id - in: path - required: true - description: ID of the project to follow - schema: - type: integer - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user - responses: - '201': - description: Project followed successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ProjectFollowingsResponse' - example: - status: 201 - error: null - data: - userId: 1 - projectId: 2 - followedAt: '2025-07-16T12:34:56Z' - - '400': - $ref: '#/components/responses/BadRequest' - '404': - $ref: '#/components/responses/NotFound' - '409': - $ref: '#/components/responses/Conflict' - '500': - $ref: '#/components/responses/InternalServerError' - delete: - summary: Unfollow a project - security: - - shibbolethAuth: [] - tags: - - Me - parameters: - - name: id - in: path - required: true - description: ID of the project to unfollow - schema: - type: integer - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user - responses: - '200': - description: Project unfollowed successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ProjectFollowingsResponse' - '400': - $ref: '#/components/responses/BadRequest' - '404': - $ref: '#/components/responses/NotFound' - '500': - $ref: '#/components/responses/InternalServerError' - /api/users/{id}/followings/people: get: tags: @@ -753,83 +659,6 @@ paths: '500': $ref: '#/components/responses/InternalServerError' - /api/me/followings/people/{id}: - post: - summary: Follow another user - security: - - shibbolethAuth: [] - tags: - - Me - parameters: - - name: id - in: path - required: true - description: ID of the user to be followed - schema: - type: integer - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user - responses: - '201': - description: User followed successfully - content: - application/json: - schema: - $ref: '#/components/schemas/UserFollowingsResponse' - example: - status: 201 - error: null - data: - userId: 1 - followingId: 2 - followedAt: '2025-07-16T12:34:56Z' - memetype: application/json - '400': - $ref: '#/components/responses/BadRequest' - '404': - $ref: '#/components/responses/NotFound' - '409': - $ref: '#/components/responses/Conflict' - '500': - $ref: '#/components/responses/InternalServerError' - - delete: - summary: Unfollow a user - security: - - shibbolethAuth: [] - tags: - - Me - parameters: - - name: id - in: path - required: true - description: ID of the user to be unfollowed - schema: - type: integer - - in: query - name: devId - schema: - type: integer - required: false - description: The user ID to be used as the current user - responses: - '200': - description: User unfollowed successfully - content: - application/json: - schema: - $ref: '#/components/schemas/UserFollowingsResponse' - '400': - $ref: '#/components/responses/BadRequest' - '404': - $ref: '#/components/responses/NotFound' - '500': - $ref: '#/components/responses/InternalServerError' - # ME /api/me: get: @@ -988,6 +817,205 @@ paths: '500': $ref: '#/components/responses/InternalServerError' + /api/me/projects: + get: + summary: Get current user's own projects + description: Returns the list of projects owned by the user identified by userID. + tags: + - Me + security: + - shibbolethAuth: [] + parameters: + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + responses: + '200': + description: List of projects owned by the user + content: + application/json: + schema: + type: object + properties: + status: + type: integer + example: 200 + error: + type: string + nullable: true + example: null + data: + type: array + items: + $ref: '#/components/schemas/ProjectWithFollowers' + memetype: + type: string + example: application/json + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/InternalServerError' + + /api/me/followings/projects/{id}: + post: + summary: Follow a project + security: + - shibbolethAuth: [] + tags: + - Me + parameters: + - name: id + in: path + required: true + description: ID of the project to follow + schema: + type: integer + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + responses: + '201': + description: Project followed successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectFollowingsResponse' + example: + status: 201 + error: null + data: + userId: 1 + projectId: 2 + followedAt: '2025-07-16T12:34:56Z' + + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/InternalServerError' + delete: + summary: Unfollow a project + security: + - shibbolethAuth: [] + tags: + - Me + parameters: + - name: id + in: path + required: true + description: ID of the project to unfollow + schema: + type: integer + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + responses: + '200': + description: Project unfollowed successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectFollowingsResponse' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' + + /api/me/followings/people/{id}: + post: + summary: Follow another user + security: + - shibbolethAuth: [] + tags: + - Me + parameters: + - name: id + in: path + required: true + description: ID of the user to be followed + schema: + type: integer + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + responses: + '201': + description: User followed successfully + content: + application/json: + schema: + $ref: '#/components/schemas/UserFollowingsResponse' + example: + status: 201 + error: null + data: + userId: 1 + followingId: 2 + followedAt: '2025-07-16T12:34:56Z' + memetype: application/json + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/InternalServerError' + + delete: + summary: Unfollow a user + security: + - shibbolethAuth: [] + tags: + - Me + parameters: + - name: id + in: path + required: true + description: ID of the user to be unfollowed + schema: + type: integer + - in: query + name: devId + schema: + type: integer + required: false + description: The user ID to be used as the current user + responses: + '200': + description: User unfollowed successfully + content: + application/json: + schema: + $ref: '#/components/schemas/UserFollowingsResponse' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' + # PROJECTS /api/projects: get: From 5b481a9a601bc3b9e28728530bc4fdb59466cfeb Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 14:04:04 -0400 Subject: [PATCH 043/322] make uid required in Users table --- server/prisma/schema.prisma | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index b29e575f2..1af2b4560 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -16,8 +16,8 @@ model Genres { @@map("genres") } -model JobTitles { - titleId Int @id @default(autoincrement()) @map("title_id") +model Roles { + roleId Int @id @default(autoincrement()) @map("title_id") label String @db.VarChar(50) jobs Jobs[] members Members[] @@ -27,7 +27,7 @@ model JobTitles { model Jobs { projectId Int @map("project_id") - titleId Int @map("title_id") + roleId Int @map("title_id") availability JobsAvailability duration JobsDuration location JobsLocation @@ -36,11 +36,11 @@ model Jobs { createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) projects Projects @relation(fields: [projectId], references: [projectId], onDelete: Cascade, map: "FK2_project_id") - jobTitles JobTitles @relation(fields: [titleId], references: [titleId], map: "FK_jobs_job_titles") + roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_jobs_job_titles") - @@id([projectId, titleId]) + @@id([projectId, roleId]) @@index([projectId], map: "FK2_project_id") - @@index([titleId], map: "FK_jobs_job_titles") + @@index([roleId], map: "FK_jobs_job_titles") @@map("jobs") } @@ -55,15 +55,15 @@ model Majors { model Members { projectId Int @map("project_id") userId Int @map("user_id") - titleId Int @map("title_id") + roleId Int @map("title_id") profileVisibility MembersProfileVisibility @default(public) @map("profile_visibility") createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) - jobTitles JobTitles @relation(fields: [titleId], references: [titleId], map: "FK_members_job_titles") + roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_members_job_titles") projects Projects @relation(fields: [projectId], references: [projectId], onDelete: Cascade, map: "FK_members_projects") users Users @relation(fields: [userId], references: [userId], onDelete: Cascade, map: "FK_members_users") @@id([projectId, userId]) - @@index([titleId], map: "FK_members_job_titles") + @@index([roleId], map: "FK_members_job_titles") @@index([userId], map: "FK_members_users") @@map("members") } @@ -229,7 +229,7 @@ model Users { createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) phoneNumber Int? @map("phone_number") - universityId String? @unique(map: "university_id_UNIQUE") @map("university_id") @db.VarChar(9) + universityId String @unique(map: "university_id_UNIQUE") @map("university_id") @db.VarChar(9) members Members[] projectFollowings ProjectFollowings[] projects Projects[] From b18c509245f0552a2467a998a3731f2b6e14e43a Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Aug 2025 14:10:43 -0400 Subject: [PATCH 044/322] fixed swagger param type mismatches --- server/docs/swagger.yaml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 1621486dd..9071042d1 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -367,20 +367,26 @@ paths: tags: - Users parameters: + - in: path + name: Username + required: true + schema: + type: string + description: Username - in: query name: devFirstName required: false schema: - type: integer + type: string description: The first name to be used as the current first name - in: query name: devLastName required: false schema: - type: integer + type: string description: The last name to be used as the current last name - in: query - name: devEmail + name: string required: false schema: type: integer From 648a37c7e1db7873fa325361baea28cfe619004a Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 14:14:41 -0400 Subject: [PATCH 045/322] correct all user titles --- server/src/services/helpers/userTransform.ts | 4 ++-- server/src/services/users/get-all-users.ts | 4 +--- server/src/services/users/get-by-id.ts | 4 +--- shared/types.d.ts | 22 ++++++++++---------- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/server/src/services/helpers/userTransform.ts b/server/src/services/helpers/userTransform.ts index a633eb895..fb87495f3 100644 --- a/server/src/services/helpers/userTransform.ts +++ b/server/src/services/helpers/userTransform.ts @@ -15,7 +15,7 @@ const sampleUsers = prisma.users.findMany({ academicYear: true, location: true, funFact: true, - jobTitles: { select: { label: true } }, + title: true, majors: { select: { label: true } }, userSkills: { select: { @@ -46,7 +46,7 @@ export const transformUser = (user: UsersGetPayload): UserDetail => { academicYear: user.academicYear, location: user.location, funFact: user.funFact, - jobTitle: user.jobTitles?.label ?? null, + title: user.title, major: user.majors?.label ?? null, skills: user.userSkills.length > 0 diff --git a/server/src/services/users/get-all-users.ts b/server/src/services/users/get-all-users.ts index 10595c0c3..4755e5278 100644 --- a/server/src/services/users/get-all-users.ts +++ b/server/src/services/users/get-all-users.ts @@ -21,9 +21,7 @@ export const getAllUsersService = async (): Promise Date: Thu, 28 Aug 2025 14:24:13 -0400 Subject: [PATCH 046/322] fixed response body in create user --- server/docs/swagger.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 9071042d1..74cd0852b 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -389,7 +389,7 @@ paths: name: string required: false schema: - type: integer + type: string description: The email to be used as the current email - in: query name: devUID @@ -418,7 +418,11 @@ paths: data: type: array items: - $ref: '#/components/schemas/UserDetails' + type: object + properties: + username: + type: string + example: User01 memetype: type: string example: application/json From 77dc2c081e593efb9fa2ce69cc7f1f742df7f5f1 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Thu, 28 Aug 2025 14:30:48 -0400 Subject: [PATCH 047/322] username changed to take from the request body --- server/src/api/controllers/users/create-user.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/api/controllers/users/create-user.ts b/server/src/api/controllers/users/create-user.ts index 7e143a788..74ed552dd 100644 --- a/server/src/api/controllers/users/create-user.ts +++ b/server/src/api/controllers/users/create-user.ts @@ -51,7 +51,8 @@ export const createUser = async (req: Request, res: Response): Promise => return; } - const username = req.params.username; + const data = req.body as { username: string }; + const username = data.username; const userExist = await getUserByUsernameService(username); if (userExist !== 'NOT_FOUND' && userExist !== 'INTERNAL_ERROR' && userExist.userId !== uid) { From a405a50d406cd0036b68bee0d7df24c2bc9cd135 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Aug 2025 14:41:54 -0400 Subject: [PATCH 048/322] got create user in swagger to hit the endpoint --- server/docs/swagger.yaml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 74cd0852b..41c1be0bf 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -360,19 +360,21 @@ paths: example: application/json '500': $ref: '#/components/responses/InternalServerError' - - /api/users/{username}: post: summary: Create a user tags: - Users + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + username: + type: string + example: User01 parameters: - - in: path - name: Username - required: true - schema: - type: string - description: Username - in: query name: devFirstName required: false @@ -397,7 +399,6 @@ paths: schema: type: integer description: The UID to be used as the current UID - security: shibbolethAuth: [] responses: From ab6c8f9faa733b5f49af20860449fda59a5c6b6d Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 14:44:12 -0400 Subject: [PATCH 049/322] fix role ids in db tables --- server/prisma/schema.prisma | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 1af2b4560..4904647f0 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -17,17 +17,17 @@ model Genres { } model Roles { - roleId Int @id @default(autoincrement()) @map("title_id") + roleId Int @id @default(autoincrement()) @map("role_id") label String @db.VarChar(50) jobs Jobs[] members Members[] - @@map("job_titles") + @@map("roles") } model Jobs { projectId Int @map("project_id") - roleId Int @map("title_id") + roleId Int @map("role_id") availability JobsAvailability duration JobsDuration location JobsLocation @@ -36,11 +36,11 @@ model Jobs { createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) projects Projects @relation(fields: [projectId], references: [projectId], onDelete: Cascade, map: "FK2_project_id") - roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_jobs_job_titles") + roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_jobs_roles") @@id([projectId, roleId]) @@index([projectId], map: "FK2_project_id") - @@index([roleId], map: "FK_jobs_job_titles") + @@index([roleId], map: "FK_jobs_roles") @@map("jobs") } @@ -55,15 +55,15 @@ model Majors { model Members { projectId Int @map("project_id") userId Int @map("user_id") - roleId Int @map("title_id") + roleId Int @map("role_id") profileVisibility MembersProfileVisibility @default(public) @map("profile_visibility") createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) - roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_members_job_titles") + roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_members_roles") projects Projects @relation(fields: [projectId], references: [projectId], onDelete: Cascade, map: "FK_members_projects") users Users @relation(fields: [userId], references: [userId], onDelete: Cascade, map: "FK_members_users") @@id([projectId, userId]) - @@index([roleId], map: "FK_members_job_titles") + @@index([roleId], map: "FK_members_roles") @@index([userId], map: "FK_members_users") @@map("members") } From 6c4b6e81455b621f530eb6ddd1aa8865f62ebc62 Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Aug 2025 14:51:22 -0400 Subject: [PATCH 050/322] changed param types for create user in swagger --- server/docs/swagger.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 41c1be0bf..94634f1b3 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -388,7 +388,7 @@ paths: type: string description: The last name to be used as the current last name - in: query - name: string + name: devEmail required: false schema: type: string @@ -397,7 +397,7 @@ paths: name: devUID required: false schema: - type: integer + type: string description: The UID to be used as the current UID security: shibbolethAuth: [] From 71ae482b901931ec754ebb142393a32575f6f24c Mon Sep 17 00:00:00 2001 From: chum-bot Date: Thu, 28 Aug 2025 15:08:40 -0400 Subject: [PATCH 051/322] moved get-username into me because it only gets the current user --- .../api/controllers/{users => projects}/get-username-shib.ts | 2 +- server/src/api/middleware/inject-current-user.ts | 2 +- server/src/api/routes/me.ts | 4 ++++ server/src/api/routes/users.ts | 5 ----- server/src/services/{users => me}/get-user-shib.ts | 0 5 files changed, 6 insertions(+), 7 deletions(-) rename server/src/api/controllers/{users => projects}/get-username-shib.ts (94%) rename server/src/services/{users => me}/get-user-shib.ts (100%) diff --git a/server/src/api/controllers/users/get-username-shib.ts b/server/src/api/controllers/projects/get-username-shib.ts similarity index 94% rename from server/src/api/controllers/users/get-username-shib.ts rename to server/src/api/controllers/projects/get-username-shib.ts index b041ad13c..4626c76bd 100644 --- a/server/src/api/controllers/users/get-username-shib.ts +++ b/server/src/api/controllers/projects/get-username-shib.ts @@ -1,7 +1,7 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; import { uidHeaderKey } from '#config/constants.ts'; -import { getUserByShibService } from '#services/users/get-user-shib.ts'; +import { getUserByShibService } from '#services/me/get-user-shib.ts'; //get username by shibbolth export const getUsernameByShib = async (req: Request, res: Response): Promise => { diff --git a/server/src/api/middleware/inject-current-user.ts b/server/src/api/middleware/inject-current-user.ts index a3b17f035..f60e7a940 100644 --- a/server/src/api/middleware/inject-current-user.ts +++ b/server/src/api/middleware/inject-current-user.ts @@ -3,7 +3,7 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { NextFunction, Request, Response } from 'express'; import { uidHeaderKey } from '#config/constants.ts'; import envConfig from '#config/env.ts'; -import { getUserByShibService } from '#services/users/get-user-shib.ts'; +import { getUserByShibService } from '#services/me/get-user-shib.ts'; const injectCurrentUser = async (request: Request, response: Response, next: NextFunction) => { if (envConfig.env === 'development' || envConfig.env === 'test') { diff --git a/server/src/api/routes/me.ts b/server/src/api/routes/me.ts index 82a67e2a6..e45729b45 100644 --- a/server/src/api/routes/me.ts +++ b/server/src/api/routes/me.ts @@ -7,6 +7,7 @@ import { deleteUser } from '#controllers/me/delete-user.ts'; import { getAccount } from '#controllers/me/get-acc.ts'; import { getMyProjects } from '#controllers/me/get-my-proj.ts'; import { updateUserInfo } from '#controllers/me/update-info.ts'; +import { getUsernameByShib } from '#controllers/projects/get-username-shib.ts'; import injectCurrentUser from '../middleware/inject-current-user.ts'; import requiresLogin from '../middleware/requires-login.ts'; @@ -15,6 +16,9 @@ const router = Router(); //All routes use requiresLogin and injectCurrentUser router.use(requiresLogin, injectCurrentUser); +//Gets username by shib ID +router.get('/get-username', requiresLogin, getUsernameByShib); + //Gets user's account router.get('/', getAccount); diff --git a/server/src/api/routes/users.ts b/server/src/api/routes/users.ts index 3823545b9..d0575b9ae 100644 --- a/server/src/api/routes/users.ts +++ b/server/src/api/routes/users.ts @@ -7,15 +7,10 @@ import { getUserByUsername } from '#controllers/users/get-by-username.ts'; import { getProjectsFollowing } from '#controllers/users/get-proj-following.ts'; import { getUserFollowing } from '#controllers/users/get-user-following.ts'; import { getOtherUserProjects } from '#controllers/users/get-user-proj.ts'; -import { getUsernameByShib } from '#controllers/users/get-username-shib.ts'; import requiresLogin from '../middleware/requires-login.ts'; const router = Router(); -//Gets username by shib ID -router.get('/get-username', requiresLogin, getUsernameByShib); -//formerly get-username-session - //Gets users router.get('/', getAllUsers); diff --git a/server/src/services/users/get-user-shib.ts b/server/src/services/me/get-user-shib.ts similarity index 100% rename from server/src/services/users/get-user-shib.ts rename to server/src/services/me/get-user-shib.ts From dd1fb0ec79df9787ebc0b75f1da7338dc471581f Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 15:09:02 -0400 Subject: [PATCH 052/322] fix create user --- server/src/api/controllers/users/create-user.ts | 8 ++++---- server/src/services/users/create-user.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/api/controllers/users/create-user.ts b/server/src/api/controllers/users/create-user.ts index 74ed552dd..4a61f3fcb 100644 --- a/server/src/api/controllers/users/create-user.ts +++ b/server/src/api/controllers/users/create-user.ts @@ -11,7 +11,7 @@ import createUserService from '#services/users/create-user.ts'; import { getUserByUsernameService } from '#services/users/get-by-username.ts'; export const createUser = async (req: Request, res: Response): Promise => { - let uid = parseInt(req.headers[uidHeaderKey] as string); + let uid = req.headers[uidHeaderKey] as string; let firstName = req.headers[firstNameHeaderKey] as string | undefined; let lastName = req.headers[lastNameHeaderKey] as string; let email = req.headers[emailHeaderKey] as string; @@ -21,7 +21,7 @@ export const createUser = async (req: Request, res: Response): Promise => const devFirstName = req.query.devFirstName as string | undefined; const devLastName = req.query.devLastName as string | undefined; const devEmail = req.query.devEmail as string | undefined; - const devUID = parseInt(req.query.devUID as string); + const devUID = req.query.devUID as string | undefined; if (devFirstName) { firstName = devFirstName; @@ -35,7 +35,7 @@ export const createUser = async (req: Request, res: Response): Promise => email = devEmail; } - if (devUID && !isNaN(devUID)) { + if (devUID) { uid = devUID; } } @@ -55,7 +55,7 @@ export const createUser = async (req: Request, res: Response): Promise => const username = data.username; const userExist = await getUserByUsernameService(username); - if (userExist !== 'NOT_FOUND' && userExist !== 'INTERNAL_ERROR' && userExist.userId !== uid) { + if (userExist !== 'NOT_FOUND' && userExist !== 'INTERNAL_ERROR') { const resBody: ApiResponse = { status: 409, error: 'Username already taken', diff --git a/server/src/services/users/create-user.ts b/server/src/services/users/create-user.ts index 85f7d5dc1..35904ba76 100644 --- a/server/src/services/users/create-user.ts +++ b/server/src/services/users/create-user.ts @@ -6,7 +6,7 @@ import type { ServiceErrorSubset } from '#services/service-error.ts'; type CreateUserServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'CONFLICT'>; const createUserService = async ( - uid: number, + uid: string, username: string, firstName: string, lastName: string, From edac434ed934521c8e7a4e9504fe18addef66387 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 15:30:03 -0400 Subject: [PATCH 053/322] rename job titles dataset to roles dataset --- server/src/api/controllers/datasets/get-job-titles.ts | 2 +- .../services/datasets/{get-job-titles.ts => get-roles.ts} | 6 +++--- shared/types.d.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename server/src/services/datasets/{get-job-titles.ts => get-roles.ts} (64%) diff --git a/server/src/api/controllers/datasets/get-job-titles.ts b/server/src/api/controllers/datasets/get-job-titles.ts index 3a8bae6c1..fd0810962 100644 --- a/server/src/api/controllers/datasets/get-job-titles.ts +++ b/server/src/api/controllers/datasets/get-job-titles.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import getJobTitlesService from '#services/datasets/get-job-titles.ts'; +import getJobTitlesService from '#services/datasets/get-roles.ts'; const getJobTitlesController = async (_request: Request, response: Response): Promise => { const result = await getJobTitlesService(); diff --git a/server/src/services/datasets/get-job-titles.ts b/server/src/services/datasets/get-roles.ts similarity index 64% rename from server/src/services/datasets/get-job-titles.ts rename to server/src/services/datasets/get-roles.ts index ae9dfb567..5b963422a 100644 --- a/server/src/services/datasets/get-job-titles.ts +++ b/server/src/services/datasets/get-roles.ts @@ -1,12 +1,12 @@ +import type { Role } from '@looking-for-group/shared'; import prisma from '#config/prisma.ts'; import type { ServiceErrorSubset } from '#services/service-error.ts'; -import type { JobTitle } from '../../../../shared/types.ts'; type GetJobTitlesServiceError = ServiceErrorSubset<'INTERNAL_ERROR'>; -const getJobTitlesService = async (): Promise => { +const getJobTitlesService = async (): Promise => { try { - return await prisma.jobTitles.findMany(); + return await prisma.roles.findMany(); } catch (e) { console.error(`Error in getJobTitlesService: ${JSON.stringify(e)}`); diff --git a/shared/types.d.ts b/shared/types.d.ts index 22911442d..9b3b49c01 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -43,8 +43,8 @@ export interface ApiResponse<_data = any> { // DATASETS -export interface JobTitle { - titleId: number; +export interface Role { + roleId: number; label: string; } From 2048aaf23f25b827b990e3013cd213a9dd1bf702 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 15:31:08 -0400 Subject: [PATCH 054/322] rename job titles route to roles --- .../datasets/{get-job-titles.ts => get-roles.ts} | 4 ++-- server/src/api/routes/datasets.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename server/src/api/controllers/datasets/{get-job-titles.ts => get-roles.ts} (82%) diff --git a/server/src/api/controllers/datasets/get-job-titles.ts b/server/src/api/controllers/datasets/get-roles.ts similarity index 82% rename from server/src/api/controllers/datasets/get-job-titles.ts rename to server/src/api/controllers/datasets/get-roles.ts index fd0810962..fbae75607 100644 --- a/server/src/api/controllers/datasets/get-job-titles.ts +++ b/server/src/api/controllers/datasets/get-roles.ts @@ -2,7 +2,7 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; import getJobTitlesService from '#services/datasets/get-roles.ts'; -const getJobTitlesController = async (_request: Request, response: Response): Promise => { +const getRolesController = async (_request: Request, response: Response): Promise => { const result = await getJobTitlesService(); if (result === 'INTERNAL_ERROR') { @@ -25,4 +25,4 @@ const getJobTitlesController = async (_request: Request, response: Response): Pr response.status(200).json(resBody); }; -export default getJobTitlesController; +export default getRolesController; diff --git a/server/src/api/routes/datasets.ts b/server/src/api/routes/datasets.ts index 3e887d83f..371a89209 100644 --- a/server/src/api/routes/datasets.ts +++ b/server/src/api/routes/datasets.ts @@ -1,15 +1,15 @@ import { Router } from 'express'; -import getJobTitlesController from '#controllers/datasets/get-job-titles.ts'; import getMajorsController from '#controllers/datasets/get-majors.ts'; import getProjectTypesController from '#controllers/datasets/get-project-genres.ts'; +import getRolesController from '#controllers/datasets/get-roles.ts'; import getSkillsController from '#controllers/datasets/get-skills.ts'; import getSocialsController from '#controllers/datasets/get-socials.ts'; import getTagsController from '#controllers/datasets/get-tags.ts'; const router = Router(); -//Receives list of all job-titles -router.get('/job-titles', getJobTitlesController); +//Receives list of all roles +router.get('/roles', getRolesController); //Receives list of all skills router.get('/skills', getSkillsController); From ff782f14290b5f0b8b4bea4e06caab9259cf6af8 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 15:33:00 -0400 Subject: [PATCH 055/322] update Job and Member types to rename title to role --- shared/types.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/types.d.ts b/shared/types.d.ts index 9b3b49c01..a4bb0541f 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -198,7 +198,7 @@ export interface ProjectTag { export interface Member { projectId: number; userId: number; - titleId: number; + roleId: number; //permission: number; } @@ -241,7 +241,7 @@ export interface ProjectWithFollowers extends Project { //Jobs for projects export interface Job { projectId: number; - titleId: number; + roleId: number; availability: string; duration: string; location: string; From c14975c34ff6d454a3aec3f2af91433af003db4f Mon Sep 17 00:00:00 2001 From: Michael Robinson Date: Thu, 28 Aug 2025 15:38:45 -0400 Subject: [PATCH 056/322] changed jobTitle to title and role in swagger --- server/docs/swagger.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 94634f1b3..040b8b7e8 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -8,14 +8,14 @@ info: Because of this, please use the vite proxy when reviewing the docs. paths: # DATASETS - /api/datasets/job-titles: + /api/datasets/roles: get: - summary: Returns a list of all job titles + summary: Returns a list of all roles tags: - Datasets responses: '200': - description: List of all the job titles available + description: List of all the roles available content: application/json: schema: @@ -31,7 +31,7 @@ paths: data: type: array items: - $ref: '#/components/schemas/JobTitle' + $ref: '#/components/schemas/Role' memetype: type: string example: application/json @@ -738,8 +738,8 @@ paths: type: string pronouns: type: string - jobTitleId: - type: integer + title: + type: string MajorId: type: integer academic_year: @@ -756,7 +756,7 @@ paths: lastName: Bones headline: Sigh.. pronouns: they/them - jobTitleId: 1 + title: 'Student' majorId: 2 academic_year: Senior location: Grave Yard @@ -1765,15 +1765,15 @@ components: scheme: bearer bearerFormat: JWT schemas: - JobTitle: + Role: type: object properties: - titleId: + roleId: type: integer label: type: string example: - titleId: 1 + roleId: 1 label: Full-Stack Developer Social: @@ -1845,8 +1845,8 @@ components: pronouns: type: string nullable: true - jobTitleId: - type: integer + title: + type: string nullable: true majorId: type: integer @@ -2120,8 +2120,8 @@ components: type: string pronouns: type: string - jobTitleId: - type: integer + title: + type: string majorId: type: integer academicYear: From 1352d41f816328431caedad0c0df91d4dbd846fd Mon Sep 17 00:00:00 2001 From: chum-bot Date: Thu, 28 Aug 2025 18:13:38 -0400 Subject: [PATCH 057/322] fixed create project endpoint to not have userId in req body --- server/docs/swagger.yaml | 3 --- server/src/api/controllers/projects/create-project.ts | 7 +++++-- server/src/services/projects/create-proj.ts | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 040b8b7e8..e593c510f 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -2193,9 +2193,6 @@ components: type: string maxLength: 300 nullable: true - userId: - type: integer - nullable: true ProjectImage: type: object diff --git a/server/src/api/controllers/projects/create-project.ts b/server/src/api/controllers/projects/create-project.ts index bdfd27f89..c54a8da22 100644 --- a/server/src/api/controllers/projects/create-project.ts +++ b/server/src/api/controllers/projects/create-project.ts @@ -1,12 +1,15 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; import type { Prisma } from '#prisma-models/index.js'; -import getService from '#services/projects/create-proj.ts'; +import createProjectService from '#services/projects/create-proj.ts'; const createProjectController = async (_req: Request, res: Response) => { + const curUserId = _req.currentUser; + _req.body['userId'] = parseInt(curUserId as string); const data: Prisma.ProjectsCreateInput = _req.body as Prisma.ProjectsCreateInput; - const result = await getService(data); + const result = await createProjectService(data); if (result === 'INTERNAL_ERROR') { const resBody: ApiResponse = { diff --git a/server/src/services/projects/create-proj.ts b/server/src/services/projects/create-proj.ts index 2db944cb8..85e89e280 100644 --- a/server/src/services/projects/create-proj.ts +++ b/server/src/services/projects/create-proj.ts @@ -9,6 +9,7 @@ const createProjectService = async ( ): Promise => { try { const project = await prisma.projects.create({ data }); + return project; } catch (e) { console.error('Error in updateProjectService:', e); From ead51bfa7ae2da895ead7f1e2d90492a12b4b612 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 19:25:56 -0400 Subject: [PATCH 058/322] fix user followings schema --- server/prisma/schema.prisma | 90 ++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 4904647f0..31a2fec34 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -17,17 +17,17 @@ model Genres { } model Roles { - roleId Int @id @default(autoincrement()) @map("role_id") + roleId Int @id @default(autoincrement()) @map("title_id") label String @db.VarChar(50) jobs Jobs[] members Members[] - @@map("roles") + @@map("job_titles") } model Jobs { projectId Int @map("project_id") - roleId Int @map("role_id") + roleId Int @map("title_id") availability JobsAvailability duration JobsDuration location JobsLocation @@ -36,11 +36,11 @@ model Jobs { createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) projects Projects @relation(fields: [projectId], references: [projectId], onDelete: Cascade, map: "FK2_project_id") - roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_jobs_roles") + roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_jobs_job_titles") @@id([projectId, roleId]) @@index([projectId], map: "FK2_project_id") - @@index([roleId], map: "FK_jobs_roles") + @@index([roleId], map: "FK_jobs_job_titles") @@map("jobs") } @@ -55,15 +55,15 @@ model Majors { model Members { projectId Int @map("project_id") userId Int @map("user_id") - roleId Int @map("role_id") + roleId Int @map("title_id") profileVisibility MembersProfileVisibility @default(public) @map("profile_visibility") createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) - roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_members_roles") + roles Roles @relation(fields: [roleId], references: [roleId], map: "FK_members_job_titles") projects Projects @relation(fields: [projectId], references: [projectId], onDelete: Cascade, map: "FK_members_projects") users Users @relation(fields: [userId], references: [userId], onDelete: Cascade, map: "FK_members_users") @@id([projectId, userId]) - @@index([roleId], map: "FK_members_roles") + @@index([roleId], map: "FK_members_job_titles") @@index([userId], map: "FK_members_users") @@map("members") } @@ -138,7 +138,7 @@ model Projects { purpose ProjectsPurpose? status ProjectsStatus audience String? @db.VarChar(300) - userId Int @map("user_id") + userId Int @map("user_id") createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) jobs Jobs[] @@ -173,15 +173,15 @@ model Tags { } model UserFollowings { - userId Int @map("user_id") - followingId Int @map("following_id") - followedAt DateTime @default(now()) @map("followed_at") @db.Timestamp(0) - usersUserFollowingsFollowingIdTousers Users @relation("user_followings_following_idTousers", fields: [followingId], references: [userId], onDelete: Cascade, map: "FK_user_followings_following_user") - usersUserFollowingsUserIdTousers Users @relation("user_followings_user_idTousers", fields: [userId], references: [userId], onDelete: Cascade, map: "FK_user_followings_users") - - @@id([userId, followingId]) - @@index([followingId], map: "FK_user_followings_following_user") - @@index([userId], map: "FK_user_followings_users") + senderId Int @map("sender_id") + receiverId Int @map("receiver_id") + followedAt DateTime @default(now()) @map("followed_at") @db.Timestamp(0) + senderUser Users @relation("sender_user", fields: [senderId], references: [userId], onDelete: Cascade, map: "FK_user_followings_sender") + receiverUser Users @relation("receiver_user", fields: [receiverId], references: [userId], onDelete: Cascade, map: "FK_user_followings_receiver") + + @@id([senderId, receiverId]) + @@index([senderId], map: "FK_user_followings_sender") + @@index([receiverId], map: "FK_user_followings_receiver") @@map("user_followings") } @@ -211,33 +211,33 @@ model UserSocials { } model Users { - userId Int @id @default(autoincrement()) @map("user_id") - username String @db.Text - ritEmail String @map("rit_email") @db.VarChar(50) - firstName String @map("first_name") @db.Text - lastName String @map("last_name") @db.Text - profileImage String? @map("profile_image") @db.VarChar(100) - headline String? @db.VarChar(100) - pronouns String? @db.Text - title String? @db.VarChar(50) - majorId Int? @map("major_id") - academicYear UsersAcademicYear? @map("academic_year") - location String? @db.VarChar(150) - funFact String? @map("fun_fact") @db.VarChar(100) - bio String? @db.VarChar(600) - visibility Int @default(1) @db.TinyInt - createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) - updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) - phoneNumber Int? @map("phone_number") - universityId String @unique(map: "university_id_UNIQUE") @map("university_id") @db.VarChar(9) - members Members[] - projectFollowings ProjectFollowings[] - projects Projects[] - userFollowingsUserFollowingsFollowingIdTousers UserFollowings[] @relation("user_followings_following_idTousers") - userFollowingsUserFollowingsUserIdTousers UserFollowings[] @relation("user_followings_user_idTousers") - userSkills UserSkills[] - userSocials UserSocials[] - majors Majors? @relation(fields: [majorId], references: [majorId], onDelete: Restrict, map: "FK_users_majors") + userId Int @id @default(autoincrement()) @map("user_id") + username String @db.Text + ritEmail String @map("rit_email") @db.VarChar(50) + firstName String @map("first_name") @db.Text + lastName String @map("last_name") @db.Text + profileImage String? @map("profile_image") @db.VarChar(100) + headline String? @db.VarChar(100) + pronouns String? @db.Text + title String? @db.VarChar(50) + majorId Int? @map("major_id") + academicYear UsersAcademicYear? @map("academic_year") + location String? @db.VarChar(150) + funFact String? @map("fun_fact") @db.VarChar(100) + bio String? @db.VarChar(600) + visibility Int @default(1) @db.TinyInt + createdAt DateTime @default(now()) @map("created_at") @db.Timestamp(0) + updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamp(0) + phoneNumber Int? @map("phone_number") + universityId String @unique(map: "university_id_UNIQUE") @map("university_id") @db.VarChar(9) + members Members[] + projectFollowings ProjectFollowings[] + projects Projects[] + followers UserFollowings[] @relation("receiver_user") + following UserFollowings[] @relation("sender_user") + userSkills UserSkills[] + userSocials UserSocials[] + majors Majors? @relation(fields: [majorId], references: [majorId], onDelete: Restrict, map: "FK_users_majors") @@index([majorId], map: "FK_users_majors") @@map("users") From 0dbd650e3547841df33fad7c601714e3209d809c Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 19:35:29 -0400 Subject: [PATCH 059/322] add forbidden is a service error --- server/src/services/service-error.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/services/service-error.ts b/server/src/services/service-error.ts index b53f3d5b6..3787c9835 100644 --- a/server/src/services/service-error.ts +++ b/server/src/services/service-error.ts @@ -1,5 +1,5 @@ // Master list of all possible error messages that a service can have, expand as needed -type ServiceError = 'INTERNAL_ERROR' | 'NOT_FOUND' | 'CONFLICT'; +type ServiceError = 'INTERNAL_ERROR' | 'NOT_FOUND' | 'CONFLICT' | 'FORBIDDEN'; // This utility allows us to use ServiceError as a list of all possible output values // while making subtypes that only have some of the values which is then enforced by TypeScript From 9f37b324456c311eaffab8fba2e9853080f6bba7 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 19:39:06 -0400 Subject: [PATCH 060/322] update user followings type to follow new schema --- shared/types.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/types.d.ts b/shared/types.d.ts index a4bb0541f..98c35896f 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -91,8 +91,8 @@ export interface UserSocial { export type UserFollowings = { - userId: number; - followingId: number; + senderId: number; + receiverId: number; followedAt: Date; }; From 4f18741554cb98bb8396c0acda906dc2434de417 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Thu, 28 Aug 2025 19:39:15 -0400 Subject: [PATCH 061/322] handle forbidden error --- server/src/api/controllers/me/add-follow-user.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/server/src/api/controllers/me/add-follow-user.ts b/server/src/api/controllers/me/add-follow-user.ts index 54e5aed07..8347d28a0 100644 --- a/server/src/api/controllers/me/add-follow-user.ts +++ b/server/src/api/controllers/me/add-follow-user.ts @@ -32,6 +32,17 @@ export const addUserFollowing = async (req: Request, res: Response): Promise Date: Thu, 28 Aug 2025 19:39:32 -0400 Subject: [PATCH 062/322] update follow user services to use new schema --- server/src/services/me/add-follow-user.ts | 22 ++++++++++--------- .../src/services/users/get-user-following.ts | 8 +++---- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/server/src/services/me/add-follow-user.ts b/server/src/services/me/add-follow-user.ts index 36d6f2ca7..e467450ab 100644 --- a/server/src/services/me/add-follow-user.ts +++ b/server/src/services/me/add-follow-user.ts @@ -2,19 +2,21 @@ import type { UserFollowings } from '@looking-for-group/shared'; import prisma from '#config/prisma.ts'; import type { ServiceErrorSubset } from '#services/service-error.ts'; -type AddFollowServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND' | 'CONFLICT'>; +type AddFollowServiceError = ServiceErrorSubset< + 'INTERNAL_ERROR' | 'NOT_FOUND' | 'CONFLICT' | 'FORBIDDEN' +>; export const addUserFollowingService = async ( - userId: number, - followingId: number, + senderId: number, + receiverId: number, ): Promise => { try { //no following self - if (userId === followingId) return 'NOT_FOUND'; + if (senderId === receiverId) return 'FORBIDDEN'; //check if user exists const followUser = await prisma.users.findUnique({ - where: { userId: followingId }, + where: { userId: receiverId }, select: { userId: true }, }); @@ -23,9 +25,9 @@ export const addUserFollowingService = async ( //if already followed const exists = await prisma.userFollowings.findUnique({ where: { - userId_followingId: { - userId, - followingId, + senderId_receiverId: { + senderId, + receiverId, }, }, }); @@ -35,8 +37,8 @@ export const addUserFollowingService = async ( ///create the following const addFollow = await prisma.userFollowings.create({ data: { - userId, - followingId, + senderId, + receiverId, }, }); diff --git a/server/src/services/users/get-user-following.ts b/server/src/services/users/get-user-following.ts index b4db33e9c..c69c9c281 100644 --- a/server/src/services/users/get-user-following.ts +++ b/server/src/services/users/get-user-following.ts @@ -6,14 +6,14 @@ type GetUserServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; //get the user by the username export const getUserFollowingService = async ( - userId: number, + senderId: number, ): Promise => { try { const following = await prisma.userFollowings.findMany({ - where: { userId }, + where: { senderId }, select: { - userId: true, - followingId: true, + senderId: true, + receiverId: true, followedAt: true, }, }); From 09412afbd7375791d3d4fbeea4a415ba9d6eb4fb Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Fri, 29 Aug 2025 12:23:54 -0400 Subject: [PATCH 063/322] map Roles to roles --- server/prisma/schema.prisma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index 31a2fec34..c28619291 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -22,7 +22,7 @@ model Roles { jobs Jobs[] members Members[] - @@map("job_titles") + @@map("roles") } model Jobs { From 39e9666a97c0855085b420b5c5ea85d854e0a3ac Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Fri, 29 Aug 2025 12:25:34 -0400 Subject: [PATCH 064/322] fix follow user --- server/src/api/controllers/me/add-follow-user.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/src/api/controllers/me/add-follow-user.ts b/server/src/api/controllers/me/add-follow-user.ts index 8347d28a0..75dc3120a 100644 --- a/server/src/api/controllers/me/add-follow-user.ts +++ b/server/src/api/controllers/me/add-follow-user.ts @@ -15,11 +15,11 @@ export const addUserFollowing = async (req: Request, res: Response): Promise Date: Fri, 29 Aug 2025 12:47:35 -0400 Subject: [PATCH 065/322] links tab styles matched --- .../ProjectCreatorEditor/tabs/LinksTab.tsx | 37 ++++++++++--------- client/src/components/Styles/linksTab.css | 34 ++++++++++++----- client/src/components/Styles/projects.css | 12 ++++-- 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx b/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx index da5451efd..5c363b5da 100644 --- a/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx +++ b/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx @@ -187,7 +187,7 @@ export const LinksTab = ({ isNewProject = false, projectData = defaultProject, s
{renderTags()}
+ +
+
+

*Fill out all required info before saving!*

+
+ !failCheck}> + Save Changes + +
); }; \ No newline at end of file diff --git a/client/src/components/Styles/discoverMeet.css b/client/src/components/Styles/discoverMeet.css index 412567177..acdf4643b 100644 --- a/client/src/components/Styles/discoverMeet.css +++ b/client/src/components/Styles/discoverMeet.css @@ -458,19 +458,29 @@ Discover and Meet page style rules /*tag rules may be used for buttons elsewhere, but will stay here for the time being*/ .tag-button { + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; + border-radius: 30px; border: none; - padding: 5px 15px; + height: 28px; + padding: 0 17px; font-size: medium; /* margin: 0 4px; */ flex-shrink: 0; } /* selected tags */ - -.tag-button-red-selected { - background-color: var(--tag-red-selected); - border: 2px solid var(--tag-red-selected); +.tag-button-red-selected, +.tag-button-orange-selected, +.tag-button-yellow-selected, +.tag-button-green-selected, +.tag-button-blue-selected, +.tag-button-purple-selected, +.tag-button-grey-selected +{ color: var(--tag-text-selected); max-width: 100%; @@ -479,71 +489,42 @@ Discover and Meet page style rules } } +.tag-button-red-selected { + background-color: var(--tag-red-selected); + border: 2px solid var(--tag-red-selected); +} + .tag-button-orange-selected { background-color: var(--tag-orange-selected); border: 2px solid var(--tag-orange-selected); - color: var(--tag-text-selected); - - .fa { - color: var(--tag-text-selected) !important; - } } .tag-button-yellow-selected { background-color: var(--tag-yellow-selected); border: 2px solid var(--tag-yellow-selected); - color: var(--tag-text-selected); - max-width: 100%; - - .fa { - color: var(--tag-text-selected) !important; - } } .tag-button-green-selected { background-color: var(--tag-green-selected); border: 2px solid var(--tag-green-selected); - color: var(--tag-text-selected); - - .fa { - color: var(--tag-text-selected) !important; - } } .tag-button-blue-selected { background-color: var(--tag-blue-selected); border: 2px solid var(--tag-blue-selected); - color: var(--tag-text-selected); - max-width: 100%; - - .fa { - color: var(--tag-text-selected) !important; - } } .tag-button-purple-selected { background-color: var(--tag-purple-selected); border: 2px solid var(--tag-purple-selected); - color: var(--tag-text-selected); - max-width: 100%; - - .fa { - color: var(--tag-text-selected) !important; - } } .tag-button-grey-selected { background-color: var(--tag-grey-selected); border: 2px solid var(--tag-grey-selected); - color: var(--tag-text-selected); - - .fa { - color: var(--tag-text-selected) !important; - } } /* unselected tags */ - .tag-button-red-unselected { background-color: var(--tag-red-unselected); border: 2px solid var(--tag-red-unselected-border); @@ -560,7 +541,7 @@ Discover and Meet page style rules border: 2px solid var(--tag-red-selected); color: var(--tag-text-selected); - .fa { + .fa { color: var(--tag-text-selected) !important; } } diff --git a/client/src/components/Styles/general.css b/client/src/components/Styles/general.css index fd3cc55f2..bebbc7905 100644 --- a/client/src/components/Styles/general.css +++ b/client/src/components/Styles/general.css @@ -91,7 +91,7 @@ General style rules --tag-purple-unselected-border: #d7bed3; --tag-grey-unselected-border: #d0d0d0; - --tag-text-selected: white; + --tag-text-selected: black; --tag-text-unselected-red: #ffa0b0; --tag-text-unselected-orange: #ffa381; @@ -204,12 +204,8 @@ used for the more options dropdown menu and notifications .button-reset { background-color: transparent; border: none; - padding: 10px 20px; - font-size: 2ch; - font-weight: 700; - width: max-content; - margin: auto; + margin: 0; } button { @@ -1131,6 +1127,7 @@ Header style rules #header-searchbar>.search-wrapper>.search-bar { margin: 0; + gap: 15px; } #header-buttons { @@ -1297,7 +1294,7 @@ Search style rules text-align: left; display: flex; flex-direction: row; - gap: 5px; + gap: 10px; /* float: right; */ /* align-content: center; */ /* margin: auto; */ @@ -1320,11 +1317,14 @@ Search style rules .search-button { background: none; border: none; - /* padding: 4px; */ - padding-top: 2px; font: inherit; cursor: pointer; outline: inherit; + align-content: center; + + i { + color: var(--primary-color); + } } .navIcon { diff --git a/client/src/components/Styles/projects.css b/client/src/components/Styles/projects.css index 6fb825e7d..2555bfba2 100644 --- a/client/src/components/Styles/projects.css +++ b/client/src/components/Styles/projects.css @@ -664,6 +664,8 @@ Project Creator and Editor style rules background-color: var(--bg-color); border: 1px solid var(--border-color); border-radius: 10px; + grid-area: search; + min-width: 150px; } #project-editor-tag-search-container { @@ -679,14 +681,14 @@ Project Creator and Editor style rules #project-editor-tag-wrapper { display: flex; flex-direction: column; + gap: 10px; } #tag-search-divider, #selected-tag-divider { - height: 4px; - width: 80%; - border: none; - border-radius: 3px; + height: 2px; + width: 100%; + border: none; background-color: var(--header-color); } @@ -813,12 +815,20 @@ Project Creator and Editor style rules display: grid; grid-template: 'type search' auto - 'select search' 1fr / + 'select search' 1fr + 'save save' auto / 1fr 2fr; gap: 20px; height: 100%; } +#tags-save-info { + grid-area: save; + display: flex; + flex-direction: column; + align-items: center; +} + @media only screen and (max-width: 650px) { #project-editor-tags { display: flex; @@ -828,14 +838,17 @@ Project Creator and Editor style rules #project-editor-type-tags { grid-area: type; - min-height: 80px; display: flex; - flex-direction: column; + flex-direction: column; gap: 15px; } #project-editor-selected-tags { grid-area: select; + + .error { + margin-top: 15px; + } } #project-editor-selected-tags-container { @@ -854,11 +867,6 @@ Project Creator and Editor style rules gap: 8px; } -#project-editor-tag-search { - grid-area: search; - min-width: 150px; -} - #project-editor-type-tags, #project-editor-selected-tags, #project-editor-tag-search { @@ -867,11 +875,6 @@ Project Creator and Editor style rules border-radius: 8px; } -#project-editor-selected-tags>.error, -#project-editor-type-tags>.error { - margin-top: 15px; -} - .project-editor-section-header { color: var(--primary-color); font-size: 2ch; @@ -909,8 +912,8 @@ Project Creator and Editor style rules margin-bottom: 10px; padding: 0; color: var(--neutral-gray); - font-size: 1.6ch; - font-weight: 600; + font-size: 16px; + font-weight: 400; word-break: normal; max-width: 100%; } @@ -927,7 +930,7 @@ Project Creator and Editor style rules .project-editor-team-tab:hover, .team-tab-active { color: var(--primary-color); - font-weight: 600; + font-weight: 700; } @@ -1074,7 +1077,7 @@ Project Creator and Editor style rules width: 100%; } -#user-search-container .search-bar { +#user-search-container .search-bar { /* Override for default SearchBar component */ display: flex; align-items: center; From 8bdf7cbafce9ad66222d6dbf117783166bd4994c Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Wed, 3 Sep 2025 13:09:18 -0400 Subject: [PATCH 085/322] type error cleanup --- .../ProjectCreatorEditor/tabs/GeneralTab.tsx | 17 +++++++++++++++-- .../ProjectCreatorEditor/tabs/MediaTab.tsx | 14 +++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx b/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx index 6056a1a43..17c7c811b 100644 --- a/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx +++ b/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx @@ -1,6 +1,5 @@ // --- Imports --- import { useEffect, useState, useRef } from "react"; -import { Dropdown, DropdownButton, DropdownContent } from "../../Dropdown"; import { ThemeIcon } from "../../ThemeIcon"; import { Select, SelectButton, SelectOptions } from "../../Select"; import { PopupButton } from '../../Popup'; @@ -63,8 +62,22 @@ const keyboardDebounce = (func: any, delay: any) => { }; }; +type GeneralTabProps = { + isNewProject: boolean; + projectData?: ProjectData; + setProjectData?: (data: ProjectData) => void; + saveProject?: () => void; + failCheck: boolean; +} + // --- Component --- -export const GeneralTab = ({ isNewProject = false, projectData = defaultProject, setProjectData, saveProject, failCheck }) => { +export const GeneralTab = ({ + isNewProject = false, + projectData = defaultProject, + setProjectData, + saveProject, + failCheck +}: GeneralTabProps) => { // --- Hooks --- // tracking project modifications diff --git a/client/src/components/ProjectCreatorEditor/tabs/MediaTab.tsx b/client/src/components/ProjectCreatorEditor/tabs/MediaTab.tsx index d422cea69..4be0a0030 100644 --- a/client/src/components/ProjectCreatorEditor/tabs/MediaTab.tsx +++ b/client/src/components/ProjectCreatorEditor/tabs/MediaTab.tsx @@ -31,13 +31,6 @@ interface ProjectData { userId?: number; } -type MediaTabProps = { - projectData?: ProjectData; - setProjectData?: (data: ProjectData) => void; - saveProject?: () => void; - failCheck: boolean; -} - // --- Variables --- // Default project value const defaultProject: ProjectData = { @@ -57,6 +50,13 @@ const defaultProject: ProjectData = { title: '', }; +type MediaTabProps = { + projectData?: ProjectData; + setProjectData?: (data: ProjectData) => void; + saveProject?: () => void; + failCheck: boolean; +} + // --- Component --- export const MediaTab = ({ projectData = defaultProject, From 9ec9769f5f17d5658f579603a9820d2d351624bb Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Wed, 3 Sep 2025 13:30:41 -0400 Subject: [PATCH 086/322] fixed tag styles --- client/src/components/Styles/discoverMeet.css | 76 +++++++++++++++---- 1 file changed, 60 insertions(+), 16 deletions(-) diff --git a/client/src/components/Styles/discoverMeet.css b/client/src/components/Styles/discoverMeet.css index acdf4643b..2287776f4 100644 --- a/client/src/components/Styles/discoverMeet.css +++ b/client/src/components/Styles/discoverMeet.css @@ -481,10 +481,13 @@ Discover and Meet page style rules .tag-button-purple-selected, .tag-button-grey-selected { - color: var(--tag-text-selected); max-width: 100%; + + p { + color: var(--tag-text-selected); + } - .fa { + .fa { color: var(--tag-text-selected) !important; } } @@ -528,8 +531,11 @@ Discover and Meet page style rules .tag-button-red-unselected { background-color: var(--tag-red-unselected); border: 2px solid var(--tag-red-unselected-border); - color: var(--tag-text-unselected-red); max-width: 100%; + + p { + color: var(--tag-text-unselected-red); + } .fa { color: var(--tag-text-unselected-red) !important; @@ -539,7 +545,9 @@ Discover and Meet page style rules .tag-button-red-unselected:hover { background-color: var(--tag-red-selected); border: 2px solid var(--tag-red-selected); - color: var(--tag-text-selected); + p { + color: var(--tag-text-selected); + } .fa { color: var(--tag-text-selected) !important; @@ -549,7 +557,10 @@ Discover and Meet page style rules .tag-button-orange-unselected { background-color: var(--tag-orange-unselected); border: 2px solid var(--tag-orange-unselected-border); - color: var(--tag-text-unselected-orange); + + p { + color: var(--tag-text-unselected-orange); + } .fa { color: var(--tag-text-unselected-orange) !important; @@ -559,7 +570,10 @@ Discover and Meet page style rules .tag-button-orange-unselected:hover { background-color: var(--tag-orange-selected); border: 2px solid var(--tag-orange-selected); - color: var(--tag-text-selected); + + p { + color: var(--tag-text-selected); + } .fa { color: var(--tag-text-selected) !important; @@ -569,9 +583,12 @@ Discover and Meet page style rules .tag-button-yellow-unselected { background-color: var(--tag-yellow-unselected); border: 2px solid var(--tag-yellow-unselected-border); - color: var(--tag-text-unselected-yellow); max-width: 100%; + p { + color: var(--tag-text-unselected-yellow); + } + .fa { color: var(--tag-text-unselected-yellow) !important; } @@ -580,7 +597,10 @@ Discover and Meet page style rules .tag-button-yellow-unselected:hover { background-color: var(--tag-yellow-selected); border: 2px solid var(--tag-yellow-selected); - color: var(--tag-text-selected); + + p { + color: var(--tag-text-selected); + } .fa { color: var(--tag-text-selected) !important; @@ -590,7 +610,10 @@ Discover and Meet page style rules .tag-button-green-unselected { background-color: var(--tag-green-unselected); border: 2px solid var(--tag-green-unselected-border); - color: var(--tag-text-unselected-green); + + p { + color: var(--tag-text-unselected-green); + } .fa { color: var(--tag-text-unselected-green) !important; @@ -600,7 +623,10 @@ Discover and Meet page style rules .tag-button-green-unselected:hover { background-color: var(--tag-green-selected); border: 2px solid var(--tag-green-selected); - color: var(--tag-text-selected); + + p { + color: var(--tag-text-selected); + } .fa { color: var(--tag-text-selected) !important; @@ -610,9 +636,12 @@ Discover and Meet page style rules .tag-button-blue-unselected { background-color: var(--tag-blue-unselected); border: 2px solid var(--tag-blue-unselected-border); - color: var(--tag-text-unselected-blue); max-width: 100%; + p { + color: var(--tag-text-unselected-blue); + } + .fa { color: var(--tag-text-unselected-blue) !important; } @@ -621,7 +650,10 @@ Discover and Meet page style rules .tag-button-blue-unselected:hover { background-color: var(--tag-blue-selected); border: 2px solid var(--tag-blue-selected); - color: var(--tag-text-selected); + + p { + color: var(--tag-text-selected); + } .fa { color: var(--tag-text-selected) !important; @@ -631,9 +663,12 @@ Discover and Meet page style rules .tag-button-purple-unselected { background-color: var(--tag-purple-unselected); border: 2px solid var(--tag-purple-unselected-border); - color: var(--tag-text-unselected-purple); max-width: 100%; + p { + color: var(--tag-text-unselected-purple); + } + .fa { color: var(--tag-text-unselected-purple) !important; } @@ -642,7 +677,10 @@ Discover and Meet page style rules .tag-button-purple-unselected:hover { background-color: var(--tag-purple-selected); border: 2px solid var(--tag-purple-selected); - color: var(--tag-text-selected); + + p { + color: var(--tag-text-selected); + } .fa { color: var(--tag-text-selected) !important; @@ -652,7 +690,10 @@ Discover and Meet page style rules .tag-button-grey-unselected { background-color: var(--tag-grey-unselected); border: 2px solid var(--tag-grey-unselected-border); - color: var(--tag-text-unselected-grey); + + p { + color: var(--tag-text-unselected-grey); + } .fa { color: var(--tag-text-unselected-grey) !important; @@ -662,7 +703,10 @@ Discover and Meet page style rules .tag-button-grey-unselected:hover { background-color: var(--tag-grey-selected); border: 2px solid var(--tag-grey-selected); - color: var(--tag-text-selected); + + p { + color: var(--tag-text-selected); + } .fa { color: var(--tag-text-selected) !important; From 70a85806dfb0d18e9191326fe422dc80d3315f07 Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 3 Sep 2025 13:46:28 -0400 Subject: [PATCH 087/322] Implemented deleteImage controller and service for projects --- package-lock.json | 956 +++++++++--------- package.json | 3 +- server/docs/swagger.yaml | 13 +- server/prisma/schema.prisma | 1 + server/src/api/controllers/me/update-info.ts | 2 + .../src/api/controllers/projects/add-image.ts | 10 +- .../api/controllers/projects/delete-image.ts | 41 + server/src/api/controllers/projects/index.ts | 2 + server/src/api/routes/projects.ts | 8 +- server/src/services/projects/add-image.ts | 1 + server/src/services/projects/delete-image.ts | 31 + server/src/services/projects/update-image.ts | 2 + shared/types.d.ts | 5 +- 13 files changed, 573 insertions(+), 502 deletions(-) create mode 100644 server/src/api/controllers/projects/delete-image.ts create mode 100644 server/src/services/projects/delete-image.ts diff --git a/package-lock.json b/package-lock.json index b83b33b76..3a7fbe44c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,8 @@ "cross-env": "^7.0.3", "dotenv-cli": "^8.0.0", "husky": "^9.1.7", - "lint-staged": "^16.1.2" + "lint-staged": "^16.1.2", + "prisma": "^6.12.0" }, "engines": { "node": ">=v23.6.0" @@ -274,35 +275,35 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.876.0.tgz", - "integrity": "sha512-rrdrB0IlHfRaY+qxo87iSPJJxjCZ2WIV0wKi0EWz02yBpq17c0o6Vzc8f1+ksR+IZGkGttQnD2j4UpItMdLSKg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.879.0.tgz", + "integrity": "sha512-1bD2Do/OdCIzl72ncHKYamDhPijUErLYpuLvciyYD4Ywt4cVLHjWtVIqb22XOOHYYHE3NqHMd4uRhvXMlsBRoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.876.0", - "@aws-sdk/credential-provider-node": "3.876.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-node": "3.879.0", "@aws-sdk/middleware-bucket-endpoint": "3.873.0", "@aws-sdk/middleware-expect-continue": "3.873.0", - "@aws-sdk/middleware-flexible-checksums": "3.876.0", + "@aws-sdk/middleware-flexible-checksums": "3.879.0", "@aws-sdk/middleware-host-header": "3.873.0", "@aws-sdk/middleware-location-constraint": "3.873.0", "@aws-sdk/middleware-logger": "3.876.0", "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-sdk-s3": "3.876.0", + "@aws-sdk/middleware-sdk-s3": "3.879.0", "@aws-sdk/middleware-ssec": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/middleware-user-agent": "3.879.0", "@aws-sdk/region-config-resolver": "3.873.0", - "@aws-sdk/signature-v4-multi-region": "3.876.0", + "@aws-sdk/signature-v4-multi-region": "3.879.0", "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", + "@aws-sdk/util-endpoints": "3.879.0", "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.876.0", + "@aws-sdk/util-user-agent-node": "3.879.0", "@aws-sdk/xml-builder": "3.873.0", "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", + "@smithy/core": "^3.9.0", "@smithy/eventstream-serde-browser": "^4.0.5", "@smithy/eventstream-serde-config-resolver": "^4.1.3", "@smithy/eventstream-serde-node": "^4.0.5", @@ -313,21 +314,21 @@ "@smithy/invalid-dependency": "^4.0.5", "@smithy/md5-js": "^4.0.5", "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", "@smithy/middleware-serde": "^4.0.9", "@smithy/middleware-stack": "^4.0.5", "@smithy/node-config-provider": "^4.1.4", "@smithy/node-http-handler": "^4.1.1", "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.0", "@smithy/types": "^4.3.2", "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", "@smithy/util-endpoints": "^3.0.7", "@smithy/util-middleware": "^4.0.5", "@smithy/util-retry": "^4.0.7", @@ -343,44 +344,44 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.876.0.tgz", - "integrity": "sha512-Vf0PMF7HVpvllrfPODnBZmlz6kT/y2AvOt1RQG3+qD0VrHWzShc5nwgRZ+yyP3xkKVhZsQ3sJapfZTFnjqMOYA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.879.0.tgz", + "integrity": "sha512-+Pc3OYFpRYpKLKRreovPM63FPPud1/SF9vemwIJfz6KwsBCJdvg7vYD1xLSIp5DVZLeetgf4reCyAA5ImBfZuw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/middleware-host-header": "3.873.0", "@aws-sdk/middleware-logger": "3.876.0", "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/middleware-user-agent": "3.879.0", "@aws-sdk/region-config-resolver": "3.873.0", "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", + "@aws-sdk/util-endpoints": "3.879.0", "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.876.0", + "@aws-sdk/util-user-agent-node": "3.879.0", "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", + "@smithy/core": "^3.9.0", "@smithy/fetch-http-handler": "^5.1.1", "@smithy/hash-node": "^4.0.5", "@smithy/invalid-dependency": "^4.0.5", "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", "@smithy/middleware-serde": "^4.0.9", "@smithy/middleware-stack": "^4.0.5", "@smithy/node-config-provider": "^4.1.4", "@smithy/node-http-handler": "^4.1.1", "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.0", "@smithy/types": "^4.3.2", "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", "@smithy/util-endpoints": "^3.0.7", "@smithy/util-middleware": "^4.0.5", "@smithy/util-retry": "^4.0.7", @@ -392,19 +393,19 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.876.0.tgz", - "integrity": "sha512-sVFBFkdoPOPyY13NaXO1E/R9O5J6ixzHnnRbqrbXYM2QQgLNPTKIiRtmVEuVoFV9YULg+/aKm7caix8m468y9w==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.879.0.tgz", + "integrity": "sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.862.0", "@aws-sdk/xml-builder": "3.873.0", - "@smithy/core": "^3.8.0", + "@smithy/core": "^3.9.0", "@smithy/node-config-provider": "^4.1.4", "@smithy/property-provider": "^4.0.5", "@smithy/protocol-http": "^5.1.3", "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.0", "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", @@ -418,12 +419,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.876.0.tgz", - "integrity": "sha512-cof7lwp2AlrAfRs0pt4W2KMS2VMBvEmpcti1UOFfSJIqkn+cyJliMJ8LHg22GI+kUexjvxdAqSbf3M7OHvEW+w==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.879.0.tgz", + "integrity": "sha512-JgG7A8SSbr5IiCYL8kk39Y9chdSB5GPwBorDW8V8mr19G9L+qd6ohED4fAocoNFaDnYJ5wGAHhCfSJjzcsPBVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/property-provider": "^4.0.5", "@smithy/types": "^4.3.2", @@ -434,18 +435,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.876.0.tgz", - "integrity": "sha512-wzmef2NBp2+X1l8D4Q8hx1G8oI3+WdvLdPev9VnVpRYZxYGRWVPl++wvCBsCn/ZL0mdWopPkhHA3kFexQhMzvg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.879.0.tgz", + "integrity": "sha512-2hM5ByLpyK+qORUexjtYyDZsgxVCCUiJQZRMGkNXFEGz6zTpbjfTIWoh3zRgWHEBiqyPIyfEy50eIF69WshcuA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/fetch-http-handler": "^5.1.1", "@smithy/node-http-handler": "^4.1.1", "@smithy/property-provider": "^4.0.5", "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.0", "@smithy/types": "^4.3.2", "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" @@ -455,18 +456,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.876.0.tgz", - "integrity": "sha512-JHbW6fqnJsVjGHCyko7B0NVPT1nEAPxkM3CGjUcVGsHgJBkxOLVCMQqTRyHcDdeHR2qeojlLoOHRz97xIHQjYw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.879.0.tgz", + "integrity": "sha512-07M8zfb73KmMBqVO5/V3Ea9kqDspMX0fO0kaI1bsjWI6ngnMye8jCE0/sIhmkVAI0aU709VA0g+Bzlopnw9EoQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", - "@aws-sdk/credential-provider-env": "3.876.0", - "@aws-sdk/credential-provider-http": "3.876.0", - "@aws-sdk/credential-provider-process": "3.876.0", - "@aws-sdk/credential-provider-sso": "3.876.0", - "@aws-sdk/credential-provider-web-identity": "3.876.0", - "@aws-sdk/nested-clients": "3.876.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/credential-provider-imds": "^4.0.7", "@smithy/property-provider": "^4.0.5", @@ -479,17 +480,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.876.0.tgz", - "integrity": "sha512-eHbNt1+Hi43e8ANnwf6toapLSxfMiyGq459y3Uh6i7NBOiWWKEsOVcgOfUC3RCoqeikxovt1tFM2cEElWUIOhg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.879.0.tgz", + "integrity": "sha512-FYaAqJbnSTrVL2iZkNDj2hj5087yMv2RN2GA8DJhe7iOJjzhzRojrtlfpWeJg6IhK0sBKDH+YXbdeexCzUJvtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.876.0", - "@aws-sdk/credential-provider-http": "3.876.0", - "@aws-sdk/credential-provider-ini": "3.876.0", - "@aws-sdk/credential-provider-process": "3.876.0", - "@aws-sdk/credential-provider-sso": "3.876.0", - "@aws-sdk/credential-provider-web-identity": "3.876.0", + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-ini": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/credential-provider-imds": "^4.0.7", "@smithy/property-provider": "^4.0.5", @@ -502,12 +503,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.876.0.tgz", - "integrity": "sha512-SMX4OlHvspu3gF4hxe7WAnZFhxpiCye+WlBSVoWfW/i9XNhtrZS1JMr29MK34GlCTk9qO7FlRwds/Z5k7xPpHg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.879.0.tgz", + "integrity": "sha512-7r360x1VyEt35Sm1JFOzww2WpnfJNBbvvnzoyLt7WRfK0S/AfsuWhu5ltJ80QvJ0R3AiSNbG+q/btG2IHhDYPQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", @@ -519,14 +520,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.876.0.tgz", - "integrity": "sha512-iP5dz9XqwePbgnh7Bdrq5e1319JpCRKLyomUfHH1XVeXkIHmwIJdmTj1Upeo1J8L/5cLHmhXAN6CTN11bLo8SA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.879.0.tgz", + "integrity": "sha512-gd27B0NsgtKlaPNARj4IX7F7US5NuU691rGm0EUSkDsM7TctvJULighKoHzPxDQlrDbVI11PW4WtKS/Zg5zPlQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.876.0", - "@aws-sdk/core": "3.876.0", - "@aws-sdk/token-providers": "3.876.0", + "@aws-sdk/client-sso": "3.879.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/token-providers": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", @@ -538,13 +539,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.876.0.tgz", - "integrity": "sha512-q/XSCP1uae5aB9veM8zcm6Gqu6A4ckX9ZbhHgCzURXVJDwp+nINW1hM9vppMjGw3ND9Ibx/adR+KfTI0TDMzqw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.879.0.tgz", + "integrity": "sha512-Jy4uPFfGzHk1Mxy+/Wr43vuw9yXsE2yiF4e4598vc3aJfO0YtA2nSfbKD3PNKRORwXbeKqWPfph9SCKQpWoxEg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", - "@aws-sdk/nested-clients": "3.876.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/property-provider": "^4.0.5", "@smithy/types": "^4.3.2", @@ -588,15 +589,15 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.876.0.tgz", - "integrity": "sha512-Xfb9/XP0WcQq/yJxUubfzMUF0AYSX10UUIRbCJog0/lnDNocEiGEIaarwuQzoxb9QW9TQ1l5dDc/5bOMa1YVGw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.879.0.tgz", + "integrity": "sha512-U1rcWToy2rlQPQLsx5h73uTC1XYo/JpnlJGCc3Iw7b1qrK8Mke4+rgMPKCfnXELD5TTazGrbT03frxH4Y1Ycvw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/is-array-buffer": "^4.0.0", "@smithy/node-config-provider": "^4.1.4", @@ -670,19 +671,19 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.876.0.tgz", - "integrity": "sha512-h+TDs9EKAfXnrkogQpQz3o11zvs6Vh9+ehxyd35OcM7evnDeoV4GFjjnAKq+MxbBk/5Ewnvng+d6/WQDvMbj7Q==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.879.0.tgz", + "integrity": "sha512-ZTpLr2AbZcCsEzu18YCtB8Tp8tjAWHT0ccfwy3HiL6g9ncuSMW+7BVi1hDYmBidFwpPbnnIMtM0db3pDMR6/WA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/types": "3.862.0", "@aws-sdk/util-arn-parser": "3.873.0", - "@smithy/core": "^3.8.0", + "@smithy/core": "^3.9.0", "@smithy/node-config-provider": "^4.1.4", "@smithy/protocol-http": "^5.1.3", "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.0", "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.5", @@ -709,15 +710,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.876.0.tgz", - "integrity": "sha512-FR+8INfnbNv32QDQ5szxkWX6mB/QgezfNyx8LnAh1ErISZMmEFBxXXir+ZOfuV8vsmal1a6cy9qmnMNDaNnaNQ==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.879.0.tgz", + "integrity": "sha512-DDSV8228lQxeMAFKnigkd0fHzzn5aauZMYC3CSj6e5/qE7+9OwpkUcjHfb7HZ9KWG6L2/70aKZXHqiJ4xKhOZw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", - "@smithy/core": "^3.8.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@smithy/core": "^3.9.0", "@smithy/protocol-http": "^5.1.3", "@smithy/types": "^4.3.2", "tslib": "^2.6.2" @@ -727,44 +728,44 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.876.0.tgz", - "integrity": "sha512-R4TZrkM2gUElTsotk8mt3y7iLG8TNi1LL1wgVdEEWSLOYTaFyglGdoNBMtEeP7lmXilaTy00AbYF6BakJvSTHg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.879.0.tgz", + "integrity": "sha512-7+n9NpIz9QtKYnxmw1fHi9C8o0GrX8LbBR4D50c7bH6Iq5+XdSuL5AFOWWQ5cMD0JhqYYJhK/fJsVau3nUtC4g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.876.0", + "@aws-sdk/core": "3.879.0", "@aws-sdk/middleware-host-header": "3.873.0", "@aws-sdk/middleware-logger": "3.876.0", "@aws-sdk/middleware-recursion-detection": "3.873.0", - "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/middleware-user-agent": "3.879.0", "@aws-sdk/region-config-resolver": "3.873.0", "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.873.0", + "@aws-sdk/util-endpoints": "3.879.0", "@aws-sdk/util-user-agent-browser": "3.873.0", - "@aws-sdk/util-user-agent-node": "3.876.0", + "@aws-sdk/util-user-agent-node": "3.879.0", "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", + "@smithy/core": "^3.9.0", "@smithy/fetch-http-handler": "^5.1.1", "@smithy/hash-node": "^4.0.5", "@smithy/invalid-dependency": "^4.0.5", "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", "@smithy/middleware-serde": "^4.0.9", "@smithy/middleware-stack": "^4.0.5", "@smithy/node-config-provider": "^4.1.4", "@smithy/node-http-handler": "^4.1.1", "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.0", "@smithy/types": "^4.3.2", "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", "@smithy/util-endpoints": "^3.0.7", "@smithy/util-middleware": "^4.0.5", "@smithy/util-retry": "^4.0.7", @@ -793,12 +794,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.876.0.tgz", - "integrity": "sha512-OMDcuaVlC2rbze92w4QcNfuEA0IeT2GsT1ByZCwe+Y9tZwxzj7fCiOOU0UmJfa+juuQ/YBzVYxnkrkz3Rg6DEw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.879.0.tgz", + "integrity": "sha512-MDsw0EWOHyKac75X3gD8tLWtmPuRliS/s4IhWRhsdDCU13wewHIs5IlA5B65kT6ISf49yEIalEH3FHUSVqdmIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.876.0", + "@aws-sdk/middleware-sdk-s3": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/protocol-http": "^5.1.3", "@smithy/signature-v4": "^5.1.3", @@ -810,13 +811,13 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.876.0.tgz", - "integrity": "sha512-iU08kaQbhXnY0CC2TBcr7y/2PqPwZP2CTWX/Rbq0NvhOyteikfh7ASC+bRfLUp0XMSHKvSb+w2dh8a0lvx4oHg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.879.0.tgz", + "integrity": "sha512-47J7sCwXdnw9plRZNAGVkNEOlSiLb/kR2slnDIHRK9NB/ECKsoqgz5OZQJ9E2f0yqOs8zSNJjn3T01KxpgW8Qw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.876.0", - "@aws-sdk/nested-clients": "3.876.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/property-provider": "^4.0.5", "@smithy/shared-ini-file-loader": "^4.0.5", @@ -853,9 +854,9 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.873.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.873.0.tgz", - "integrity": "sha512-YByHrhjxYdjKRf/RQygRK1uh0As1FIi9+jXTcIEX/rBgN8mUByczr2u4QXBzw7ZdbdcOBMOkPnLRjNOWW1MkFg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz", + "integrity": "sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.862.0", @@ -893,12 +894,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.876.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.876.0.tgz", - "integrity": "sha512-/ZIaeUt60JBdI0mNc7sZ8v3Tuzp8Pbe4gIAYnppGyF4KV8QA+Yu8tp2bGHfkKn150t1uvQ6P/4CwFfoGF34dzg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.879.0.tgz", + "integrity": "sha512-A5KGc1S+CJRzYnuxJQQmH1BtGsz46AgyHkqReKfGiNQA8ET/9y9LQ5t2ABqnSBHHIh3+MiCcQSkUZ0S3rTodrQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.876.0", + "@aws-sdk/middleware-user-agent": "3.879.0", "@aws-sdk/types": "3.862.0", "@smithy/node-config-provider": "^4.1.4", "@smithy/types": "^4.3.2", @@ -1045,21 +1046,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.4", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", "dev": true, "license": "MIT", "optional": true, @@ -1068,9 +1069,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", "optional": true, @@ -1521,9 +1522,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", + "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1539,6 +1540,19 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -1707,33 +1721,19 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1918,9 +1918,9 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", - "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.9.0.tgz", + "integrity": "sha512-fSfQlSRu9Z5yBkvsNhYF2rPS8cGXn/TZVrlwN1948QyZ8xMZ0JvP50S2acZNaf+o63u6aEeMjipFyksjIcWrog==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.0.0", @@ -1964,17 +1964,10 @@ "node": ">= 8.0.0" } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz", - "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", + "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==", "cpu": [ "arm" ], @@ -1986,9 +1979,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz", - "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", + "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==", "cpu": [ "arm64" ], @@ -2000,9 +1993,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz", - "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", + "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==", "cpu": [ "arm64" ], @@ -2014,9 +2007,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz", - "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", + "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==", "cpu": [ "x64" ], @@ -2028,9 +2021,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz", - "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", + "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==", "cpu": [ "arm64" ], @@ -2042,9 +2035,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz", - "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", + "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==", "cpu": [ "x64" ], @@ -2056,9 +2049,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz", - "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", + "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==", "cpu": [ "arm" ], @@ -2070,9 +2063,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz", - "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", + "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==", "cpu": [ "arm" ], @@ -2084,9 +2077,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz", - "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", + "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==", "cpu": [ "arm64" ], @@ -2098,9 +2091,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz", - "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", + "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==", "cpu": [ "arm64" ], @@ -2112,9 +2105,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz", - "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", + "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==", "cpu": [ "loong64" ], @@ -2126,9 +2119,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz", - "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", + "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==", "cpu": [ "ppc64" ], @@ -2140,9 +2133,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz", - "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", + "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==", "cpu": [ "riscv64" ], @@ -2154,9 +2147,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz", - "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", + "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==", "cpu": [ "riscv64" ], @@ -2168,9 +2161,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz", - "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", + "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==", "cpu": [ "s390x" ], @@ -2182,9 +2175,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz", - "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", + "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==", "cpu": [ "x64" ], @@ -2196,9 +2189,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz", - "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", + "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==", "cpu": [ "x64" ], @@ -2209,10 +2202,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", + "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz", - "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", + "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==", "cpu": [ "arm64" ], @@ -2224,9 +2231,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz", - "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", + "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==", "cpu": [ "ia32" ], @@ -2238,9 +2245,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz", - "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", + "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==", "cpu": [ "x64" ], @@ -2321,9 +2328,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", - "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.2.tgz", + "integrity": "sha512-H7H+dnfyHa/XXmZB3+IcqB1snIvbXaeGbV7//PMY69YKMOfGtuHPg6aukxsD0TyqmIU+bcX5nitR+nf/19nTlQ==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.0.9", @@ -2542,12 +2549,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", - "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", + "version": "4.1.21", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.21.tgz", + "integrity": "sha512-VCFE6LGSbnXs6uxLTdtar6dbkOHa9mrj692pZJx1mQVEzk0gvckAX9WB9BzlONUpv92QBWGezROz/+yEitQjAQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.8.0", + "@smithy/core": "^3.9.2", "@smithy/middleware-serde": "^4.0.9", "@smithy/node-config-provider": "^4.1.4", "@smithy/shared-ini-file-loader": "^4.0.5", @@ -2561,15 +2568,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.19", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz", - "integrity": "sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==", + "version": "4.1.22", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.22.tgz", + "integrity": "sha512-mb6/wn4ixnSJCkKVLs51AKAyknbSTvwrHCM7cqgwGfYQ7/J6Qvv+49cBHe6Rl8Q0m3fROVYcSvM6bBiQtuhYWg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.1.4", "@smithy/protocol-http": "^5.1.3", "@smithy/service-error-classification": "^4.0.7", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.2", "@smithy/types": "^4.3.2", "@smithy/util-middleware": "^4.0.5", "@smithy/util-retry": "^4.0.7", @@ -2737,13 +2744,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", - "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.2.tgz", + "integrity": "sha512-WRdTJ7aNSJY0WuGpxrvVgRaFKGiuvtXX1Txhnu2BdynraSlH2bcP75riQ4SiQfawU1HNEKaPI5gf/ePm+Ro/Cw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.8.0", - "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/core": "^3.9.2", + "@smithy/middleware-endpoint": "^4.1.21", "@smithy/middleware-stack": "^4.0.5", "@smithy/protocol-http": "^5.1.3", "@smithy/types": "^4.3.2", @@ -2844,13 +2851,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz", - "integrity": "sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==", + "version": "4.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.29.tgz", + "integrity": "sha512-awrIb21sWml3OMRhqf8e5GPLuZAcH3PRAHXVOPof/rBOKLxc6N01ZRs25154Ww6Ygm9oNP6G0tVvhcy8ktYXtw==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.0.5", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.2", "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -2860,16 +2867,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz", - "integrity": "sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==", + "version": "4.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.29.tgz", + "integrity": "sha512-DxBWCC059GwOQXc5nxVudhdGQLZHTDhU4rkK4rvaBQn8IWBw8G+3H2hWk897LaNv6zwwhh7kpfqF0rJ77DvlSg==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.1.5", "@smithy/credential-provider-imds": "^4.0.7", "@smithy/node-config-provider": "^4.1.4", "@smithy/property-provider": "^4.0.5", - "@smithy/smithy-client": "^4.4.10", + "@smithy/smithy-client": "^4.5.2", "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, @@ -3401,9 +3408,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.8.tgz", - "integrity": "sha512-xG7xaBMJCpcK0RpN8jDbAACQo54ycO6h4dSSmgv8+fu6ZIAdANkx/WsawASUjVXYfy+J9AbUpRMNNEsXCDfDBQ==", + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3464,17 +3471,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", - "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", + "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/type-utils": "8.41.0", - "@typescript-eslint/utils": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/type-utils": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -3488,7 +3495,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.41.0", + "@typescript-eslint/parser": "^8.42.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -3504,16 +3511,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", - "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", + "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", "debug": "^4.3.4" }, "engines": { @@ -3529,14 +3536,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", + "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", + "@typescript-eslint/tsconfig-utils": "^8.42.0", + "@typescript-eslint/types": "^8.42.0", "debug": "^4.3.4" }, "engines": { @@ -3551,14 +3558,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", + "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3569,9 +3576,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", + "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", "dev": true, "license": "MIT", "engines": { @@ -3586,15 +3593,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", - "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", + "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/utils": "8.41.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -3611,9 +3618,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", + "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", "dev": true, "license": "MIT", "engines": { @@ -3625,16 +3632,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", + "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/project-service": "8.42.0", + "@typescript-eslint/tsconfig-utils": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3654,16 +3661,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", - "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", + "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0" + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3678,13 +3685,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", + "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/types": "8.42.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -3695,19 +3702,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -3992,12 +3986,13 @@ } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.4.tgz", - "integrity": "sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.8.tgz", + "integrity": "sha512-+M0eRDo/UiIF4xZZbZBBAR2Resx0ihdLRNpYevkrDJ6F3xHuEXSAAJGt6Ahabd0eJC4mQKvLA1JY1qBM058Cag==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/scope-manager": "^8.41.0", "@typescript-eslint/utils": "^8.24.1" }, "peerDependencies": { @@ -4058,6 +4053,16 @@ } } }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", @@ -4564,36 +4569,6 @@ } } }, - "node_modules/c12/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/c12/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -4720,41 +4695,19 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" } }, "node_modules/citty": { @@ -5345,9 +5298,9 @@ } }, "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", "dev": true, "license": "MIT" }, @@ -5926,13 +5879,13 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5949,19 +5902,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5993,19 +5933,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -6043,14 +5970,11 @@ } }, "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", @@ -6427,9 +6351,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.1.tgz", + "integrity": "sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==", "dev": true, "license": "MIT", "engines": { @@ -6849,9 +6773,9 @@ "license": "ISC" }, "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", + "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", "license": "MIT", "funding": { "type": "opencollective", @@ -7523,17 +7447,17 @@ } }, "node_modules/lint-staged": { - "version": "16.1.5", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.5.tgz", - "integrity": "sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==", + "version": "16.1.6", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.6.tgz", + "integrity": "sha512-U4kuulU3CKIytlkLlaHcGgKscNfJPNTiDF2avIUGFCv7K95/DCYQ7Ra62ydeRWmgQGg9zJYw2dzdbztwJlqrow==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.5.0", + "chalk": "^5.6.0", "commander": "^14.0.0", "debug": "^4.4.1", "lilconfig": "^3.1.3", - "listr2": "^9.0.1", + "listr2": "^9.0.3", "micromatch": "^4.0.8", "nano-spawn": "^1.0.2", "pidtree": "^0.6.0", @@ -7564,9 +7488,9 @@ } }, "node_modules/listr2": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.2.tgz", - "integrity": "sha512-VVd7cS6W+vLJu2wmq4QmfVj14Iep7cz4r/OWNk36Aq5ZOY7G8/BfCrQFexcwB1OIxB3yERiePfE/REBjEFulag==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.3.tgz", + "integrity": "sha512-0aeh5HHHgmq1KRdMMDHfhMWQmIT/m7nRDTlxlFqni2Sp0had9baqsjJRvDGdlvgd6NmPE0nPloOipiQJGFtTHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7638,13 +7562,13 @@ } }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.0.0" + "get-east-asian-width": "^1.3.1" }, "engines": { "node": ">=18" @@ -8040,6 +7964,44 @@ "concat-map": "0.0.1" } }, + "node_modules/nodemon/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/nodemon/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -8063,6 +8025,19 @@ "node": "*" } }, + "node_modules/nodemon/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -8421,12 +8396,13 @@ "license": "MIT" }, "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "engines": { - "node": ">=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/pathe": { @@ -8813,16 +8789,17 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/redux": { @@ -8977,9 +8954,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.49.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", - "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", + "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", "dev": true, "license": "MIT", "dependencies": { @@ -8993,26 +8970,27 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.49.0", - "@rollup/rollup-android-arm64": "4.49.0", - "@rollup/rollup-darwin-arm64": "4.49.0", - "@rollup/rollup-darwin-x64": "4.49.0", - "@rollup/rollup-freebsd-arm64": "4.49.0", - "@rollup/rollup-freebsd-x64": "4.49.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.49.0", - "@rollup/rollup-linux-arm-musleabihf": "4.49.0", - "@rollup/rollup-linux-arm64-gnu": "4.49.0", - "@rollup/rollup-linux-arm64-musl": "4.49.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.49.0", - "@rollup/rollup-linux-ppc64-gnu": "4.49.0", - "@rollup/rollup-linux-riscv64-gnu": "4.49.0", - "@rollup/rollup-linux-riscv64-musl": "4.49.0", - "@rollup/rollup-linux-s390x-gnu": "4.49.0", - "@rollup/rollup-linux-x64-gnu": "4.49.0", - "@rollup/rollup-linux-x64-musl": "4.49.0", - "@rollup/rollup-win32-arm64-msvc": "4.49.0", - "@rollup/rollup-win32-ia32-msvc": "4.49.0", - "@rollup/rollup-win32-x64-msvc": "4.49.0", + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", "fsevents": "~2.3.2" } }, @@ -9717,9 +9695,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.27.1", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.27.1.tgz", - "integrity": "sha512-oGtpYO3lnoaqyGtlJalvryl7TwzgRuxpOVWqEHx8af0YXI+Kt+4jMpLdgMtMcmWmuQ0QTCHLKExwrBFMSxvAUA==", + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.28.1.tgz", + "integrity": "sha512-IvPrtNi8MvjiuDgoSmPYgg27Lvu38fnLD1OSd8Y103xXsPAqezVNnNeHnVCZ/d+CMXJblflGaIyHxAYIF3O71w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10087,16 +10065,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.41.0.tgz", - "integrity": "sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz", + "integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.41.0", - "@typescript-eslint/parser": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/utils": "8.41.0" + "@typescript-eslint/eslint-plugin": "8.42.0", + "@typescript-eslint/parser": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10244,9 +10222,9 @@ } }, "node_modules/vite": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", - "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", + "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", "dev": true, "license": "MIT", "dependencies": { @@ -10955,9 +10933,7 @@ } }, "server/node_modules/dotenv": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", - "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", + "version": "17.2.2", "dev": true, "license": "BSD-2-Clause", "engines": { diff --git a/package.json b/package.json index 5a41a57a6..681e6a248 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "cross-env": "^7.0.3", "dotenv-cli": "^8.0.0", "husky": "^9.1.7", - "lint-staged": "^16.1.2" + "lint-staged": "^16.1.2", + "prisma": "^6.12.0" }, "engines": { "node": ">=v23.6.0" diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 11406fb2a..31b9d89dc 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -1309,6 +1309,10 @@ paths: type: string description: Alternate text for the image example: Screenshot of the project UI + position: + type: integer + description: Index of the project image + example: 0 responses: '200': description: Picture added successfully @@ -1415,11 +1419,10 @@ paths: $ref: '#/components/responses/InternalServerError' delete: - summary: Remove a picture from a project (NOT FINISHED) + summary: Remove a picture from a project tags: - Projects - description: This endpoint is intended to remove a picture from a project by picture ID, - but is not implemented yet. + description: Removes a picture from a project by picture ID security: - shibbolethAuth: [] parameters: @@ -1442,8 +1445,8 @@ paths: required: false description: The user ID to be used as the current user responses: - '501': - description: NOT DONE + '200': + description: Picture removed successfully content: application/json: schema: diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index bb860130e..769365b24 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -96,6 +96,7 @@ model ProjectGenres { model ProjectImages { imageId Int @id @default(autoincrement()) @map("image_id") image String @db.VarChar(100) + altText String @db.VarChar(150) position Int projectId Int @map("project_id") projects Projects @relation(fields: [projectId], references: [projectId], onDelete: Cascade, map: "FK_project_images_projects") diff --git a/server/src/api/controllers/me/update-info.ts b/server/src/api/controllers/me/update-info.ts index c32dac66f..453d0f7ed 100644 --- a/server/src/api/controllers/me/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -3,6 +3,7 @@ import type { RequestHandler } from 'express'; import type { UsersAcademicYear } from '#prisma-models/index.js'; import { updateUserInfoService } from '#services/me/update-info.ts'; import { getUserByUsernameService } from '#services/users/get-by-username.ts'; +//import { uploadImageService } from '#services/images/upload-image.ts' interface UpdateUserInfo { firstName?: string; @@ -18,6 +19,7 @@ interface UpdateUserInfo { visibility?: number; username?: string; phoneNumber?: number; + profileImage?: string; } export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserInfo> = async ( diff --git a/server/src/api/controllers/projects/add-image.ts b/server/src/api/controllers/projects/add-image.ts index 8ff59114e..5b7f97b8a 100644 --- a/server/src/api/controllers/projects/add-image.ts +++ b/server/src/api/controllers/projects/add-image.ts @@ -3,8 +3,14 @@ import type { Request, Response } from 'express'; import type { Prisma } from '#prisma-models/index.js'; import getService from '#services/projects/add-image.ts'; -const addImageController = async (_req: Request, res: Response) => { - const data: Prisma.ProjectImagesCreateInput = _req.body as Prisma.ProjectImagesCreateInput; +const addImageController = async (req: Request, res: Response) => { + const data: Prisma.ProjectImagesCreateInput = req.body as Prisma.ProjectImagesCreateInput; + + data.projects = { + connect: { + projectId: parseInt(req.params.id), + }, + }; const result = await getService(data); diff --git a/server/src/api/controllers/projects/delete-image.ts b/server/src/api/controllers/projects/delete-image.ts new file mode 100644 index 000000000..869c04a3f --- /dev/null +++ b/server/src/api/controllers/projects/delete-image.ts @@ -0,0 +1,41 @@ +import type { ApiResponse } from '@looking-for-group/shared'; +import type { Request, Response } from 'express'; +import { deleteImageService } from '#services/projects/delete-image.ts'; + +const deleteImageController = async (req: Request, res: Response) => { + const projectId = parseInt(req.params.id); + const imageId = parseInt(req.params.picId); + + const result = await deleteImageService(projectId, imageId); + + if (result === 'INTERNAL_ERROR') { + const resBody: ApiResponse = { + status: 500, + error: 'Internal Server Error', + data: null, + memetype: 'application/json', + }; + res.status(500).json(resBody); + return; + } + + if (result === 'NOT_FOUND') { + const resBody: ApiResponse = { + status: 404, + error: 'Internal Server Error', + data: null, + memetype: 'application/json', + }; + res.status(500).json(resBody); + return; + } + const resBody: ApiResponse = { + status: 200, + error: null, + data: result, + memetype: 'application/json', + }; + res.status(200).json(resBody); +}; + +export default deleteImageController; diff --git a/server/src/api/controllers/projects/index.ts b/server/src/api/controllers/projects/index.ts index 0d8cbfd2a..69f979c85 100644 --- a/server/src/api/controllers/projects/index.ts +++ b/server/src/api/controllers/projects/index.ts @@ -1,6 +1,7 @@ import addImage from './add-image.ts'; import addMember from './add-member.ts'; import createProject from './create-project.ts'; +import deleteImage from './delete-image.ts'; import deleteMember from './delete-member.ts'; import deleteProject from './delete-project.ts'; import getProjectPics from './get-proj-pictures.ts'; @@ -22,4 +23,5 @@ export default { deleteProject, updateImage, deleteMember, + deleteImage, }; diff --git a/server/src/api/routes/projects.ts b/server/src/api/routes/projects.ts index bfc0317a5..9ed5f2d7d 100644 --- a/server/src/api/routes/projects.ts +++ b/server/src/api/routes/projects.ts @@ -49,7 +49,13 @@ router.put( ); //Removes picture from a project -// router.delete('/:id/pictures/:picId' /* deletePicture */); +router.delete( + '/:id/pictures/:picId', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + PROJECT.deleteImage, +); //Adds member to a specific project through id router.post( diff --git a/server/src/services/projects/add-image.ts b/server/src/services/projects/add-image.ts index 5a2ac7734..287ad8696 100644 --- a/server/src/services/projects/add-image.ts +++ b/server/src/services/projects/add-image.ts @@ -1,6 +1,7 @@ import prisma from '#config/prisma.ts'; import type { Prisma } from '#prisma-models/index.js'; import type { ServiceErrorSubset } from '#services/service-error.ts'; +//import { uploadImageService } from '#services/upload-image.ts' type AddImageServiceError = ServiceErrorSubset<'INTERNAL_ERROR'>; diff --git a/server/src/services/projects/delete-image.ts b/server/src/services/projects/delete-image.ts new file mode 100644 index 000000000..b49a73353 --- /dev/null +++ b/server/src/services/projects/delete-image.ts @@ -0,0 +1,31 @@ +import prisma from '#config/prisma.ts'; +import type { ServiceErrorSubset } from '#services/service-error.ts'; + +type DeleteImageServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; + +//delete a member +export const deleteImageService = async ( + projectId: number, + imageId: number, +): Promise | DeleteImageServiceError> => { + try { + const deletedImage = await prisma.projectImages.delete({ + where: { + projectId: projectId, + imageId: imageId, + }, + }); + + return deletedImage; + } catch (error) { + console.error('Error in deleteImageService:', error); + + if (error instanceof Object && 'code' in error) { + if (error.code === 'P2025') { + return 'NOT_FOUND'; + } + } + + return 'INTERNAL_ERROR'; + } +}; diff --git a/server/src/services/projects/update-image.ts b/server/src/services/projects/update-image.ts index e92d6f69c..9bc9a1d72 100644 --- a/server/src/services/projects/update-image.ts +++ b/server/src/services/projects/update-image.ts @@ -1,6 +1,8 @@ import prisma from '#config/prisma.ts'; import type { Prisma } from '#prisma-models/index.js'; import type { ServiceErrorSubset } from '#services/service-error.ts'; +//import uploadImageService from '#services/upload-image.ts' +//import deleteImageService from '#services/delete-image.ts' type UpdateImageServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; diff --git a/shared/types.d.ts b/shared/types.d.ts index 98c35896f..d3da9fffe 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -177,12 +177,11 @@ export interface ProjectFollowings { followedAt: Date; } - -//there is no alt text in database yet +//images for projects export interface ProjectImage { imageId: number; image: string; - //altText: ''; + altText: ''; } //tags for projects From 2145a3d73b514c83e99391b30a679dddf26ae1ce Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 3 Sep 2025 13:56:42 -0400 Subject: [PATCH 088/322] updated swagger to reflect deleteImage addition --- server/docs/swagger.yaml | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml index 31b9d89dc..c8fce4719 100644 --- a/server/docs/swagger.yaml +++ b/server/docs/swagger.yaml @@ -1454,17 +1454,37 @@ paths: properties: status: type: integer - example: 501 + example: 200 error: type: string - example: NOT DONE - data: - type: string - nullable: true example: null + data: + type: object + properties: + imageId: + type: integer + example: 1 + image: + type: string + example: string + altText: + type: string + example: string + position: + type: integer + position: integer + projectId: + type: integer + position: integer memetype: type: string example: application/json + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/InternalServerError' /api/projects/{id}/members: post: From a2f7a2f51909e008479eae04f6519ed1049b5b83 Mon Sep 17 00:00:00 2001 From: Rndomblitzer12 Date: Wed, 3 Sep 2025 12:46:19 -0600 Subject: [PATCH 089/322] Updated credits for summer 2025 --- client/src/constants/lfgmembers.ts | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/client/src/constants/lfgmembers.ts b/client/src/constants/lfgmembers.ts index c36cb05e9..df0739391 100644 --- a/client/src/constants/lfgmembers.ts +++ b/client/src/constants/lfgmembers.ts @@ -4,6 +4,16 @@ export const members = [ 'name': 'Weez', 'role': 'Supervisor/Project Lead', 'photo': '/assets/creditProfiles/Weez.png' + }, + { + 'name': 'Rose Rushton', + 'role': 'Project Lead/Producer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Sebastian Portalatin Prieto', + 'role': 'Back-End Developer', + 'photo': '/assets/creditProfiles/BG.png' }, { 'name': 'Ben Gomez', @@ -44,6 +54,86 @@ export const members = [ 'name': 'Trevor Dunn', 'role': 'UI/UX Designer', 'photo': '/assets/creditProfiles/TD.png' + }, + { + 'name': 'Bin Xu', + 'role': 'Back-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Thomas Berrios', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Jackson Heim', + 'role': 'Back-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Marigold Parson', + 'role': 'Back-End Lead', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Max Chu', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Nicholas Rivera', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Ella Clevens', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Victoria Lau', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Kenny Hatch', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Saavan Tandon', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Dylan Kim', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Jack Shysko', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Josh Samuel', + 'role': 'Front-End Developer', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Liam Prisco', + 'role': 'Bugfixing', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Ethan Schechter', + 'role': 'Bugfixing', + 'photo': '/assets/creditProfiles/BG.png' + }, + { + 'name': 'Elizabeth Sanabria', + 'role': 'Bugfixing', + 'photo': '/assets/creditProfiles/BG.png' }, { 'name': 'Abraham Furlan', From 5f8334dbc2f41a00e6fc15434d1de3eba7db8a15 Mon Sep 17 00:00:00 2001 From: Elia Cohen Date: Wed, 3 Sep 2025 14:46:44 -0400 Subject: [PATCH 090/322] images!!! --- package-lock.json | 106 ++++++++++++++++++ server/package.json | 1 + .../api/controllers/images/delete-image.ts | 14 +++ .../src/api/controllers/images/get-image.ts | 44 ++++++++ .../api/controllers/images/upload-image.ts | 14 +++ .../controllers/projects/create-project.ts | 22 ++-- server/src/api/routes/images.ts | 17 +++ server/src/api/routes/me.ts | 3 +- server/src/api/routes/projects.ts | 20 +++- server/src/app.ts | 2 + server/src/config/env.ts | 2 +- server/src/config/multer.ts | 4 + server/src/config/s3.ts | 1 + server/src/services/images/delete-image.ts | 46 ++++++++ server/src/services/images/get-image.ts | 50 +++++++++ server/src/services/images/upload-image.ts | 44 ++++++++ server/src/services/service-error.ts | 2 +- shared/types.d.ts | 6 + 18 files changed, 382 insertions(+), 16 deletions(-) create mode 100644 server/src/api/controllers/images/delete-image.ts create mode 100644 server/src/api/controllers/images/get-image.ts create mode 100644 server/src/api/controllers/images/upload-image.ts create mode 100644 server/src/api/routes/images.ts create mode 100644 server/src/config/multer.ts create mode 100644 server/src/services/images/delete-image.ts create mode 100644 server/src/services/images/get-image.ts create mode 100644 server/src/services/images/upload-image.ts diff --git a/package-lock.json b/package-lock.json index 3a7fbe44c..59faf5598 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,10 @@ "server", "shared" ], + "dependencies": { + "@aws-sdk/s3-request-presigner": "^3.879.0", + "multer": "^2.0.2" + }, "devDependencies": { "concurrently": "^9.2.0", "cross-env": "^7.0.3", @@ -793,6 +797,93 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.879.0.tgz", + "integrity": "sha512-WNUrY4UW1ZAkBiSq9HnhJcG/1NdrEy37DDxqE8u0OdIZHhbgU1x1r4iXgQssAZhV6D+Ib70oiQGtPSH/lXeMKg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/signature-v4-multi-region": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-format-url": "3.873.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/core": { + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.879.0.tgz", + "integrity": "sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/core": "^3.9.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.879.0.tgz", + "integrity": "sha512-ZTpLr2AbZcCsEzu18YCtB8Tp8tjAWHT0ccfwy3HiL6g9ncuSMW+7BVi1hDYmBidFwpPbnnIMtM0db3pDMR6/WA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-arn-parser": "3.873.0", + "@smithy/core": "^3.9.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.879.0.tgz", + "integrity": "sha512-MDsw0EWOHyKac75X3gD8tLWtmPuRliS/s4IhWRhsdDCU13wewHIs5IlA5B65kT6ISf49yEIalEH3FHUSVqdmIQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.879.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.879.0.tgz", @@ -869,6 +960,21 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/util-format-url": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.873.0.tgz", + "integrity": "sha512-v//b9jFnhzTKKV3HFTw2MakdM22uBAs2lBov51BWmFXuFtSTdBLrR7zgfetQPE3PVkFai0cmtJQPdc3MX+T/cQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/util-locate-window": { "version": "3.873.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", diff --git a/server/package.json b/server/package.json index df2d52918..d1dd51b83 100644 --- a/server/package.json +++ b/server/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.850.0", + "@aws-sdk/s3-request-presigner": "^3.879.0", "@prisma/client": "^6.10.1", "express": "5.1.0", "morgan": "^1.10.0", diff --git a/server/src/api/controllers/images/delete-image.ts b/server/src/api/controllers/images/delete-image.ts new file mode 100644 index 000000000..3476d7068 --- /dev/null +++ b/server/src/api/controllers/images/delete-image.ts @@ -0,0 +1,14 @@ +// ONLY TO BE USED FOR TESTING + +import type { Request, Response } from 'express'; +import { deleteImageService } from '#services/images/delete-image.ts'; + +export const deleteImage = async (req: Request, res: Response): Promise => { + if (!req.params.image) { + res.status(400).send(); + return; + } + + const result = await deleteImageService(req.params.image); + res.status(200).json({ result }); +}; diff --git a/server/src/api/controllers/images/get-image.ts b/server/src/api/controllers/images/get-image.ts new file mode 100644 index 000000000..70d32c06a --- /dev/null +++ b/server/src/api/controllers/images/get-image.ts @@ -0,0 +1,44 @@ +import type { ApiResponse } from '@looking-for-group/shared'; +import type { Request, Response } from 'express'; +import { getImageService } from '#services/images/get-image.ts'; + +export const getImage = async (req: Request, res: Response): Promise => { + const key = req.params.image; + + if (!key) { + const resBody: ApiResponse = { + status: 400, + error: 'Missing image key', + data: null, + memetype: 'application/json', + }; + res.status(400).json(resBody); + return; + } + + const result = await getImageService(key); + + if (result === 'NOT_FOUND') { + const resBody: ApiResponse = { + status: 404, + error: 'Image not found', + data: null, + memetype: 'application/json', + }; + res.status(404).json(resBody); + return; + } + + if (result === 'INTERNAL_ERROR') { + const resBody: ApiResponse = { + status: 500, + error: 'Image not found', + data: null, + memetype: 'application/json', + }; + res.status(500).json(resBody); + return; + } + + res.redirect(301, result.location); +}; diff --git a/server/src/api/controllers/images/upload-image.ts b/server/src/api/controllers/images/upload-image.ts new file mode 100644 index 000000000..25ecd8d67 --- /dev/null +++ b/server/src/api/controllers/images/upload-image.ts @@ -0,0 +1,14 @@ +// ONLY TO BE USED FOR TESTING + +import type { Request, Response } from 'express'; +import { uploadImageService } from '#services/images/upload-image.ts'; + +export const uploadImage = async (req: Request, res: Response): Promise => { + if (!req.file?.buffer) { + res.status(400).send(); + return; + } + + const result = await uploadImageService(req.file.buffer, 'test.png', 'image/png'); + res.status(200).json({ result }); +}; diff --git a/server/src/api/controllers/projects/create-project.ts b/server/src/api/controllers/projects/create-project.ts index 207d69172..84be17f8a 100644 --- a/server/src/api/controllers/projects/create-project.ts +++ b/server/src/api/controllers/projects/create-project.ts @@ -4,20 +4,20 @@ import type { Request, Response } from 'express'; import type { Prisma, ProjectsPurpose, ProjectsStatus } from '#prisma-models/index.js'; import createProjectService from '#services/projects/create-proj.ts'; -const createProjectController = async (_req: Request, res: Response) => { - const curUserId = _req.currentUser; - _req.body['userId'] = parseInt(curUserId as string); +const createProjectController = async (req: Request, res: Response) => { + const curUserId = req.currentUser; + req.body['userId'] = parseInt(curUserId as string); const data: Prisma.ProjectsCreateInput = { - title: _req.body.title as string, - hook: _req.body.hook as string, - description: _req.body.description as string, - thumbnail: _req.body.thumbnail as string, - purpose: _req.body.purpose as ProjectsPurpose, - status: _req.body.status as ProjectsStatus, - audience: _req.body.audience as string, + title: req.body.title as string, + hook: req.body.hook as string, + description: req.body.description as string, + thumbnail: req.body.thumbnail as string, + purpose: req.body.purpose as ProjectsPurpose, + status: req.body.status as ProjectsStatus, + audience: req.body.audience as string, users: { connect: { - userId: _req.body.userId as number, + userId: req.body.userId as number, }, }, }; diff --git a/server/src/api/routes/images.ts b/server/src/api/routes/images.ts new file mode 100644 index 000000000..f47d99a48 --- /dev/null +++ b/server/src/api/routes/images.ts @@ -0,0 +1,17 @@ +import { Router } from 'express'; +// import { uploadImage } from '#controllers/images/upload-image.ts'; +import { getImage } from '#controllers/images/get-image.ts'; +// import { deleteImage } from '#controllers/images/delete-image.ts'; +// import { upload } from '#config/multer.ts'; + +const router = Router(); + +router.get('/:image', getImage); + +// only to be used for testing +// router.delete("/:image", deleteImage); + +// only to be used for testing +// router.post("/", upload.single('image'), uploadImage); + +export default router; diff --git a/server/src/api/routes/me.ts b/server/src/api/routes/me.ts index e45729b45..c32bb01cc 100644 --- a/server/src/api/routes/me.ts +++ b/server/src/api/routes/me.ts @@ -1,4 +1,5 @@ import { Router } from 'express'; +import { upload } from '#config/multer.ts'; import { addProjectFollowing } from '#controllers/me/add-follow-proj.ts'; import { addUserFollowing } from '#controllers/me/add-follow-user.ts'; import { deleteProjectFollowing } from '#controllers/me/delete-follow-proj.ts'; @@ -23,7 +24,7 @@ router.get('/get-username', requiresLogin, getUsernameByShib); router.get('/', getAccount); //Updates users information -router.put('/', updateUserInfo); +router.put('/', upload.single('profile-pic'), updateUserInfo); //Delete user router.delete('/', deleteUser); diff --git a/server/src/api/routes/projects.ts b/server/src/api/routes/projects.ts index 9ed5f2d7d..fc5cd2ba3 100644 --- a/server/src/api/routes/projects.ts +++ b/server/src/api/routes/projects.ts @@ -1,4 +1,5 @@ import { Router } from 'express'; +import { upload } from '#config/multer.ts'; import PROJECT from '#controllers/projects/index.ts'; import injectCurrentUser from '../middleware/inject-current-user.ts'; import requiresLogin from '../middleware/requires-login.ts'; @@ -10,13 +11,26 @@ const router = Router(); router.get('/', PROJECT.getProjects); //Create a new project -router.post('/', requiresLogin, injectCurrentUser, PROJECT.createProject); +router.post( + '/', + requiresLogin, + injectCurrentUser, + upload.single('thumbnail'), + PROJECT.createProject, +); //Get a specific project router.get('/:id', PROJECT.getProjectByID); //Edits a project through a specific id -router.put('/:id', requiresLogin, injectCurrentUser, requiresProjectOwner, PROJECT.updateProject); +router.put( + '/:id', + requiresLogin, + injectCurrentUser, + requiresProjectOwner, + upload.single('thumbnail'), + PROJECT.updateProject, +); //Deletes project through a specific id router.delete( @@ -36,6 +50,7 @@ router.post( requiresLogin, injectCurrentUser, requiresProjectOwner, + upload.single('image'), PROJECT.addImage, ); @@ -45,6 +60,7 @@ router.put( requiresLogin, injectCurrentUser, requiresProjectOwner, + upload.single('image'), PROJECT.updateImage, ); diff --git a/server/src/app.ts b/server/src/app.ts index 95ac8b79b..453099e8f 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -2,6 +2,7 @@ import express, { type Request, type Response } from 'express'; import morgan from 'morgan'; import envConfig from '#config/env.ts'; import datasetsRouter from '#routes/datasets.ts'; +import imagesRouter from '#routes/images.ts'; import meRouter from '#routes/me.ts'; import projectsRouter from '#routes/projects.ts'; import usersRouter from '#routes/users.ts'; @@ -26,6 +27,7 @@ app.use('/datasets', datasetsRouter); app.use('/users', usersRouter); app.use('/projects', projectsRouter); app.use('/me', meRouter); +app.use('/images', imagesRouter); app.get('', (_req: Request, res: Response) => { res.json({ message: 'You Reached The Looking For Group API' }); diff --git a/server/src/config/env.ts b/server/src/config/env.ts index be4d1f2de..b7a63617a 100644 --- a/server/src/config/env.ts +++ b/server/src/config/env.ts @@ -1,7 +1,7 @@ const envConfig = Object.freeze({ env: (process.env.NODE_ENV ?? 'production') as 'production' | 'development' | 'test', databaseUrl: `mysql://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}`, - s3Endpoint: `${process.env.S3_HOST}:${process.env.S3_PORT}`, + s3Endpoint: `http://${process.env.S3_HOST}:${process.env.S3_PORT}`, s3Bucket: `${process.env.S3_BUCKET}`, s3User: `${process.env.S3_USER}`, s3Pass: `${process.env.S3_PASS}`, diff --git a/server/src/config/multer.ts b/server/src/config/multer.ts new file mode 100644 index 000000000..31f643d8b --- /dev/null +++ b/server/src/config/multer.ts @@ -0,0 +1,4 @@ +import multer from 'multer'; + +const storage = multer.memoryStorage(); +export const upload = multer({ storage }); diff --git a/server/src/config/s3.ts b/server/src/config/s3.ts index 0de3456db..e62bfca46 100644 --- a/server/src/config/s3.ts +++ b/server/src/config/s3.ts @@ -7,6 +7,7 @@ const s3 = new S3Client({ accessKeyId: envConfig.s3User, secretAccessKey: envConfig.s3Pass, }, + region: 'us-east-1', forcePathStyle: true, }); diff --git a/server/src/services/images/delete-image.ts b/server/src/services/images/delete-image.ts new file mode 100644 index 000000000..715792957 --- /dev/null +++ b/server/src/services/images/delete-image.ts @@ -0,0 +1,46 @@ +import { DeleteObjectCommand, HeadObjectCommand, NotFound } from '@aws-sdk/client-s3'; +import envConfig from '#config/env.ts'; +import s3 from '#config/s3.ts'; +import type { ServiceErrorSubset } from '#services/service-error.ts'; + +type UploadImageServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; + +// https://mrfreelancer9.medium.com/integrate-aws-s3-with-your-node-js-project-a-step-by-step-guide-f7f160ea8d29 +const isFileExists = async (key: string): Promise => { + try { + await s3.send( + new HeadObjectCommand({ + Bucket: envConfig.s3Bucket, + Key: key, + }), + ); + + return true; + } catch (error) { + if (error instanceof NotFound) return false; + throw error; + } +}; + +export const deleteImageService = async ( + location: string, +): Promise => { + try { + if (!location.startsWith('/api/images')) return 'NOT_FOUND'; + const key = location.substring('/api/images/'.length); + + // file not found + if (!(await isFileExists(key))) return 'NOT_FOUND'; + + const deleteParams = { + Bucket: envConfig.s3Bucket, + Key: key, + }; + + await s3.send(new DeleteObjectCommand(deleteParams)); + return; + } catch (error) { + console.error(error); + return 'INTERNAL_ERROR'; + } +}; diff --git a/server/src/services/images/get-image.ts b/server/src/services/images/get-image.ts new file mode 100644 index 000000000..4fcc69f31 --- /dev/null +++ b/server/src/services/images/get-image.ts @@ -0,0 +1,50 @@ +import { GetObjectCommand, HeadObjectCommand, NotFound } from '@aws-sdk/client-s3'; +import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +import type { ImageUploadResult } from '@looking-for-group/shared'; +import envConfig from '#config/env.ts'; +import s3 from '#config/s3.ts'; +import type { ServiceErrorSubset } from '#services/service-error.ts'; + +type GetImageServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'NOT_FOUND'>; + +// https://mrfreelancer9.medium.com/integrate-aws-s3-with-your-node-js-project-a-step-by-step-guide-f7f160ea8d29 +const isFileExists = async (key: string): Promise => { + try { + await s3.send( + new HeadObjectCommand({ + Bucket: envConfig.s3Bucket, + Key: key, + }), + ); + + return true; + } catch (error) { + if (error instanceof NotFound) return false; + throw error; + } +}; + +export const getImageService = async ( + key: string, +): Promise => { + try { + // file not found + if (!(await isFileExists(key))) return 'NOT_FOUND'; + + // configure s3 upload parameters + const getParameters = { + Bucket: envConfig.s3Bucket, + Key: key, + }; + + const command = new GetObjectCommand(getParameters); + const url = await getSignedUrl(s3, command); + + return { location: url }; + } catch (error) { + if (error instanceof NotFound) { + return 'NOT_FOUND'; + } + return 'INTERNAL_ERROR'; + } +}; diff --git a/server/src/services/images/upload-image.ts b/server/src/services/images/upload-image.ts new file mode 100644 index 000000000..296ffba97 --- /dev/null +++ b/server/src/services/images/upload-image.ts @@ -0,0 +1,44 @@ +import { randomUUID } from 'crypto'; +import path from 'path'; +import { PutObjectCommand, S3ServiceException } from '@aws-sdk/client-s3'; +import type { ImageUploadResult } from '@looking-for-group/shared'; +import envConfig from '#config/env.ts'; +import s3 from '#config/s3.ts'; +import type { ServiceErrorSubset } from '#services/service-error.ts'; + +type UploadImageServiceError = ServiceErrorSubset<'INTERNAL_ERROR' | 'CONTENT_TOO_LARGE'>; + +export const uploadImageService = async ( + buffer: Buffer, + filename: string, + filetype: string, +): Promise => { + try { + // transform filename + const ext = path.extname(filename); + const base = path.basename(filename, ext).substring(0, 20); + const uniqueKey = base + randomUUID() + ext; + + // configure s3 upload parameters + const uploadParameters = { + Bucket: envConfig.s3Bucket, + Key: uniqueKey, + ContentType: filetype, + Body: buffer, + }; + + const command = new PutObjectCommand(uploadParameters); + await s3.send(command); + + return { location: `/api/images/${uniqueKey}` }; + } catch (error) { + // https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/javascript_s3_code_examples.html + if (error instanceof S3ServiceException && error.name === 'EntityTooLarge') { + console.error(`Error while uploading image: ${error.name}: ${error.message}`); + return 'CONTENT_TOO_LARGE'; + } else { + console.error(error); + return 'INTERNAL_ERROR'; + } + } +}; diff --git a/server/src/services/service-error.ts b/server/src/services/service-error.ts index 3787c9835..76b47a962 100644 --- a/server/src/services/service-error.ts +++ b/server/src/services/service-error.ts @@ -1,5 +1,5 @@ // Master list of all possible error messages that a service can have, expand as needed -type ServiceError = 'INTERNAL_ERROR' | 'NOT_FOUND' | 'CONFLICT' | 'FORBIDDEN'; +type ServiceError = 'INTERNAL_ERROR' | 'NOT_FOUND' | 'CONFLICT' | 'FORBIDDEN' | 'CONTENT_TOO_LARGE'; // This utility allows us to use ServiceError as a list of all possible output values // while making subtypes that only have some of the values which is then enforced by TypeScript diff --git a/shared/types.d.ts b/shared/types.d.ts index d3da9fffe..aa0b71741 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -249,3 +249,9 @@ export interface Job { createdAt: Date; updatedAt: Date; } + +// IMAGES + +export type ImageUploadResult = { + location: string; +} \ No newline at end of file From 34c6edb3c78c7f7ef41ac7f74b341ea0c495b65b Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Wed, 3 Sep 2025 15:12:42 -0400 Subject: [PATCH 091/322] team styles matched --- .../ProjectCreatorEditor/tabs/TeamTab.tsx | 33 +++++++++++++++---- client/src/components/Styles/projects.css | 30 ++++++++--------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx b/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx index 76cbbba6d..225af20c4 100644 --- a/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx +++ b/client/src/components/ProjectCreatorEditor/tabs/TeamTab.tsx @@ -98,8 +98,18 @@ const locationOptions = ['On-site', 'Remote', 'Hybrid']; const compensationOptions = ['Unpaid', 'Paid']; const permissionOptions = ['Project Member', 'Project Manager', 'Project Owner']; +type TeamTabProps = { + projectData: ProjectData; + setProjectData: (data: ProjectData) => void; + setErrorMember: (error: string) => void; + setErrorPosition: (error: string) => void; + permissions: number; + saveProject: () => void; + failCheck: boolean; +}; + // --- Component --- -export const TeamTab = ({ isNewProject = false, projectData = defaultProject, setProjectData, setErrorMember, setErrorPosition, permissions }) => { +export const TeamTab = ({ projectData = defaultProject, setProjectData, setErrorMember, setErrorPosition, permissions, saveProject, failCheck }: TeamTabProps) => { // --- Hooks --- // tracking project modifications @@ -188,7 +198,7 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se } setAllJobs(jobTitleData); } catch (error) { - console.error(error.message); + console.error((error as Error).message); } }; if (allJobs.length === 0) { @@ -228,7 +238,7 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se } setSearchableUsers({ data: searchableUsers }); } catch (error) { - console.error(error.message); + console.error((error as Error).message); } }; if (!allUsers || allUsers.length === 0) { @@ -377,7 +387,7 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se const userJson = await response.json(); userId = userJson.data[0].userId; } catch (error) { - console.error(error.message); + console.error((error as Error).message); } } await Promise.all([getUserId()]); @@ -1194,7 +1204,7 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se
- ), [allJobs, closePopup, currentMember, currentRole, errorAddMember, handleNewMember, handleSearch, handleUserSelect, modifiedProject, searchResults.data, searchableUsers]); + ), [allJobs, errorAddMember, handleNewMember, handleSearch, handleUserSelect, modifiedProject, newMember, permissions, searchBarKey, searchQuery, searchResults.data, searchableUsers, selectKey, successAddMember]); const openPositionsContent: JSX.Element = useMemo(() => (
@@ -1222,7 +1232,9 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se } }} > - add + + + Add position
@@ -1262,13 +1274,20 @@ export const TeamTab = ({ isNewProject = false, projectData = defaultProject, se
{teamTabContent}
+ +
+ !failCheck}> + Save Changes + +
- ); + ); }; // Because of hooks depending on each other, this is not implemented. // Relevant references are commented out above. // positionWindowContent is one of these + // Open position display // const positionViewWindow = useMemo(() => ( // <> diff --git a/client/src/components/Styles/projects.css b/client/src/components/Styles/projects.css index 2555bfba2..59dc5a28c 100644 --- a/client/src/components/Styles/projects.css +++ b/client/src/components/Styles/projects.css @@ -321,9 +321,9 @@ Project Creator and Editor style rules display: flex; justify-content: space-around; flex-wrap: wrap; - margin-top: 38px; + margin-top: 28px; } - + .project-editor-tab { border: none; border-radius: 30px; @@ -333,7 +333,7 @@ Project Creator and Editor style rules font-size: 2ch; font-weight: 500; } - + .project-editor-tab:hover, .project-editor-tab-active, #team-add-member-add-button, @@ -370,7 +370,7 @@ Project Creator and Editor style rules #project-editor-content { flex-grow: 1; - margin: 35px 56px 40px 55px; + margin: 35px 56px 26px 55px; } #project-editor-content label, @@ -933,16 +933,22 @@ Project Creator and Editor style rules font-weight: 700; } - - #project-editor-team { + display: flex; + flex-direction: column; height: 100%; } - #project-editor-team-content { display: flex; height: 100%; + margin-bottom: 40px; +} + +#team-save-info { + display: flex; + align-items: center; + margin-top: auto; } #project-editor-project-members { @@ -1338,8 +1344,7 @@ Project Creator and Editor style rules align-items: start; } -#team-positions-popup-list-buttons img, -.add-item-button img { +#team-positions-popup-list-buttons img { width: 21px; height: 21px; } @@ -2898,7 +2903,7 @@ Project Carousel style rules .add-item-button>button { display: flex; flex-direction: row; - align-items: end; + align-items: center; gap: 10px; padding: 0 10px; background: transparent; @@ -2910,11 +2915,6 @@ Project Carousel style rules color: var(--neutral-gray); } -.add-item-button img { - transform: rotate(45deg); - filter: var(--image-filter); -} - .positions-popup-list-item { width: max-content; background-color: var(--header-color) !important; From a0302bb2d6c7f7c531beefc474b248b9a7ff06ac Mon Sep 17 00:00:00 2001 From: chum-bot Date: Wed, 3 Sep 2025 15:15:52 -0400 Subject: [PATCH 092/322] changed the name of the delete-image in projects to remove-image for clarity --- server/src/api/controllers/me/update-info.ts | 5 +++-- server/src/api/controllers/projects/index.ts | 4 ++-- .../projects/{delete-image.ts => remove-image.ts} | 2 +- server/src/api/controllers/projects/update-image.ts | 6 +++--- .../services/projects/{delete-image.ts => remove-image.ts} | 0 5 files changed, 9 insertions(+), 8 deletions(-) rename server/src/api/controllers/projects/{delete-image.ts => remove-image.ts} (94%) rename server/src/services/projects/{delete-image.ts => remove-image.ts} (100%) diff --git a/server/src/api/controllers/me/update-info.ts b/server/src/api/controllers/me/update-info.ts index 453d0f7ed..08b948aa2 100644 --- a/server/src/api/controllers/me/update-info.ts +++ b/server/src/api/controllers/me/update-info.ts @@ -68,6 +68,7 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI 'visibility', 'username', 'phoneNumber', + 'profileImage', ]; //validate update fields @@ -85,8 +86,8 @@ export const updateUserInfo: RequestHandler<{ id: string }, unknown, UpdateUserI } //check if username was updated, and only do this whole check if it was - if (updates['username']) { - const newUsername = updates['username']; + const newUsername = updates['username']; + if (newUsername) { const userExist = await getUserByUsernameService(newUsername); if ( userExist !== 'NOT_FOUND' && diff --git a/server/src/api/controllers/projects/index.ts b/server/src/api/controllers/projects/index.ts index 69f979c85..b881cc695 100644 --- a/server/src/api/controllers/projects/index.ts +++ b/server/src/api/controllers/projects/index.ts @@ -1,12 +1,12 @@ import addImage from './add-image.ts'; import addMember from './add-member.ts'; import createProject from './create-project.ts'; -import deleteImage from './delete-image.ts'; import deleteMember from './delete-member.ts'; import deleteProject from './delete-project.ts'; import getProjectPics from './get-proj-pictures.ts'; import getProjectByID from './get-project-id.ts'; import getProjects from './get-projects.ts'; +import removeImage from './remove-image.ts'; import updateImage from './update-image.ts'; import updateMember from './update-member.ts'; import updateProject from './update-project.ts'; @@ -23,5 +23,5 @@ export default { deleteProject, updateImage, deleteMember, - deleteImage, + removeImage, }; diff --git a/server/src/api/controllers/projects/delete-image.ts b/server/src/api/controllers/projects/remove-image.ts similarity index 94% rename from server/src/api/controllers/projects/delete-image.ts rename to server/src/api/controllers/projects/remove-image.ts index 869c04a3f..e0d16baa4 100644 --- a/server/src/api/controllers/projects/delete-image.ts +++ b/server/src/api/controllers/projects/remove-image.ts @@ -1,6 +1,6 @@ import type { ApiResponse } from '@looking-for-group/shared'; import type { Request, Response } from 'express'; -import { deleteImageService } from '#services/projects/delete-image.ts'; +import { deleteImageService } from '#services/projects/remove-image.ts'; const deleteImageController = async (req: Request, res: Response) => { const projectId = parseInt(req.params.id); diff --git a/server/src/api/controllers/projects/update-image.ts b/server/src/api/controllers/projects/update-image.ts index 5aaa601e8..ba4474330 100644 --- a/server/src/api/controllers/projects/update-image.ts +++ b/server/src/api/controllers/projects/update-image.ts @@ -4,12 +4,12 @@ import getService from '#services/projects/update-image.ts'; interface UpdateImageInfo { url?: string; description?: string; - isThumbnail?: boolean; + position?: number; } const updateImageController: RequestHandler<{ id: string }, unknown, UpdateImageInfo> = async ( req, - res + res, ): Promise => { const { id } = req.params; const updates: object = req.body; @@ -20,7 +20,7 @@ const updateImageController: RequestHandler<{ id: string }, unknown, UpdateImage return; } - const allowedFields = ['url', 'description', 'isThumbnail']; + const allowedFields = ['url', 'description', 'position']; const invalidFields = Object.keys(updates).filter((field) => !allowedFields.includes(field)); if (invalidFields.length > 0) { diff --git a/server/src/services/projects/delete-image.ts b/server/src/services/projects/remove-image.ts similarity index 100% rename from server/src/services/projects/delete-image.ts rename to server/src/services/projects/remove-image.ts From 84e392fb62617d62e7b6106c1a7c373b07874f1f Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Wed, 3 Sep 2025 15:44:23 -0400 Subject: [PATCH 093/322] added save button to links tab --- .../ProjectCreatorEditor/tabs/LinksTab.tsx | 51 ++++++++++++++----- client/src/components/Styles/projects.css | 13 ++++- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx b/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx index 5c363b5da..6851aaa88 100644 --- a/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx +++ b/client/src/components/ProjectCreatorEditor/tabs/LinksTab.tsx @@ -1,6 +1,7 @@ // --- Imports --- import { useEffect, useState } from "react"; import { Select, SelectButton, SelectOptions } from "../../Select"; +import { PopupButton } from "../../Popup"; // --- Interfaces --- @@ -53,8 +54,22 @@ const defaultProject: ProjectData = { title: '', }; +type LinksTabProps = { + projectData?: ProjectData; + setProjectData?: (data: ProjectData) => void; + setErrorLinks?: (error: string) => void; + saveProject?: () => void; + failCheck: boolean; +} + // --- Component --- -export const LinksTab = ({ isNewProject = false, projectData = defaultProject, setProjectData, setErrorLinks }) => { +export const LinksTab = ({ + projectData = defaultProject, + setProjectData = () => {}, + setErrorLinks = () => {}, + saveProject = () => {}, + failCheck +}: LinksTabProps) => { // Icon failure to load by default fix const iconCheck = document.getElementsByClassName("project-link-select"); @@ -77,7 +92,7 @@ export const LinksTab = ({ isNewProject = false, projectData = defaultProject, s } } - // --- Hooks --- + // --- Hooks --- // tracking project modifications const [modifiedProject, setModifiedProject] = useState(projectData); // complete list of socials @@ -117,7 +132,7 @@ export const LinksTab = ({ isNewProject = false, projectData = defaultProject, s setAllSocials(socialsData); } catch (error) { - console.error(error.message); + console.error((error as Error).message); } }; if (allSocials.length === 0) { @@ -207,6 +222,7 @@ export const LinksTab = ({ isNewProject = false, projectData = defaultProject, s { if (allSocials) { + // FIXME: implement website name (id?) in project socials type // Create a copy of the current social, and change it const tempSocials = modifiedProject.socials; tempSocials[index].website = e.target.value; @@ -257,19 +273,20 @@ export const LinksTab = ({ isNewProject = false, projectData = defaultProject, s console.log(tempSocials); }} /> -
@@ -288,6 +305,7 @@ export const LinksTab = ({ isNewProject = false, projectData = defaultProject, s tempSocials = []; } + //FIXME: implement website name (id?) in project socials type tempSocials.push({ id: 1, website: 'Instagram', @@ -297,11 +315,18 @@ export const LinksTab = ({ isNewProject = false, projectData = defaultProject, s setModifiedProject({ ...modifiedProject, socials: tempSocials }); }}> {/* Figma wants + to be its own vector. Styles here assume it is a

*/} -

+

+ + +

Add social profile

+
); }; \ No newline at end of file diff --git a/client/src/components/Styles/projects.css b/client/src/components/Styles/projects.css index 59dc5a28c..ec8a0137d 100644 --- a/client/src/components/Styles/projects.css +++ b/client/src/components/Styles/projects.css @@ -1519,6 +1519,12 @@ select.edit-position-compensation { } /* Project Editor/Creator Links Tab */ +#project-editor-links { + display: flex; + flex-direction: column; + height: 100%; +} + #project-editor-links > label { margin-bottom: 3px; } @@ -1555,7 +1561,12 @@ select.edit-position-compensation { border: none; border-radius: 50%; transition: .15s; - align-self: anchor-center; +} + +#link-save-info { + display: flex; + justify-content: center; + margin-top: auto; } @media only screen and (max-width: 700px) { From 60fa234ed6872f6962f5ea305ba7164d6b38f8c3 Mon Sep 17 00:00:00 2001 From: Corie Beale Date: Wed, 3 Sep 2025 15:47:46 -0400 Subject: [PATCH 094/322] error cleanup --- .../ProjectCreatorEditor/tabs/GeneralTab.tsx | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx b/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx index 17c7c811b..f89d7810e 100644 --- a/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx +++ b/client/src/components/ProjectCreatorEditor/tabs/GeneralTab.tsx @@ -63,7 +63,6 @@ const keyboardDebounce = (func: any, delay: any) => { }; type GeneralTabProps = { - isNewProject: boolean; projectData?: ProjectData; setProjectData?: (data: ProjectData) => void; saveProject?: () => void; @@ -72,10 +71,9 @@ type GeneralTabProps = { // --- Component --- export const GeneralTab = ({ - isNewProject = false, projectData = defaultProject, - setProjectData, - saveProject, + setProjectData = () => {}, + saveProject = () => {}, failCheck }: GeneralTabProps) => { @@ -103,8 +101,9 @@ export const GeneralTab = ({ return (
- +
- +
- +
Define who this project is intended for--consider age group, interest, industry, or specific user needs. @@ -170,6 +169,7 @@ export const GeneralTab = ({ {modifiedProject.audience ? modifiedProject.audience.length : '0'}/100 {' '}