From f117d019c82656e664c5e70d84fd6f110f0edc68 Mon Sep 17 00:00:00 2001 From: ArnavSharma005 Date: Tue, 3 Jun 2025 12:17:09 +0530 Subject: [PATCH 01/22] add actions for manager --- app/actions/manager.ts | 105 +++++++++++++++++++++++++++++++++++++++++ package-lock.json | 12 +++++ package.json | 1 + yarn.lock | 5 ++ 4 files changed, 123 insertions(+) create mode 100644 app/actions/manager.ts diff --git a/app/actions/manager.ts b/app/actions/manager.ts new file mode 100644 index 0000000..713a277 --- /dev/null +++ b/app/actions/manager.ts @@ -0,0 +1,105 @@ +import axios from "axios"; +import dotenv from "dotenv"; +dotenv.config(); + +// ALL REQUESTS TO BE MADE BY ROLE MANAGER + +type Coordinator = { + coordinator_name: string; + coordinator_number: string; +}; + +type EventData = { + eventName: string; + category: string; + venue: string; + description: string; + endTime: number; + startTime: number; + document: string; + poster: string; + cordinators: Coordinator[]; + rules: string[]; +}; + +type Sponsor ={ + name: string; + imageUrl: string; + targetUrl: string; + SponserSection: string; +} + +export type {EventData, Coordinator , Sponsor}; + +export async function addEvent(eventData: EventData): Promise { + try{ + const url= `${process.env.SERVER_URL}/events`; + const response=await axios.post(url, eventData); + return response.data; + } + catch (error: any) { + console.error("Error adding event:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to add event"); + } +} + +export async function addSponsor(sponsorData: Sponsor): Promise { + try{ + const url= `${process.env.SERVER_URL}/sponsors`; + const response=await axios.post(url, sponsorData); + return response.data; + } + catch (error: any) { + console.error("Error adding sponsor:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to add sponsor"); + } +} + +export async function getDataOfEvent(eventCategory:string , eventName:string): Promise { + if (!eventCategory || !eventName) { + throw new Error("Event category and name are required"); + } + try { + const url = `${process.env.SERVER_URL}/admin/event/${eventCategory}/${eventName}`; + const response = await axios.get(url); + return response.data; + } catch (error: any) { + console.error("Error fetching event data:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to fetch event data"); + } +} + +export async function getQuery() : Promise { + try { + const url = `${process.env.SERVER_URL}/admin/query`; + const response = await axios.get(url); + return response.data; + } catch (error: any) { + console.error("Error fetching queries:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to fetch queries"); + } +} + +export async function mailCategory(eventName:string , eventCategory:string,heading:string,buttontext:string,buttonlink:string,subject:string,thankyou:string,detail:string): Promise { + if (!eventCategory || !eventName) { + throw new Error("Event category and name are required"); + } + try { + const url = `${process.env.SERVER_URL}/admin/mail/category`; + const data = { + eventName, + eventCategory, + heading, + buttontext, + buttonlink, + subject, + thankyou, + detail + }; + const response = await axios.post(url, data); + return response.data; + } catch (error: any) { + console.error("Error sending mail:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to send mail"); + } +} diff --git a/package-lock.json b/package-lock.json index f2f3f10..7101d8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "axios": "^1.7.9", + "dotenv": "^16.5.0", "firebase": "^11.1.0", "firebase-admin": "^13.0.2", "next": "15.1.3", @@ -3172,6 +3173,17 @@ "node": ">=0.10.0" } }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", diff --git a/package.json b/package.json index e4a7155..c883b05 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "axios": "^1.7.9", + "dotenv": "^16.5.0", "firebase": "^11.1.0", "firebase-admin": "^13.0.2", "next": "15.1.3", diff --git a/yarn.lock b/yarn.lock index 38a5890..a9ff707 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1548,6 +1548,11 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +dotenv@^16.5.0: + version "16.5.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz" + integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== + dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" From 0d155d0f1aa2959b46a654034d4fb993d7cab749 Mon Sep 17 00:00:00 2001 From: OjuIsOn Date: Tue, 3 Jun 2025 23:51:47 +0530 Subject: [PATCH 02/22] Add API actions and DTOs for information part - Implemented actions for information part - Created DTOs :- categories, contacts, developers, events, facts, videos, FAQs, lectures, and sponsors . --- app/actions/information.ts | 262 + app/dtos/category.dto.ts | 14 + app/dtos/contact.dto.ts | 18 + app/dtos/dev.dto.ts | 25 + app/dtos/event.dto.ts | 45 + app/dtos/facts_vids_faq_notifc.dto.ts | 43 + app/dtos/lecture.dto.ts | 18 + app/dtos/sponsor.dto.ts | 33 + package-lock.json | 8165 ------------------------- package.json | 2 +- yarn.lock | 321 +- 11 files changed, 687 insertions(+), 8259 deletions(-) create mode 100644 app/actions/information.ts create mode 100644 app/dtos/category.dto.ts create mode 100644 app/dtos/contact.dto.ts create mode 100644 app/dtos/dev.dto.ts create mode 100644 app/dtos/event.dto.ts create mode 100644 app/dtos/facts_vids_faq_notifc.dto.ts create mode 100644 app/dtos/lecture.dto.ts create mode 100644 app/dtos/sponsor.dto.ts delete mode 100644 package-lock.json diff --git a/app/actions/information.ts b/app/actions/information.ts new file mode 100644 index 0000000..0706480 --- /dev/null +++ b/app/actions/information.ts @@ -0,0 +1,262 @@ +import axios from "axios"; +import { + Event, + + EventsResponse,TimelineEvent, + TimelineResponse +} from "../dtos/event.dto"; + + +import { + CategoriesResponse, + Category +} from "../dtos/category.dto"; + + +import { + ContactSection, + ContactsResponse +} from "../dtos/contact.dto"; + + +import { + Lecture , + LecturesResponse +} from "../dtos/lecture.dto"; + + +import { + FoodSponsor, + FoodSponsorsResponse, + SponsorSection, + SponsorsResponse +} from "../dtos/sponsor.dto"; + +import { + AboutAppDevsResponse, + AboutResponse, + Developer +} from "../dtos/dev.dto"; + + + + +import { + FactsResponse, + FAQ, + FAQResponse, + NotificationResponse, + Video, + VideosResponse + } from "../dtos/facts_vids_faq_notifc.dto"; + + + +export async function getCategoriesName(): Promise { + try { + const url = `${process.env.SERVER_URL}/events/categories`; + const response = await axios.get(url); + return response.data.data.categories; + } + catch (error: any) { + console.error("Error getting categories name:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get the categories name"); + } +} + +export async function getEventsNames(eventCategory?: string): Promise { + + try { + let url = `${process.env.SERVER_URL}/events`; + if (eventCategory && eventCategory.trim() !== "") { + url += `?eventCategory=${encodeURIComponent(eventCategory)}`; + } + const response = await axios.get(url); + return response.data.data.events; + } + catch (error: any) { + console.error("Error getting the events names:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get the events names"); + } +} + +export async function getEventsDescriptionByCategory(eventCategory: string,eventName?:string): Promise { + if(!eventCategory){ + throw new Error("Event catergory is required"); + } + try { + let url = `${process.env.SERVER_URL}/events/description?eventCategory=${encodeURIComponent(eventCategory)}` + if (eventName && eventName.trim() !== "") { + url += `?eventName=${encodeURIComponent(eventName)}`; + } + const response = await axios.get(url); + return response.data.data.events; + } + catch (error: any) { + console.error("Error getting the event description", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get the Description by category"); + } + +} + + + +export async function getTimelineEvents(): Promise { + try { + const url = `${process.env.SERVER_URL}/events/timeline`; + + const response = await axios.get(url); + + return response.data.data.events; + } catch (error: any) { + console.error("Error getting timeline events:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get timeline events"); + } +} + + +export async function getAllContacts(): Promise { + try { + const url = `${process.env.SERVER_URL}/contacts`; + + const response = await axios.get(url); + + return response.data.data.contacts; + } catch (error: any) { + console.error("Error getting contact sections:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get contacts"); + } +} + + + +export async function getGuestLectures(): Promise { + try { + const url = `${process.env.SERVER_URL}/lectures`; + + const response = await axios.get(url); + + return response.data.data.lectures; + } catch (error: any) { + console.error("Error getting guest lectures:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get guest lectures"); + } +} + + +export async function getSponsors(): Promise { + try { + const url = `${process.env.SERVER_URL}/sponsors`; + + const response = await axios.get(url); + + return response.data.data.paisa; + } catch (error: any) { + console.error("Error getting sponsors:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get sponsors"); + } +} + + +export async function getFoodSponsors(): Promise { + try { + const url = `${process.env.SERVER_URL}/foodsponsors`; + + const response = await axios.get(url); + + return response.data.data.foodSponsors; + } catch (error: any) { + console.error("Error getting food sponsors:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get food sponsors"); + } +} + +export async function getDevelopers(): Promise { + try { + const url = `${process.env.SERVER_URL}/about`; + + const response = await axios.get(url); + + return response.data.data.devs; + } catch (error: any) { + console.error("Error getting developers info:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get developers info"); + } +} + + +export async function getAppDevelopers(): Promise { + try { + const url = `${process.env.SERVER_URL}/aboutAppDevs`; + + const response = await axios.get(url); + + return response.data.data.information; + } catch (error: any) { + console.error("Error getting app developers info:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get app developers info"); + } +} + +export async function getRandomFact(): Promise { + try { + const url = `${process.env.SERVER_URL}/facts`; + + const response = await axios.get(url); + + return response.data.data.message; + } catch (error: any) { + console.error("Error getting random fact:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get random fact"); + } +} + +export async function getVideos(): Promise { + try { + const url = `${process.env.SERVER_URL}/videos`; + + const response = await axios.get(url); + + return response.data.data; + } catch (error: any) { + console.error("Error getting videos:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to get videos"); + } +} + +export async function getFAQs(): Promise { + try { + const url = `${process.env.SERVER_URL}/faq`; + + const response = await axios.get(url); + + return response.data.data; + } catch (error: any) { + console.error("Error fetching FAQs:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to fetch FAQs"); + } +} + + +export async function getUpcomingEvents(timestamp?: number): Promise { + try { + const url = `${process.env.SERVER_URL}/timestamp/events`; + const response = await axios.get(url, { + params: { timestamp }, + }); + return response.data.data.events; + } catch (error: any) { + console.error("Error fetching upcoming events:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to fetch upcoming events"); + } +} + +export async function getNotifications(): Promise { + try { + const response = await axios.get(`${process.env.SERVER_URL}/notification`); + return response.data; + } catch (error: any) { + console.error("Error fetching notifications:", error?.response?.data || error.message); + throw new Error(error?.response?.data?.message || "Failed to fetch notifications"); + } +} \ No newline at end of file diff --git a/app/dtos/category.dto.ts b/app/dtos/category.dto.ts new file mode 100644 index 0000000..37831b1 --- /dev/null +++ b/app/dtos/category.dto.ts @@ -0,0 +1,14 @@ +export interface Category { + categoryName: string; + imgUrl: string; + icon: string; +} + + +export interface CategoriesResponse { + success: boolean; + message: string; + data: { + categories: Category[]; + }; +} \ No newline at end of file diff --git a/app/dtos/contact.dto.ts b/app/dtos/contact.dto.ts new file mode 100644 index 0000000..f3c69b0 --- /dev/null +++ b/app/dtos/contact.dto.ts @@ -0,0 +1,18 @@ +export interface ContactPerson { + imageUrl: string; + name: string; +} + +export interface ContactSection { + section: string; + logo: string; + people: ContactPerson[]; +} + +export interface ContactsResponse { + success: boolean; + message: string; + data: { + contacts: ContactSection[]; + }; +} diff --git a/app/dtos/dev.dto.ts b/app/dtos/dev.dto.ts new file mode 100644 index 0000000..b112651 --- /dev/null +++ b/app/dtos/dev.dto.ts @@ -0,0 +1,25 @@ +export interface Developer { + imageUrl: string; + name: string; + year: string; + github: string; + linkedin: string; + insta: string; +} + +export interface AboutResponse { + success: boolean; + message: string; + data: { + devs: Developer[]; + }; +} + +export interface AboutAppDevsResponse { + success: boolean; + message: string; + data: { + information: Developer[]; + }; +} + diff --git a/app/dtos/event.dto.ts b/app/dtos/event.dto.ts new file mode 100644 index 0000000..a7facff --- /dev/null +++ b/app/dtos/event.dto.ts @@ -0,0 +1,45 @@ +export interface Coordinator { + coordinator_name: string; + coordinator_number: string; +}; + + +export interface Event { + eventName: string, + eventCategory: string, + venue: string, + description: string, + endTime: 0, + startTime: 0, + document: string, + poster: string, + cordinators: Coordinator[], + rules: [ + string + ] +} + +export interface EventsResponse { + success: boolean; + message: string; + data: { + events: Event[]; + }; +} + + +export interface TimelineEvent { + eventName: string; + eventCategory: string; + startTime: number; + endTime: number; +} + +export interface TimelineResponse { + success: boolean; + message: string; + data: { + events: TimelineEvent[]; + }; +} + diff --git a/app/dtos/facts_vids_faq_notifc.dto.ts b/app/dtos/facts_vids_faq_notifc.dto.ts new file mode 100644 index 0000000..1d1e6af --- /dev/null +++ b/app/dtos/facts_vids_faq_notifc.dto.ts @@ -0,0 +1,43 @@ +export interface FactsResponse { + success: boolean; + message: string; + data: { + message: string; + }; +} + +export interface Video { + title: string; + url: string; +} + +export interface VideosResponse { + success: boolean; + message: string; + data: Video[]; +} + +export interface FAQ { + ques: string; + ans: string; +} + +export interface FAQResponse { + success: boolean; + message: string; + data: FAQ[]; +} + +export interface Notification { + notif: string; + time: string; +} + +export interface NotificationResponse { + success: boolean; + message: string; + data: { + notifications: Notification[]; + }; +} + diff --git a/app/dtos/lecture.dto.ts b/app/dtos/lecture.dto.ts new file mode 100644 index 0000000..967ee7b --- /dev/null +++ b/app/dtos/lecture.dto.ts @@ -0,0 +1,18 @@ +export interface Lecture { + date: string; + desc: string; + imageUrl: string; + time: string; + name: string; + insta: string; + linkedin: string; + facebook: string; +} + +export interface LecturesResponse { + success: boolean; + message: string; + data: { + lectures: Lecture[]; + }; +} diff --git a/app/dtos/sponsor.dto.ts b/app/dtos/sponsor.dto.ts new file mode 100644 index 0000000..cda597e --- /dev/null +++ b/app/dtos/sponsor.dto.ts @@ -0,0 +1,33 @@ +export interface Sponsor { + imageUrl: string; + targetUrl: string; +} + +export interface SponsorSection { + sponsors: Sponsor[]; + sponsorSection: string; +} + +export interface SponsorsResponse { + success: boolean; + message: string; + data: { + paisa: SponsorSection[]; + }; +} + + +export interface FoodSponsor { + imageUrl: string; + link: string; + name: string; +} + +export interface FoodSponsorsResponse { + success: boolean; + message: string; + data: { + foodSponsors: FoodSponsor[]; + }; +} + diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index f2f3f10..0000000 --- a/package-lock.json +++ /dev/null @@ -1,8165 +0,0 @@ -{ - "name": "admin-panel", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "admin-panel", - "version": "0.1.0", - "dependencies": { - "axios": "^1.7.9", - "firebase": "^11.1.0", - "firebase-admin": "^13.0.2", - "next": "15.1.3", - "react": "^19.0.0", - "react-datepicker": "^7.6.0", - "react-dom": "^19.0.0", - "react-hot-toast": "^2.5.1", - "react-icons": "^5.4.0" - }, - "devDependencies": { - "@eslint/eslintrc": "^3", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "15.1.3", - "postcss": "^8", - "tailwindcss": "^3.4.1", - "typescript": "^5" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "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", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.5", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", - "integrity": "sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==" - }, - "node_modules/@firebase/analytics": { - "version": "0.10.10", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.10.tgz", - "integrity": "sha512-Psdo7c9g2SLAYh6u1XRA+RZ7ab2JfBVuAt/kLzXkhKZL/gS2cQUCMsOW5p0RIlDPRKqpdNSmvujd2TeRWLKOkQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/installations": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.16.tgz", - "integrity": "sha512-Q/s+u/TEMSb2EDJFQMGsOzpSosybBl8HuoSEMyGZ99+0Pu7SIR9MPDGUjc8PKiCFQWDJ3QXxgqh1d/rujyAMbA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/analytics": "0.10.10", - "@firebase/analytics-types": "0.8.3", - "@firebase/component": "0.6.11", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", - "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app": { - "version": "0.10.17", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.17.tgz", - "integrity": "sha512-53sIYyAnYEPIZdaxuyq5OST7j4KBc2pqmktz+tEb1BIUSbXh8Gp4k/o6qzLelLpm4ngrBz7SRN0PZJqNRAyPog==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.10.tgz", - "integrity": "sha512-DWFfxxif/t+Ow4MmRUevDX+A3hVxm1rUf6y5ZP4sIomfnVCO1NNahqtsv9rb1/tKGkTeoVT40weiTS/WjQG1mA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.17.tgz", - "integrity": "sha512-a/eadrGsY0MVCBPhrNbKUhoYpms4UKTYLKO7nswwSFVsm3Rw6NslQQCNLfvljcDqP4E7alQDRGJXjkxd/5gJ+Q==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check": "0.8.10", - "@firebase/app-check-types": "0.5.3", - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", - "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz", - "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-compat": { - "version": "0.2.47", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.47.tgz", - "integrity": "sha512-TdEWGDp6kSwuO1mxiM2Fe39eLWygfyzqTZcoU3aPV0viqqphPCbBBnVjPbFJErZ4+yaS7uCWXEbFEP9m5/COKA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app": "0.10.17", - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/auth-compat": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.16.tgz", - "integrity": "sha512-YlYwJMBqAyv0ESy3jDUyshMhZlbUiwAm6B6+uUmigNDHU+uq7j4SFiDJEZlFFIz397yBzKn06SUdqutdQzGnCA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth": "1.8.1", - "@firebase/auth-types": "0.12.3", - "@firebase/component": "0.6.11", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-compat/node_modules/@firebase/auth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.8.1.tgz", - "integrity": "sha512-LX9N/Cf5Z35r5yqm2+5M3+2bRRe/+RFaa/+u4HDni7TA27C/Xm4XHLKcWcLg1BzjrS4zngSaBEOSODvp6RFOqQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", - "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/auth-types": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.3.tgz", - "integrity": "sha512-Zq9zI0o5hqXDtKg6yDkSnvMCMuLU6qAVS51PANQx+ZZX5xnzyNLEBO3GZgBUPsV5qIMFhjhqmLDxUqCbnAYy2A==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.11.tgz", - "integrity": "sha512-eQbeCgPukLgsKD0Kw5wQgsMDX5LeoI1MIrziNDjmc6XDq5ZQnuUymANQgAb2wp1tSF9zDSXyxJmIUXaKgN58Ug==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/data-connect": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.1.3.tgz", - "integrity": "sha512-FbAQpWNHownJx1VTCQI4ydbWGOZmSWXoFlirQn3ItHqsLJYSywqxSgDafzvyooifFh3J/2WqaM8y9hInnPcsTw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.10.tgz", - "integrity": "sha512-sWp2g92u7xT4BojGbTXZ80iaSIaL6GAL0pwvM0CO/hb0nHSnABAqsH7AhnWGsGvXuEvbPr7blZylPaR9J+GSuQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.1.tgz", - "integrity": "sha512-IsFivOjdE1GrjTeKoBU/ZMenESKDXidFDzZzHBPQ/4P20ptGdrl3oLlWrV/QJqJ9lND4IidE3z4Xr5JyfUW1vg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/database": "1.0.10", - "@firebase/database-types": "1.0.7", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.7.tgz", - "integrity": "sha512-I7zcLfJXrM0WM+ksFmFdAMdlq/DFmpeMNa+/GNsLyFo5u/lX5zzkPzGe3srVWqaBQBY5KprylDGxOsP6ETfL0A==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-types": "0.9.3", - "@firebase/util": "1.10.2" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.5.tgz", - "integrity": "sha512-OO3rHvjC07jL2ITN255xH/UzCVSvh6xG8oTzQdFScQvFbcm1fjCL1hgAdpDZcx3vVcKMV+6ktr8wbllkB8r+FQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "@firebase/webchannel-wrapper": "1.0.3", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.3.40", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.40.tgz", - "integrity": "sha512-18HopMN811KYBc9Ptpr1Rewwio0XF09FF3jc5wtV6rGyAs815SlFFw5vW7ZeLd43zv9tlEc2FzM0H+5Vr9ZRxw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/firestore": "4.7.5", - "@firebase/firestore-types": "3.0.3", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", - "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/functions": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.0.tgz", - "integrity": "sha512-plTtzY/nT0jOgHzT0vB9qch4FpHFOhCnR8HhYBqqdArG6GOQMIruKZbiTyLybO8bcaaNgQ6kSm9yohGUwxHcIw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.11", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.17.tgz", - "integrity": "sha512-oj2XV8YsJYutyPCRYUfbN6swmfrL6zar0/qtqZsKT7P7btOiYRl+lD6fxtQaT+pKE5YgOBGZW//kLPZfY0jWhw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/functions": "0.12.0", - "@firebase/functions-types": "0.6.3", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", - "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/installations": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.11.tgz", - "integrity": "sha512-w8fY8mw6fxJzsZM2ufmTtomopXl1+bn/syYon+Gpn+0p0nO1cIUEVEFrFazTLaaL9q1CaVhc3HmseRTsI3igAA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/util": "1.10.2", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.11.tgz", - "integrity": "sha512-SHRgw5LTa6v8LubmJZxcOCwEd1MfWQPUtKdiuCx2VMWnapX54skZd1PkQg0K4l3k+4ujbI2cn7FE6Li9hbChBw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/installations": "0.6.11", - "@firebase/installations-types": "0.5.3", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", - "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/logger": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.4.tgz", - "integrity": "sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.15", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.15.tgz", - "integrity": "sha512-Bz+qvWNEwEWAbYtG4An8hgcNco6NWNoNLuLbGVwPL2fAoCF1zz+dcaBp+iTR2+K199JyRyDT9yDPAXhNHNDaKQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/installations": "0.6.11", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.10.2", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.15.tgz", - "integrity": "sha512-mEKKASRvRWq1aBNHgioGsOYR2c5nBZpO7k90K794zjKe0WkGNf0k7PLs5SlCf8FKnzumEkhTAp/SjYxovuxa8A==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/messaging": "0.12.15", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", - "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/performance": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.11.tgz", - "integrity": "sha512-FlkJFeqLlIeh5T4Am3uE38HVzggliDIEFy/fErEc1faINOUFCb6vQBEoNZGaXvRnTR8lh3X/hP7tv37C7BsK9g==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/installations": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.11.tgz", - "integrity": "sha512-DqeNBy51W2xzlklyC7Ht9JQ94HhTA08PCcM4MDeyG/ol3fqum/+YgtHWQ2IQuduqH9afETthZqLwCZiSgY7hiA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/performance": "0.6.11", - "@firebase/performance-types": "0.2.3", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", - "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/remote-config": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.11.tgz", - "integrity": "sha512-9z0rgKuws2nj+7cdiqF+NY1QR4na6KnuOvP+jQvgilDOhGtKOcCMq5XHiu66i73A9kFhyU6QQ2pHXxcmaq1pBw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/installations": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.11.tgz", - "integrity": "sha512-zfIjpwPrGuIOZDmduukN086qjhZ1LnbJi/iYzgua+2qeTlO0XdlE1v66gJPwygGB3TOhT0yb9EiUZ3nBNttMqg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/remote-config": "0.4.11", - "@firebase/remote-config-types": "0.3.3", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.3.tgz", - "integrity": "sha512-YlRI9CHxrk3lpQuFup9N1eohpwdWayKZUNZ/YeQ0PZoncJ66P32UsKUKqVXOaieTjJIOh7yH8JEzRdht5s+d6g==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/storage": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.4.tgz", - "integrity": "sha512-b1KaTTRiMupFurIhpGIbReaWev0k5O3ouTHkAPcEssT+FvU3q/1JwzvkX4+ZdB60Fc43Mbp8qQ1gWfT0Z2FP9Q==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.14.tgz", - "integrity": "sha512-Ok5FmXJiapaNAOQ8W8qppnfwgP8540jw2B8M0c4TFZqF4BD+CoKBxW0dRtOuLNGadLhzqqkDZZZtkexxrveQqA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/storage": "0.13.4", - "@firebase/storage-types": "0.8.3", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", - "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/util": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.2.tgz", - "integrity": "sha512-qnSHIoE9FK+HYnNhTI8q14evyqbc/vHRivfB4TgCIUOl4tosmKSQlp7ltymOlMP4xVIJTg5wrkfcZ60X4nUf7Q==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@firebase/vertexai": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@firebase/vertexai/-/vertexai-1.0.2.tgz", - "integrity": "sha512-4dC9m2nD0tkfKJT5v+i27tELrmUePjFXW3CDAxhVHUEv647B2R7kqpGQnyPkNEeaXkCr76THe7GGg35EWn4lDw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz", - "integrity": "sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==", - "license": "Apache-2.0" - }, - "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.3.tgz", - "integrity": "sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.9", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, - "node_modules/@google-cloud/firestore": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.0.tgz", - "integrity": "sha512-88uZ+jLsp1aVMj7gh3EKYH1aulTAMFAp8sH/v5a9w8q8iqSG27RiWLoxSAFr/XocZ9hGiWH1kEnBw+zl3xAgNA==", - "optional": true, - "dependencies": { - "@opentelemetry/api": "^1.3.0", - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.3", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", - "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.15.0.tgz", - "integrity": "sha512-/j/+8DFuEOo33fbdX0V5wjooOoFahEaMEdImHBmM2tH9MPHJYNtmXOf2sGUmZmiufSukmBEvdlzYgDkkgeBiVQ==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "html-entities": "^2.5.2", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.15", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", - "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.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", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@next/env": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.3.tgz", - "integrity": "sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw==", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.3.tgz", - "integrity": "sha512-oeP1vnc5Cq9UoOb8SYHAEPbCXMzOgG70l+Zfd+Ie00R25FOm+CCVNrcIubJvB1tvBgakXE37MmqSycksXVPRqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz", - "integrity": "sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz", - "integrity": "sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz", - "integrity": "sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz", - "integrity": "sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz", - "integrity": "sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz", - "integrity": "sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz", - "integrity": "sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz", - "integrity": "sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "optional": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "optional": true - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.8.tgz", - "integrity": "sha512-7fx54m60nLFUVYlxAB1xpe9CBWX2vSrk50Y6ogRJ1v5xxtba7qXTg5BgYDN5dq+yuQQ9HaVlHJyAAt1/mxryFg==", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" - }, - "node_modules/@types/node": { - "version": "20.17.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.11.tgz", - "integrity": "sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/react": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz", - "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz", - "integrity": "sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "optional": true, - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", - "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz", - "integrity": "sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/type-utils": "8.19.0", - "@typescript-eslint/utils": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.0.tgz", - "integrity": "sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/typescript-estree": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz", - "integrity": "sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz", - "integrity": "sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.19.0", - "@typescript-eslint/utils": "8.19.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.0.tgz", - "integrity": "sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz", - "integrity": "sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/visitor-keys": "8.19.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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/@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" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.0.tgz", - "integrity": "sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.19.0", - "@typescript-eslint/types": "8.19.0", - "@typescript-eslint/typescript-estree": "8.19.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz", - "integrity": "sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.19.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", - "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "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/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/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "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==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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==", - "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==", - "license": "MIT" - }, - "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==", - "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/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==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-next": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.3.tgz", - "integrity": "sha512-wGYlNuWnh4ujuKtZvH+7B2Z2vy9nONZE6ztd+DKF7hAsIabkrxmD4TzYHzASHENo42lmz2tnT2B+zN2sOHvpJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "15.1.3", - "@rushstack/eslint-patch": "^1.10.3", - "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^5.0.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", - "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.7", - "enhanced-resolve": "^5.15.0", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3", - "stable-hash": "^0.0.4" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/eslint-import-resolver-typescript/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/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", - "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", - "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "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/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.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", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/farmhash-modern": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", - "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", - "engines": { - "node": ">=18.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", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/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/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz", - "integrity": "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/firebase": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.1.0.tgz", - "integrity": "sha512-3OoNW3vBXmBLYJvcwbPCwfluptbDVp2zZYjrfHPVFAXfPgmyy/LWjidt+Sw2WNvRelsG0v++WN2Wor6J3OwDRg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/analytics": "0.10.10", - "@firebase/analytics-compat": "0.2.16", - "@firebase/app": "0.10.17", - "@firebase/app-check": "0.8.10", - "@firebase/app-check-compat": "0.3.17", - "@firebase/app-compat": "0.2.47", - "@firebase/app-types": "0.9.3", - "@firebase/auth": "1.8.1", - "@firebase/auth-compat": "0.5.16", - "@firebase/data-connect": "0.1.3", - "@firebase/database": "1.0.10", - "@firebase/database-compat": "2.0.1", - "@firebase/firestore": "4.7.5", - "@firebase/firestore-compat": "0.3.40", - "@firebase/functions": "0.12.0", - "@firebase/functions-compat": "0.3.17", - "@firebase/installations": "0.6.11", - "@firebase/installations-compat": "0.2.11", - "@firebase/messaging": "0.12.15", - "@firebase/messaging-compat": "0.2.15", - "@firebase/performance": "0.6.11", - "@firebase/performance-compat": "0.2.11", - "@firebase/remote-config": "0.4.11", - "@firebase/remote-config-compat": "0.2.11", - "@firebase/storage": "0.13.4", - "@firebase/storage-compat": "0.3.14", - "@firebase/util": "1.10.2", - "@firebase/vertexai": "1.0.2" - } - }, - "node_modules/firebase-admin": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.0.2.tgz", - "integrity": "sha512-YWVpoN+tZVSRXF0qC0gojoF5bSqvBRbnBk8+xUtFiguM2L4vB7f0moAwV1VVWDDHvTnvQ68OyTMpdp6wKo/clw==", - "dependencies": { - "@fastify/busboy": "^3.0.0", - "@firebase/database-compat": "^2.0.0", - "@firebase/database-types": "^1.0.6", - "@types/node": "^22.8.7", - "farmhash-modern": "^1.1.0", - "google-auth-library": "^9.14.2", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.1.0", - "node-forge": "^1.3.1", - "uuid": "^11.0.2" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.11.0", - "@google-cloud/storage": "^7.14.0" - } - }, - "node_modules/firebase-admin/node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/firebase-admin/node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "node_modules/firebase/node_modules/@firebase/auth": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.8.1.tgz", - "integrity": "sha512-LX9N/Cf5Z35r5yqm2+5M3+2bRRe/+RFaa/+u4HDni7TA27C/Xm4XHLKcWcLg1BzjrS4zngSaBEOSODvp6RFOqQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "optional": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/goober": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", - "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, - "node_modules/google-auth-library": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.4.1.tgz", - "integrity": "sha512-Phyp9fMfA00J3sZbJxbbB4jC55b7DBjE3F6poyL3wKMEBVKA79q6BGuHcTiM28yOzVql0NDbRL8MLLh8Iwk9Dg==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "^1.10.9", - "@grpc/proto-loader": "^0.7.13", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.7.0", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.2", - "protobufjs": "^7.3.2", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/@grpc/grpc-js": { - "version": "1.12.5", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz", - "integrity": "sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/google-gax/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "optional": true - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "license": "MIT" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "optional": true - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true - }, - "node_modules/is-async-function": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", - "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", - "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.6.3" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/next": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/next/-/next-15.1.3.tgz", - "integrity": "sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==", - "license": "MIT", - "dependencies": { - "@next/env": "15.1.3", - "@swc/counter": "0.1.3", - "@swc/helpers": "0.5.15", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.1.3", - "@next/swc-darwin-x64": "15.1.3", - "@next/swc-linux-arm64-gnu": "15.1.3", - "@next/swc-linux-arm64-musl": "15.1.3", - "@next/swc-linux-x64-gnu": "15.1.3", - "@next/swc-linux-x64-musl": "15.1.3", - "@next/swc-win32-arm64-msvc": "15.1.3", - "@next/swc-win32-x64-msvc": "15.1.3", - "sharp": "^0.33.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proto3-json-serializer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", - "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-datepicker": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.6.0.tgz", - "integrity": "sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.27.0", - "clsx": "^2.1.1", - "date-fns": "^3.6.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/react-dom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", - "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.25.0" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/react-hot-toast": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.1.tgz", - "integrity": "sha512-54Gq1ZD1JbmAb4psp9bvFHjS7lje+8ubboUmvKZkCsQBLH6AOpZ9JemfRvIdHcfb9AZXRaFLrb3qUobGYDJhFQ==", - "dependencies": { - "csstype": "^3.1.3", - "goober": "^2.1.16" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/react-icons": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz", - "integrity": "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", - "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "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/string-width-cjs/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/string-width-cjs/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/string-width-cjs/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/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/strip-ansi-cjs": { - "name": "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/strip-ansi-cjs/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/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/tailwindcss/node_modules/fast-glob/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/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/teeny-request/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "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": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/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", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "optional": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "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==", - "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==", - "license": "MIT" - }, - "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==", - "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==", - "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", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index e4a7155..110e428 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "axios": "^1.7.9", + "axios": "^1.9.0", "firebase": "^11.1.0", "firebase-admin": "^13.0.2", "next": "15.1.3", diff --git a/yarn.lock b/yarn.lock index 38a5890..21d628d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,13 @@ resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== +"@emnapi/runtime@^1.2.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.3.tgz#c0564665c80dc81c448adac23f9dfbed6c838f7d" + integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.1" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz" @@ -131,7 +138,7 @@ "@firebase/util" "1.10.2" tslib "^2.1.0" -"@firebase/app-compat@0.2.47", "@firebase/app-compat@0.x": +"@firebase/app-compat@0.2.47": version "0.2.47" resolved "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.47.tgz" integrity sha512-TdEWGDp6kSwuO1mxiM2Fe39eLWygfyzqTZcoU3aPV0viqqphPCbBBnVjPbFJErZ4+yaS7uCWXEbFEP9m5/COKA== @@ -142,12 +149,12 @@ "@firebase/util" "1.10.2" tslib "^2.1.0" -"@firebase/app-types@0.9.3", "@firebase/app-types@0.x": +"@firebase/app-types@0.9.3": version "0.9.3" resolved "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz" integrity sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw== -"@firebase/app@0.10.17", "@firebase/app@0.x": +"@firebase/app@0.10.17": version "0.10.17" resolved "https://registry.npmjs.org/@firebase/app/-/app-0.10.17.tgz" integrity sha512-53sIYyAnYEPIZdaxuyq5OST7j4KBc2pqmktz+tEb1BIUSbXh8Gp4k/o6qzLelLpm4ngrBz7SRN0PZJqNRAyPog== @@ -208,7 +215,7 @@ "@firebase/util" "1.10.2" tslib "^2.1.0" -"@firebase/database-compat@^2.0.0", "@firebase/database-compat@2.0.1": +"@firebase/database-compat@2.0.1", "@firebase/database-compat@^2.0.0": version "2.0.1" resolved "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.1.tgz" integrity sha512-IsFivOjdE1GrjTeKoBU/ZMenESKDXidFDzZzHBPQ/4P20ptGdrl3oLlWrV/QJqJ9lND4IidE3z4Xr5JyfUW1vg== @@ -220,7 +227,7 @@ "@firebase/util" "1.10.2" tslib "^2.1.0" -"@firebase/database-types@^1.0.6", "@firebase/database-types@1.0.7": +"@firebase/database-types@1.0.7", "@firebase/database-types@^1.0.6": version "1.0.7" resolved "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.7.tgz" integrity sha512-I7zcLfJXrM0WM+ksFmFdAMdlq/DFmpeMNa+/GNsLyFo5u/lX5zzkPzGe3srVWqaBQBY5KprylDGxOsP6ETfL0A== @@ -439,7 +446,7 @@ "@firebase/util" "1.10.2" tslib "^2.1.0" -"@firebase/util@1.10.2", "@firebase/util@1.x": +"@firebase/util@1.10.2": version "1.10.2" resolved "https://registry.npmjs.org/@firebase/util/-/util-1.10.2.tgz" integrity sha512-qnSHIoE9FK+HYnNhTI8q14evyqbc/vHRivfB4TgCIUOl4tosmKSQlp7ltymOlMP4xVIJTg5wrkfcZ60X4nUf7Q== @@ -602,6 +609,114 @@ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz" integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + "@img/sharp-win32-x64@0.33.5": version "0.33.5" resolved "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz" @@ -668,6 +783,41 @@ dependencies: fast-glob "3.3.1" +"@next/swc-darwin-arm64@15.1.3": + version "15.1.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz#cac0dc4a1086a33767cc5fb8d11c97391216ca7c" + integrity sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg== + +"@next/swc-darwin-x64@15.1.3": + version "15.1.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz#7ebfe9abd7db5abbd28e699d234517f63259ff53" + integrity sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA== + +"@next/swc-linux-arm64-gnu@15.1.3": + version "15.1.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz#a6773ea8df2838e8aea1d638176f40849af1ed06" + integrity sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw== + +"@next/swc-linux-arm64-musl@15.1.3": + version "15.1.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz#309f60d4218511d152876e7f6cc624b7e6a44f6c" + integrity sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w== + +"@next/swc-linux-x64-gnu@15.1.3": + version "15.1.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz#c9ac936eee265da738cde4758d95af4562bbd38b" + integrity sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw== + +"@next/swc-linux-x64-musl@15.1.3": + version "15.1.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz#2fe0c262b379f3c5b39cab2fa0ba3d9108c8e440" + integrity sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw== + +"@next/swc-win32-arm64-msvc@15.1.3": + version "15.1.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz#67252289babfa38712497af646744ffc758aa3dc" + integrity sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw== + "@next/swc-win32-x64-msvc@15.1.3": version "15.1.3" resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz" @@ -681,7 +831,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -699,7 +849,7 @@ resolved "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0": +"@opentelemetry/api@^1.3.0": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -872,7 +1022,7 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node@*", "@types/node@^20", "@types/node@>=12.12.47", "@types/node@>=13.7.0": +"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^20": version "20.17.11" resolved "https://registry.npmjs.org/@types/node/-/node-20.17.11.tgz" integrity sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg== @@ -901,7 +1051,7 @@ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz" integrity sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg== -"@types/react@^19", "@types/react@^19.0.0": +"@types/react@^19": version "19.0.2" resolved "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz" integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg== @@ -955,7 +1105,7 @@ natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0": +"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": version "8.19.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.0.tgz" integrity sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw== @@ -1033,16 +1183,11 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: +acorn@^8.14.0: version "8.14.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== -agent-base@^7.1.2: - version "7.1.3" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" - integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== - agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -1050,6 +1195,11 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" @@ -1232,10 +1382,10 @@ axe-core@^4.10.0: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz" integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== -axios@^1.7.9: - version "1.7.9" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" - integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== +axios@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" + integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -1442,7 +1592,7 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.3: +csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -1484,6 +1634,13 @@ date-fns@^3.6.0: resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== +debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7: + version "4.4.0" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -1491,13 +1648,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7, debug@4: - version "4.4.0" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -1548,6 +1698,7 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" + dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" @@ -1572,7 +1723,7 @@ eastasianwidth@^0.2.0: resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ecdsa-sig-formatter@^1.0.11, ecdsa-sig-formatter@1.0.11: +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== @@ -1782,7 +1933,7 @@ eslint-module-utils@^2.12.0: dependencies: debug "^3.2.7" -eslint-plugin-import@*, eslint-plugin-import@^2.31.0: +eslint-plugin-import@^2.31.0: version "2.31.0" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz" integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== @@ -1875,7 +2026,7 @@ eslint-visitor-keys@^4.2.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0 || ^9.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9: +eslint@^9: version "9.17.0" resolved "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz" integrity sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA== @@ -1968,27 +2119,27 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.8" + micromatch "^4.0.4" -fast-glob@3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -2148,6 +2299,11 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -2239,7 +2395,7 @@ get-tsconfig@^4.7.5: dependencies: resolve-pkg-maps "^1.0.0" -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -2253,13 +2409,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob@^10.3.10: version "10.4.5" resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" @@ -2694,7 +2843,7 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jiti@*, jiti@^1.21.6: +jiti@^1.21.6: version "1.21.7" resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== @@ -2928,11 +3077,6 @@ loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - lru-cache@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" @@ -2940,6 +3084,11 @@ lru-cache@6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-memoizer@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz" @@ -3287,15 +3436,6 @@ postcss-value-parser@^4.0.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8, postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.47, postcss@>=8.0.9: - version "8.4.49" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== - dependencies: - nanoid "^3.3.7" - picocolors "^1.1.1" - source-map-js "^1.2.1" - postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -3305,6 +3445,15 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8, postcss@^8.4.47: + version "8.4.49" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -3368,7 +3517,7 @@ react-datepicker@^7.6.0: clsx "^2.1.1" date-fns "^3.6.0" -"react-dom@^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@^19.0.0, react-dom@>=16, react-dom@>=16.8.0, react-dom@>=17.0.0: +react-dom@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz" integrity sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ== @@ -3393,7 +3542,7 @@ react-is@^16.13.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react@*, "react@^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react@^19.0.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", react@>=16, react@>=16.8.0, react@>=17.0.0: +react@^19.0.0: version "19.0.0" resolved "https://registry.npmjs.org/react/-/react-19.0.0.tgz" integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== @@ -3517,7 +3666,7 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.2.1, safe-buffer@>=5.1.0, safe-buffer@~5.2.0: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -3705,13 +3854,6 @@ streamsearch@^1.1.0: resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -3721,16 +3863,7 @@ string_decoder@^1.1.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3816,6 +3949,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -3984,7 +4124,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.1.0, tslib@^2.8.0: +tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0: version "2.8.1" resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -4041,7 +4181,7 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" -typescript@^5, typescript@>=3.3.1, typescript@>=4.2.0, "typescript@>=4.8.4 <5.8.0": +typescript@^5: version "5.7.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== @@ -4088,12 +4228,7 @@ uuid@^8.0.0: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -uuid@^9.0.1: +uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== From 0367ea911429b9bca42c9901520cd57a5b96f06d Mon Sep 17 00:00:00 2001 From: Debatreya Das <116421305+Debatreya@users.noreply.github.com> Date: Wed, 4 Jun 2025 10:36:07 +0530 Subject: [PATCH 03/22] Update app/dtos/event.dto.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/dtos/event.dto.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/dtos/event.dto.ts b/app/dtos/event.dto.ts index a7facff..959c270 100644 --- a/app/dtos/event.dto.ts +++ b/app/dtos/event.dto.ts @@ -14,9 +14,7 @@ export interface Event { document: string, poster: string, cordinators: Coordinator[], - rules: [ - string - ] + rules: string[]; } export interface EventsResponse { From 9a02717cfaa0e714b604376942b29650562f3b78 Mon Sep 17 00:00:00 2001 From: Debatreya Das <116421305+Debatreya@users.noreply.github.com> Date: Wed, 4 Jun 2025 10:36:24 +0530 Subject: [PATCH 04/22] Update app/actions/information.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/actions/information.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/actions/information.ts b/app/actions/information.ts index 0706480..3326f0f 100644 --- a/app/actions/information.ts +++ b/app/actions/information.ts @@ -82,7 +82,7 @@ export async function getEventsNames(eventCategory?: string): Promise { export async function getEventsDescriptionByCategory(eventCategory: string,eventName?:string): Promise { if(!eventCategory){ - throw new Error("Event catergory is required"); + throw new Error("Event category is required"); } try { let url = `${process.env.SERVER_URL}/events/description?eventCategory=${encodeURIComponent(eventCategory)}` From 09cb8f7193c332bbbd2198bdcfd8224e3845c2d9 Mon Sep 17 00:00:00 2001 From: Debatreya Das <116421305+Debatreya@users.noreply.github.com> Date: Wed, 4 Jun 2025 10:40:22 +0530 Subject: [PATCH 05/22] Update app/actions/information.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- app/actions/information.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/actions/information.ts b/app/actions/information.ts index 3326f0f..c1444b4 100644 --- a/app/actions/information.ts +++ b/app/actions/information.ts @@ -87,7 +87,7 @@ export async function getEventsDescriptionByCategory(eventCategory: string,event try { let url = `${process.env.SERVER_URL}/events/description?eventCategory=${encodeURIComponent(eventCategory)}` if (eventName && eventName.trim() !== "") { - url += `?eventName=${encodeURIComponent(eventName)}`; + url += `&eventName=${encodeURIComponent(eventName)}`; } const response = await axios.get(url); return response.data.data.events; From e09ddcc951a6dc960447c8e35d8c691555fdea39 Mon Sep 17 00:00:00 2001 From: Agrawal-Vansh Date: Thu, 5 Jun 2025 16:48:19 +0530 Subject: [PATCH 06/22] User routes updates as per swagger UI APIs --- app/actions/users.ts | 269 +++++++++++-------------------------------- app/dtos/user.dto.ts | 23 ++++ 2 files changed, 91 insertions(+), 201 deletions(-) create mode 100644 app/dtos/user.dto.ts diff --git a/app/actions/users.ts b/app/actions/users.ts index 2044a50..cc5dd44 100644 --- a/app/actions/users.ts +++ b/app/actions/users.ts @@ -1,220 +1,87 @@ -import { - collection, - setDoc, - getDocs, - getDoc, - doc, - updateDoc, - deleteDoc, -} from "firebase/firestore"; -import { db } from "@/app/db"; - -export type RegisteredEvents = { - [category: string]: string[]; -}; - -export type User = { - admin: boolean; - email: string; - name: string; - onBoard: boolean; - picture: string; - role: "user" | "admin" | "manager"; - college?: string; - phone?: string; - year?: string; - registeredEvents?: RegisteredEvents; -}; - -export type UsersDTO = { - [email: string]: User; -}; - -// Get all users -/** - * Fetches all users from the Firestore database. - * - * @returns {Promise} A promise that resolves to an object containing all users, - * where each key is the user's email and the value is the user data. - * - * @throws {Error} Throws an error if there is an issue fetching users from the database. - * - * @example - * ```typescript - * getAllUsers() - * .then((users) => { - * console.log(users); - * }) - * .catch((error) => { - * console.error("Error fetching users:", error); - * }); - * ``` - */ -export async function getAllUsers(): Promise { +import axios from "axios"; +import { UserEventsResponse,SimpleResponse, UserEventUpdateRequest,AddQueryRequest } from "../dtos/user.dto"; +import { Event } from "../dtos/event.dto"; + +export async function getUserEvents(): Promise { try { - const querySnapshot = await getDocs(collection(db, "users")); - const data: UsersDTO = {}; + const url = `${process.env.SERVER_URL}/user/event`; - querySnapshot.forEach((doc) => { - data[doc.id] = doc.data() as User; + const response = await axios.get(url, { + withCredentials: true, // ensure session/cookie is sent }); - return data; - } catch (error) { - console.error("Error fetching users:", error); - throw new Error("Failed to fetch users"); + return response.data.data.events; + } catch (error: any) { + console.error("Error fetching user events:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to fetch user events"); } } -// Get user by email -/** - * Fetches a user by their email from the Firestore database. - * - * @param {string} email - The email of the user to fetch. - * @returns {Promise} A promise that resolves to a User object containing the user's data. - * - * @throws {Error} Throws an error if the user is not found or if there is an issue fetching the user. - * - * @example - * ```typescript - * getUserByEmail("user@example.com") - * .then((user) => { - * console.log(user); - * }) - * .catch((error) => { - * console.error("Error fetching user:", error); - * }); - * ``` - */ -export async function getUserByEmail(email: string): Promise { - try { - const docRef = doc(db, "users", email); - const docSnap = await getDoc(docRef); - - if (docSnap.exists()) { - return docSnap.data() as User; - } else { - return null; - } - } catch (error) { - console.error("Error fetching user:", error); - return null; - } -} -// Create user -/** - * Creates a new user in the Firestore database. - * - * @param {string} email - The email of the user to create. - * @param {User} data - The data of the user to create. - * @returns {Promise} A promise that resolves when the user is successfully created. - * - * @throws {Error} Throws an error if there is an issue creating the user. - * - * @example - * ```typescript - * const userData: User = { - * email: "user@example.com", - * name: "John Doe", - * admin: false, - * onBoard: true, - * picture: "https://example.com/picture.jpg", - * role: "user" - * }; - * - * createUser("user@example.com", userData) - * .then(() => { - * console.log("User created successfully"); - * }) - * .catch((error) => { - * console.error("Error creating user:", error); - * }); - * ``` - */ -export async function createUser(email: string, data: User): Promise { +export async function updateUserEvent(data: UserEventUpdateRequest): Promise { try { - const collectionRef = collection(db, "users"); - const docRef = doc(collectionRef, email); - - await setDoc(docRef, data); - console.log("User created:", email); - } catch (error) { - console.error("Error creating user:", error); - throw new Error("Failed to create user"); + const url = `${process.env.SERVER_URL}/user/event`; + + // Create URLSearchParams and append form fields clearly + const formData = new URLSearchParams(); + formData.append("eventName", data.eventName); + formData.append("eventCategory", data.eventCategory); + + const response = await axios.put(url, formData, { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + withCredentials: true, + }); + + return response.data; + } catch (error: any) { + console.error("Error updating user event:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to update user event"); } } -// Update user -/** - * Updates an existing user in the Firestore database. - * - * @param {string} email - The email of the user to update. - * @param {Partial} data - The updated data for the user. - * @returns {Promise} A promise that resolves when the user is successfully updated. - * - * @throws {Error} Throws an error if the user is not found or if there is an issue updating the user. - * - * @example - * ```typescript - * const updatedData: Partial = { - * name: "Jane Doe", - * phone: "1234567890" - * }; - * - * updateUser("user@example.com", updatedData) - * .then(() => { - * console.log("User updated successfully"); - * }) - * .catch((error) => { - * console.error("Error updating user:", error); - * }); - * ``` - */ -export async function updateUser( - email: string, - data: Partial, -): Promise { + +export async function unregisterUserEvent(data: UserEventUpdateRequest): Promise { try { - const decodedEmail = decodeURIComponent(email); - const docRef = doc(db, "users", decodedEmail); - - await updateDoc(docRef, data); - console.log("User updated:", email); - } catch (error) { - console.error("Error updating user:", error); - throw new Error("Failed to update user"); + const url = `${process.env.SERVER_URL}/user/event/unregister`; + + const formData = new URLSearchParams(); + formData.append("eventName", data.eventName); + formData.append("eventCategory", data.eventCategory); + + const response = await axios.put(url, formData, { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + withCredentials: true, + }); + + return response.data; + } catch (error: any) { + console.error("Error unregistering user event:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to unregister user event"); } } -// Delete user -/** - * Deletes an existing user from the Firestore database. - * - * @param {string} email - The email of the user to delete. - * @returns {Promise} A promise that resolves when the user is successfully deleted. - * - * @throws {Error} Throws an error if the user is not found or if there is an issue deleting the user. - * - * @example - * ```typescript - * deleteUser("user@example.com") - * .then(() => { - * console.log("User deleted successfully"); - * }) - * .catch((error) => { - * console.error("Error deleting user:", error); - * }); - * ``` - */ -export async function deleteUser(email: string): Promise { + +export async function addQuery(data: AddQueryRequest): Promise { try { - const docRef = doc(db, "users", email); + const url = `${process.env.SERVER_URL}/query`; - await deleteDoc(docRef); - console.log("User deleted:", email); - } catch (error) { - console.error("Error deleting user:", error); - throw new Error("Failed to delete user"); + const formData = new URLSearchParams(); + formData.append("text", data.text); + + const response = await axios.post(url, formData, { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + withCredentials: true, + }); + + return response.data; + } catch (error: any) { + console.error("Error adding query:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to add query"); } -} +} \ No newline at end of file diff --git a/app/dtos/user.dto.ts b/app/dtos/user.dto.ts new file mode 100644 index 0000000..6d9c657 --- /dev/null +++ b/app/dtos/user.dto.ts @@ -0,0 +1,23 @@ +import { Event } from "./event.dto"; + +export interface UserEventsResponse { + success: boolean; + message: string; + data: { + events: Event[]; + }; +} + +export interface UserEventUpdateRequest { + eventName: string; + eventCategory: string; +} + +export interface SimpleResponse { + success: boolean; + message: string; +} + +export interface AddQueryRequest { + text: string; +} \ No newline at end of file From 8ea57d12844285de2226b835153682d22bf0e797 Mon Sep 17 00:00:00 2001 From: Agrawal-Vansh Date: Thu, 5 Jun 2025 17:16:57 +0530 Subject: [PATCH 07/22] added user DTO and APIs as per swagger UI docs --- app/actions/users.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/actions/users.ts b/app/actions/users.ts index cc5dd44..9775e24 100644 --- a/app/actions/users.ts +++ b/app/actions/users.ts @@ -7,7 +7,7 @@ export async function getUserEvents(): Promise { const url = `${process.env.SERVER_URL}/user/event`; const response = await axios.get(url, { - withCredentials: true, // ensure session/cookie is sent + withCredentials: true, }); return response.data.data.events; From 25753778b3593bd9495cd83a4cfae83b6fcd4dd7 Mon Sep 17 00:00:00 2001 From: Debatreya Das <116421305+Debatreya@users.noreply.github.com> Date: Fri, 6 Jun 2025 11:37:02 +0530 Subject: [PATCH 08/22] Update README.md A code rabbit stuff --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f21d22..557b414 100644 --- a/README.md +++ b/README.md @@ -35,4 +35,6 @@ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. -Let's not have an update feature on eventCategory. (updating by name). It is complex to implement and have no need \ No newline at end of file +Let's not have an update feature on eventCategory. (updating by name). It is complex to implement and have no need + +![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/Debatreya/AdminPanel?utm_source=oss&utm_medium=github&utm_campaign=Debatreya%2FAdminPanel&labelColor=171717&color=FF570A&link=https%3A%2F%2Fcoderabbit.ai&label=CodeRabbit+Reviews) From 02c494b5f2925ff85c48202a3528c90f8ac8ae50 Mon Sep 17 00:00:00 2001 From: Yash Shakya Date: Sat, 7 Jun 2025 01:07:24 +0530 Subject: [PATCH 09/22] added actions for manager and required dtos --- app/actions/admin.ts | 77 ++++++++++++++++++++++++++++++++++++ app/dtos/category.dto.ts | 8 ++++ app/dtos/mail.dto.ts | 10 +++++ app/dtos/notification.dto.ts | 7 ++++ app/dtos/query.dto.ts | 5 +++ app/dtos/user.dto.ts | 5 +++ 6 files changed, 112 insertions(+) create mode 100644 app/actions/admin.ts create mode 100644 app/dtos/notification.dto.ts diff --git a/app/actions/admin.ts b/app/actions/admin.ts new file mode 100644 index 0000000..5943a50 --- /dev/null +++ b/app/actions/admin.ts @@ -0,0 +1,77 @@ +import axios from "axios"; + +import { Category,SimpleCategoriesResponse } from "../dtos/category.dto"; +import { QueryBody } from "../dtos/query.dto"; +import { SimpleResponse, UserUpdateBody } from "../dtos/user.dto"; +import { MailBody } from "../dtos/mail.dto"; +import { NotificationBody } from "../dtos/notification.dto"; + +export async function addCategory(category:Category): Promise{ + if(!category) throw new Error("Category is required"); + try { + const url=`${process.env.SERVER_URL}/events/categories`; + const response = await axios.post(url,category) + return response.data; + } catch (error:any) { + console.error("Error adding category:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to add category"); + } +} + +export async function deleteQuery(query: QueryBody): Promise{ + if(!query) throw new Error("Query required"); + try { + const url=`${process.env.SERVER_URL}/admin/query`; + const response = await axios.put(url,query); + return response.data; + } catch (error:any) { + console.error("Error deleting query:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed delete query"); + } +} + +export async function sendMailToMultipleUsers(mail:MailBody): Promise{ + + try { + const url = `${process.env.SERVER_URL}/admin/mail/list`; + const response=await axios.post(url,mail); + return response.data; + } catch (error:any) { + console.error("Error sending mail:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed sending mail"); + } +} + +export async function sendNotification(notification:NotificationBody): Promise{ + try{ + const url=`${process.env.SERVER_URL}/admin/mobilenoti`; + const response = await axios.post(url,notification); + return response.data; + }catch(error:any){ + console.error("Error sending notification:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed sending notification"); + } +} + +export async function updateUser(): Promise { + try { + const url=`${process.env.SERVER_URL}/updateUsers`; + const response = await axios.post(url); + return response.data; + } catch (error:any) { + console.error("Error updating:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed updating"); + } +} + +export async function updateUserByAdmin(user:UserUpdateBody): Promise { + try { + const url=`${process.env.SERVER_URL}/admin/user`; + const response = await axios.post(url,user); + return response.data; + } catch (error:any) { + console.error("Error updating user:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed updating user"); + } +} + diff --git a/app/dtos/category.dto.ts b/app/dtos/category.dto.ts index 37831b1..44472d3 100644 --- a/app/dtos/category.dto.ts +++ b/app/dtos/category.dto.ts @@ -11,4 +11,12 @@ export interface CategoriesResponse { data: { categories: Category[]; }; +} + +export interface SimpleCategoriesResponse { + success: boolean; + message: string; + data: { + categories: string[]; + }; } \ No newline at end of file diff --git a/app/dtos/mail.dto.ts b/app/dtos/mail.dto.ts index 845eb41..d3c2b6e 100644 --- a/app/dtos/mail.dto.ts +++ b/app/dtos/mail.dto.ts @@ -1,4 +1,14 @@ export interface mailResponse { success: boolean; message: string; +} + +export interface MailBody { + users: string[] + heading?: string, + buttontext?: string, + buttonlink?: string, + subject?: string, + thankyou?: string, + detail?: string } \ No newline at end of file diff --git a/app/dtos/notification.dto.ts b/app/dtos/notification.dto.ts new file mode 100644 index 0000000..e86eb44 --- /dev/null +++ b/app/dtos/notification.dto.ts @@ -0,0 +1,7 @@ +export interface NotificationBody{ + topic: string; + title: string; + body: string; + image: string; + link?: string; +} \ No newline at end of file diff --git a/app/dtos/query.dto.ts b/app/dtos/query.dto.ts index 6bd411a..74ba0dd 100644 --- a/app/dtos/query.dto.ts +++ b/app/dtos/query.dto.ts @@ -3,3 +3,8 @@ export interface QueryResponse { message: string; data: any; } + +export interface QueryBody { + id: string; + queryEmail: string; +} \ No newline at end of file diff --git a/app/dtos/user.dto.ts b/app/dtos/user.dto.ts index 6d9c657..04744cf 100644 --- a/app/dtos/user.dto.ts +++ b/app/dtos/user.dto.ts @@ -13,6 +13,11 @@ export interface UserEventUpdateRequest { eventCategory: string; } +export interface UserUpdateBody { + userEmail: string; + role: string; +} + export interface SimpleResponse { success: boolean; message: string; From 620017f26f56324cb8606056dc30e5ce7777196e Mon Sep 17 00:00:00 2001 From: Yash Shakya Date: Sat, 7 Jun 2025 15:29:10 +0530 Subject: [PATCH 10/22] some fixes --- app/actions/admin.ts | 4 +++- app/dtos/mail.dto.ts | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/actions/admin.ts b/app/actions/admin.ts index 5943a50..203e2f7 100644 --- a/app/actions/admin.ts +++ b/app/actions/admin.ts @@ -31,7 +31,7 @@ export async function deleteQuery(query: QueryBody): Promise{ } export async function sendMailToMultipleUsers(mail:MailBody): Promise{ - + if(!mail) throw new Error("Mail data is required"); try { const url = `${process.env.SERVER_URL}/admin/mail/list`; const response=await axios.post(url,mail); @@ -43,6 +43,7 @@ export async function sendMailToMultipleUsers(mail:MailBody): Promise{ + if(!notification) throw new Error("Notification data is required"); try{ const url=`${process.env.SERVER_URL}/admin/mobilenoti`; const response = await axios.post(url,notification); @@ -65,6 +66,7 @@ export async function updateUser(): Promise { } export async function updateUserByAdmin(user:UserUpdateBody): Promise { + if(!user) throw new Error("User data is required"); try { const url=`${process.env.SERVER_URL}/admin/user`; const response = await axios.post(url,user); diff --git a/app/dtos/mail.dto.ts b/app/dtos/mail.dto.ts index d3c2b6e..bb480f9 100644 --- a/app/dtos/mail.dto.ts +++ b/app/dtos/mail.dto.ts @@ -4,11 +4,11 @@ export interface mailResponse { } export interface MailBody { - users: string[] - heading?: string, - buttontext?: string, - buttonlink?: string, - subject?: string, - thankyou?: string, - detail?: string + users: string[]; + heading?: string; + buttontext?: string; + buttonlink?: string; + subject?: string; + thankyou?: string; + detail?: string; } \ No newline at end of file From 77a53674c22221bdf009be589c68d4d7c22f9150 Mon Sep 17 00:00:00 2001 From: Yash Shakya Date: Sun, 8 Jun 2025 01:37:48 +0530 Subject: [PATCH 11/22] added App actions and authentication dto --- app/actions/app.ts | 26 ++++++++++++++++++++++++++ app/dtos/authentication.dto.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 app/actions/app.ts create mode 100644 app/dtos/authentication.dto.ts diff --git a/app/actions/app.ts b/app/actions/app.ts new file mode 100644 index 0000000..019012a --- /dev/null +++ b/app/actions/app.ts @@ -0,0 +1,26 @@ +import axios from "axios"; + +import { UserAuthResponse, IdToken,UserProfileUpdateSchema } from "../dtos/authentication.dto"; + +export async function loginUsingOAuth(idToken:IdToken): Promise { + if(!idToken) throw new Error("Id Token required"); + try { + const url=`${process.env.SERVER_URL}/loginApp`; + const response = await axios.put(url,idToken); + return response.data; + } catch (error:any) { + console.error("Error in login:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to login"); + } +} + +export async function updateUserProfile(updateSchema:UserProfileUpdateSchema) : Promise { + try { + const url=`${process.env.SERVER_URL}/signUpApp`; + const response = await axios.put(url,updateSchema); + return response.data; + } catch (error:any) { + console.error("Error updating user profile:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Failed to update user profile"); + } +} \ No newline at end of file diff --git a/app/dtos/authentication.dto.ts b/app/dtos/authentication.dto.ts new file mode 100644 index 0000000..9d87e4b --- /dev/null +++ b/app/dtos/authentication.dto.ts @@ -0,0 +1,27 @@ +export interface UserAuthResponse { + success: true; + onBoard: true; + data: { + user: { + email: string; + name: string; + picture: string; + onBoard: boolean; + college: string; + year: string; + admin: boolean; + role: string; + }; + token: string; + }; +} + +export interface IdToken { + idToken:string; +} + +export interface UserProfileUpdateSchema { + year:string; + phone: string; + college: string; +} \ No newline at end of file From 116e37e35ee3d0bc39fb424f2e6d87f6fc84b94f Mon Sep 17 00:00:00 2001 From: Yash Shakya Date: Sun, 8 Jun 2025 01:52:36 +0530 Subject: [PATCH 12/22] some fixes --- app/actions/app.ts | 9 ++++++--- app/dtos/authentication.dto.ts | 7 ++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/actions/app.ts b/app/actions/app.ts index 019012a..bdf3846 100644 --- a/app/actions/app.ts +++ b/app/actions/app.ts @@ -1,12 +1,12 @@ import axios from "axios"; -import { UserAuthResponse, IdToken,UserProfileUpdateSchema } from "../dtos/authentication.dto"; +import { UserAuthResponse, UserProfileUpdateSchema } from "../dtos/authentication.dto"; -export async function loginUsingOAuth(idToken:IdToken): Promise { +export async function loginUsingOAuth(idToken:string): Promise { if(!idToken) throw new Error("Id Token required"); try { const url=`${process.env.SERVER_URL}/loginApp`; - const response = await axios.put(url,idToken); + const response = await axios.post(url,idToken); return response.data; } catch (error:any) { console.error("Error in login:", error?.response?.data || error.message || error); @@ -15,6 +15,9 @@ export async function loginUsingOAuth(idToken:IdToken): Promise { + if(!updateSchema || !updateSchema.year || !updateSchema.college) { + throw new Error("Year and college are required for profile update"); + } try { const url=`${process.env.SERVER_URL}/signUpApp`; const response = await axios.put(url,updateSchema); diff --git a/app/dtos/authentication.dto.ts b/app/dtos/authentication.dto.ts index 9d87e4b..4895cda 100644 --- a/app/dtos/authentication.dto.ts +++ b/app/dtos/authentication.dto.ts @@ -1,6 +1,6 @@ export interface UserAuthResponse { - success: true; - onBoard: true; + success: boolean; + onBoard: boolean; data: { user: { email: string; @@ -16,9 +16,6 @@ export interface UserAuthResponse { }; } -export interface IdToken { - idToken:string; -} export interface UserProfileUpdateSchema { year:string; From 7f105b80ef607af20623647a8565b4e850e13042 Mon Sep 17 00:00:00 2001 From: OjuIsOn Date: Sun, 8 Jun 2025 10:30:16 +0530 Subject: [PATCH 13/22] added app and web actions along with suitable dtos --- app/actions/app.ts | 37 +++++++++++++++++++++++++++++++++++++ app/actions/web.ts | 37 +++++++++++++++++++++++++++++++++++++ app/dtos/user.dto.ts | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 app/actions/app.ts create mode 100644 app/actions/web.ts diff --git a/app/actions/app.ts b/app/actions/app.ts new file mode 100644 index 0000000..c0a60a4 --- /dev/null +++ b/app/actions/app.ts @@ -0,0 +1,37 @@ +import axios from "axios"; +import { LoginRequest, LoginUserResponse, updateUserRequest } from "../dtos/user.dto"; + +export async function loginWebUsingGoogleAPP(Token:LoginRequest): Promise { + if(!Token || Token.idToken.length==0) throw new Error("Invalid token: Token is missing or empty") + try { + const url=`${process.env.SERVER_URL}/loginApp`; + + + const response= await axios.post(url,Token); + + return response.data; + + + + } catch (error:any) { + console.error("Login(APP) failed:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Login request failed"); + } +} + +export async function UpdateUserProfileForAndroid(payload:updateUserRequest): Promise { + if(!payload) throw new Error("Empty fields! fill fields to update the user") + try { + + const url=`${process.env.SERVER_URL}/signUpApp` + + const response=await axios.put(url,payload) + + return response.data + + } catch (error:any) { + console.error("Failed to update user profile(APP):", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Profile update failed"); + } + +} \ No newline at end of file diff --git a/app/actions/web.ts b/app/actions/web.ts new file mode 100644 index 0000000..328fdd2 --- /dev/null +++ b/app/actions/web.ts @@ -0,0 +1,37 @@ +import axios from "axios"; +import { LoginRequest, LoginUserResponse, updateUserRequest } from "../dtos/user.dto"; + +export async function loginWebUsingGoogleWeb(Token:LoginRequest): Promise { + if(!Token || Token.idToken.length==0) throw new Error("Invalid token: Token is missing or empty") + try { + const url=`${process.env.SERVER_URL}/login`; + + + const response= await axios.post(url,Token); + + return response.data; + + + + } catch (error:any) { + console.error("Login failed:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Login request failed"); + } +} + +export async function UpdateUserProfileForWeb(payload:updateUserRequest): Promise { + if(!payload) throw new Error("Empty fields! fill fields to update the user") + try { + + const url=`${process.env.SERVER_URL}/user` + + const response=await axios.put(url,payload) + + return response.data + + } catch (error:any) { + console.error("Failed to update user profile:", error?.response?.data || error.message || error); + throw new Error(error?.response?.data?.message || "Profile update failed"); + } + +} \ No newline at end of file diff --git a/app/dtos/user.dto.ts b/app/dtos/user.dto.ts index 04744cf..b87caa7 100644 --- a/app/dtos/user.dto.ts +++ b/app/dtos/user.dto.ts @@ -25,4 +25,35 @@ export interface SimpleResponse { export interface AddQueryRequest { text: string; -} \ No newline at end of file +} + + +export interface LoginRequest { + idToken: string; +} + +export interface User { + email: string; + name: string; + picture: string; + onBoard: boolean; + college: string; + year: string; + admin: boolean; + role: string; +} + +export interface updateUserRequest { + year:string; + college:string; + phone:string; +} + +export interface LoginUserResponse { + success: boolean; + onBoard: boolean; + data: { + user: User; + token: string; + }; +} From c034c39b8d4802e07cc4df66209a7fcb4efeae1a Mon Sep 17 00:00:00 2001 From: Ojasvi <155801461+OjuIsOn@users.noreply.github.com> Date: Sun, 8 Jun 2025 12:07:39 +0530 Subject: [PATCH 14/22] Delete app/actions/app.ts --- app/actions/app.ts | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 app/actions/app.ts diff --git a/app/actions/app.ts b/app/actions/app.ts deleted file mode 100644 index c0a60a4..0000000 --- a/app/actions/app.ts +++ /dev/null @@ -1,37 +0,0 @@ -import axios from "axios"; -import { LoginRequest, LoginUserResponse, updateUserRequest } from "../dtos/user.dto"; - -export async function loginWebUsingGoogleAPP(Token:LoginRequest): Promise { - if(!Token || Token.idToken.length==0) throw new Error("Invalid token: Token is missing or empty") - try { - const url=`${process.env.SERVER_URL}/loginApp`; - - - const response= await axios.post(url,Token); - - return response.data; - - - - } catch (error:any) { - console.error("Login(APP) failed:", error?.response?.data || error.message || error); - throw new Error(error?.response?.data?.message || "Login request failed"); - } -} - -export async function UpdateUserProfileForAndroid(payload:updateUserRequest): Promise { - if(!payload) throw new Error("Empty fields! fill fields to update the user") - try { - - const url=`${process.env.SERVER_URL}/signUpApp` - - const response=await axios.put(url,payload) - - return response.data - - } catch (error:any) { - console.error("Failed to update user profile(APP):", error?.response?.data || error.message || error); - throw new Error(error?.response?.data?.message || "Profile update failed"); - } - -} \ No newline at end of file From a7c320c70a5bd76338b262801eebe8705c5891f2 Mon Sep 17 00:00:00 2001 From: Ojasvi <155801461+OjuIsOn@users.noreply.github.com> Date: Sun, 8 Jun 2025 12:13:19 +0530 Subject: [PATCH 15/22] Delete app/dtos/user.dto.ts --- app/dtos/user.dto.ts | 59 -------------------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 app/dtos/user.dto.ts diff --git a/app/dtos/user.dto.ts b/app/dtos/user.dto.ts deleted file mode 100644 index b87caa7..0000000 --- a/app/dtos/user.dto.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Event } from "./event.dto"; - -export interface UserEventsResponse { - success: boolean; - message: string; - data: { - events: Event[]; - }; -} - -export interface UserEventUpdateRequest { - eventName: string; - eventCategory: string; -} - -export interface UserUpdateBody { - userEmail: string; - role: string; -} - -export interface SimpleResponse { - success: boolean; - message: string; -} - -export interface AddQueryRequest { - text: string; -} - - -export interface LoginRequest { - idToken: string; -} - -export interface User { - email: string; - name: string; - picture: string; - onBoard: boolean; - college: string; - year: string; - admin: boolean; - role: string; -} - -export interface updateUserRequest { - year:string; - college:string; - phone:string; -} - -export interface LoginUserResponse { - success: boolean; - onBoard: boolean; - data: { - user: User; - token: string; - }; -} From 1d3ec7feb7f83b06a53e2c9234c5abe0d479a89d Mon Sep 17 00:00:00 2001 From: Ojasvi <155801461+OjuIsOn@users.noreply.github.com> Date: Sun, 8 Jun 2025 12:17:39 +0530 Subject: [PATCH 16/22] Update web.ts --- app/actions/web.ts | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/app/actions/web.ts b/app/actions/web.ts index 328fdd2..fb04760 100644 --- a/app/actions/web.ts +++ b/app/actions/web.ts @@ -2,12 +2,20 @@ import axios from "axios"; import { LoginRequest, LoginUserResponse, updateUserRequest } from "../dtos/user.dto"; export async function loginWebUsingGoogleWeb(Token:LoginRequest): Promise { - if(!Token || Token.idToken.length==0) throw new Error("Invalid token: Token is missing or empty") + if(!Token || !Token.idToken || Token.idToken.trim().length === 0) { + throw new Error("Invalid token: Token is missing or empty"); + } + try { const url=`${process.env.SERVER_URL}/login`; - const response= await axios.post(url,Token); + const response= await axios.post(url,Token, { + headers: { + "Content-Type": "application/json", + Accept: "application/json" + } + }); return response.data; @@ -20,12 +28,22 @@ export async function loginWebUsingGoogleWeb(Token:LoginRequest): Promise { - if(!payload) throw new Error("Empty fields! fill fields to update the user") + if(!payload) { + throw new Error("Empty fields! fill fields to update the user"); + } + if(!payload.year || !payload.college || !payload.phone) { + throw new Error("Required fields missing: year, college, and phone are required"); + } + try { const url=`${process.env.SERVER_URL}/user` - const response=await axios.put(url,payload) + const response=await axios.put(url,payload,{ + headers: { + "Content-Type": "application/json", + Accept: "application/json" + }) return response.data @@ -34,4 +52,4 @@ export async function UpdateUserProfileForWeb(payload:updateUserRequest): Promis throw new Error(error?.response?.data?.message || "Profile update failed"); } -} \ No newline at end of file +} From 486481e31b8658d474ea5cc70bffc60e3bd746eb Mon Sep 17 00:00:00 2001 From: OjuIsOn Date: Sun, 8 Jun 2025 12:28:56 +0530 Subject: [PATCH 17/22] removed app.ts --- app/actions/app.ts | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 app/actions/app.ts diff --git a/app/actions/app.ts b/app/actions/app.ts deleted file mode 100644 index c0a60a4..0000000 --- a/app/actions/app.ts +++ /dev/null @@ -1,37 +0,0 @@ -import axios from "axios"; -import { LoginRequest, LoginUserResponse, updateUserRequest } from "../dtos/user.dto"; - -export async function loginWebUsingGoogleAPP(Token:LoginRequest): Promise { - if(!Token || Token.idToken.length==0) throw new Error("Invalid token: Token is missing or empty") - try { - const url=`${process.env.SERVER_URL}/loginApp`; - - - const response= await axios.post(url,Token); - - return response.data; - - - - } catch (error:any) { - console.error("Login(APP) failed:", error?.response?.data || error.message || error); - throw new Error(error?.response?.data?.message || "Login request failed"); - } -} - -export async function UpdateUserProfileForAndroid(payload:updateUserRequest): Promise { - if(!payload) throw new Error("Empty fields! fill fields to update the user") - try { - - const url=`${process.env.SERVER_URL}/signUpApp` - - const response=await axios.put(url,payload) - - return response.data - - } catch (error:any) { - console.error("Failed to update user profile(APP):", error?.response?.data || error.message || error); - throw new Error(error?.response?.data?.message || "Profile update failed"); - } - -} \ No newline at end of file From ac2048b6ef2e0f44f2d16818771051d5bf8719df Mon Sep 17 00:00:00 2001 From: OjuIsOn Date: Sun, 8 Jun 2025 12:31:11 +0530 Subject: [PATCH 18/22] finally done resolving --- app/actions/web.ts | 3 ++- app/dtos/user.dto.ts | 59 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 app/dtos/user.dto.ts diff --git a/app/actions/web.ts b/app/actions/web.ts index fb04760..8ff4d56 100644 --- a/app/actions/web.ts +++ b/app/actions/web.ts @@ -43,7 +43,8 @@ export async function UpdateUserProfileForWeb(payload:updateUserRequest): Promis headers: { "Content-Type": "application/json", Accept: "application/json" - }) + } + }) return response.data diff --git a/app/dtos/user.dto.ts b/app/dtos/user.dto.ts new file mode 100644 index 0000000..b87caa7 --- /dev/null +++ b/app/dtos/user.dto.ts @@ -0,0 +1,59 @@ +import { Event } from "./event.dto"; + +export interface UserEventsResponse { + success: boolean; + message: string; + data: { + events: Event[]; + }; +} + +export interface UserEventUpdateRequest { + eventName: string; + eventCategory: string; +} + +export interface UserUpdateBody { + userEmail: string; + role: string; +} + +export interface SimpleResponse { + success: boolean; + message: string; +} + +export interface AddQueryRequest { + text: string; +} + + +export interface LoginRequest { + idToken: string; +} + +export interface User { + email: string; + name: string; + picture: string; + onBoard: boolean; + college: string; + year: string; + admin: boolean; + role: string; +} + +export interface updateUserRequest { + year:string; + college:string; + phone:string; +} + +export interface LoginUserResponse { + success: boolean; + onBoard: boolean; + data: { + user: User; + token: string; + }; +} From b84daea2e3f8750abb1914fbb154d09c4cf4cef1 Mon Sep 17 00:00:00 2001 From: OjuIsOn Date: Sun, 8 Jun 2025 12:33:01 +0530 Subject: [PATCH 19/22] u -> U --- app/actions/web.ts | 4 ++-- app/dtos/user.dto.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/actions/web.ts b/app/actions/web.ts index 8ff4d56..2facb68 100644 --- a/app/actions/web.ts +++ b/app/actions/web.ts @@ -1,5 +1,5 @@ import axios from "axios"; -import { LoginRequest, LoginUserResponse, updateUserRequest } from "../dtos/user.dto"; +import { LoginRequest, LoginUserResponse, UpdateUserRequest } from "../dtos/user.dto"; export async function loginWebUsingGoogleWeb(Token:LoginRequest): Promise { if(!Token || !Token.idToken || Token.idToken.trim().length === 0) { @@ -27,7 +27,7 @@ export async function loginWebUsingGoogleWeb(Token:LoginRequest): Promise { +export async function UpdateUserProfileForWeb(payload:UpdateUserRequest): Promise { if(!payload) { throw new Error("Empty fields! fill fields to update the user"); } diff --git a/app/dtos/user.dto.ts b/app/dtos/user.dto.ts index b87caa7..695fa04 100644 --- a/app/dtos/user.dto.ts +++ b/app/dtos/user.dto.ts @@ -43,7 +43,7 @@ export interface User { role: string; } -export interface updateUserRequest { +export interface UpdateUserRequest { year:string; college:string; phone:string; From 62df4762e50187d11b20649703dd5a61b2e2a49c Mon Sep 17 00:00:00 2001 From: Debatreya Date: Sun, 8 Jun 2025 15:07:24 +0530 Subject: [PATCH 20/22] feat(api): Added an API layer --- app/api/README.md | 1669 +++++++++++++++++++++ app/api/admin/category/route.ts | 15 + app/api/admin/mail/route.ts | 15 + app/api/admin/notification/route.ts | 15 + app/api/admin/query/route.ts | 15 + app/api/admin/route.ts | 65 + app/api/admin/update-users/route.ts | 14 + app/api/admin/user/route.ts | 15 + app/api/event-categories/route.ts | 120 ++ app/api/events/route.ts | 183 +++ app/api/lectures/route.ts | 143 ++ app/api/sponsors/route.ts | 137 ++ app/api/techspardha-teams/[team]/route.ts | 26 + app/api/techspardha-teams/route.ts | 95 ++ app/api/users/route.ts | 69 + 15 files changed, 2596 insertions(+) create mode 100644 app/api/README.md create mode 100644 app/api/admin/category/route.ts create mode 100644 app/api/admin/mail/route.ts create mode 100644 app/api/admin/notification/route.ts create mode 100644 app/api/admin/query/route.ts create mode 100644 app/api/admin/route.ts create mode 100644 app/api/admin/update-users/route.ts create mode 100644 app/api/admin/user/route.ts create mode 100644 app/api/event-categories/route.ts create mode 100644 app/api/events/route.ts create mode 100644 app/api/lectures/route.ts create mode 100644 app/api/sponsors/route.ts create mode 100644 app/api/techspardha-teams/[team]/route.ts create mode 100644 app/api/techspardha-teams/route.ts create mode 100644 app/api/users/route.ts diff --git a/app/api/README.md b/app/api/README.md new file mode 100644 index 0000000..3eab51c --- /dev/null +++ b/app/api/README.md @@ -0,0 +1,1669 @@ +# API Documentation + +This folder contains an API wrapper for the actions defined in `app/actions`. +It exposes endpoints that interact with the core business logic, enabling external access via HTTP requests. + +- **Purpose:** Decouple API routes from internal logic. +- **Usage:** Import and use these endpoints in your application or with external clients. +- **Structure:** Each file corresponds to a specific action or group of actions. + +Keep this folder in sync with updates to `app/actions`. + +## Base URL + +All API endpoints are available under the `/api` route of your deployed application. +Example: `https://your-app-domain.com/api/{endpoint_path}` + +## Available Endpoints + +Detailed descriptions of each endpoint, including request and response formats. + +--- + +### Admin Endpoints + +#### Category Management + +**1. Get All Categories** + - **Method:** `GET` + - **Path:** `/api/admin/category` + - **Description:** Retrieves a list of all administrative categories. + - **Request Body:** None + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + [ + { + "id": "string", + "name": "string" + } + ] + ``` + - **Example:** + ```json + [ + { + "id": "cat_123", + "name": "General" + }, + { + "id": "cat_456", + "name": "Technical" + } + ] + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to fetch categories" + } + ``` + +**2. Add a New Category** + - **Method:** `POST` + - **Path:** `/api/admin/category` + - **Description:** Adds a new administrative category. + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "name": "string (required)" + } + ``` + - **Example:** + ```json + { + "name": "New Category Name" + } + ``` + - **Query Parameters:** None + - **Successful Response (201 Created):** + - **Schema:** `application/json` + ```json + { + "id": "string", + "name": "string", + "message": "string" + } + ``` + - **Example:** + ```json + { + "id": "cat_789", + "name": "New Category Name", + "message": "Category added successfully" + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Category name is required" + } + ``` + +#### Query Management + +**1. Delete a Query** + - **Method:** `PUT` (Note: Typically DELETE method is used for deletion) + - **Path:** `/api/admin/query` + - **Description:** Deletes a specific user query. The query ID is expected in the request body. + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "id": "string (required, ID of the query to delete)" + } + ``` + - **Example:** + ```json + { + "id": "query_abc" + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Query query_abc deleted successfully" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Query not found" + } + ``` + +#### Communication + +**1. Send Mail to Multiple Users** + - **Method:** `POST` + - **Path:** `/api/admin/mail` + - **Description:** Sends an email to a list of specified users. + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "subject": "string (required)", + "body": "string (required, HTML or plain text content of the email)", + "recipients": "string[] (required, array of user emails or IDs)" + } + ``` + - **Example:** + ```json + { + "subject": "Important Update", + "body": "

Hello, this is an important update regarding your account.

", + "recipients": ["user1@example.com", "user2@example.com"] + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Mail sent successfully to 2 recipients" + } + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to send email" + } + ``` + +**2. Send Notification** + - **Method:** `POST` + - **Path:** `/api/admin/notification` + - **Description:** Sends a notification (e.g., push notification, in-app message). + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "title": "string (required)", + "message": "string (required)", + "targetUsers": "string[] (optional, array of user IDs or segments; if omitted, might be broadcast)", + "type": "string (optional, e.g., 'info', 'warning', 'event_update')" + } + ``` + - **Example:** + ```json + { + "title": "New Event Scheduled!", + "message": "Check out the new 'Tech Talk' event happening next week.", + "targetUsers": ["all"], + "type": "event_update" + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "notificationId": "string (optional)" + } + ``` + - **Example:** + ```json + { + "message": "Notification sent successfully", + "notificationId": "notif_xyz" + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Notification title and message are required" + } + ``` + +#### User Management (Admin) + +**1. Update All Users** + - **Method:** `POST` + - **Path:** `/api/admin/update-users` + - **Description:** Performs a bulk update operation on all users (e.g., recalculate points, assign roles). The specific operation depends on the backend implementation of the `updateAllUsers` action. + - **Request Body:** `application/json` (The body might contain parameters for the update operation) + - **Schema:** (This is highly dependent on the `updateAllUsers` action) + ```json + { + "operation": "string (required, e.g., 'recalculate_scores')", + "parameters": "object (optional, parameters for the operation)" + } + ``` + - **Example:** + ```json + { + "operation": "archive_inactive_users", + "parameters": { + "inactive_days": 90 + } + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "details": "object (optional, details about the update)" + } + ``` + - **Example:** + ```json + { + "message": "All users updated successfully", + "details": { + "users_affected": 1500, + "operation_performed": "archive_inactive_users" + } + } + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to update all users" + } + ``` + +**2. Update a Specific User** + - **Method:** `POST` (Note: Typically PUT/PATCH method is used for updates) + - **Path:** `/api/admin/user` + - **Description:** Updates details for a specific user. User ID and fields to update are expected in the request body. + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "userId": "string (required)", + "updates": { + "name": "string (optional)", + "email": "string (optional)", + "role": "string (optional)" + // ... other updatable fields like isActive, etc. + } + } + ``` + - **Example:** + ```json + { + "userId": "user_pqr", + "updates": { + "role": "admin", + "isActive": true + } + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "user": { + "id": "string", + "name": "string", + "email": "string", + "role": "string" + // ... other user fields + } + } + ``` + - **Example:** + ```json + { + "message": "User user_pqr updated successfully", + "user": { + "id": "user_pqr", + "name": "Updated Name", + "email": "user.pqr@example.com", + "role": "admin", + "isActive": true + } + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "User not found" + } + ``` + +--- + +### Techspardha Teams Endpoints + +Manages Techspardha team information. + +**1. Get All Teams** + - **Method:** `GET` + - **Path:** `/api/techspardha-teams` + - **Description:** Retrieves a list of all Techspardha teams. + - **Request Body:** None + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + [ + { + "teamName": "string", + "description": "string", + "members": [ + { "name": "string", "role": "string", "contact": "string (optional)" } + ], + "logoUrl": "string (optional)" + } + ] + ``` + - **Example:** + ```json + [ + { + "teamName": "Web Dev Team", + "description": "Responsible for website development.", + "members": [ + { "name": "Alice", "role": "Lead Developer", "contact": "alice@example.com" }, + { "name": "Bob", "role": "Frontend Developer" } + ], + "logoUrl": "https://example.com/logos/web_dev.png" + } + ] + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to fetch teams" + } + ``` + +**2. Create a New Team** + - **Method:** `POST` + - **Path:** `/api/techspardha-teams` + - **Description:** Creates a new Techspardha team. Assumes `teamName` is unique. Logo can be uploaded if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "teamName": "string (required)", + "description": "string (required)", + "members": [ + { "name": "string (required)", "role": "string (required)", "contact": "string (optional)" } + ], + "logoUrl": "string (optional, if providing URL directly instead of uploading file)", + "logoFile": "file (optional, if uploading a new logo via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "teamName": "AI Mavericks", + "description": "Exploring the frontiers of AI.", + "members": [ + { "name": "Charlie", "role": "AI Researcher", "contact": "charlie@example.com" } + ] + } + ``` + - **Query Parameters:** None + - **Successful Response (201 Created):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "team": { + "teamName": "string", + "description": "string", + "members": [ + { "name": "string", "role": "string", "contact": "string (optional)" } + ], + "logoUrl": "string (optional)" + } + } + ``` + - **Example:** + ```json + { + "message": "Team 'AI Mavericks' created successfully", + "team": { + "teamName": "AI Mavericks", + "description": "Exploring the frontiers of AI.", + "members": [ + { "name": "Charlie", "role": "AI Researcher", "contact": "charlie@example.com" } + ], + "logoUrl": "https://example.com/logos/ai_mavericks.png" + } + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Team name and description are required" + } + ``` + +**3. Update a Team** + - **Method:** `PUT` + - **Path:** `/api/techspardha-teams` + - **Description:** Updates an existing Techspardha team. The team to update is identified by `teamName` in the request body. Logo can be updated if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "teamName": "string (required, identifier for the team to update)", + "description": "string (optional)", + "members": [ + { "name": "string (required)", "role": "string (required)", "contact": "string (optional)" } + ], + "logoUrl": "string (optional, if providing URL directly instead of uploading file)", + "logoFile": "file (optional, if uploading a new logo via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "teamName": "Web Dev Team", + "description": "Responsible for all web presence and development.", + "members": [ + { "name": "Alice", "role": "Team Lead", "contact": "alice@example.com" }, + { "name": "Bob", "role": "Frontend Developer" }, + { "name": "Eve", "role": "Backend Developer" } + ] + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Same as Create Team response `team` object, plus a message) + - **Example:** + ```json + { + "message": "Team 'Web Dev Team' updated successfully", + "team": { + "teamName": "Web Dev Team", + "description": "Responsible for all web presence and development.", + "members": [ + { "name": "Alice", "role": "Team Lead", "contact": "alice@example.com" }, + { "name": "Bob", "role": "Frontend Developer" }, + { "name": "Eve", "role": "Backend Developer" } + ], + "logoUrl": "https://example.com/logos/web_dev_updated.png" + } + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Team 'Web Dev Team' not found" + } + ``` + +**4. Delete a Team** + - **Method:** `DELETE` + - **Path:** `/api/techspardha-teams` + - **Description:** Deletes a Techspardha team. + - **Request Body:** None + - **Query Parameters:** + - `team`: `string` (required) - The name of the team to delete. + - **Example:** `/api/techspardha-teams?team=AI%20Mavericks` + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Team 'AI Mavericks' deleted successfully" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Team 'AI Mavericks' not found" + } + ``` + +**5. Get a Specific Team** + - **Method:** `GET` + - **Path:** `/api/techspardha-teams/{team}` + - **Description:** Retrieves details for a specific Techspardha team by its name (URL-encoded if it contains spaces or special characters). + - **Request Body:** None + - **Path Parameters:** + - `team`: `string` (required) - The name of the team. + - **Example:** `/api/techspardha-teams/Web%20Dev%20Team` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Single team object, same structure as in Get All Teams) + - **Example:** + ```json + { + "teamName": "Web Dev Team", + "description": "Responsible for website development.", + "members": [ + { "name": "Alice", "role": "Lead Developer", "contact": "alice@example.com" }, + { "name": "Bob", "role": "Frontend Developer" } + ], + "logoUrl": "https://example.com/logos/web_dev.png" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Team 'Web Dev Team' not found" + } + ``` + +--- + +### Sponsors Endpoints + +Manages sponsor information. + +**1. Get All Sponsors** + - **Method:** `GET` + - **Path:** `/api/sponsors` + - **Description:** Retrieves a list of all sponsors. + - **Request Body:** None + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + [ + { + "id": "string", + "name": "string", + "category": "string", + "logoUrl": "string", + "websiteUrl": "string (optional)", + "description": "string (optional)" + } + ] + ``` + - **Example:** + ```json + [ + { + "id": "sponsor_001", + "name": "Tech Solutions Inc.", + "category": "Gold", + "logoUrl": "https://example.com/logos/tech_solutions.png", + "websiteUrl": "https://techsolutions.com" + } + ] + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to fetch sponsors" + } + ``` + +**2. Get Sponsors by Category** + - **Method:** `GET` + - **Path:** `/api/sponsors` + - **Description:** Retrieves a list of sponsors filtered by category. (*Note: The underlying action `getSponsorsByCategory` might need implementation in `app/actions/sponsors.ts` and uncommenting in the API route.*) + - **Request Body:** None + - **Query Parameters:** + - `category`: `string` (required) - The category of sponsors to retrieve. + - **Example:** `/api/sponsors?category=Gold` + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Same as Get All Sponsors) + - **Example:** + ```json + [ + { + "id": "sponsor_001", + "name": "Tech Solutions Inc.", + "category": "Gold", + "logoUrl": "https://example.com/logos/tech_solutions.png", + "websiteUrl": "https://techsolutions.com" + } + ] + ``` + - **Error Response (e.g., 404 Not Found if category has no sponsors or 500 if action not implemented):** + ```json + { + "error": "No sponsors found for category 'Gold' or feature not available" + } + ``` + +**3. Create a New Sponsor** + - **Method:** `POST` + - **Path:** `/api/sponsors` + - **Description:** Adds a new sponsor. Logo can be uploaded if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "name": "string (required)", + "category": "string (required)", + "websiteUrl": "string (optional)", + "description": "string (optional)", + "logoUrl": "string (optional, if providing URL directly instead of uploading file)", + "logoFile": "file (optional, if uploading a new logo via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "name": "Innovate Corp", + "category": "Silver", + "websiteUrl": "https://innovatecorp.com", + "description": "Supporting innovation in tech." + } + ``` + - **Query Parameters:** None + - **Successful Response (201 Created):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "sponsor": { + "id": "string", + "name": "string", + "category": "string", + "logoUrl": "string", + "websiteUrl": "string (optional)", + "description": "string (optional)" + } + } + ``` + - **Example:** + ```json + { + "message": "Sponsor 'Innovate Corp' created successfully", + "sponsor": { + "id": "sponsor_002", + "name": "Innovate Corp", + "category": "Silver", + "logoUrl": "https://example.com/logos/innovate_corp.png", + "websiteUrl": "https://innovatecorp.com", + "description": "Supporting innovation in tech." + } + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Sponsor name and category are required" + } + ``` + +**4. Update a Sponsor** + - **Method:** `PUT` + - **Path:** `/api/sponsors` + - **Description:** Updates an existing sponsor. The sponsor to update is identified by `id` in the request body. Logo can be updated if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "id": "string (required, identifier for the sponsor to update)", + "name": "string (optional)", + "category": "string (optional)", + "websiteUrl": "string (optional)", + "description": "string (optional)", + "logoUrl": "string (optional, if providing URL directly instead of uploading file)", + "logoFile": "file (optional, if uploading a new logo via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "id": "sponsor_001", + "category": "Platinum", + "description": "Premier sponsor for Techspardha." + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Same as Create Sponsor response `sponsor` object, plus a message) + - **Example:** + ```json + { + "message": "Sponsor 'Tech Solutions Inc.' updated successfully", + "sponsor": { + "id": "sponsor_001", + "name": "Tech Solutions Inc.", + "category": "Platinum", + "logoUrl": "https://example.com/logos/tech_solutions_updated.png", + "websiteUrl": "https://techsolutions.com", + "description": "Premier sponsor for Techspardha." + } + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Sponsor with id 'sponsor_001' not found" + } + ``` + +**5. Delete a Sponsor** + - **Method:** `DELETE` + - **Path:** `/api/sponsors` + - **Description:** Deletes a sponsor. + - **Request Body:** None + - **Query Parameters:** + - `id`: `string` (required) - The ID of the sponsor to delete. + - `category`: `string` (required) - The category of the sponsor (used as part of the identifier in the backend action). + - **Example:** `/api/sponsors?id=sponsor_002&category=Silver` + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Sponsor 'sponsor_002' from category 'Silver' deleted successfully" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Sponsor with id 'sponsor_002' in category 'Silver' not found" + } + ``` + +--- + +### Events Endpoints + +Manages event information for Techspardha. + +**1. Get All Events** + - **Method:** `GET` + - **Path:** `/api/events` + - **Description:** Retrieves a list of all events. + - **Request Body:** None + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + [ + { + "eventName": "string", + "category": "string", + "description": "string", + "date": "string (ISO 8601 Date, e.g., YYYY-MM-DD)", + "time": "string (e.g., HH:MM AM/PM)", + "venue": "string", + "teamSizeMin": "number", + "teamSizeMax": "number", + "posterUrl": "string (optional)", + "rulebookUrl": "string (optional)", + "registrationOpen": "boolean" + } + ] + ``` + - **Example:** + ```json + [ + { + "eventName": "CodeSprint", + "category": "Coding", + "description": "A competitive programming contest.", + "date": "2025-10-15", + "time": "10:00 AM", + "venue": "Online", + "teamSizeMin": 1, + "teamSizeMax": 3, + "posterUrl": "https://example.com/posters/codesprint.png", + "registrationOpen": true + } + ] + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to fetch events" + } + ``` + +**2. Get Events by Category** + - **Method:** `GET` + - **Path:** `/api/events` + - **Description:** Retrieves events filtered by category. (*Note: The underlying action `getEventsByCategory` might need implementation in `app/actions/events.ts` and uncommenting in the API route.*) + - **Request Body:** None + - **Query Parameters:** + - `category`: `string` (required) - The category of events to retrieve. + - **Example:** `/api/events?category=Coding` + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Array of event objects, same structure as in Get All Events) + - **Example:** (A list of events belonging to the "Coding" category) + - **Error Response (e.g., 404 Not Found or 500 if action not implemented):** + ```json + { + "error": "No events found for category 'Coding' or feature not available" + } + ``` + +**3. Get a Specific Event** + - **Method:** `GET` + - **Path:** `/api/events` + - **Description:** Retrieves details for a specific event by its name and category. This endpoint uses the `getEventByName` action. + - **Request Body:** None + - **Query Parameters:** + - `category`: `string` (required) - The category of the event. + - `eventName`: `string` (required) - The name of the event. + - **Example:** `/api/events?category=Coding&eventName=CodeSprint` + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Single event object, same structure as in Get All Events) + - **Example:** + ```json + { + "eventName": "CodeSprint", + "category": "Coding", + "description": "A competitive programming contest.", + "date": "2025-10-15", + "time": "10:00 AM", + "venue": "Online", + "teamSizeMin": 1, + "teamSizeMax": 3, + "posterUrl": "https://example.com/posters/codesprint.png", + "registrationOpen": true + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Event 'CodeSprint' in category 'Coding' not found" + } + ``` + +**4. Create a New Event** + - **Method:** `POST` + - **Path:** `/api/events` + - **Description:** Creates a new event. Poster and/or rulebook can be uploaded if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "eventName": "string (required)", + "category": "string (required)", + "description": "string (required)", + "date": "string (required, ISO 8601 Date, e.g., YYYY-MM-DD)", + "time": "string (required, e.g., HH:MM AM/PM)", + "venue": "string (required)", + "teamSizeMin": "number (required, default 1)", + "teamSizeMax": "number (required, default 1)", + "registrationOpen": "boolean (default false)", + "posterUrl": "string (optional, if providing URL directly)", + "rulebookUrl": "string (optional, if providing URL directly)", + "posterFile": "file (optional, if uploading a new poster via multipart/form-data)", + "rulebookFile": "file (optional, if uploading a new rulebook via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "eventName": "RoboWars", + "category": "Robotics", + "description": "Battle of the bots!", + "date": "2025-10-20", + "time": "02:00 PM", + "venue": "Main Auditorium", + "teamSizeMin": 2, + "teamSizeMax": 4, + "registrationOpen": true + } + ``` + - **Query Parameters:** None + - **Successful Response (201 Created):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "event": { /* Event object, same structure as in Get All Events */ } + } + ``` + - **Example:** + ```json + { + "message": "Event 'RoboWars' created successfully", + "event": { + "eventName": "RoboWars", + "category": "Robotics", + "description": "Battle of the bots!", + "date": "2025-10-20", + "time": "02:00 PM", + "venue": "Main Auditorium", + "teamSizeMin": 2, + "teamSizeMax": 4, + "posterUrl": "https://example.com/posters/robowars.png", + "registrationOpen": true + } + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Event name, category, and date are required" + } + ``` + +**5. Update an Event** + - **Method:** `PUT` + - **Path:** `/api/events` + - **Description:** Updates an existing event. The event is identified by `eventName` and `category` in the request body. This endpoint uses the `updateEventByName` action. Poster/rulebook can be updated if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** (Includes identifier fields and updatable fields) + ```json + { + "eventName": "string (required, identifier)", + "category": "string (required, identifier)", + "description": "string (optional)", + "date": "string (optional, ISO 8601 Date)", + "time": "string (optional)", + "venue": "string (optional)", + "teamSizeMin": "number (optional)", + "teamSizeMax": "number (optional)", + "registrationOpen": "boolean (optional)", + "posterUrl": "string (optional, if providing URL directly)", + "rulebookUrl": "string (optional, if providing URL directly)", + "posterFile": "file (optional, if uploading/updating poster via multipart/form-data)", + "rulebookFile": "file (optional, if uploading/updating rulebook via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "eventName": "CodeSprint", + "category": "Coding", + "venue": "CSE Department Lab 1", + "registrationOpen": false + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Same as Create Event response) + - **Example:** + ```json + { + "message": "Event 'CodeSprint' updated successfully", + "event": { + "eventName": "CodeSprint", + "category": "Coding", + "venue": "CSE Department Lab 1", + "registrationOpen": false + /* ... other fields ... */ + } + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Event 'CodeSprint' in category 'Coding' not found for update" + } + ``` + +**6. Delete an Event** + - **Method:** `DELETE` + - **Path:** `/api/events` + - **Description:** Deletes an event. + - **Request Body:** None + - **Query Parameters:** + - `category`: `string` (required) - The category of the event. + - `eventName`: `string` (required) - The name of the event. + - **Example:** `/api/events?category=Robotics&eventName=RoboWars` + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Event 'RoboWars' from category 'Robotics' deleted successfully" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Event 'RoboWars' in category 'Robotics' not found" + } + ``` + +--- + +### Event Categories Endpoints + +Manages categories for events. + +**1. Get All Event Categories** + - **Method:** `GET` + - **Path:** `/api/event-categories` + - **Description:** Retrieves a list of all event categories. + - **Request Body:** None + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + [ + { + "id": "string", + "name": "string", + "description": "string (optional)", + "iconUrl": "string (optional)" + } + ] + ``` + - **Example:** + ```json + [ + { + "id": "evcat_01", + "name": "Coding", + "description": "Events related to programming and algorithms." + }, + { + "id": "evcat_02", + "name": "Robotics", + "iconUrl": "https://example.com/icons/robotics.svg" + } + ] + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to fetch event categories" + } + ``` + +**2. Get a Specific Event Category** + - **Method:** `GET` + - **Path:** `/api/event-categories` + - **Description:** Retrieves details for a specific event category by its ID. + - **Request Body:** None + - **Query Parameters:** + - `id`: `string` (required) - The ID of the event category. + - **Example:** `/api/event-categories?id=evcat_01` + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Single event category object) + - **Example:** + ```json + { + "id": "evcat_01", + "name": "Coding", + "description": "Events related to programming and algorithms." + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Event category with id 'evcat_01' not found" + } + ``` + +**3. Create a New Event Category** + - **Method:** `POST` + - **Path:** `/api/event-categories` + - **Description:** Creates a new event category. Icon can be uploaded if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "name": "string (required)", + "description": "string (optional)", + "iconUrl": "string (optional, if providing URL directly)", + "iconFile": "file (optional, if uploading a new icon via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "name": "Gaming", + "description": "E-sports and casual gaming events." + } + ``` + - **Query Parameters:** None + - **Successful Response (201 Created):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "category": { + "id": "string", + "name": "string", + "description": "string (optional)", + "iconUrl": "string (optional)" + } + } + ``` + - **Example:** + ```json + { + "message": "Event category 'Gaming' created successfully", + "category": { + "id": "evcat_03", + "name": "Gaming", + "description": "E-sports and casual gaming events.", + "iconUrl": "https://example.com/icons/gaming.png" + } + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Event category name is required" + } + ``` + +**4. Update an Event Category** + - **Method:** `PUT` + - **Path:** `/api/event-categories` + - **Description:** Updates an existing event category. The category is identified by `id` in the request body. Icon can be updated if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "id": "string (required, identifier)", + "name": "string (optional)", + "description": "string (optional)", + "iconUrl": "string (optional, if providing URL directly)", + "iconFile": "file (optional, if uploading a new icon via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "id": "evcat_01", + "description": "All competitive programming and hackathon events." + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Same as Create Event Category response `category` object, plus a message) + - **Example:** + ```json + { + "message": "Event category 'Coding' updated successfully", + "category": { + "id": "evcat_01", + "name": "Coding", + "description": "All competitive programming and hackathon events.", + "iconUrl": "https://example.com/icons/coding_updated.png" + } + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Event category with id 'evcat_01' not found for update" + } + ``` + +**5. Delete an Event Category** + - **Method:** `DELETE` + - **Path:** `/api/event-categories` + - **Description:** Deletes an event category. + - **Request Body:** None + - **Query Parameters:** + - `id`: `string` (required) - The ID of the event category to delete. + - **Example:** `/api/event-categories?id=evcat_03` + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Event category 'evcat_03' deleted successfully" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Event category with id 'evcat_03' not found" + } + ``` + +--- + +### Lectures Endpoints + +Manages guest lectures and talks. + +**1. Get All Lectures** + - **Method:** `GET` + - **Path:** `/api/lectures` + - **Description:** Retrieves a list of all scheduled lectures. + - **Request Body:** None + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + [ + { + "id": "string", + "title": "string", + "speakerName": "string", + "description": "string", + "dateTime": "string (ISO 8601 DateTime, e.g., YYYY-MM-DDTHH:mm:ssZ)", + "venue": "string", + "imageUrl": "string (optional)" + } + ] + ``` + - **Example:** + ```json + [ + { + "id": "lec_001", + "title": "The Future of AI", + "speakerName": "Dr. Eva Core", + "description": "An insightful talk on upcoming AI trends.", + "dateTime": "2025-11-05T14:00:00Z", + "venue": "Seminar Hall A", + "imageUrl": "https://example.com/images/eva_core_lecture.jpg" + } + ] + ``` + - **Error Response (e.g., 500 Internal Server Error):** + ```json + { + "error": "Failed to fetch lectures" + } + ``` + +**2. Get a Specific Lecture** + - **Method:** `GET` + - **Path:** `/api/lectures` + - **Description:** Retrieves details for a specific lecture by its ID. + - **Request Body:** None + - **Query Parameters:** + - `id`: `string` (required) - The ID of the lecture. + - **Example:** `/api/lectures?id=lec_001` + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Single lecture object) + - **Example:** + ```json + { + "id": "lec_001", + "title": "The Future of AI", + "speakerName": "Dr. Eva Core", + "description": "An insightful talk on upcoming AI trends.", + "dateTime": "2025-11-05T14:00:00Z", + "venue": "Seminar Hall A", + "imageUrl": "https://example.com/images/eva_core_lecture.jpg" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Lecture with id 'lec_001' not found" + } + ``` + +**3. Create a New Lecture** + - **Method:** `POST` + - **Path:** `/api/lectures` + - **Description:** Schedules a new lecture. Image can be uploaded if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "title": "string (required)", + "speakerName": "string (required)", + "description": "string (required)", + "dateTime": "string (required, ISO 8601 DateTime)", + "venue": "string (required)", + "imageUrl": "string (optional, if providing URL directly)", + "imageFile": "file (optional, if uploading a new image via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "title": "Blockchain Revolution", + "speakerName": "Mr. Satoshi Nakamoto Jr.", + "description": "Exploring the impact of blockchain technology.", + "dateTime": "2025-11-10T11:00:00Z", + "venue": "Auditorium B" + } + ``` + - **Query Parameters:** None + - **Successful Response (201 Created):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "lecture": { + "id": "string", + "title": "string", + "speakerName": "string", + "description": "string", + "dateTime": "string", + "venue": "string", + "imageUrl": "string (optional)" + } + } + ``` + - **Example:** + ```json + { + "message": "Lecture 'Blockchain Revolution' created successfully", + "lecture": { + "id": "lec_002", + "title": "Blockchain Revolution", + "speakerName": "Mr. Satoshi Nakamoto Jr.", + "description": "Exploring the impact of blockchain technology.", + "dateTime": "2025-11-10T11:00:00Z", + "venue": "Auditorium B", + "imageUrl": "https://example.com/images/blockchain_lecture.jpg" + } + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Lecture title, speaker name, description, dateTime, and venue are required" + } + ``` + +**4. Update a Lecture** + - **Method:** `PUT` + - **Path:** `/api/lectures` + - **Description:** Updates an existing lecture. The lecture is identified by `id` in the request body. Image can be updated if `multipart/form-data` is used. + - **Request Body:** `application/json` or `multipart/form-data` + - **Schema (JSON):** + ```json + { + "id": "string (required, identifier for the lecture to update)", + "title": "string (optional)", + "speakerName": "string (optional)", + "description": "string (optional)", + "dateTime": "string (optional, ISO 8601 DateTime)", + "venue": "string (optional)", + "imageUrl": "string (optional, if providing URL directly)", + "imageFile": "file (optional, if uploading a new image via multipart/form-data)" + } + ``` + - **Example (JSON):** + ```json + { + "id": "lec_001", + "venue": "Main Auditorium (Capacity: 500)", + "description": "An insightful talk on upcoming AI trends and their ethical implications." + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Same as Create Lecture response `lecture` object, plus a message) + - **Example:** + ```json + { + "message": "Lecture 'The Future of AI' updated successfully", + "lecture": { + "id": "lec_001", + "title": "The Future of AI", + "speakerName": "Dr. Eva Core", + "description": "An insightful talk on upcoming AI trends and their ethical implications.", + "dateTime": "2025-11-05T14:00:00Z", + "venue": "Main Auditorium (Capacity: 500)", + "imageUrl": "https://example.com/images/eva_core_lecture_updated.jpg" + } + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Lecture with id 'lec_001' not found for update" + } + ``` + +**5. Delete a Lecture** + - **Method:** `DELETE` + - **Path:** `/api/lectures` + - **Description:** Deletes a lecture. + - **Request Body:** None + - **Query Parameters:** + - `id`: `string` (required) - The ID of the lecture to delete. + - **Example:** `/api/lectures?id=lec_002` + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Lecture 'lec_002' deleted successfully" + } + ``` + - **Error Response (e.g., 404 Not Found):** + ```json + { + "error": "Lecture with id 'lec_002' not found" + } + ``` + +--- + +### Users Endpoints + +Manages user-specific actions like event registration and queries. These endpoints typically operate in the context of the authenticated user, unless specified otherwise (e.g., for admin actions). + +**1. Get User's Registered Events** + - **Method:** `GET` + - **Path:** `/api/users` + - **Description:** Retrieves a list of events the authenticated user is registered for. If an admin makes the request with a `userId` query parameter, it can fetch events for that specific user. + - **Request Body:** None + - **Query Parameters:** + - `userId`: `string` (optional) - ID of the user to fetch events for. Typically used by an admin. If omitted, defaults to the authenticated user. + - **Example:** `/api/users` (for current user) or `/api/users?userId=user_abc` (for a specific user by admin) + - **Successful Response (200 OK):** + - **Schema:** `application/json` (Array of Event objects, see Events section for the detailed Event object schema) + ```json + [ + { + "eventName": "CodeSprint", + "category": "Coding", + "description": "A competitive programming contest.", + "date": "2025-10-15", + "time": "10:00 AM", + "venue": "Online", + "teamSizeMin": 1, + "teamSizeMax": 3, + "posterUrl": "https://example.com/posters/codesprint.png", + "registrationOpen": true + } + // ... more registered events + ] + ``` + - **Error Response (e.g., 401 Unauthorized or 500 Internal Server Error):** + ```json + { + "error": "User not authenticated or failed to fetch user events" + } + ``` + +**2. Register User for an Event** + - **Method:** `PUT` + - **Path:** `/api/users` + - **Description:** Registers the authenticated user for a specified event. An admin might be able to specify a `userId` in the body to register another user. + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "eventId": "string (required, ID of the event to register for)", + "userId": "string (optional, defaults to authenticated user; admin can specify to register another user)" + } + ``` + - **Example:** + ```json + { + "eventId": "event_abc123" + } + ``` + - **Query Parameters:** None + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "registrationDetails": { + "userId": "string", + "eventId": "string", + "status": "string (e.g., 'registered', 'waitlisted')" + } + } + ``` + - **Example:** + ```json + { + "message": "Successfully registered for event 'CodeSprint'", + "registrationDetails": { + "userId": "user_xyz789", + "eventId": "event_abc123", + "status": "registered" + } + } + ``` + - **Error Response (e.g., 400 Bad Request, 404 Event Not Found, 409 Already Registered):** + ```json + { + "error": "Event ID is required, or Event not found/registration closed, or User already registered" + } + ``` + +**3. Unregister User from an Event** + - **Method:** `PUT` + - **Path:** `/api/users` + - **Description:** Unregisters the authenticated user from a specified event. An admin might be able to specify a `userId` in the body. + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "eventId": "string (required, ID of the event to unregister from)", + "userId": "string (optional, defaults to authenticated user; admin can specify for another user)" + } + ``` + - **Example:** + ```json + { + "eventId": "event_abc123" + } + ``` + - **Query Parameters:** + - `action`: `string` (required, must be `unregister`) + - **Example:** `/api/users?action=unregister` + - **Successful Response (200 OK):** + - **Schema:** `application/json` + ```json + { + "message": "string" + } + ``` + - **Example:** + ```json + { + "message": "Successfully unregistered from event 'CodeSprint'" + } + ``` + - **Error Response (e.g., 400 Bad Request, 404 Event Not Found):** + ```json + { + "error": "Event ID is required, or user not registered for this event" + } + ``` + +**4. Add a Query (Contact/Feedback)** + - **Method:** `POST` + - **Path:** `/api/users` + - **Description:** Allows the authenticated user to submit a query, feedback, or contact message. + - **Request Body:** `application/json` + - **Schema:** + ```json + { + "subject": "string (required)", + "message": "string (required)", + "userId": "string (optional, defaults to authenticated user; can also be inferred from auth session)", + "email": "string (optional, if user is not authenticated or for record keeping)" + } + ``` + - **Example:** + ```json + { + "subject": "Feedback on RoboWars Event", + "message": "The event was great, but the live stream had some issues." + } + ``` + - **Query Parameters:** None + - **Successful Response (201 Created):** + - **Schema:** `application/json` + ```json + { + "message": "string", + "queryId": "string (ID of the created query)" + } + ``` + - **Example:** + ```json + { + "message": "Query submitted successfully. We will get back to you soon.", + "queryId": "query_def456" + } + ``` + - **Error Response (e.g., 400 Bad Request):** + ```json + { + "error": "Subject and message are required for the query" + } + ``` + +--- + +## Request and Response Format + +Most endpoints accept and return JSON data (`application/json`). +File uploads (e.g., logos, posters, icons for teams, sponsors, events, categories, lectures) should generally be sent as `multipart/form-data`. When using `multipart/form-data`, any accompanying JSON-like data (e.g., name, description) should be sent as regular form fields alongside the file(s). The API route handlers are responsible for parsing `FormData` accordingly. + +## Authentication + +These endpoints typically inherit authentication mechanisms from the Next.js server (e.g., session cookies, JWT tokens in headers). Ensure your application has appropriate authentication and authorization middleware set up to protect these endpoints as needed. Some endpoints may operate on the authenticated user's context by default (e.g., fetching user-specific data, registering for events). For administrative actions, proper role checks should be in place. + +## Error Handling + +All endpoints aim to return appropriate HTTP status codes to indicate the outcome of the request: + +- `200 OK`: The request was successful. +- `201 Created`: The request was successful, and a new resource was created. +- `400 Bad Request`: The server could not understand the request due to invalid syntax or missing parameters (e.g., a required field in the JSON body is missing). The response body should contain details about the error. +- `401 Unauthorized`: Authentication is required and has failed, or it has not yet been provided. The client should authenticate and try again. +- `403 Forbidden`: The authenticated user does not have the necessary permissions to perform the requested action on the resource. +- `404 Not Found`: The requested resource (e.g., a specific event, user, or category) could not be found on the server. +- `409 Conflict`: The request could not be completed due to a conflict with the current state of the resource (e.g., trying to create a resource that already exists with a unique identifier). +- `500 Internal Server Error`: An unexpected condition was encountered on the server that prevented it from fulfilling the request. + +Error responses are in JSON format and include an `error` field with a descriptive message. + +**Example Error Response (e.g., 400 Bad Request):** +```json +{ + "error": "A descriptive error message explaining what went wrong, e.g., 'eventName is required'." +} +``` \ No newline at end of file diff --git a/app/api/admin/category/route.ts b/app/api/admin/category/route.ts new file mode 100644 index 0000000..aed20de --- /dev/null +++ b/app/api/admin/category/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { addCategory } from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const result = await addCategory(body); + return NextResponse.json(result, { status: 201 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to add category' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/mail/route.ts b/app/api/admin/mail/route.ts new file mode 100644 index 0000000..87a900e --- /dev/null +++ b/app/api/admin/mail/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { sendMailToMultipleUsers } from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const result = await sendMailToMultipleUsers(body); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to send mail' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/notification/route.ts b/app/api/admin/notification/route.ts new file mode 100644 index 0000000..d22c34e --- /dev/null +++ b/app/api/admin/notification/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { sendNotification } from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const result = await sendNotification(body); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to send notification' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/query/route.ts b/app/api/admin/query/route.ts new file mode 100644 index 0000000..b8c6909 --- /dev/null +++ b/app/api/admin/query/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { deleteQuery } from '@/app/actions/admin'; + +export async function PUT(request: NextRequest) { + try { + const body = await request.json(); + const result = await deleteQuery(body); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to delete query' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/route.ts b/app/api/admin/route.ts new file mode 100644 index 0000000..8f5fa07 --- /dev/null +++ b/app/api/admin/route.ts @@ -0,0 +1,65 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { + addCategory, + deleteQuery, + sendMailToMultipleUsers, + sendNotification, + updateUser, + updateUserByAdmin +} from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const url = new URL(request.url); + const path = url.pathname; + const body = await request.json(); + + // Route to the appropriate function based on the request path + if (path.endsWith('/category')) { + const result = await addCategory(body); + return NextResponse.json(result, { status: 201 }); + } + else if (path.endsWith('/mail')) { + const result = await sendMailToMultipleUsers(body); + return NextResponse.json(result, { status: 200 }); + } + else if (path.endsWith('/notification')) { + const result = await sendNotification(body); + return NextResponse.json(result, { status: 200 }); + } + else if (path.endsWith('/update-users')) { + const result = await updateUser(); + return NextResponse.json(result, { status: 200 }); + } + else if (path.endsWith('/update-user')) { + const result = await updateUserByAdmin(body); + return NextResponse.json(result, { status: 200 }); + } + else { + return NextResponse.json( + { error: 'Invalid endpoint' }, + { status: 404 } + ); + } + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to process request' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const body = await request.json(); + + // Handle the query deletion + const result = await deleteQuery(body); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to delete query' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/update-users/route.ts b/app/api/admin/update-users/route.ts new file mode 100644 index 0000000..d05d2d2 --- /dev/null +++ b/app/api/admin/update-users/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { updateUser } from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const result = await updateUser(); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update users' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/user/route.ts b/app/api/admin/user/route.ts new file mode 100644 index 0000000..57e64c7 --- /dev/null +++ b/app/api/admin/user/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { updateUserByAdmin } from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const result = await updateUserByAdmin(body); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update user' }, + { status: 500 } + ); + } +} diff --git a/app/api/event-categories/route.ts b/app/api/event-categories/route.ts new file mode 100644 index 0000000..0c31e41 --- /dev/null +++ b/app/api/event-categories/route.ts @@ -0,0 +1,120 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { + getAllEventCategory, + getEventCategoryById, + createEventCategory, + updateEventCategory, + deleteEventCategory +} from '@/app/actions/eventCategory'; + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const id = searchParams.get('id'); + + if (id) { + const category = await getEventCategoryById(id); + return NextResponse.json(category, { status: 200 }); + } else { + const categories = await getAllEventCategory(); + return NextResponse.json(categories, { status: 200 }); + } + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch event categories' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const formData = await request.formData(); + + const eventCategory = formData.get('eventCategory') as string; + const image = formData.get('image') as File; + + if (!eventCategory || !image) { + return NextResponse.json( + { error: 'Event category name and image are required' }, + { status: 400 } + ); + } + + await createEventCategory({ eventCategory, image }); + + return NextResponse.json( + { message: 'Event category created successfully' }, + { status: 201 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to create event category' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const formData = await request.formData(); + + const id = formData.get('id') as string; + + if (!id) { + return NextResponse.json( + { error: 'Event category ID is required' }, + { status: 400 } + ); + } + + // Build updated data object + const updatedData: any = {}; + + if (formData.has('eventCategory')) { + updatedData.eventCategory = formData.get('eventCategory') as string; + } + + if (formData.has('image')) { + updatedData.image = formData.get('image') as File; + } + + await updateEventCategory(id, updatedData); + + return NextResponse.json( + { message: 'Event category updated successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update event category' }, + { status: 500 } + ); + } +} + +export async function DELETE(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const id = searchParams.get('id'); + + if (!id) { + return NextResponse.json( + { error: 'Event category ID is required' }, + { status: 400 } + ); + } + + await deleteEventCategory(id); + + return NextResponse.json( + { message: 'Event category deleted successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to delete event category' }, + { status: 500 } + ); + } +} diff --git a/app/api/events/route.ts b/app/api/events/route.ts new file mode 100644 index 0000000..9be9274 --- /dev/null +++ b/app/api/events/route.ts @@ -0,0 +1,183 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { + getAllEvents, + // getEventsByCategory, // Assuming you might want to add this back later if needed + getEventByName, + createEvent, + updateEventByName, + deleteEvent +} from '@/app/actions/events'; + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const category = searchParams.get('category'); + const eventName = searchParams.get('eventName'); + + if (eventName && category) { + const event = await getEventByName(category, eventName); + return NextResponse.json(event, { status: 200 }); + } else if (category) { + // Assuming getEventsByCategory is intended to be used, if not, this part might need adjustment + // const events = await getEventsByCategory(category); + // return NextResponse.json(events, { status: 200 }); + // If getEventsByCategory is not available or not intended, adjust this part accordingly. + // For now, I'll comment it out to avoid errors if it's not defined in actions. + return NextResponse.json({ error: "Fetching all events for a category is not implemented yet" }, { status: 501 }); + } else { + const events = await getAllEvents(); + return NextResponse.json(events, { status: 200 }); + } + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch events' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const formData = await request.formData(); + + // Parse coordinators from form data (expected as JSON string) + let coordinators: any[] = []; + const coordinatorsJson = formData.get('coordinators'); + + if (coordinatorsJson && typeof coordinatorsJson === 'string') { + coordinators = JSON.parse(coordinatorsJson); + } + + // Parse rules from form data (expected as JSON string) + let rules: string[] = []; + const rulesJson = formData.get('rules'); + + if (rulesJson && typeof rulesJson === 'string') { + rules = JSON.parse(rulesJson); + } + + // Create event object from form data + const eventData = { + coordinators, + description: formData.get('description') as string, + document: formData.get('document') as string, + endTime: Number(formData.get('endTime')), + eventCategory: formData.get('eventCategory') as string, + eventName: formData.get('eventName') as string, + flagship: formData.get('flagship') === 'true', + rules, + startTime: Number(formData.get('startTime')), + venue: formData.get('venue') as string, + image: formData.get('image') as File, + }; + + if (!eventData.eventCategory || !eventData.eventName) { + return NextResponse.json( + { error: 'Event category and name are required' }, + { status: 400 } + ); + } + + const result = await createEvent(eventData); + + return NextResponse.json( + { id: result, message: 'Event created successfully' }, + { status: 201 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to create event' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const formData = await request.formData(); + + const category = formData.get('category') as string; + const eventName = formData.get('eventName') as string; + + if (!category || !eventName) { + return NextResponse.json( + { error: 'Event category and name are required' }, + { status: 400 } + ); + } + + // Parse coordinators from form data (expected as JSON string) + let coordinators: any[] = []; + const coordinatorsJson = formData.get('coordinators'); + + if (coordinatorsJson && typeof coordinatorsJson === 'string') { + coordinators = JSON.parse(coordinatorsJson); + } + + // Parse rules from form data (expected as JSON string) + let rules: string[] = []; + const rulesJson = formData.get('rules'); + + if (rulesJson && typeof rulesJson === 'string') { + rules = JSON.parse(rulesJson); + } + + // Build updated data object + const updatedData: any = { + coordinators, + description: formData.get('description') as string, + document: formData.get('document') as string, + endTime: Number(formData.get('endTime')), + eventCategory: formData.get('eventCategory') as string, + eventName: formData.get('eventName') as string, + flagship: formData.get('flagship') === 'true', + rules, + startTime: Number(formData.get('startTime')), + venue: formData.get('venue') as string, + }; + + // Include image if provided + if (formData.has('image')) { + updatedData.image = formData.get('image') as File; + } + + const result = await updateEventByName(category, eventName, updatedData); + + return NextResponse.json( + { success: result, message: 'Event updated successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update event' }, + { status: 500 } + ); + } +} + +export async function DELETE(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const category = searchParams.get('category'); + const eventName = searchParams.get('eventName'); + + if (!category || !eventName) { + return NextResponse.json( + { error: 'Event category and name are required' }, + { status: 400 } + ); + } + + await deleteEvent(category, eventName); + + return NextResponse.json( + { message: 'Event deleted successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to delete event' }, + { status: 500 } + ); + } +} diff --git a/app/api/lectures/route.ts b/app/api/lectures/route.ts new file mode 100644 index 0000000..1c00772 --- /dev/null +++ b/app/api/lectures/route.ts @@ -0,0 +1,143 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { + getAllLecture, + getLectureById, + createLecture, + updateLecture, + deleteLecture, + Lecture // Import the Lecture type +} from '@/app/actions/lecture'; + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const id = searchParams.get('id'); + + if (id) { + const lecture = await getLectureById(id); + return NextResponse.json(lecture, { status: 200 }); + } else { + const lectures = await getAllLecture(); + return NextResponse.json(lectures, { status: 200 }); + } + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch lectures' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const formData = await request.formData(); + + // Create lecture object from form data + const lecture: any = { + date: formData.get('date') as string, + desc: formData.get('desc') as string, + name: formData.get('name') as string, + time: formData.get('time') as string, + image: formData.get('image') as File, + }; + + // Add optional fields if provided + if (formData.has('facebook')) lecture.facebook = formData.get('facebook') as string; + if (formData.has('insta')) lecture.insta = formData.get('insta') as string; + if (formData.has('linkedin')) lecture.linkedin = formData.get('linkedin') as string; + if (formData.has('link')) lecture.link = formData.get('link') as string; + + if (!lecture.date || !lecture.desc || !lecture.name || !lecture.time) { + return NextResponse.json( + { error: 'Date, description, name, and time are required' }, + { status: 400 } + ); + } + + const result = await createLecture(lecture); + + if (typeof result === 'object' && 'err_desc' in result) { + return NextResponse.json( + { error: result.err_desc }, + { status: 400 } + ); + } + + return NextResponse.json( + { id: result, message: 'Lecture created successfully' }, + { status: 201 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to create lecture' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const formData = await request.formData(); + + const id = formData.get('id') as string; + + if (!id) { + return NextResponse.json( + { error: 'Lecture ID is required' }, + { status: 400 } + ); + } + + // Build lecture object from form data + const updatedData: Partial = {}; // Use Partial for type safety + + // Add fields if provided + if (formData.has('date')) updatedData.date = formData.get('date') as string; + if (formData.has('desc')) updatedData.desc = formData.get('desc') as string; + if (formData.has('name')) updatedData.name = formData.get('name') as string; + if (formData.has('time')) updatedData.time = formData.get('time') as string; + if (formData.has('facebook')) updatedData.facebook = formData.get('facebook') as string; + if (formData.has('insta')) updatedData.insta = formData.get('insta') as string; + if (formData.has('linkedin')) updatedData.linkedin = formData.get('linkedin') as string; + if (formData.has('link')) updatedData.link = formData.get('link') as string; + if (formData.has('image')) updatedData.image = formData.get('image') as File; + + await updateLecture(id, updatedData); // Pass id and updatedData separately + + return NextResponse.json( + { message: 'Lecture updated successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update lecture' }, + { status: 500 } + ); + } +} + +export async function DELETE(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const id = searchParams.get('id'); + + if (!id) { + return NextResponse.json( + { error: 'Lecture ID is required' }, + { status: 400 } + ); + } + + await deleteLecture(id); + + return NextResponse.json( + { message: 'Lecture deleted successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to delete lecture' }, + { status: 500 } + ); + } +} diff --git a/app/api/sponsors/route.ts b/app/api/sponsors/route.ts new file mode 100644 index 0000000..b71b667 --- /dev/null +++ b/app/api/sponsors/route.ts @@ -0,0 +1,137 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { + getAllSponsors, + createSponsor, + updateSponsor, + deleteSponsor, + // getSponsorsByCategory // Commented out as it's not defined in actions +} from '@/app/actions/sponsors'; + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const category = searchParams.get('category'); + + if (category) { + // const sponsors = await getSponsorsByCategory(category); // Needs implementation in actions + // return NextResponse.json(sponsors, { status: 200 }); + return NextResponse.json( + { error: 'Fetching sponsors by category is not implemented yet. Implement getSponsorsByCategory in actions.' }, + { status: 501 } // 501 Not Implemented + ); + } else { + const sponsors = await getAllSponsors(); + return NextResponse.json(sponsors, { status: 200 }); + } + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch sponsors' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const formData = await request.formData(); + + // Create sponsor object from form data + const sponsor = { + category: formData.get('category') as string, + alt: formData.get('alt') as string, + name: formData.get('name') as string, + targetUrl: formData.get('targetUrl') as string, + image: formData.get('image') as File | null, + }; + + if (!sponsor.category || !sponsor.name) { + return NextResponse.json( + { error: 'Category and name are required' }, + { status: 400 } + ); + } + + const result = await createSponsor(sponsor); + + if (typeof result === 'object' && 'err_desc' in result) { + return NextResponse.json( + { error: result.err_desc }, + { status: 400 } + ); + } + + return NextResponse.json( + { id: result, message: 'Sponsor created successfully' }, + { status: 201 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to create sponsor' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const formData = await request.formData(); + + const id = formData.get('id') as string; + const currentCategory = formData.get('currentCategory') as string; + + if (!id || !currentCategory) { + return NextResponse.json( + { error: 'Sponsor ID and current category are required' }, + { status: 400 } + ); + } + + // Build updated data object + const updatedData: any = {}; + + if (formData.has('category')) updatedData.category = formData.get('category') as string; + if (formData.has('alt')) updatedData.alt = formData.get('alt') as string; + if (formData.has('name')) updatedData.name = formData.get('name') as string; + if (formData.has('targetUrl')) updatedData.targetUrl = formData.get('targetUrl') as string; + if (formData.has('image')) updatedData.image = formData.get('image') as File; + + const result = await updateSponsor(id, currentCategory, updatedData); + + return NextResponse.json( + { success: result, message: 'Sponsor updated successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update sponsor' }, + { status: 500 } + ); + } +} + +export async function DELETE(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const id = searchParams.get('id'); + const category = searchParams.get('category'); + + if (!id || !category) { + return NextResponse.json( + { error: 'Sponsor ID and category are required' }, + { status: 400 } + ); + } + + const result = await deleteSponsor(category, id); // Swapped id and category to match action + + return NextResponse.json( + { success: result, message: 'Sponsor deleted successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to delete sponsor' }, + { status: 500 } + ); + } +} diff --git a/app/api/techspardha-teams/[team]/route.ts b/app/api/techspardha-teams/[team]/route.ts new file mode 100644 index 0000000..251e13c --- /dev/null +++ b/app/api/techspardha-teams/[team]/route.ts @@ -0,0 +1,26 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getTechspardhaTeamById } from '@/app/actions/techspardha_teams'; + +export async function GET( + request: NextRequest, + { params }: { params: { team: string } } +) { + try { + const team = params.team; + + if (!team) { + return NextResponse.json( + { error: 'Team name is required' }, + { status: 400 } + ); + } + + const teamData = await getTechspardhaTeamById(team); + return NextResponse.json(teamData, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch techspardha team' }, + { status: 500 } + ); + } +} diff --git a/app/api/techspardha-teams/route.ts b/app/api/techspardha-teams/route.ts new file mode 100644 index 0000000..a4801af --- /dev/null +++ b/app/api/techspardha-teams/route.ts @@ -0,0 +1,95 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { + getAllTechspardhaTeams, + getTechspardhaTeamById, + createTechspardhaTeam, + updateTechspardhaTeam, + deleteTechspardhaTeam +} from '@/app/actions/techspardha_teams'; + +export async function GET(request: NextRequest) { + try { + const teams = await getAllTechspardhaTeams(); + return NextResponse.json(teams, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch techspardha teams' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const { team, data } = body; + + if (!team || !data) { + return NextResponse.json( + { error: 'Team name and data are required' }, + { status: 400 } + ); + } + + await createTechspardhaTeam(team, data); + return NextResponse.json( + { message: 'Techspardha team created successfully' }, + { status: 201 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to create techspardha team' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const body = await request.json(); + const { team, data } = body; + + if (!team || !data) { + return NextResponse.json( + { error: 'Team name and data are required' }, + { status: 400 } + ); + } + + await updateTechspardhaTeam(team, data); + return NextResponse.json( + { message: 'Techspardha team updated successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update techspardha team' }, + { status: 500 } + ); + } +} + +export async function DELETE(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const team = searchParams.get('team'); + + if (!team) { + return NextResponse.json( + { error: 'Team name is required' }, + { status: 400 } + ); + } + + await deleteTechspardhaTeam(team); + return NextResponse.json( + { message: 'Techspardha team deleted successfully' }, + { status: 200 } + ); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to delete techspardha team' }, + { status: 500 } + ); + } +} diff --git a/app/api/users/route.ts b/app/api/users/route.ts new file mode 100644 index 0000000..76c148f --- /dev/null +++ b/app/api/users/route.ts @@ -0,0 +1,69 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { + getUserEvents, + updateUserEvent, + unregisterUserEvent, + addQuery +} from '@/app/actions/users'; + +export async function GET(request: NextRequest) { + try { + const events = await getUserEvents(); + return NextResponse.json(events, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch user events' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const action = searchParams.get('action'); + + const body = await request.json(); + + if (!body.eventName || !body.eventCategory) { + return NextResponse.json( + { error: 'Event name and category are required' }, + { status: 400 } + ); + } + + if (action === 'unregister') { + const result = await unregisterUserEvent(body); + return NextResponse.json(result, { status: 200 }); + } else { + const result = await updateUserEvent(body); + return NextResponse.json(result, { status: 200 }); + } + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update user event' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + + if (!body.name || !body.email || !body.query) { + return NextResponse.json( + { error: 'Name, email, and query are required' }, + { status: 400 } + ); + } + + const result = await addQuery(body); + return NextResponse.json(result, { status: 201 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to add query' }, + { status: 500 } + ); + } +} From e7b370a8cb8064f9475092ce43732090d138a4dd Mon Sep 17 00:00:00 2001 From: OjuIsOn Date: Sat, 5 Jul 2025 18:14:36 +0530 Subject: [PATCH 21/22] added complete api layer --- app/actions/admin.ts | 36 ++- app/actions/app.ts | 10 +- app/actions/information.ts | 26 +- app/actions/manager.ts | 30 +- app/actions/users.ts | 295 ++++++++++++++++-- app/actions/web.ts | 23 +- app/api/about/route.ts | 15 + app/api/aboutAppDevs/route.ts | 15 + app/api/admin/category/route.ts | 4 +- .../admin/event/[category]/[name]/route.ts | 21 ++ app/api/admin/event/route.ts | 37 +++ app/api/admin/mail/category/route.ts | 46 +++ app/api/admin/mail/list/route.ts | 24 ++ app/api/admin/mail/route.ts | 3 +- app/api/admin/mobilenoti/route.ts | 24 ++ app/api/admin/notification/route.ts | 15 - app/api/admin/query/route.ts | 17 +- app/api/admin/route.ts | 91 ++++-- app/api/admin/update-users/route.ts | 4 +- app/api/admin/user/route.ts | 19 +- app/api/app/route.ts | 38 +++ app/api/auth/app/route.ts | 36 +++ app/api/auth/web/route.ts | 40 +++ app/api/contacts/route.ts | 14 + app/api/events/categories/route.ts | 54 ++++ app/api/events/description/route.ts | 25 ++ app/api/events/route.ts | 144 +++++---- app/api/events/timeline/route.ts | 14 + app/api/facts/route.ts | 14 + app/api/faq/route.ts | 14 + app/api/foodsponsors/route.ts | 14 + app/api/lectures/route.ts | 3 +- app/api/notification/route.ts | 14 + app/api/query/route.ts | 22 ++ app/api/sponsors/route.ts | 59 ++-- app/api/timestamp/events/route.ts | 17 + app/api/updateUsers/route.ts | 16 + app/api/user/event/route.ts | 37 +++ app/api/user/event/unregister/route.ts | 22 ++ app/api/users/route.ts | 69 ---- app/api/videos/route.ts | 14 + app/layout.tsx | 1 - app/page.tsx | 1 + app/utils/axiosSetup.ts | 16 + 44 files changed, 1160 insertions(+), 293 deletions(-) create mode 100644 app/api/about/route.ts create mode 100644 app/api/aboutAppDevs/route.ts create mode 100644 app/api/admin/event/[category]/[name]/route.ts create mode 100644 app/api/admin/event/route.ts create mode 100644 app/api/admin/mail/category/route.ts create mode 100644 app/api/admin/mail/list/route.ts create mode 100644 app/api/admin/mobilenoti/route.ts delete mode 100644 app/api/admin/notification/route.ts create mode 100644 app/api/app/route.ts create mode 100644 app/api/auth/app/route.ts create mode 100644 app/api/auth/web/route.ts create mode 100644 app/api/contacts/route.ts create mode 100644 app/api/events/categories/route.ts create mode 100644 app/api/events/description/route.ts create mode 100644 app/api/events/timeline/route.ts create mode 100644 app/api/facts/route.ts create mode 100644 app/api/faq/route.ts create mode 100644 app/api/foodsponsors/route.ts create mode 100644 app/api/notification/route.ts create mode 100644 app/api/query/route.ts create mode 100644 app/api/timestamp/events/route.ts create mode 100644 app/api/updateUsers/route.ts create mode 100644 app/api/user/event/route.ts create mode 100644 app/api/user/event/unregister/route.ts delete mode 100644 app/api/users/route.ts create mode 100644 app/api/videos/route.ts create mode 100644 app/utils/axiosSetup.ts diff --git a/app/actions/admin.ts b/app/actions/admin.ts index 203e2f7..83f3f06 100644 --- a/app/actions/admin.ts +++ b/app/actions/admin.ts @@ -6,11 +6,17 @@ import { SimpleResponse, UserUpdateBody } from "../dtos/user.dto"; import { MailBody } from "../dtos/mail.dto"; import { NotificationBody } from "../dtos/notification.dto"; -export async function addCategory(category:Category): Promise{ +export async function addCategory(category:Category, token?: string): Promise{ if(!category) throw new Error("Category is required"); try { const url=`${process.env.SERVER_URL}/events/categories`; - const response = await axios.post(url,category) + const headers = token ? { Authorization: token } : undefined; + + const response = await axios.post(url,{ + category:category.categoryName, + imgUrl:category.imgUrl, + icon:category.icon + }, { headers }); return response.data; } catch (error:any) { console.error("Error adding category:", error?.response?.data || error.message || error); @@ -18,11 +24,12 @@ export async function addCategory(category:Category): Promise{ +export async function deleteQuery(query: QueryBody, token?: string): Promise{ if(!query) throw new Error("Query required"); try { const url=`${process.env.SERVER_URL}/admin/query`; - const response = await axios.put(url,query); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.put(url,query, { headers }); return response.data; } catch (error:any) { console.error("Error deleting query:", error?.response?.data || error.message || error); @@ -30,11 +37,12 @@ export async function deleteQuery(query: QueryBody): Promise{ } } -export async function sendMailToMultipleUsers(mail:MailBody): Promise{ +export async function sendMailToMultipleUsers(mail:MailBody, token?: string): Promise{ if(!mail) throw new Error("Mail data is required"); try { const url = `${process.env.SERVER_URL}/admin/mail/list`; - const response=await axios.post(url,mail); + const headers = token ? { Authorization: token } : undefined; + const response=await axios.post(url,mail, { headers }); return response.data; } catch (error:any) { console.error("Error sending mail:", error?.response?.data || error.message || error); @@ -42,11 +50,12 @@ export async function sendMailToMultipleUsers(mail:MailBody): Promise{ +export async function sendNotification(notification:NotificationBody, token?: string): Promise{ if(!notification) throw new Error("Notification data is required"); try{ const url=`${process.env.SERVER_URL}/admin/mobilenoti`; - const response = await axios.post(url,notification); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.post(url,notification, { headers }); return response.data; }catch(error:any){ console.error("Error sending notification:", error?.response?.data || error.message || error); @@ -54,10 +63,11 @@ export async function sendNotification(notification:NotificationBody): Promise { +export async function updateUser(token?: string): Promise { try { const url=`${process.env.SERVER_URL}/updateUsers`; - const response = await axios.post(url); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.post(url, undefined, { headers }); return response.data; } catch (error:any) { console.error("Error updating:", error?.response?.data || error.message || error); @@ -65,11 +75,13 @@ export async function updateUser(): Promise { } } -export async function updateUserByAdmin(user:UserUpdateBody): Promise { +export async function updateUserByAdmin(user:UserUpdateBody, token?: string): Promise { if(!user) throw new Error("User data is required"); try { const url=`${process.env.SERVER_URL}/admin/user`; - const response = await axios.post(url,user); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.put(url,user, { headers }); + return response.data; } catch (error:any) { console.error("Error updating user:", error?.response?.data || error.message || error); diff --git a/app/actions/app.ts b/app/actions/app.ts index bdf3846..a0f93d0 100644 --- a/app/actions/app.ts +++ b/app/actions/app.ts @@ -2,11 +2,12 @@ import axios from "axios"; import { UserAuthResponse, UserProfileUpdateSchema } from "../dtos/authentication.dto"; -export async function loginUsingOAuth(idToken:string): Promise { +export async function loginUsingOAuth(idToken:string, token?: string): Promise { if(!idToken) throw new Error("Id Token required"); try { const url=`${process.env.SERVER_URL}/loginApp`; - const response = await axios.post(url,idToken); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.post(url,idToken, { headers }); return response.data; } catch (error:any) { console.error("Error in login:", error?.response?.data || error.message || error); @@ -14,13 +15,14 @@ export async function loginUsingOAuth(idToken:string): Promise } } -export async function updateUserProfile(updateSchema:UserProfileUpdateSchema) : Promise { +export async function updateUserProfile(updateSchema:UserProfileUpdateSchema, token?: string) : Promise { if(!updateSchema || !updateSchema.year || !updateSchema.college) { throw new Error("Year and college are required for profile update"); } try { const url=`${process.env.SERVER_URL}/signUpApp`; - const response = await axios.put(url,updateSchema); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.put(url,updateSchema, { headers }); return response.data; } catch (error:any) { console.error("Error updating user profile:", error?.response?.data || error.message || error); diff --git a/app/actions/information.ts b/app/actions/information.ts index c1444b4..07428f6 100644 --- a/app/actions/information.ts +++ b/app/actions/information.ts @@ -64,14 +64,14 @@ export async function getCategoriesName(): Promise { } } -export async function getEventsNames(eventCategory?: string): Promise { - +export async function getEventsNames(eventCategory?: string, token?: string): Promise { try { let url = `${process.env.SERVER_URL}/events`; if (eventCategory && eventCategory.trim() !== "") { url += `?eventCategory=${encodeURIComponent(eventCategory)}`; } - const response = await axios.get(url); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.get(url, { headers }); return response.data.data.events; } catch (error: any) { @@ -80,16 +80,17 @@ export async function getEventsNames(eventCategory?: string): Promise { } } -export async function getEventsDescriptionByCategory(eventCategory: string,eventName?:string): Promise { - if(!eventCategory){ +export async function getEventsDescriptionByCategory(eventCategory: string, eventName?: string, token?: string): Promise { + if (!eventCategory) { throw new Error("Event category is required"); } try { - let url = `${process.env.SERVER_URL}/events/description?eventCategory=${encodeURIComponent(eventCategory)}` + let url = `${process.env.SERVER_URL}/events/description?eventCategory=${encodeURIComponent(eventCategory)}`; if (eventName && eventName.trim() !== "") { url += `&eventName=${encodeURIComponent(eventName)}`; } - const response = await axios.get(url); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.get(url, { headers }); return response.data.data.events; } catch (error: any) { @@ -101,12 +102,11 @@ export async function getEventsDescriptionByCategory(eventCategory: string,event -export async function getTimelineEvents(): Promise { +export async function getTimelineEvents(token?: string): Promise { try { const url = `${process.env.SERVER_URL}/events/timeline`; - - const response = await axios.get(url); - + const headers = token ? { Authorization: token } : undefined; + const response = await axios.get(url, { headers }); return response.data.data.events; } catch (error: any) { console.error("Error getting timeline events:", error?.response?.data || error.message || error); @@ -238,11 +238,13 @@ export async function getFAQs(): Promise { } -export async function getUpcomingEvents(timestamp?: number): Promise { +export async function getUpcomingEvents(timestamp?: number, token?: string): Promise { try { const url = `${process.env.SERVER_URL}/timestamp/events`; + const headers = token ? { Authorization: token } : undefined; const response = await axios.get(url, { params: { timestamp }, + headers }); return response.data.data.events; } catch (error: any) { diff --git a/app/actions/manager.ts b/app/actions/manager.ts index 1cbdd21..adab060 100644 --- a/app/actions/manager.ts +++ b/app/actions/manager.ts @@ -7,10 +7,12 @@ import { addSponsordto ,SponsorsResponse } from "../dtos/sponsor.dto"; import { QueryResponse } from "../dtos/query.dto"; import { mailResponse } from "../dtos/mail.dto"; -export async function addEvent(eventData: Event): Promise { +export async function addEvent(eventData: Event, token?: string): Promise { try{ const url= `${process.env.SERVER_URL}/events`; - const response=await axios.post(url, eventData); + const headers = token ? { Authorization: token } : undefined; + const response=await axios.post(url, eventData, { headers }); + console.log(response) return response.data; } catch (error: any) { @@ -19,10 +21,13 @@ export async function addEvent(eventData: Event): Promise { } } -export async function addSponsor(sponsor: addSponsordto): Promise { +export async function addSponsor(sponsor: addSponsordto, token?: string): Promise { try{ const url= `${process.env.SERVER_URL}/sponsors`; - const response=await axios.post(url, sponsor); + const headers = token ? { Authorization: token } : undefined; + + const response=await axios.post(url, sponsor, { headers }); + return response.data; } catch (error: any) { @@ -31,13 +36,14 @@ export async function addSponsor(sponsor: addSponsordto): Promise { +export async function getDataOfEvent(eventCategory:string , eventName:string, token?: string): Promise { if (!eventCategory || !eventName) { throw new Error("Event category and name are required"); } try { - const url = `${process.env.SERVER_URL}/admin/event/${eventCategory}/${eventName}`; - const response = await axios.get(url); + const url = `${process.env.SERVER_URL}/admin/event?eventCategory=${eventCategory}&eventName=${eventName}`; + const headers = token ? { Authorization: token } : undefined; + const response = await axios.get(url, { headers }); return response.data; } catch (error: any) { console.error("Error fetching event data:", error?.response?.data || error.message || error); @@ -45,10 +51,11 @@ export async function getDataOfEvent(eventCategory:string , eventName:string): P } } -export async function getQuery() : Promise { +export async function getQuery(token?: string) : Promise { try { const url = `${process.env.SERVER_URL}/admin/query`; - const response = await axios.get(url); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.get(url, { headers }); return response.data; } catch (error: any) { console.error("Error fetching queries:", error?.response?.data || error.message || error); @@ -56,7 +63,7 @@ export async function getQuery() : Promise { } } -export async function mailCategory(eventName:string , eventCategory:string,heading:string,buttontext:string,buttonlink:string,subject:string,thankyou:string,detail:string): Promise { +export async function mailCategory(eventName:string , eventCategory:string,heading:string,buttontext:string,buttonlink:string,subject:string,thankyou:string,detail:string, token?: string): Promise { if (!eventCategory || !eventName) { throw new Error("Event category and name are required"); } @@ -72,7 +79,8 @@ export async function mailCategory(eventName:string , eventCategory:string,headi thankyou, detail }; - const response = await axios.post(url, data); + const headers = token ? { Authorization: token } : undefined; + const response = await axios.post(url, data, { headers }); return response.data; } catch (error: any) { console.error("Error sending mail:", error?.response?.data || error.message || error); diff --git a/app/actions/users.ts b/app/actions/users.ts index 9775e24..a45aefd 100644 --- a/app/actions/users.ts +++ b/app/actions/users.ts @@ -2,13 +2,16 @@ import axios from "axios"; import { UserEventsResponse,SimpleResponse, UserEventUpdateRequest,AddQueryRequest } from "../dtos/user.dto"; import { Event } from "../dtos/event.dto"; -export async function getUserEvents(): Promise { +export async function getUserEvents(token?: string): Promise { try { const url = `${process.env.SERVER_URL}/user/event`; - + const headers = token ? { Authorization: token } : undefined; + console.log(headers); const response = await axios.get(url, { - withCredentials: true, + withCredentials: true, + headers }); + return response.data.data.events; } catch (error: any) { @@ -18,7 +21,7 @@ export async function getUserEvents(): Promise { } -export async function updateUserEvent(data: UserEventUpdateRequest): Promise { +export async function updateUserEvent(data: UserEventUpdateRequest, token?: string): Promise { try { const url = `${process.env.SERVER_URL}/user/event`; @@ -26,11 +29,11 @@ export async function updateUserEvent(data: UserEventUpdateRequest): Promise(url, formData, { - headers: { - "Content-Type": "application/x-www-form-urlencoded", - }, + const response = await axios.put(url, data, { + headers, withCredentials: true, }); @@ -42,21 +45,16 @@ export async function updateUserEvent(data: UserEventUpdateRequest): Promise { +export async function unregisterUserEvent(data: UserEventUpdateRequest, token?: string): Promise { try { const url = `${process.env.SERVER_URL}/user/event/unregister`; - - const formData = new URLSearchParams(); - formData.append("eventName", data.eventName); - formData.append("eventCategory", data.eventCategory); - - const response = await axios.put(url, formData, { - headers: { - "Content-Type": "application/x-www-form-urlencoded", - }, + const headers: any = { "Content-Type": "application/x-www-form-urlencoded" }; + if (token) headers.Authorization = token; + console.log(headers) + const response = await axios.put(url, data, { + headers, withCredentials: true, }); - return response.data; } catch (error: any) { console.error("Error unregistering user event:", error?.response?.data || error.message || error); @@ -65,17 +63,16 @@ export async function unregisterUserEvent(data: UserEventUpdateRequest): Promise } -export async function addQuery(data: AddQueryRequest): Promise { +export async function addQuery(data: AddQueryRequest, token?: string): Promise { try { const url = `${process.env.SERVER_URL}/query`; - const formData = new URLSearchParams(); formData.append("text", data.text); + const headers: any = { "Content-Type": "application/x-www-form-urlencoded" }; + if (token) headers.Authorization = token; const response = await axios.post(url, formData, { - headers: { - "Content-Type": "application/x-www-form-urlencoded", - }, + headers, withCredentials: true, }); @@ -83,5 +80,255 @@ export async function addQuery(data: AddQueryRequest): Promise { } catch (error: any) { console.error("Error adding query:", error?.response?.data || error.message || error); throw new Error(error?.response?.data?.message || "Failed to add query"); + } +} + + +import { + collection, + setDoc, + getDocs, + getDoc, + doc, + updateDoc, + deleteDoc, +} from "firebase/firestore"; +import { db } from "@/app/db"; + +export type RegisteredEvents = { + [category: string]: string[]; +}; + +export type User = { + admin: boolean; + email: string; + name: string; + onBoard: boolean; + picture: string; + role: "user" | "admin" | "manager"; + college?: string; + phone?: string; + year?: string; + registeredEvents?: RegisteredEvents; +}; + +export type UsersDTO = { + [email: string]: User; +}; + +// Get all users +/** + * Fetches all users from the Firestore database. + * + * @returns {Promise} A promise that resolves to an object containing all users, + * where each key is the user's email and the value is the user data. + * + * @throws {Error} Throws an error if there is an issue fetching users from the database. + * + * @example + * typescript + * getAllUsers() + * .then((users) => { + * console.log(users); + * }) + * .catch((error) => { + * console.error("Error fetching users:", error); + * }); + * + */ +export async function getAllUsers(): Promise { + try { + const querySnapshot = await getDocs(collection(db, "users")); + const data: UsersDTO = {}; + + querySnapshot.forEach((doc) => { + data[doc.id] = doc.data() as User; + }); + + return data; + } catch (error) { + console.error("Error fetching users:", error); + throw new Error("Failed to fetch users"); + } +} + +// Get user by email +/** + * Fetches a user by their email from the Firestore database. + * + * @param {string} email - The email of the user to fetch. + * @returns {Promise} A promise that resolves to a User object containing the user's data. + * + * @throws {Error} Throws an error if the user is not found or if there is an issue fetching the user. + * + * @example + * typescript + * getUserByEmail("user@example.com") + * .then((user) => { + * console.log(user); + * }) + * .catch((error) => { + * console.error("Error fetching user:", error); + * }); + * + */ +export async function getUserByEmail(email: string): Promise { + try { + const docRef = doc(db, "users", email); + const docSnap = await getDoc(docRef); + + if (docSnap.exists()) { + return docSnap.data() as User; + } else { + return null; + } + } catch (error) { + console.error("Error fetching user:", error); + return null; + } +} + +// Create user +/** + * Creates a new user in the Firestore database. + * + * @param {string} email - The email of the user to create. + * @param {User} data - The data of the user to create. + * @returns {Promise} A promise that resolves when the user is successfully created. + * + * @throws {Error} Throws an error if there is an issue creating the user. + * + * @example + * typescript + * const userData: User = { + * email: "user@example.com", + * name: "John Doe", + * admin: false, + * onBoard: true, + * picture: "https://example.com/picture.jpg", + * role: "user" + * }; + * + * createUser("user@example.com", userData) + * .then(() => { + * console.log("User created successfully"); + * }) + * .catch((error) => { + * console.error("Error creating user:", error); + * }); + * + */ +export async function createUser(email: string, data: User): Promise { + try { + const collectionRef = collection(db, "users"); + const docRef = doc(collectionRef, email); + + await setDoc(docRef, data); + console.log("User created:", email); + } catch (error) { + console.error("Error creating user:", error); + throw new Error("Failed to create user"); + + + + + + + + + + + } +} + +// Update user +/** + * Updates an existing user in the Firestore database. + * + * @param {string} email - The email of the user to update. + * @param {Partial} data - The updated data for the user. + * @returns {Promise} A promise that resolves when the user is successfully updated. + * + * @throws {Error} Throws an error if the user is not found or if there is an issue updating the user. + * + * @example + * typescript + * const updatedData: Partial = { + * name: "Jane Doe", + * phone: "1234567890" + * }; + * + * updateUser("user@example.com", updatedData) + * .then(() => { + * console.log("User updated successfully"); + * }) + * .catch((error) => { + * console.error("Error updating user:", error); + * }); + * + */ +export async function updateUser( + email: string, + data: Partial, +): Promise { + try { + const decodedEmail = decodeURIComponent(email); + const docRef = doc(db, "users", decodedEmail); + + await updateDoc(docRef, data); + console.log("User updated:", email); + } catch (error) { + console.error("Error updating user:", error); + throw new Error("Failed to update user"); + + + + + + + + + + } +} + +// Delete user +/** + * Deletes an existing user from the Firestore database. + * + * @param {string} email - The email of the user to delete. + * @returns {Promise} A promise that resolves when the user is successfully deleted. + * + * @throws {Error} Throws an error if the user is not found or if there is an issue deleting the user. + * + * @example + * typescript + * deleteUser("user@example.com") + * .then(() => { + * console.log("User deleted successfully"); + * }) + * .catch((error) => { + * console.error("Error deleting user:", error); + * }); + * + */ +export async function deleteUser(email: string): Promise { + try { + const docRef = doc(db, "users", email); + + await deleteDoc(docRef); + console.log("User deleted:", email); + } catch (error) { + console.error("Error deleting user:", error); + throw new Error("Failed to delete user"); + + + + + + + + + } } \ No newline at end of file diff --git a/app/actions/web.ts b/app/actions/web.ts index 2facb68..2e95405 100644 --- a/app/actions/web.ts +++ b/app/actions/web.ts @@ -1,21 +1,19 @@ import axios from "axios"; import { LoginRequest, LoginUserResponse, UpdateUserRequest } from "../dtos/user.dto"; -export async function loginWebUsingGoogleWeb(Token:LoginRequest): Promise { +export async function loginWebUsingGoogleWeb(Token:LoginRequest, token?: string): Promise { if(!Token || !Token.idToken || Token.idToken.trim().length === 0) { throw new Error("Invalid token: Token is missing or empty"); } try { const url=`${process.env.SERVER_URL}/login`; - - - const response= await axios.post(url,Token, { - headers: { + const headers: any = { "Content-Type": "application/json", Accept: "application/json" - } - }); + }; + if (token) headers.Authorization = token; + const response= await axios.post(url,Token, { headers }); return response.data; @@ -27,7 +25,7 @@ export async function loginWebUsingGoogleWeb(Token:LoginRequest): Promise { +export async function UpdateUserProfileForWeb(payload:UpdateUserRequest, token?: string): Promise { if(!payload) { throw new Error("Empty fields! fill fields to update the user"); } @@ -38,13 +36,12 @@ export async function UpdateUserProfileForWeb(payload:UpdateUserRequest): Promis try { const url=`${process.env.SERVER_URL}/user` - - const response=await axios.put(url,payload,{ - headers: { + const headers: any = { "Content-Type": "application/json", Accept: "application/json" - } - }) + }; + if (token) headers.Authorization = token; + const response=await axios.put(url,payload,{ headers }) return response.data diff --git a/app/api/about/route.ts b/app/api/about/route.ts new file mode 100644 index 0000000..53b2b7d --- /dev/null +++ b/app/api/about/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getDevelopers, getAppDevelopers } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const devs = await getDevelopers(); + return NextResponse.json({ data: { devs } }); + + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get developers info' }, + { status: 500 } + ); + } +} diff --git a/app/api/aboutAppDevs/route.ts b/app/api/aboutAppDevs/route.ts new file mode 100644 index 0000000..109ded4 --- /dev/null +++ b/app/api/aboutAppDevs/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getDevelopers, getAppDevelopers } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + + const appDevs = await getAppDevelopers(); + return NextResponse.json({ data: { information: appDevs } }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get developers info' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/category/route.ts b/app/api/admin/category/route.ts index aed20de..ead97ad 100644 --- a/app/api/admin/category/route.ts +++ b/app/api/admin/category/route.ts @@ -3,8 +3,10 @@ import { addCategory } from '@/app/actions/admin'; export async function POST(request: NextRequest) { try { + + const authHeader = request.headers.get('authorization') || ''; const body = await request.json(); - const result = await addCategory(body); + const result = await addCategory(body,authHeader); return NextResponse.json(result, { status: 201 }); } catch (error: any) { return NextResponse.json( diff --git a/app/api/admin/event/[category]/[name]/route.ts b/app/api/admin/event/[category]/[name]/route.ts new file mode 100644 index 0000000..0cdff5b --- /dev/null +++ b/app/api/admin/event/[category]/[name]/route.ts @@ -0,0 +1,21 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getDataOfEvent } from '@/app/actions/manager'; + +export async function GET( + request: NextRequest, + { params }: { params: { category: string; name: string } } +) { + try { + const authHeader = request.headers.get('authorization') || ''; + if (!params.category || !params.name) { + return NextResponse.json({ error: 'Event category and name are required' }, { status: 400 }); + } + const result = await getDataOfEvent(params.category, params.name,authHeader); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch event data' }, + { status: 500 } + ); + } +} diff --git a/app/api/admin/event/route.ts b/app/api/admin/event/route.ts new file mode 100644 index 0000000..d7c71aa --- /dev/null +++ b/app/api/admin/event/route.ts @@ -0,0 +1,37 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getDataOfEvent } from '@/app/actions/manager'; + +export async function GET(request: NextRequest) { + try { + + const { searchParams } = new URL(request.url); + const eventCategory = searchParams.get('eventCategory'); + const eventName = searchParams.get('eventName'); + const authHeader = request.headers.get('authorization'); + + if (!eventCategory || !eventName) { + return NextResponse.json( + { success: false, message: 'Event category and name are required' }, + { status: 400 } + ); + } + + const result = await getDataOfEvent( + eventCategory, + eventName, + authHeader ?? undefined + ); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { + success: false, + message: + error?.response?.data?.message || + error.message || + 'Failed to fetch event data', + }, + { status: error?.response?.status || 500 } + ); + } +} diff --git a/app/api/admin/mail/category/route.ts b/app/api/admin/mail/category/route.ts new file mode 100644 index 0000000..e36ebd6 --- /dev/null +++ b/app/api/admin/mail/category/route.ts @@ -0,0 +1,46 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { mailCategory } from '@/app/actions/manager'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const authHeader = request.headers.get('authorization') || ''; + const { + eventName, + eventCategory, + heading, + buttontext, + buttonlink, + subject, + thankyou, + detail + } = body; + + if (!eventCategory || !eventName) { + return NextResponse.json( + { success: false, message: 'Event category and name are required' }, + { status: 400 } + ); + } + + const result = await mailCategory( + eventName, + eventCategory, + heading, + buttontext, + buttonlink, + subject, + thankyou, + detail,authHeader + ); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { + success: false, + message: error?.response?.data?.message || error.message || 'Failed to send mail' + }, + { status: error?.response?.status || 500 } + ); + } +} diff --git a/app/api/admin/mail/list/route.ts b/app/api/admin/mail/list/route.ts new file mode 100644 index 0000000..cd38297 --- /dev/null +++ b/app/api/admin/mail/list/route.ts @@ -0,0 +1,24 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { sendMailToMultipleUsers } from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const authHeader = request.headers.get('authorization') || ''; + const body = await request.json(); + if (!body) { + return NextResponse.json( + { success: false, message: 'Mail data is required' }, + { status: 400 } + ); + } const result = await sendMailToMultipleUsers(body,authHeader); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { + success: false, + message: error?.response?.data?.message || error.message || 'Failed to send mail' + }, + { status: error?.response?.status || 500 } + ); + } +} diff --git a/app/api/admin/mail/route.ts b/app/api/admin/mail/route.ts index 87a900e..0cde742 100644 --- a/app/api/admin/mail/route.ts +++ b/app/api/admin/mail/route.ts @@ -3,8 +3,9 @@ import { sendMailToMultipleUsers } from '@/app/actions/admin'; export async function POST(request: NextRequest) { try { + const authHeader = request.headers.get('authorization') || ''; const body = await request.json(); - const result = await sendMailToMultipleUsers(body); + const result = await sendMailToMultipleUsers(body,authHeader); return NextResponse.json(result, { status: 200 }); } catch (error: any) { return NextResponse.json( diff --git a/app/api/admin/mobilenoti/route.ts b/app/api/admin/mobilenoti/route.ts new file mode 100644 index 0000000..e22684d --- /dev/null +++ b/app/api/admin/mobilenoti/route.ts @@ -0,0 +1,24 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { sendNotification } from '@/app/actions/admin'; + +export async function POST(request: NextRequest) { + try { + const authHeader = request.headers.get('authorization') || ''; + const body = await request.json(); + if (!body) { + return NextResponse.json( + { success: false, message: 'Notification data is required' }, + { status: 400 } + ); + } const result = await sendNotification(body,authHeader); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { + success: false, + message: error?.response?.data?.message || error.message || 'Failed to send notification' + }, + { status: error?.response?.status || 500 } + ); + } +} diff --git a/app/api/admin/notification/route.ts b/app/api/admin/notification/route.ts deleted file mode 100644 index d22c34e..0000000 --- a/app/api/admin/notification/route.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NextRequest, NextResponse } from 'next/server'; -import { sendNotification } from '@/app/actions/admin'; - -export async function POST(request: NextRequest) { - try { - const body = await request.json(); - const result = await sendNotification(body); - return NextResponse.json(result, { status: 200 }); - } catch (error: any) { - return NextResponse.json( - { error: error.message || 'Failed to send notification' }, - { status: 500 } - ); - } -} diff --git a/app/api/admin/query/route.ts b/app/api/admin/query/route.ts index b8c6909..700e882 100644 --- a/app/api/admin/query/route.ts +++ b/app/api/admin/query/route.ts @@ -1,10 +1,25 @@ import { NextRequest, NextResponse } from 'next/server'; import { deleteQuery } from '@/app/actions/admin'; +import { getQuery } from '@/app/actions/manager'; + +export async function GET(request: NextRequest) { + try { + const authHeader = request.headers.get('authorization') || ""; + const result = await getQuery(authHeader); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch queries' }, + { status: 500 } + ); + } +} export async function PUT(request: NextRequest) { try { + const authHeader = request.headers.get('authorization') || ""; const body = await request.json(); - const result = await deleteQuery(body); + const result = await deleteQuery(body,authHeader); return NextResponse.json(result, { status: 200 }); } catch (error: any) { return NextResponse.json( diff --git a/app/api/admin/route.ts b/app/api/admin/route.ts index 8f5fa07..140bf14 100644 --- a/app/api/admin/route.ts +++ b/app/api/admin/route.ts @@ -10,36 +10,48 @@ import { export async function POST(request: NextRequest) { try { - const url = new URL(request.url); - const path = url.pathname; + const { searchParams } = new URL(request.url); + const action = searchParams.get('action'); const body = await request.json(); + const authHeader = request.headers.get('authorization'); + switch (action) { + case 'add-category': + if (!body) { + return NextResponse.json({ error: 'Category is required' }, { status: 400 }); + } + const categoryResult = await addCategory(body, authHeader ?? undefined); + return NextResponse.json(categoryResult, { status: 200 }); - // Route to the appropriate function based on the request path - if (path.endsWith('/category')) { - const result = await addCategory(body); - return NextResponse.json(result, { status: 201 }); - } - else if (path.endsWith('/mail')) { - const result = await sendMailToMultipleUsers(body); - return NextResponse.json(result, { status: 200 }); - } - else if (path.endsWith('/notification')) { - const result = await sendNotification(body); - return NextResponse.json(result, { status: 200 }); - } - else if (path.endsWith('/update-users')) { - const result = await updateUser(); - return NextResponse.json(result, { status: 200 }); - } - else if (path.endsWith('/update-user')) { - const result = await updateUserByAdmin(body); - return NextResponse.json(result, { status: 200 }); - } - else { - return NextResponse.json( - { error: 'Invalid endpoint' }, - { status: 404 } - ); + case 'send-mail': + if (!body) { + return NextResponse.json({ error: 'Mail data is required' }, { status: 400 }); + } + const mailResult = await sendMailToMultipleUsers(body, authHeader ?? undefined); + return NextResponse.json(mailResult, { status: 200 }); + + case 'send-notification': + if (!body) { + return NextResponse.json({ error: 'Notification data is required' }, { status: 400 }); + } + const notificationResult = await sendNotification(body, authHeader ?? undefined); + return NextResponse.json(notificationResult, { status: 200 }); + + case 'update-user': + if (!body) { + return NextResponse.json({ error: 'User data is required' }, { status: 400 }); + } + const userResult = await updateUserByAdmin(body, authHeader ?? undefined); + return NextResponse.json(userResult, { status: 200 }); + + case 'update-users': + const updateResult = await updateUser(authHeader ?? undefined); + return NextResponse.json(updateResult, { status: 200 }); + + default: + return NextResponse.json( + { error: 'Invalid action' }, + { status: 400 } + ); } } catch (error: any) { return NextResponse.json( @@ -51,14 +63,27 @@ export async function POST(request: NextRequest) { export async function PUT(request: NextRequest) { try { + const { searchParams } = new URL(request.url); + const action = searchParams.get('action'); const body = await request.json(); - - // Handle the query deletion - const result = await deleteQuery(body); - return NextResponse.json(result, { status: 200 }); + const authHeader = request.headers.get('authorization'); + switch (action) { + case 'delete-query': + if (!body) { + return NextResponse.json({ error: 'Query data is required' }, { status: 400 }); + } + const result = await deleteQuery(body, authHeader ?? undefined); + return NextResponse.json(result, { status: 200 }); + + default: + return NextResponse.json( + { error: 'Invalid action' }, + { status: 400 } + ); + } } catch (error: any) { return NextResponse.json( - { error: error.message || 'Failed to delete query' }, + { error: error.message || 'Failed to process request' }, { status: 500 } ); } diff --git a/app/api/admin/update-users/route.ts b/app/api/admin/update-users/route.ts index d05d2d2..4dfbf55 100644 --- a/app/api/admin/update-users/route.ts +++ b/app/api/admin/update-users/route.ts @@ -1,9 +1,11 @@ import { NextRequest, NextResponse } from 'next/server'; import { updateUser } from '@/app/actions/admin'; +import { auth } from 'firebase-admin'; export async function POST(request: NextRequest) { try { - const result = await updateUser(); + const authHeader = request.headers.get('authorization') || ''; + const result = await updateUser(authHeader); return NextResponse.json(result, { status: 200 }); } catch (error: any) { return NextResponse.json( diff --git a/app/api/admin/user/route.ts b/app/api/admin/user/route.ts index 57e64c7..80ff9b9 100644 --- a/app/api/admin/user/route.ts +++ b/app/api/admin/user/route.ts @@ -1,15 +1,24 @@ import { NextRequest, NextResponse } from 'next/server'; import { updateUserByAdmin } from '@/app/actions/admin'; -export async function POST(request: NextRequest) { +export async function PUT(request: NextRequest) { try { + const authHeader = request.headers.get('authorization') || ''; const body = await request.json(); - const result = await updateUserByAdmin(body); - return NextResponse.json(result, { status: 200 }); + if (!body) { + return NextResponse.json( + { success: false, message: 'User data is required' } , + { status: 400 } + ); + } const result = await updateUserByAdmin(body,authHeader); + return NextResponse.json(result); } catch (error: any) { return NextResponse.json( - { error: error.message || 'Failed to update user' }, - { status: 500 } + { + success: false, + message: error?.response?.data?.message || error.message || 'Failed to update user' + }, + { status: error?.response?.status || 500 } ); } } diff --git a/app/api/app/route.ts b/app/api/app/route.ts new file mode 100644 index 0000000..5aeca0a --- /dev/null +++ b/app/api/app/route.ts @@ -0,0 +1,38 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { loginUsingOAuth, updateUserProfile } from '@/app/actions/app'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const authHeader = request.headers.get('authorization'); + if (!body.idToken) { + return NextResponse.json({ error: 'ID Token required' }, { status: 400 }); + } + const result = await loginUsingOAuth(body.idToken, authHeader ?? undefined); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to login' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const body = await request.json(); + const authHeader = request.headers.get('authorization'); + if (!body.year || !body.college) { + return NextResponse.json({ + error: 'Year and college are required for profile update' + }, { status: 400 }); + } + const result = await updateUserProfile(body, authHeader ?? undefined); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update user profile' }, + { status: 500 } + ); + } +} diff --git a/app/api/auth/app/route.ts b/app/api/auth/app/route.ts new file mode 100644 index 0000000..c0b114a --- /dev/null +++ b/app/api/auth/app/route.ts @@ -0,0 +1,36 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { loginUsingOAuth, updateUserProfile } from '@/app/actions/app'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + if (!body.idToken) { + return NextResponse.json({ error: 'ID Token required' }, { status: 400 }); + } + const result = await loginUsingOAuth(body.idToken); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to login' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const body = await request.json(); + if (!body.year || !body.college) { + return NextResponse.json({ + error: 'Year and college are required for profile update' + }, { status: 400 }); + } + const result = await updateUserProfile(body); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update user profile' }, + { status: 500 } + ); + } +} diff --git a/app/api/auth/web/route.ts b/app/api/auth/web/route.ts new file mode 100644 index 0000000..a9df81b --- /dev/null +++ b/app/api/auth/web/route.ts @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { loginWebUsingGoogleWeb, UpdateUserProfileForWeb } from '@/app/actions/web'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + const authHeader = request.headers.get('authorization'); + if (!body.idToken || body.idToken.trim().length === 0) { + return NextResponse.json({ + error: 'Invalid token: Token is missing or empty' + }, { status: 400 }); + } + const result = await loginWebUsingGoogleWeb(body, authHeader ?? undefined); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Login request failed' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const body = await request.json(); + const authHeader = request.headers.get('authorization'); + if (!body.year || !body.college || !body.phone) { + return NextResponse.json({ + error: 'Required fields missing: year, college, and phone are required' + }, { status: 400 }); + } + const result = await UpdateUserProfileForWeb(body, authHeader ?? undefined); + return NextResponse.json(result); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Profile update failed' }, + { status: 500 } + ); + } +} diff --git a/app/api/contacts/route.ts b/app/api/contacts/route.ts new file mode 100644 index 0000000..f13d2c9 --- /dev/null +++ b/app/api/contacts/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getAllContacts } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const contacts = await getAllContacts(); + return NextResponse.json({ data: { contacts } }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get contacts' }, + { status: 500 } + ); + } +} diff --git a/app/api/events/categories/route.ts b/app/api/events/categories/route.ts new file mode 100644 index 0000000..4559df2 --- /dev/null +++ b/app/api/events/categories/route.ts @@ -0,0 +1,54 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getCategoriesName } from '@/app/actions/information'; +import { addCategory } from '@/app/actions/admin'; +import { Category } from '@/app/dtos/category.dto'; + +export async function GET(request: NextRequest) { + try { + const categories = await getCategoriesName(); + return NextResponse.json({ data: { categories } }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get categories' }, + { status: 500 } + ); + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + if (!body.categoryName || typeof body.categoryName !== 'string') { + return NextResponse.json( + { error: 'Category name is required and must be a string' }, + { status: 400 } + ); + } + if (!body.imgUrl || typeof body.imgUrl !== 'string') { + return NextResponse.json( + { error: 'Image URL is required and must be a string' }, + { status: 400 } + ); + } + if (!body.icon || typeof body.icon !== 'string') { + return NextResponse.json( + { error: 'Icon is required and must be a string' }, + { status: 400 } + ); + } + + const category = { + categoryName: body.categoryName, + imgUrl: body.imgUrl, + icon: body.icon + }; + const authHeader = request.headers.get('authorization') || ''; + const result = await addCategory(category,authHeader); + return NextResponse.json({ data: result }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to add category' }, + { status: error.response?.status || 500 } + ); + } +} diff --git a/app/api/events/description/route.ts b/app/api/events/description/route.ts new file mode 100644 index 0000000..198c0d0 --- /dev/null +++ b/app/api/events/description/route.ts @@ -0,0 +1,25 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getEventsDescriptionByCategory } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const eventCategory = searchParams.get('eventCategory'); + const eventName = searchParams.get('eventName'); + + if (!eventCategory) { + return NextResponse.json( + { error: 'Event category is required' }, + { status: 400 } + ); + } + + const eventsDesc = await getEventsDescriptionByCategory(eventCategory, eventName || undefined); + return NextResponse.json({ data: { events: eventsDesc } }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get event description' }, + { status: 500 } + ); + } +} diff --git a/app/api/events/route.ts b/app/api/events/route.ts index 9be9274..cbcd83f 100644 --- a/app/api/events/route.ts +++ b/app/api/events/route.ts @@ -1,32 +1,56 @@ import { NextRequest, NextResponse } from 'next/server'; +import { addEvent } from '@/app/actions/manager'; import { getAllEvents, - // getEventsByCategory, // Assuming you might want to add this back later if needed getEventByName, - createEvent, updateEventByName, deleteEvent } from '@/app/actions/events'; +import { + getEventsNames, + getEventsDescriptionByCategory, + getTimelineEvents, + getUpcomingEvents +} from '@/app/actions/information'; export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url); - const category = searchParams.get('category'); + const action = searchParams.get('action'); + const eventCategory = searchParams.get('eventCategory'); const eventName = searchParams.get('eventName'); - - if (eventName && category) { - const event = await getEventByName(category, eventName); - return NextResponse.json(event, { status: 200 }); - } else if (category) { - // Assuming getEventsByCategory is intended to be used, if not, this part might need adjustment - // const events = await getEventsByCategory(category); - // return NextResponse.json(events, { status: 200 }); - // If getEventsByCategory is not available or not intended, adjust this part accordingly. - // For now, I'll comment it out to avoid errors if it's not defined in actions. - return NextResponse.json({ error: "Fetching all events for a category is not implemented yet" }, { status: 501 }); - } else { - const events = await getAllEvents(); - return NextResponse.json(events, { status: 200 }); + const timestamp = searchParams.get('timestamp'); + const authHeader = request.headers.get('authorization') || ""; + + switch (action) { + case 'description': + if (!eventCategory) { + return NextResponse.json({ error: 'Event category is required' }, { status: 400 }); + } + const eventsDesc = await getEventsDescriptionByCategory(eventCategory, eventName || undefined, authHeader); + return NextResponse.json({ data: { events: eventsDesc } }); + + case 'timeline': + const timelineEvents = await getTimelineEvents(authHeader); + return NextResponse.json({ data: { events: timelineEvents } }); + + case 'upcoming': + const upcomingEvents = await getUpcomingEvents(timestamp ? Number(timestamp) : undefined, authHeader); + return NextResponse.json({ data: { events: upcomingEvents } }); + + case 'list': + const events = await getEventsNames(eventCategory || undefined, authHeader); + return NextResponse.json({ data: { events } }); + + default: + // Fallback to original behavior + if (eventName && eventCategory) { + const event = await getEventByName(eventCategory, eventName); + return NextResponse.json(event, { status: 200 }); + } else { + const allEvents = await getAllEvents(); + return NextResponse.json(allEvents, { status: 200 }); + } } } catch (error: any) { return NextResponse.json( @@ -38,56 +62,58 @@ export async function GET(request: NextRequest) { export async function POST(request: NextRequest) { try { - const formData = await request.formData(); - - // Parse coordinators from form data (expected as JSON string) - let coordinators: any[] = []; - const coordinatorsJson = formData.get('coordinators'); - - if (coordinatorsJson && typeof coordinatorsJson === 'string') { - coordinators = JSON.parse(coordinatorsJson); - } - - // Parse rules from form data (expected as JSON string) - let rules: string[] = []; - const rulesJson = formData.get('rules'); - - if (rulesJson && typeof rulesJson === 'string') { - rules = JSON.parse(rulesJson); + const contentType = request.headers.get('content-type'); + let eventData; + + if (contentType?.includes('multipart/form-data')) { + const formData = await request.formData(); + let coordinators: any[] = []; + let rules: string[] = []; + + const coordinatorsJson = formData.get('coordinators'); + const rulesJson = formData.get('rules'); + + if (coordinatorsJson && typeof coordinatorsJson === 'string') { + coordinators = JSON.parse(coordinatorsJson); + } + if (rulesJson && typeof rulesJson === 'string') { + rules = JSON.parse(rulesJson); + } + + eventData = { + coordinators, + description: formData.get('description') as string, + document: formData.get('document') as string, + endTime: Number(formData.get('endTime')), + eventCategory: formData.get('eventCategory') as string, + eventName: formData.get('eventName') as string, + flagship: formData.get('flagship') === 'true', + rules, + startTime: Number(formData.get('startTime')), + venue: formData.get('venue') as string, + image: formData.get('image') as File, + }; + } else { + // Handle JSON data + eventData = await request.json(); } - // Create event object from form data - const eventData = { - coordinators, - description: formData.get('description') as string, - document: formData.get('document') as string, - endTime: Number(formData.get('endTime')), - eventCategory: formData.get('eventCategory') as string, - eventName: formData.get('eventName') as string, - flagship: formData.get('flagship') === 'true', - rules, - startTime: Number(formData.get('startTime')), - venue: formData.get('venue') as string, - image: formData.get('image') as File, - }; - - if (!eventData.eventCategory || !eventData.eventName) { + if (!eventData.eventData.category || !eventData.eventData.eventName) { return NextResponse.json( - { error: 'Event category and name are required' }, + { success: false, message: 'Event category and name are required' }, { status: 400 } ); } - - const result = await createEvent(eventData); - - return NextResponse.json( - { id: result, message: 'Event created successfully' }, - { status: 201 } - ); + const authHeader = request.headers.get('authorization') || ''; + const result = await addEvent(eventData,authHeader); + return NextResponse.json(result, { status: 201 }); } catch (error: any) { return NextResponse.json( - { error: error.message || 'Failed to create event' }, - { status: 500 } + { + success: false, + message: error?.response?.data?.message || error.message || 'Failed to create event' + }, + { status: error?.response?.status || 500 } ); } } diff --git a/app/api/events/timeline/route.ts b/app/api/events/timeline/route.ts new file mode 100644 index 0000000..2fa2b85 --- /dev/null +++ b/app/api/events/timeline/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getTimelineEvents } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const timelineEvents = await getTimelineEvents(); + return NextResponse.json({ data: { events: timelineEvents } }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get timeline events' }, + { status: 500 } + ); + } +} diff --git a/app/api/facts/route.ts b/app/api/facts/route.ts new file mode 100644 index 0000000..4ea84d0 --- /dev/null +++ b/app/api/facts/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getRandomFact } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const fact = await getRandomFact(); + return NextResponse.json({ data: { message: fact } }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get random fact' }, + { status: 500 } + ); + } +} diff --git a/app/api/faq/route.ts b/app/api/faq/route.ts new file mode 100644 index 0000000..df5a426 --- /dev/null +++ b/app/api/faq/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getFAQs } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const faqs = await getFAQs(); + return NextResponse.json({ data: faqs }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch FAQs' }, + { status: 500 } + ); + } +} diff --git a/app/api/foodsponsors/route.ts b/app/api/foodsponsors/route.ts new file mode 100644 index 0000000..7b93678 --- /dev/null +++ b/app/api/foodsponsors/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getFoodSponsors } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const foodSponsors = await getFoodSponsors(); + return NextResponse.json({ data: { foodSponsors } }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get food sponsors' }, + { status: 500 } + ); + } +} diff --git a/app/api/lectures/route.ts b/app/api/lectures/route.ts index 1c00772..ef56627 100644 --- a/app/api/lectures/route.ts +++ b/app/api/lectures/route.ts @@ -5,8 +5,9 @@ import { createLecture, updateLecture, deleteLecture, - Lecture // Import the Lecture type + Lecture } from '@/app/actions/lecture'; +import { getGuestLectures } from '@/app/actions/information'; export async function GET(request: NextRequest) { try { diff --git a/app/api/notification/route.ts b/app/api/notification/route.ts new file mode 100644 index 0000000..2b986ce --- /dev/null +++ b/app/api/notification/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getNotifications } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const notifications = await getNotifications(); + return NextResponse.json(notifications); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch notifications' }, + { status: 500 } + ); + } +} diff --git a/app/api/query/route.ts b/app/api/query/route.ts new file mode 100644 index 0000000..e3ae3ca --- /dev/null +++ b/app/api/query/route.ts @@ -0,0 +1,22 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { addQuery } from '@/app/actions/users'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + if(!body.text){ + return NextResponse.json({ + success:false, + message:'query is required' + }) + } + const authHeader = request.headers.get('authorization') || ''; + const result = await addQuery(body,authHeader); + return NextResponse.json(result, { status: 201 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to add query' }, + { status: 500 } + ); + } +} diff --git a/app/api/sponsors/route.ts b/app/api/sponsors/route.ts index b71b667..23e00c3 100644 --- a/app/api/sponsors/route.ts +++ b/app/api/sponsors/route.ts @@ -1,10 +1,9 @@ import { NextRequest, NextResponse } from 'next/server'; +import { addSponsor } from '@/app/actions/manager'; import { getAllSponsors, - createSponsor, updateSponsor, - deleteSponsor, - // getSponsorsByCategory // Commented out as it's not defined in actions + deleteSponsor } from '@/app/actions/sponsors'; export async function GET(request: NextRequest) { @@ -32,42 +31,42 @@ export async function GET(request: NextRequest) { } export async function POST(request: NextRequest) { + try { - const formData = await request.formData(); - - // Create sponsor object from form data - const sponsor = { - category: formData.get('category') as string, - alt: formData.get('alt') as string, - name: formData.get('name') as string, - targetUrl: formData.get('targetUrl') as string, - image: formData.get('image') as File | null, - }; - - if (!sponsor.category || !sponsor.name) { - return NextResponse.json( - { error: 'Category and name are required' }, - { status: 400 } - ); + const contentType = request.headers.get('content-type'); + let sponsorData; + + if (contentType?.includes('multipart/form-data')) { + const formData = await request.formData(); + sponsorData = { + category: formData.get('category') as string, + alt: formData.get('alt') as string, + name: formData.get('name') as string, + targetUrl: formData.get('targetUrl') as string, + image: formData.get('image') as File | null, + }; + } else { + // Handle JSON data + sponsorData = await request.json(); } - const result = await createSponsor(sponsor); - - if (typeof result === 'object' && 'err_desc' in result) { + if (!sponsorData.sponsor.name) { return NextResponse.json( - { error: result.err_desc }, + { success: false, message: 'Category and name are required' }, { status: 400 } ); } - - return NextResponse.json( - { id: result, message: 'Sponsor created successfully' }, - { status: 201 } - ); + + const authHeader = request.headers.get('authorization') || ''; + const result = await addSponsor(sponsorData,authHeader); + return NextResponse.json(result, { status: 201 }); } catch (error: any) { return NextResponse.json( - { error: error.message || 'Failed to create sponsor' }, - { status: 500 } + { + success: false, + message: error?.response?.data?.message || error.message || 'Failed to add sponsor' + }, + { status: error?.response?.status || 500 } ); } } diff --git a/app/api/timestamp/events/route.ts b/app/api/timestamp/events/route.ts new file mode 100644 index 0000000..f2e8182 --- /dev/null +++ b/app/api/timestamp/events/route.ts @@ -0,0 +1,17 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getFAQs, getUpcomingEvents } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const timestamp = searchParams.get('timestamp'); + const upcomingEvents = await getUpcomingEvents(timestamp ? Number(timestamp) : undefined); + return NextResponse.json({ data: { events: upcomingEvents } }); + + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch FAQs' }, + { status: 500 } + ); + } +} diff --git a/app/api/updateUsers/route.ts b/app/api/updateUsers/route.ts new file mode 100644 index 0000000..2ed2ae1 --- /dev/null +++ b/app/api/updateUsers/route.ts @@ -0,0 +1,16 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { updateUser } from '@/app/actions/admin'; + +export async function GET(request: NextRequest) { + try { const result = await updateUser(); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { + success: false, + message: error?.response?.data?.message || error.message || 'Failed to update users' + }, + { status: error?.response?.status || 500 } + ); + } +} diff --git a/app/api/user/event/route.ts b/app/api/user/event/route.ts new file mode 100644 index 0000000..49610a9 --- /dev/null +++ b/app/api/user/event/route.ts @@ -0,0 +1,37 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getUserEvents, updateUserEvent } from '@/app/actions/users'; + +export async function GET(request: NextRequest) { + try { + const authHeader = request.headers.get('authorization') || ""; + const events = await getUserEvents(authHeader); + return NextResponse.json(events, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to fetch user events' }, + { status: 500 } + ); + } +} + +export async function PUT(request: NextRequest) { + try { + const authHeader = request.headers.get('authorization') || ""; + const body = await request.json(); + + if (!body.eventName || !body.eventCategory) { + return NextResponse.json( + { error: 'Event name and category are required' }, + { status: 400 } + ); + } + + const result = await updateUserEvent(body, authHeader); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to update user event' }, + { status: 500 } + ); + } +} diff --git a/app/api/user/event/unregister/route.ts b/app/api/user/event/unregister/route.ts new file mode 100644 index 0000000..ee10a1c --- /dev/null +++ b/app/api/user/event/unregister/route.ts @@ -0,0 +1,22 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { unregisterUserEvent } from '@/app/actions/users'; + +export async function PUT(request: NextRequest) { + try { + const body = await request.json(); + const authHeader = request.headers.get('authorization'); + if (!body.eventName || !body.eventCategory) { + return NextResponse.json( + { error: 'Event name and category are required' }, + { status: 400 } + ); + } + const result = await unregisterUserEvent(body, authHeader ?? undefined); + return NextResponse.json(result, { status: 200 }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to unregister from event' }, + { status: 500 } + ); + } +} diff --git a/app/api/users/route.ts b/app/api/users/route.ts deleted file mode 100644 index 76c148f..0000000 --- a/app/api/users/route.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { NextRequest, NextResponse } from 'next/server'; -import { - getUserEvents, - updateUserEvent, - unregisterUserEvent, - addQuery -} from '@/app/actions/users'; - -export async function GET(request: NextRequest) { - try { - const events = await getUserEvents(); - return NextResponse.json(events, { status: 200 }); - } catch (error: any) { - return NextResponse.json( - { error: error.message || 'Failed to fetch user events' }, - { status: 500 } - ); - } -} - -export async function PUT(request: NextRequest) { - try { - const { searchParams } = new URL(request.url); - const action = searchParams.get('action'); - - const body = await request.json(); - - if (!body.eventName || !body.eventCategory) { - return NextResponse.json( - { error: 'Event name and category are required' }, - { status: 400 } - ); - } - - if (action === 'unregister') { - const result = await unregisterUserEvent(body); - return NextResponse.json(result, { status: 200 }); - } else { - const result = await updateUserEvent(body); - return NextResponse.json(result, { status: 200 }); - } - } catch (error: any) { - return NextResponse.json( - { error: error.message || 'Failed to update user event' }, - { status: 500 } - ); - } -} - -export async function POST(request: NextRequest) { - try { - const body = await request.json(); - - if (!body.name || !body.email || !body.query) { - return NextResponse.json( - { error: 'Name, email, and query are required' }, - { status: 400 } - ); - } - - const result = await addQuery(body); - return NextResponse.json(result, { status: 201 }); - } catch (error: any) { - return NextResponse.json( - { error: error.message || 'Failed to add query' }, - { status: 500 } - ); - } -} diff --git a/app/api/videos/route.ts b/app/api/videos/route.ts new file mode 100644 index 0000000..3216a6c --- /dev/null +++ b/app/api/videos/route.ts @@ -0,0 +1,14 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getVideos } from '@/app/actions/information'; + +export async function GET(request: NextRequest) { + try { + const videos = await getVideos(); + return NextResponse.json({ data: videos }); + } catch (error: any) { + return NextResponse.json( + { error: error.message || 'Failed to get videos' }, + { status: 500 } + ); + } +} diff --git a/app/layout.tsx b/app/layout.tsx index 20e5e49..70d2ba9 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -3,7 +3,6 @@ import { Poppins } from "next/font/google"; import "./globals.css"; import NavRoutes from "@/app/constants/routes"; import Sidenav from "@/app/ui/sidenav"; - const poppins = Poppins({ weight: ["400", "700", "800"], variable: "--font-poppins", diff --git a/app/page.tsx b/app/page.tsx index 8ec4fda..530c70a 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -11,6 +11,7 @@ import { Toaster, toast } from 'react-hot-toast' const auth = getAuth(firebase_app) const SUPERADMIN_EMAIL = process.env.NEXT_PUBLIC_SUPERADMIN_EMAIL + export default function LoginPage() { const router = useRouter() const [user, setUser] = useState(null) diff --git a/app/utils/axiosSetup.ts b/app/utils/axiosSetup.ts new file mode 100644 index 0000000..06cc1ee --- /dev/null +++ b/app/utils/axiosSetup.ts @@ -0,0 +1,16 @@ +// app/axiosSetup.ts or lib/axiosSetup.ts +import axios from "axios"; + +axios.defaults.baseURL = process.env.NEXT_PUBLIC_SERVER_URL; // use NEXT_PUBLIC_ prefix + +axios.interceptors.request.use((config) => { + const token = typeof window !== "undefined" ? localStorage.getItem("token") : null; + + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + + return config; +}, (error) => { + return Promise.reject(error); +}); From fb0621408ce7ad8c312c879e798f972247ec675a Mon Sep 17 00:00:00 2001 From: Agrawal-Vansh Date: Fri, 19 Sep 2025 00:16:43 +0530 Subject: [PATCH 22/22] Worked on valid Copilot suggestions --- app/actions/users.ts | 27 --------------------------- app/api/admin/mail/list/route.ts | 3 ++- app/api/admin/mobilenoti/route.ts | 3 ++- app/api/admin/user/route.ts | 3 ++- app/api/events/route.ts | 2 +- app/api/query/route.ts | 2 +- app/api/sponsors/route.ts | 2 +- app/api/timestamp/events/route.ts | 2 +- 8 files changed, 10 insertions(+), 34 deletions(-) diff --git a/app/actions/users.ts b/app/actions/users.ts index a45aefd..85d7912 100644 --- a/app/actions/users.ts +++ b/app/actions/users.ts @@ -228,16 +228,6 @@ export async function createUser(email: string, data: User): Promise { } catch (error) { console.error("Error creating user:", error); throw new Error("Failed to create user"); - - - - - - - - - - } } @@ -281,14 +271,6 @@ export async function updateUser( console.error("Error updating user:", error); throw new Error("Failed to update user"); - - - - - - - - } } @@ -321,14 +303,5 @@ export async function deleteUser(email: string): Promise { } catch (error) { console.error("Error deleting user:", error); throw new Error("Failed to delete user"); - - - - - - - - - } } \ No newline at end of file diff --git a/app/api/admin/mail/list/route.ts b/app/api/admin/mail/list/route.ts index cd38297..b3b52ad 100644 --- a/app/api/admin/mail/list/route.ts +++ b/app/api/admin/mail/list/route.ts @@ -10,7 +10,8 @@ export async function POST(request: NextRequest) { { success: false, message: 'Mail data is required' }, { status: 400 } ); - } const result = await sendMailToMultipleUsers(body,authHeader); + } + const result = await sendMailToMultipleUsers(body,authHeader); return NextResponse.json(result, { status: 200 }); } catch (error: any) { return NextResponse.json( diff --git a/app/api/admin/mobilenoti/route.ts b/app/api/admin/mobilenoti/route.ts index e22684d..b3d3644 100644 --- a/app/api/admin/mobilenoti/route.ts +++ b/app/api/admin/mobilenoti/route.ts @@ -10,7 +10,8 @@ export async function POST(request: NextRequest) { { success: false, message: 'Notification data is required' }, { status: 400 } ); - } const result = await sendNotification(body,authHeader); + } + const result = await sendNotification(body,authHeader); return NextResponse.json(result, { status: 200 }); } catch (error: any) { return NextResponse.json( diff --git a/app/api/admin/user/route.ts b/app/api/admin/user/route.ts index 80ff9b9..721acf6 100644 --- a/app/api/admin/user/route.ts +++ b/app/api/admin/user/route.ts @@ -10,7 +10,8 @@ export async function PUT(request: NextRequest) { { success: false, message: 'User data is required' } , { status: 400 } ); - } const result = await updateUserByAdmin(body,authHeader); + } + const result = await updateUserByAdmin(body,authHeader); return NextResponse.json(result); } catch (error: any) { return NextResponse.json( diff --git a/app/api/events/route.ts b/app/api/events/route.ts index cbcd83f..842ebf0 100644 --- a/app/api/events/route.ts +++ b/app/api/events/route.ts @@ -98,7 +98,7 @@ export async function POST(request: NextRequest) { eventData = await request.json(); } - if (!eventData.eventData.category || !eventData.eventData.eventName) { + if (!eventData.category || !eventData.eventName) { return NextResponse.json( { success: false, message: 'Event category and name are required' }, { status: 400 } diff --git a/app/api/query/route.ts b/app/api/query/route.ts index e3ae3ca..4f278dc 100644 --- a/app/api/query/route.ts +++ b/app/api/query/route.ts @@ -8,7 +8,7 @@ export async function POST(request: NextRequest) { return NextResponse.json({ success:false, message:'query is required' - }) + }, { status: 400 }) } const authHeader = request.headers.get('authorization') || ''; const result = await addQuery(body,authHeader); diff --git a/app/api/sponsors/route.ts b/app/api/sponsors/route.ts index 23e00c3..4c7542f 100644 --- a/app/api/sponsors/route.ts +++ b/app/api/sponsors/route.ts @@ -50,7 +50,7 @@ export async function POST(request: NextRequest) { sponsorData = await request.json(); } - if (!sponsorData.sponsor.name) { + if (!sponsorData.name) { return NextResponse.json( { success: false, message: 'Category and name are required' }, { status: 400 } diff --git a/app/api/timestamp/events/route.ts b/app/api/timestamp/events/route.ts index f2e8182..06d0884 100644 --- a/app/api/timestamp/events/route.ts +++ b/app/api/timestamp/events/route.ts @@ -10,7 +10,7 @@ export async function GET(request: NextRequest) { } catch (error: any) { return NextResponse.json( - { error: error.message || 'Failed to fetch FAQs' }, + { error: error.message || 'Failed to fetch upcoming events' }, { status: 500 } ); }