From ce8d3356e6fabbf39c1d3d04ed0865b264f6b98b Mon Sep 17 00:00:00 2001 From: Paris Smirlakis Date: Fri, 20 Sep 2024 19:46:13 +0300 Subject: [PATCH 1/2] implement issue verification for same device --- .../components/organisms/BookingForm.tsx | 22 +++++++-- src/client/hooks/useBookingVerify.ts | 9 ++-- src/client/store/bookingStore.ts | 1 - src/env.mjs | 18 +++---- src/helpers/deviceDetect.ts | 7 +++ src/pages/404.tsx | 40 ++++++++++++++++ src/pages/confirmation/[id].tsx | 47 +++++++++++++++---- src/pages/index.tsx | 7 ++- src/server/schemas/booking.ts | 5 ++ src/server/services/BookingService.ts | 33 +++++++++++-- src/server/services/IssuerService.ts | 5 +- src/server/services/VerifierService.ts | 10 ++-- src/shared/index.ts | 3 +- .../{interfaces/index.ts => interfaces.ts} | 3 +- src/shared/{BookingDto.ts => types.ts} | 5 +- 15 files changed, 174 insertions(+), 41 deletions(-) create mode 100644 src/pages/404.tsx rename src/shared/{interfaces/index.ts => interfaces.ts} (99%) rename src/shared/{BookingDto.ts => types.ts} (67%) diff --git a/src/client/components/organisms/BookingForm.tsx b/src/client/components/organisms/BookingForm.tsx index 18cb85e..45f666c 100644 --- a/src/client/components/organisms/BookingForm.tsx +++ b/src/client/components/organisms/BookingForm.tsx @@ -3,13 +3,15 @@ import { useForm, FormProvider } from "react-hook-form"; import { BookingGuestInfo } from "../molecules/BookingGuestInfo"; import HotelDescription from "../molecules/HotelDescription"; import { useBookingStore } from "@/client/store/bookingStore"; -import { useAppStore } from "@/client/store"; +import { ModalStatus, useAppStore } from "@/client/store"; import { zodResolver } from "@hookform/resolvers/zod"; import { bookingDtoSchema } from "@/server/schemas/booking"; import { BookingDto, Hotel } from "@/shared"; import Image from "next/image"; import { LocalizationProvider } from "@mui/x-date-pickers"; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import router from "next/router"; +import { useEffect } from "react"; export const BookingForm: React.FC = () => { const methods = useForm({ @@ -19,7 +21,8 @@ export const BookingForm: React.FC = () => { location: Hotel.location, }, }); - const { isLoading, createBookingAsync } = useBookingStore(); + const { changeModalStatus, modal } = useAppStore(); // Get modal state + const { isLoading, createBookingAsync, bookingCreateRes } = useBookingStore(); const deviceType = useAppStore((state) => state.deviceType); const onSubmit = async (data: BookingDto) => { @@ -27,6 +30,17 @@ export const BookingForm: React.FC = () => { await createBookingAsync(data); }; + // Watch for changes in bookingCreateRes + useEffect(() => { + if (bookingCreateRes?.url) { + if (deviceType === 'desktop') { + changeModalStatus(ModalStatus.OPEN); + } else { + window.location.href = bookingCreateRes?.url; // Navigate to the confirmation page + } + } + }, [bookingCreateRes?.url, deviceType, changeModalStatus]); + return ( @@ -70,8 +84,8 @@ export const BookingForm: React.FC = () => { }} > {deviceType === "mobile" ? ( - ) : ( diff --git a/src/client/hooks/useBookingVerify.ts b/src/client/hooks/useBookingVerify.ts index d08881f..b6e49f9 100644 --- a/src/client/hooks/useBookingVerify.ts +++ b/src/client/hooks/useBookingVerify.ts @@ -36,14 +36,15 @@ export const useBookingVerify = () => { const { data, error } = useSWR( bookingId, fetcher, - { refreshInterval: polling ? 1000 : 0 } // Poll every second if polling is true + { refreshInterval: polling ? 3000 : 0 } // Poll every second if polling is true ); // Function to stop polling manually const stopPolling = useCallback(() => { + changeModalStatus(ModalStatus.CLOSE); setPolling(false); // Stop polling resetBooking(); // Reset booking data - changeModalStatus(ModalStatus.CLOSE); // Close modal + // Close modal }, [changeModalStatus, resetBooking]); // Handle polling logic and state changes @@ -55,14 +56,14 @@ export const useBookingVerify = () => { if (data?.status && bookingId) { setStatus(true); // Mark the status as verified - stopPolling(); // Stop polling after success + stopPolling(); router.push(PATHS.confirmation(bookingId)); // Navigate to confirmation page } // Timeout logic to stop polling after 30 seconds const timeout = setTimeout(() => { stopPolling(); // Stop polling after 30 seconds - }, 30000); + }, 60000); return () => { clearTimeout(timeout); // Clear timeout on unmount diff --git a/src/client/store/bookingStore.ts b/src/client/store/bookingStore.ts index 188c1ec..022f33b 100644 --- a/src/client/store/bookingStore.ts +++ b/src/client/store/bookingStore.ts @@ -34,7 +34,6 @@ export const useBookingStore = create()((set) => ({ ); set({ isLoading: false, bookingCreateRes: res }); - useAppStore.getState().changeModalStatus(ModalStatus.OPEN); } catch (err) { let errorMessage = "Unknown error occurred"; if (err instanceof Error) { diff --git a/src/env.mjs b/src/env.mjs index c2aacdf..29673ff 100644 --- a/src/env.mjs +++ b/src/env.mjs @@ -13,13 +13,14 @@ const server = z.object({ * built with invalid env vars. To expose them to the client, prefix them with `NEXT_PUBLIC_`. */ const client = z.object({ - NEXT_PUBLIC_APP_NAME: z.string().optional(), - NEXT_PUBLIC_APP_URL: z.string().optional(), - VERIFIER_API_URL: z.string().optional(), - ISSUER_API_URL: z.string().optional(), - KEYSTORE_FILE: z.string().optional(), - KEYSTORE_PASS: z.string().optional(), - KEYSTORE_ALIAS: z.string().optional(), + POSTGRES_CONNECTION_STRING: z.string(), + NEXT_PUBLIC_APP_NAME: z.string(), + NEXT_PUBLIC_APP_URI: z.string(), + VERIFIER_API_URL: z.string(), + ISSUER_API_URL: z.string(), + KEYSTORE_FILE: z.string(), + KEYSTORE_PASS: z.string(), + KEYSTORE_ALIAS: z.string(), }); /** @@ -29,8 +30,9 @@ const client = z.object({ * @type {Record | keyof z.infer, string | undefined>} */ const processEnv = { - POSTGRES_CONNECTION_STRING: process.env.GRAPHQL_SERVER_URI, + POSTGRES_CONNECTION_STRING: process.env.POSTGRES_CONNECTION_STRING, NEXT_PUBLIC_APP_NAME: process.env.NEXT_PUBLIC_APP_NAME, + NEXT_PUBLIC_APP_URI: process.env.NEXT_PUBLIC_APP_URI, VERIFIER_API_URL: process.env.VERIFIER_API_URL, ISSUER_API_URL: process.env.ISSUER_API_URL, KEYSTORE_FILE: process.env.KEYSTORE_FILE, diff --git a/src/helpers/deviceDetect.ts b/src/helpers/deviceDetect.ts index 33b7e29..04f35c1 100644 --- a/src/helpers/deviceDetect.ts +++ b/src/helpers/deviceDetect.ts @@ -1,3 +1,4 @@ +import { GetServerSidePropsContext } from "next/types"; import DeviceDetector from "node-device-detector"; const deviceDetector = new DeviceDetector(); @@ -7,3 +8,9 @@ export function deviceDetect(userAgent: string = "") { return deviceType; } + + +export const getDeviceTypeProps = (context: GetServerSidePropsContext) => { + const deviceType = deviceDetect(context.req.headers['user-agent'] ?? ''); + return { props: { deviceType } }; +}; diff --git a/src/pages/404.tsx b/src/pages/404.tsx new file mode 100644 index 0000000..03964ea --- /dev/null +++ b/src/pages/404.tsx @@ -0,0 +1,40 @@ +import { Box, Typography, Button } from '@mui/material'; +import { useRouter } from 'next/router'; +import React from 'react'; + +const Custom404 = () => { + const router = useRouter(); + + const handleBackToHome = () => { + router.push('/'); // Redirect to the homepage + }; + + return ( + + + 404 + + + Page Not Found + + + The page you are looking for does not exist. + + + + ); +}; + +export default Custom404; diff --git a/src/pages/confirmation/[id].tsx b/src/pages/confirmation/[id].tsx index f37cca0..8266c59 100644 --- a/src/pages/confirmation/[id].tsx +++ b/src/pages/confirmation/[id].tsx @@ -12,7 +12,8 @@ import { GetServerSideProps, GetServerSidePropsContext } from "next"; import { AppProps } from "next/app"; import QRCode from "react-qr-code"; import Container from "typedi"; - +import { array } from "zod"; + export default function ConfirmationPage(props: AppProps) { const { id, deviceType, hasError, ...bookingDetails } = props.pageProps; const {isLoading, issueConfirmationRes } = useBookingStore(); @@ -20,7 +21,7 @@ export default function ConfirmationPage(props: AppProps) { if (hasError) { return ( -
Booking not found
+ Booking not found ); } return ( @@ -31,7 +32,8 @@ export default function ConfirmationPage(props: AppProps) { {issueConfirmationRes && - {issueConfirmationRes?.url && } + {issueConfirmationRes?.url && } + {issueConfirmationRes?.url && {issueConfirmationRes.url}} {issueConfirmationRes?.otp && OTP: {issueConfirmationRes.otp}} } @@ -75,19 +77,48 @@ export const getServerSideProps: GetServerSideProps = async ( context: GetServerSidePropsContext ) => { const deviceType = deviceDetect(context.req.headers["user-agent"] ?? ""); + + // Extract id from URL params + const { id:bookingID } = context.params as { id: string }; + // Extract request_code from query parameters + const { response_code } = context.query; + const responseCode = Array.isArray(response_code) ? response_code[0] : response_code; - const { id } = context.params as { id: string }; const bookingService = Container.get(BookingService); let properties = {}; try { - const bookingDetails = await bookingService.bookingDetails(id); +console.log(responseCode) + if (responseCode) { + // Trigger the booking service with the request_code + const verify = await bookingService.bookingVerificationStatus({bookingID,responseCode}); + + if (verify) { + // If verification is successful, redirect to the same page without `request_code` + const { res, resolvedUrl } = context; + + // Remove request_code from the query parameters and redirect + const urlWithoutRequestCode = new URL(resolvedUrl, `http://${context.req.headers.host}`); + urlWithoutRequestCode.searchParams.delete("response_code"); // Remove the request_code param + + // Perform the redirect using Next.js' server-side methods + res.writeHead(302, { Location: urlWithoutRequestCode.pathname + urlWithoutRequestCode.search }); + res.end(); + return { props: {} }; // You must return empty props here because of the redirection + } else { + // If verification fails, return hasError + return { notFound: true }; + } + + } + + const bookingDetails = await bookingService.bookingDetails(bookingID); if (bookingDetails) { - properties = { id, deviceType, ...bookingDetails, hasError: false }; + properties = { bookingID, deviceType, ...bookingDetails, hasError: false }; } else { - properties = { hasError: true }; + return { notFound: true }; } } catch (error) { - properties = { hasError: true }; + return { notFound: true }; } return { props: properties }; }; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 8bbef58..c476b10 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -2,8 +2,8 @@ import { useEffect } from "react"; import Sidebar from "@/client/components/atoms/Sidebar"; import { BookingForm } from "@/client/components/organisms/BookingForm"; import HotelLocation from "@/client/components/organisms/HotelLocation"; -import { ModalStatus, useAppStore } from "@/client/store"; -import { deviceDetect } from "@/helpers/deviceDetect"; +import { useAppStore } from "@/client/store"; +import { getDeviceTypeProps } from "@/helpers/deviceDetect"; import { GetServerSidePropsContext } from "next"; import { AppProps } from "next/app"; import { Box, Container } from "@mui/material"; @@ -13,8 +13,7 @@ import QRCode from "react-qr-code"; import { useBookingVerify } from "@/client/hooks/useBookingVerify"; export function getServerSideProps(context: GetServerSidePropsContext) { - const deviceType = deviceDetect(context.req.headers["user-agent"] ?? ""); - return { props: { deviceType } }; + return getDeviceTypeProps(context); } export default function Home(props: AppProps) { diff --git a/src/server/schemas/booking.ts b/src/server/schemas/booking.ts index f6ee824..fbc5cda 100644 --- a/src/server/schemas/booking.ts +++ b/src/server/schemas/booking.ts @@ -10,6 +10,11 @@ export const bookingIdSchema = z .string() .cuid({ message: "Invalid bookingId format" }); +export const bookingVerificationSchema = z.object({ + bookingID: z.string().cuid({ message: "Invalid bookingID format" }), + responseCode: z.string().optional(), // request_code is now optional +}); + export const bookingDtoSchema = z .object({ hotel: z.string().min(1).max(100), diff --git a/src/server/services/BookingService.ts b/src/server/services/BookingService.ts index 1d5aad7..a5764b7 100644 --- a/src/server/services/BookingService.ts +++ b/src/server/services/BookingService.ts @@ -1,5 +1,5 @@ -import { bookingDtoSchema, bookingIdSchema } from "@/server/schemas"; -import type { BookingDetailsDto, BookingDto } from "@/shared"; +import { bookingDtoSchema, bookingIdSchema, bookingVerificationSchema } from "@/server/schemas"; +import type { BookingDetailsDto, BookingDto, BookingVerificationParams } from "@/shared/types"; import { BookingCreateResponse, IssueConfirmationRespone, @@ -55,8 +55,11 @@ export class BookingService { return response; } - @ValidateInput(bookingIdSchema) - public async bookingVerificationStatus(bookingID: string): Promise { + @ValidateInput(bookingVerificationSchema) + public async bookingVerificationStatus({ + bookingID, + responseCode, + }: BookingVerificationParams): Promise { const record = await this.bookingRepository.findById(bookingID); if (record?.crossDeviceTransactionId) { const verification = await this.verifier.checkVerification( @@ -76,6 +79,28 @@ export class BookingService { await this.bookingRepository.update(record.id, record); + return true; + } + }else if(record?.sameDeviceTransactionId){ + const verification = await this.verifier.checkVerification( + record.sameDeviceTransactionId, + responseCode + ); + console.log(verification); + if ( + verification.status === true && + verification.personalInfo?.date_of_birth && + verification.personalInfo.family_name && + verification.personalInfo.given_name + ) { + record.guestDateOfBirth = new Date( + verification.personalInfo.date_of_birth + ); + record.guestFamilyName = verification.personalInfo.family_name; + record.guestGivenName = verification.personalInfo.given_name; + + await this.bookingRepository.update(record.id, record); + return true; } } diff --git a/src/server/services/IssuerService.ts b/src/server/services/IssuerService.ts index 13e1be9..65612c7 100644 --- a/src/server/services/IssuerService.ts +++ b/src/server/services/IssuerService.ts @@ -4,6 +4,7 @@ import { Inject, Service } from "typedi"; import { JWTPayload } from "../types"; import { JWTService } from "./JWTService"; import { KeystoreService } from "./KeystoreService"; +import { env } from "@/env.mjs"; @Service() export class IssuerService { @@ -29,8 +30,8 @@ export class IssuerService { // Prepare the JWT payload const jwtPayload: JWTPayload = { - iss: process.env.NEXT_PUBLIC_APP_URL!, - aud: process.env.ISSUER_API_URL!, + iss: env.NEXT_PUBLIC_APP_URI, + aud: env.ISSUER_API_URL, grants: ["urn:ietf:params:oauth:grant-type:pre-authorized_code"], credentials: [ { diff --git a/src/server/services/VerifierService.ts b/src/server/services/VerifierService.ts index 1d23e69..8c403b9 100644 --- a/src/server/services/VerifierService.ts +++ b/src/server/services/VerifierService.ts @@ -78,21 +78,25 @@ export class VerifierService { }; if (isMobile) { - payload.wallet_response_redirect_uri_template = `${env.NEXT_PUBLIC_APP_URL}/confirmation/${bookingId}?response_code={RESPONSE_CODE}`; + payload.wallet_response_redirect_uri_template = `${env.NEXT_PUBLIC_APP_URI}/confirmation/${bookingId}?response_code={RESPONSE_CODE}`; } return payload; } public async checkVerification( - crossDeviceTransactionId: string + crossDeviceTransactionId: string, + responseCode?:string ): Promise { if (!crossDeviceTransactionId) { throw new Error("Transaction ID is undefined."); } try { - const url = `${env.VERIFIER_API_URL}/ui/presentations/${crossDeviceTransactionId}`; + let url = `${env.VERIFIER_API_URL}/ui/presentations/${crossDeviceTransactionId}`; + if(responseCode){ + url += `?response_code=${responseCode}`; + } const response = await fetch(url, { method: "GET", headers: { Accept: "application/json" }, diff --git a/src/shared/index.ts b/src/shared/index.ts index b9101bc..ce7f87e 100644 --- a/src/shared/index.ts +++ b/src/shared/index.ts @@ -1,4 +1,5 @@ -export * from "./BookingDto"; +export * from "./types"; +export * from "./interfaces"; export const Hotel = { name: "Utopia", diff --git a/src/shared/interfaces/index.ts b/src/shared/interfaces.ts similarity index 99% rename from src/shared/interfaces/index.ts rename to src/shared/interfaces.ts index abe5577..2f227a3 100644 --- a/src/shared/interfaces/index.ts +++ b/src/shared/interfaces.ts @@ -17,4 +17,5 @@ personalInfo?: PersonalInfo; export interface IssueConfirmationRespone { url: string; otp?: string; // Optional field -} \ No newline at end of file +} + diff --git a/src/shared/BookingDto.ts b/src/shared/types.ts similarity index 67% rename from src/shared/BookingDto.ts rename to src/shared/types.ts index 989b43e..668986d 100644 --- a/src/shared/BookingDto.ts +++ b/src/shared/types.ts @@ -1,4 +1,4 @@ -import { bookingDtoSchema } from "@/server/schemas"; +import { bookingDtoSchema, bookingVerificationSchema } from "@/server/schemas"; import { z } from "zod"; //this is what user can submit @@ -10,3 +10,6 @@ export type BookingDetailsDto = BookingDto & { guestDateOfBirth: string | null; // Can be Date or ISO string based on your usage reservationDate: string; }; + + +export type BookingVerificationParams = z.infer; From b7ea6a05ff3ab8b3a619b73b4455e4dd15396ddf Mon Sep 17 00:00:00 2001 From: Paris Smirlakis Date: Fri, 20 Sep 2024 20:13:05 +0300 Subject: [PATCH 2/2] removed tailwind 100%, small fix on cross divice flow --- package-lock.json | 512 +++--------------- package.json | 2 - postcss.config.mjs | 3 +- src/client/components/atoms/CopyIcon.tsx | 2 +- src/client/components/atoms/HeartIcon.tsx | 2 +- src/client/components/atoms/PinIcon.tsx | 2 +- src/client/components/atoms/PlusIcon.tsx | 2 +- src/client/components/atoms/ShareIcon.tsx | 2 +- src/client/components/atoms/StarIcon.tsx | 2 +- src/client/components/atoms/TagIcon.tsx | 2 +- src/client/components/atoms/ThumbUpIcon.tsx | 2 +- .../organisms/ConfirmationDetails.tsx | 2 +- src/client/components/organisms/Header.tsx | 2 +- src/pages/api/booking/verification/[id].ts | 2 +- src/pages/confirmation/[id].tsx | 11 +- src/pages/index.tsx | 2 +- tailwind.config.ts | 49 -- 17 files changed, 90 insertions(+), 511 deletions(-) delete mode 100644 tailwind.config.ts diff --git a/package-lock.json b/package-lock.json index 711c197..2da5652 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "@mui/material-nextjs": "^6.1.0", "@mui/x-date-pickers": "^6.20.2", "@prisma/client": "^5.19.1", - "@tailwindcss/forms": "^0.5.9", "cbor-x": "^1.6.0", "dayjs": "^1.11.13", "jks-js": "^1.1.3", @@ -47,21 +46,9 @@ "eslint-config-next": "14.2.5", "postcss": "^8.4.45", "prisma": "^5.19.1", - "tailwindcss": "^3.4.11", "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@automapper/core": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/@automapper/core/-/core-8.8.1.tgz", @@ -626,6 +613,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -642,6 +630,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "engines": { "node": ">=12" }, @@ -653,6 +642,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1180,6 +1170,7 @@ "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, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1192,6 +1183,7 @@ "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, "engines": { "node": ">= 8" } @@ -1200,6 +1192,7 @@ "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, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1221,6 +1214,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "optional": true, "engines": { "node": ">=14" @@ -1399,17 +1393,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.9.tgz", - "integrity": "sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" - } - }, "node_modules/@tanstack/react-virtual": { "version": "3.10.8", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.8.tgz", @@ -1660,6 +1643,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -1675,28 +1659,6 @@ "node": ">=4" } }, - "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==" - }, - "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==", - "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==" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1971,18 +1933,8 @@ "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==" - }, - "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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -1998,6 +1950,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -2080,14 +2033,6 @@ "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==", - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001660", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", @@ -2157,40 +2102,6 @@ "node": ">=0.8.0" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "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==", - "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", @@ -2217,14 +2128,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2260,6 +2163,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2269,17 +2173,6 @@ "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==", - "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", @@ -2444,11 +2337,6 @@ "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==" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2461,11 +2349,6 @@ "node": ">=8" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2537,7 +2420,8 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, "node_modules/electron-to-chromium": { "version": "1.5.25", @@ -2548,7 +2432,8 @@ "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==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/enhanced-resolve": { "version": "5.17.1", @@ -3287,6 +3172,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3302,6 +3188,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -3325,6 +3212,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -3345,6 +3233,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3406,6 +3295,7 @@ "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, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -3440,6 +3330,7 @@ "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, "optional": true, "os": [ @@ -3536,6 +3427,7 @@ "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", @@ -3557,6 +3449,7 @@ "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, "dependencies": { "is-glob": "^4.0.3" }, @@ -3568,6 +3461,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -3576,6 +3470,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3889,17 +3784,6 @@ "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==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -3985,6 +3869,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4005,6 +3890,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -4028,6 +3914,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -4063,6 +3950,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -4228,7 +4116,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/iterator.prototype": { "version": "1.1.2", @@ -4247,6 +4136,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -4260,14 +4150,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/jks-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/jks-js/-/jks-js-1.1.3.tgz", @@ -4403,14 +4285,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -4451,12 +4325,14 @@ "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==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "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, "engines": { "node": ">= 8" } @@ -4465,6 +4341,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4473,14 +4350,6 @@ "node": ">=8.6" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4505,6 +4374,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -4523,16 +4393,6 @@ "object-assign": "^4.1.0" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -4703,14 +4563,6 @@ "asn1": "^0.2.4" } }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -4728,14 +4580,6 @@ "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==", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -4960,6 +4804,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -4973,6 +4818,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -5001,6 +4847,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -5008,22 +4855,6 @@ "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==", - "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==", - "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", @@ -5037,6 +4868,7 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -5060,136 +4892,11 @@ "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==", - "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==", - "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==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "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-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "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==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "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==", - "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==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -5257,6 +4964,7 @@ "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", @@ -5354,14 +5062,6 @@ "react-dom": ">=16.6.0" } }, - "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==", - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -5378,17 +5078,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/reflect-metadata": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", @@ -5475,6 +5164,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -5521,6 +5211,7 @@ "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", @@ -5640,6 +5331,7 @@ "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, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -5651,6 +5343,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -5677,6 +5370,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "engines": { "node": ">=14" }, @@ -5738,6 +5432,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -5755,6 +5450,7 @@ "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, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5767,12 +5463,14 @@ "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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/string-width/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, "engines": { "node": ">=12" }, @@ -5784,6 +5482,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5893,6 +5592,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5905,6 +5605,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5960,27 +5661,6 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, - "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==", - "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": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6020,42 +5700,6 @@ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, - "node_modules/tailwindcss": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.12.tgz", - "integrity": "sha512-Htf/gHj2+soPb9UayUNci/Ja3d8pTmu9ONTfh4QY8r3MATTZOzmv6UYWF7ZwikEIC8okpfqmGqrmDehua8mF8w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -6071,25 +5715,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "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==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -6116,6 +5741,7 @@ "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, "dependencies": { "is-number": "^7.0.0" }, @@ -6135,11 +5761,6 @@ "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==" - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -6349,6 +5970,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -6451,6 +6073,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -6468,6 +6091,7 @@ "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, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6484,6 +6108,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -6498,6 +6123,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -6508,17 +6134,20 @@ "node_modules/wrap-ansi-cjs/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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "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, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6532,6 +6161,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "engines": { "node": ">=12" }, @@ -6543,6 +6173,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { "node": ">=12" }, @@ -6554,6 +6185,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, diff --git a/package.json b/package.json index 8181ec4..a3dcb5e 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ "@mui/material-nextjs": "^6.1.0", "@mui/x-date-pickers": "^6.20.2", "@prisma/client": "^5.19.1", - "@tailwindcss/forms": "^0.5.9", "cbor-x": "^1.6.0", "dayjs": "^1.11.13", "jks-js": "^1.1.3", @@ -51,7 +50,6 @@ "eslint-config-next": "14.2.5", "postcss": "^8.4.45", "prisma": "^5.19.1", - "tailwindcss": "^3.4.11", "typescript": "^5" } } diff --git a/postcss.config.mjs b/postcss.config.mjs index 2ef30fc..047db9a 100644 --- a/postcss.config.mjs +++ b/postcss.config.mjs @@ -1,7 +1,6 @@ /** @type {import('postcss-load-config').Config} */ const config = { - plugins: { - tailwindcss: {}, + plugins: { autoprefixer: {}, }, }; diff --git a/src/client/components/atoms/CopyIcon.tsx b/src/client/components/atoms/CopyIcon.tsx index 2f52e84..2301dd8 100644 --- a/src/client/components/atoms/CopyIcon.tsx +++ b/src/client/components/atoms/CopyIcon.tsx @@ -12,7 +12,7 @@ const CopyIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size equivalent to "size-6" in Tailwind + fontSize: 24, ...(props.sx || {}), // Allow custom sx prop to override styles }} > diff --git a/src/client/components/atoms/HeartIcon.tsx b/src/client/components/atoms/HeartIcon.tsx index 00b2168..cde9e66 100644 --- a/src/client/components/atoms/HeartIcon.tsx +++ b/src/client/components/atoms/HeartIcon.tsx @@ -12,7 +12,7 @@ const HeartIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size (equivalent to Tailwind size-6) + fontSize: 24, ...(props.sx || {}), // Allow custom `sx` prop to override styles }} > diff --git a/src/client/components/atoms/PinIcon.tsx b/src/client/components/atoms/PinIcon.tsx index d55bbc2..7040193 100644 --- a/src/client/components/atoms/PinIcon.tsx +++ b/src/client/components/atoms/PinIcon.tsx @@ -12,7 +12,7 @@ const PinIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size equivalent to "w-6 h-6" in Tailwind + fontSize: 24, ...(props.sx || {}), // Allow additional sx styles from props }} > diff --git a/src/client/components/atoms/PlusIcon.tsx b/src/client/components/atoms/PlusIcon.tsx index 71e32cd..d85ddb9 100644 --- a/src/client/components/atoms/PlusIcon.tsx +++ b/src/client/components/atoms/PlusIcon.tsx @@ -12,7 +12,7 @@ const PlusIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size equivalent to Tailwind's "size-6" + fontSize: 24, ...(props.sx || {}), // Allow custom sx prop to override styles }} > diff --git a/src/client/components/atoms/ShareIcon.tsx b/src/client/components/atoms/ShareIcon.tsx index 9038ce1..5ff7808 100644 --- a/src/client/components/atoms/ShareIcon.tsx +++ b/src/client/components/atoms/ShareIcon.tsx @@ -12,7 +12,7 @@ const ShareIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size equivalent to "size-6" in Tailwind + fontSize: 24, ...(props.sx || {}), // Allow custom sx prop to override styles }} > diff --git a/src/client/components/atoms/StarIcon.tsx b/src/client/components/atoms/StarIcon.tsx index 7a13bd1..b3a8229 100644 --- a/src/client/components/atoms/StarIcon.tsx +++ b/src/client/components/atoms/StarIcon.tsx @@ -12,7 +12,7 @@ const StarIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size equivalent to "size-6" in Tailwind + fontSize: 24, ...(props.sx || {}), // Allow custom sx prop to override styles }} > diff --git a/src/client/components/atoms/TagIcon.tsx b/src/client/components/atoms/TagIcon.tsx index 4db4b6c..b5efc1a 100644 --- a/src/client/components/atoms/TagIcon.tsx +++ b/src/client/components/atoms/TagIcon.tsx @@ -12,7 +12,7 @@ const TagIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size equivalent to "size-6" in Tailwind + fontSize: 24, ...(props.sx || {}), // Allow custom sx prop to override styles }} > diff --git a/src/client/components/atoms/ThumbUpIcon.tsx b/src/client/components/atoms/ThumbUpIcon.tsx index 12f4a1d..b0c9060 100644 --- a/src/client/components/atoms/ThumbUpIcon.tsx +++ b/src/client/components/atoms/ThumbUpIcon.tsx @@ -12,7 +12,7 @@ const ThumbUpIcon: React.FC = ({ className, ...props }) => { className={className} viewBox="0 0 24 24" sx={{ - fontSize: 24, // Default size equivalent to Tailwind's "size-6" + fontSize: 24, ...(props.sx || {}), // Allow custom sx prop to override styles }} > diff --git a/src/client/components/organisms/ConfirmationDetails.tsx b/src/client/components/organisms/ConfirmationDetails.tsx index c25069a..6fa9bd9 100644 --- a/src/client/components/organisms/ConfirmationDetails.tsx +++ b/src/client/components/organisms/ConfirmationDetails.tsx @@ -24,7 +24,7 @@ const ConfirmationDetails = ({ reservationDate, } = details; const { isLoading, issueConfirmationAsync } = useBookingStore(); - +console.log(id); return ( { alt="Travel destination" sx={{ width: '100%', - aspectRatio: '12.5', // Aspect ratio like the one in Tailwind + aspectRatio: '12.5', maxWidth: '100%', }} /> diff --git a/src/pages/api/booking/verification/[id].ts b/src/pages/api/booking/verification/[id].ts index 5041e1a..e38bf86 100644 --- a/src/pages/api/booking/verification/[id].ts +++ b/src/pages/api/booking/verification/[id].ts @@ -26,7 +26,7 @@ export default async function handler( // Fetch the booking verification status from the service const bookingVerificationStatus = - await bookingService.bookingVerificationStatus(id); + await bookingService.bookingVerificationStatus({bookingID:id}); // Handle cases where no status is returned (assuming this might happen) if ( diff --git a/src/pages/confirmation/[id].tsx b/src/pages/confirmation/[id].tsx index 8266c59..71eb061 100644 --- a/src/pages/confirmation/[id].tsx +++ b/src/pages/confirmation/[id].tsx @@ -15,7 +15,7 @@ import Container from "typedi"; import { array } from "zod"; export default function ConfirmationPage(props: AppProps) { - const { id, deviceType, hasError, ...bookingDetails } = props.pageProps; + const { bookingID, deviceType, hasError, ...bookingDetails } = props.pageProps; const {isLoading, issueConfirmationRes } = useBookingStore(); const {changeModalStatus } = useAppStore(); @@ -32,8 +32,7 @@ export default function ConfirmationPage(props: AppProps) { {issueConfirmationRes && - {issueConfirmationRes?.url && } - {issueConfirmationRes?.url && {issueConfirmationRes.url}} + {issueConfirmationRes?.url && } {issueConfirmationRes?.otp && OTP: {issueConfirmationRes.otp}} } @@ -54,7 +53,7 @@ export default function ConfirmationPage(props: AppProps) { }} > - + {bookingDetails.carRental && ( @@ -86,8 +85,7 @@ export const getServerSideProps: GetServerSideProps = async ( const bookingService = Container.get(BookingService); let properties = {}; - try { -console.log(responseCode) + try { if (responseCode) { // Trigger the booking service with the request_code const verify = await bookingService.bookingVerificationStatus({bookingID,responseCode}); @@ -112,6 +110,7 @@ console.log(responseCode) } const bookingDetails = await bookingService.bookingDetails(bookingID); + if (bookingDetails) { properties = { bookingID, deviceType, ...bookingDetails, hasError: false }; } else { diff --git a/src/pages/index.tsx b/src/pages/index.tsx index c476b10..79df1c9 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -34,7 +34,7 @@ export default function Home(props: AppProps) { } + content={bookingCreateRes?.url && } handleClose={handleCloseModal} /> diff --git a/tailwind.config.ts b/tailwind.config.ts deleted file mode 100644 index 4d928b0..0000000 --- a/tailwind.config.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { Config } from "tailwindcss"; - -const config: Config = { - darkMode: "class", - content: ["./src/**/*.{js,ts,jsx,tsx,mdx}"], - theme: { - extend: { - colors: { - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", - border: "hsl(var(--border))", - primary: { - DEFAULT: "hsl(var(--primary))", // Primary color as a hex - foreground: "hsl(var(--primary-foreground))", // Text for primary - }, - secondary: { - DEFAULT: "#FEB902", // Secondary color as a hex - foreground: "hsl(var(--secondary-foreground))", // Text for secondary - }, - accent: { - DEFAULT: "hsl(var(--accent))", - foreground: "hsl(var(--accent-foreground))", - }, - destructive: { - DEFAULT: "hsl(var(--destructive))", - foreground: "hsl(var(--destructive-foreground))", - }, - muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", - }, - }, - screens: { - xs: "360px", - sm: "640px", - md: "768px", - lg: "1024px", - xl: "1280px", - "2xl": "1536px", - }, - dropShadow: { - accent: "0 0 1em hsl(var(--accent))", - }, - }, - }, - plugins: [require("@tailwindcss/forms")], -}; - -export default config;