+
+const Toaster = ({ ...props }: ToasterProps) => {
+ const { theme = "system" } = useTheme()
+
+ return (
+
+ )
+}
+
+export { Toaster }
diff --git a/sigap-website/app/_components/ui/switch.tsx b/sigap-website/components/ui/switch.tsx
similarity index 56%
rename from sigap-website/app/_components/ui/switch.tsx
rename to sigap-website/components/ui/switch.tsx
index 5f4117f..bc69cf2 100644
--- a/sigap-website/app/_components/ui/switch.tsx
+++ b/sigap-website/components/ui/switch.tsx
@@ -11,7 +11,7 @@ const Switch = React.forwardRef<
>(({ className, ...props }, ref) => (
diff --git a/sigap-website/app/_components/ui/table.tsx b/sigap-website/components/ui/table.tsx
similarity index 90%
rename from sigap-website/app/_components/ui/table.tsx
rename to sigap-website/components/ui/table.tsx
index c0df655..7f3502f 100644
--- a/sigap-website/app/_components/ui/table.tsx
+++ b/sigap-website/components/ui/table.tsx
@@ -73,7 +73,7 @@ const TableHead = React.forwardRef<
[role=checkbox]]:translate-y-[2px]",
+ "h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",
className
)}
{...props}
@@ -87,10 +87,7 @@ const TableCell = React.forwardRef<
>(({ className, ...props }, ref) => (
| [role=checkbox]]:translate-y-[2px]",
- className
- )}
+ className={cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className)}
{...props}
/>
))
diff --git a/sigap-website/app/_components/ui/tabs.tsx b/sigap-website/components/ui/tabs.tsx
similarity index 77%
rename from sigap-website/app/_components/ui/tabs.tsx
rename to sigap-website/components/ui/tabs.tsx
index 0f4caeb..26eb109 100644
--- a/sigap-website/app/_components/ui/tabs.tsx
+++ b/sigap-website/components/ui/tabs.tsx
@@ -14,7 +14,7 @@ const TabsList = React.forwardRef<
,
React.ComponentPropsWithoutRef
>(({ className, sideOffset = 4, ...props }, ref) => (
-
-
-
+
))
TooltipContent.displayName = TooltipPrimitive.Content.displayName
diff --git a/sigap-website/hooks/use-contact-us-form.ts b/sigap-website/hooks/use-contact-us-form.ts
deleted file mode 100644
index fb0667e..0000000
--- a/sigap-website/hooks/use-contact-us-form.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-import { toast } from "@/app/_hooks/use-toast";
-import { ContactUsInsert } from "@/src/entities/models/contact-us.model";
-import { ContactRepositoryImpl } from "@/src/infrastructure/repositories/contact-us.repository.impl";
-import { validateContactForm } from "@/src/infrastructure/validators/contact-us.validator";
-import { useState } from "react";
-
-
-export const useContactForm = () => {
- const [isSubmitting, setIsSubmitting] = useState(false);
- const [formData, setFormData] = useState({
- name: "",
- email: "",
- phone: "",
- typeMessage: "",
- message: "",
- });
- const [errors, setErrors] = useState<
- Partial>
- >({});
-
- const contactRepository = new ContactRepositoryImpl();
-
- // Handle input change
- const handleChange = (
- e: React.ChangeEvent
- ) => {
- const { id, value } = e.target;
- setFormData((prev) => ({ ...prev, [id]: value }));
-
- if (errors[id as keyof ContactUsInsert]) {
- setErrors((prev) => {
- const newErrors = { ...prev };
- delete newErrors[id as keyof ContactUsInsert];
- return newErrors;
- });
- }
- };
-
- // Handle select change
- const handleSelectChange = (value: string) => {
- setFormData((prev) => ({ ...prev, typeMessage: value }));
-
- // Clear error when selecting
- if (errors.typeMessage) {
- setErrors((prev) => {
- const newErrors = { ...prev };
- delete newErrors.typeMessage;
- return newErrors;
- });
- }
- };
-
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
-
- // Client-side validation
- const validation = validateContactForm(formData);
-
- if (!validation.success) {
- setErrors(validation.errors);
- return;
- }
-
- setIsSubmitting(true);
-
- try {
- const response = await contactRepository.createContactUs(formData);
-
- if (!response.success) {
- if (response.errors) {
- setErrors(response.errors);
- } else {
- toast({
- title: "Error",
- description: response.error || "Failed to send message",
- variant: "destructive",
- });
- }
- return;
- }
-
- toast({
- title: "Success",
- description:
- response.message || "Your message has been sent successfully!",
- });
-
- // Reset form
- setFormData({
- name: "",
- email: "",
- phone: "",
- typeMessage: "",
- message: "",
- });
- setErrors({});
- } catch (error) {
- toast({
- title: "Error",
- description: "An unexpected error occurred. Please try again later.",
- variant: "destructive",
- });
- } finally {
- setIsSubmitting(false);
- }
- };
-
- return {
- formData,
- errors,
- isSubmitting,
- setFormData,
- handleChange,
- handleSelectChange,
- handleSubmit,
- };
-};
diff --git a/sigap-website/hooks/use-debounce.ts b/sigap-website/hooks/use-debounce.ts
new file mode 100644
index 0000000..24061cc
--- /dev/null
+++ b/sigap-website/hooks/use-debounce.ts
@@ -0,0 +1,20 @@
+import { useEffect, useState } from "react"
+
+function useDebounce(value: T, delay = 500): T {
+ const [debouncedValue, setDebouncedValue] = useState(value)
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ setDebouncedValue(value)
+ }, delay)
+
+ return () => {
+ clearTimeout(timer)
+ }
+ }, [value, delay])
+
+ return debouncedValue
+}
+
+export default useDebounce
+
diff --git a/sigap-website/hooks/use-mobile.tsx b/sigap-website/hooks/use-mobile.tsx
new file mode 100644
index 0000000..2b0fe1d
--- /dev/null
+++ b/sigap-website/hooks/use-mobile.tsx
@@ -0,0 +1,19 @@
+import * as React from "react"
+
+const MOBILE_BREAKPOINT = 768
+
+export function useIsMobile() {
+ const [isMobile, setIsMobile] = React.useState(undefined)
+
+ React.useEffect(() => {
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
+ const onChange = () => {
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
+ }
+ mql.addEventListener("change", onChange)
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
+ return () => mql.removeEventListener("change", onChange)
+ }, [])
+
+ return !!isMobile
+}
diff --git a/sigap-website/hooks/use-nav-items.ts b/sigap-website/hooks/use-nav-items.ts
deleted file mode 100644
index 8b13789..0000000
--- a/sigap-website/hooks/use-nav-items.ts
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/sigap-website/hooks/use-navigation-item.ts b/sigap-website/hooks/use-navigation-item.ts
deleted file mode 100644
index a4977f8..0000000
--- a/sigap-website/hooks/use-navigation-item.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { NavigationItem } from "@/src/entities/models/navigation-item.model";
-import { NavigationItemRepositoryImpl } from "@/src/infrastructure/repositories/navigation-item.repository.impl";
-import { useEffect, useState } from "react";
-
-export function useNavigationItem() {
- const [items, setItems] = useState([]);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState(null);
-
- useEffect(() => {
- const fetchNavigation = async () => {
- try {
- const repository = new NavigationItemRepositoryImpl();
- const navItems = await repository.findAll();
-
- // Convert flat structure to tree
- const buildNavigationTree = (
- items: NavigationItem[],
- parentPath: string = ""
- ): any[] => {
- return items
- .filter((item) => {
- const itemPath = item.path.split("/").filter(Boolean);
- const parentPathParts = parentPath.split("/").filter(Boolean);
- return (
- itemPath.length === parentPathParts.length + 1 &&
- itemPath.slice(0, parentPathParts.length).join("/") ===
- parentPathParts.join("/")
- );
- })
- .map((item) => ({
- ...item,
- subItems: buildNavigationTree(items, item.path),
- }))
- .sort((a, b) => a.orderSeq - b.orderSeq);
- };
-
- const navigationTree = buildNavigationTree(navItems);
- setItems(navigationTree);
- } catch (err) {
- setError(
- err instanceof Error ? err.message : "Failed to fetch navigation"
- );
- } finally {
- setLoading(false);
- }
- };
-
- fetchNavigation();
- }, []);
-
- return { items, loading, error };
-}
diff --git a/sigap-website/hooks/use-navigations.ts b/sigap-website/hooks/use-navigations.ts
new file mode 100644
index 0000000..aaa673b
--- /dev/null
+++ b/sigap-website/hooks/use-navigations.ts
@@ -0,0 +1,30 @@
+import {
+ useParams,
+ usePathname,
+ useRouter,
+ useSearchParams,
+} from "next/navigation";
+import { useState } from "react";
+
+export const useNavigations = () => {
+ const [loading, setLoading] = useState(false);
+ const [open, setOpen] = useState(false);
+ const [active, setActive] = useState("");
+ const router = useRouter();
+ const params = useParams();
+ const searchParams = useSearchParams();
+ const pathname = usePathname();
+
+ return {
+ loading,
+ setLoading,
+ open,
+ setOpen,
+ active,
+ setActive,
+ router,
+ params,
+ searchParams,
+ pathname,
+ };
+};
diff --git a/sigap-website/hooks/use-resend.ts b/sigap-website/hooks/use-resend.ts
new file mode 100644
index 0000000..29c064f
--- /dev/null
+++ b/sigap-website/hooks/use-resend.ts
@@ -0,0 +1,9 @@
+import { Resend } from "resend";
+
+export const useResend = () => {
+ const resend = new Resend(process.env.RESEND_API_KEY);
+
+ return {
+ resend,
+ };
+};
diff --git a/sigap-website/hooks/use-signin.ts b/sigap-website/hooks/use-signin.ts
deleted file mode 100644
index 8b9c3b2..0000000
--- a/sigap-website/hooks/use-signin.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { toast } from "@/app/_hooks/use-toast";
-import { useState } from "react";
-import Router from "next/router";
-import { useNavigations } from "@/app/_hooks/use-navigations";
-import { SignInWithOtp } from "@/src/entities/models/users.model";
-import { SignInRepositoryImpl } from "@/src/infrastructure/repositories/signin.repository.impl";
-import { validateSignInWithOtp } from "@/src/infrastructure/validators/signin.validator";
-
-export const useSignInForm = () => {
- const [isSubmitting, setIsSubmitting] = useState(false);
- const [formData, setFormData] = useState({
- email: "",
- });
- const [errors, setErrors] = useState<
- Partial>
- >({});
- const { router } = useNavigations();
-
- const contactRepository = new SignInRepositoryImpl();
-
- // Handle input change
- const handleChange = (
- e: React.ChangeEvent
- ) => {
- const { id, value } = e.target;
- setFormData((prev) => ({ ...prev, [id]: value }));
-
- if (errors[id as keyof SignInWithOtp]) {
- setErrors((prev) => {
- const newErrors = { ...prev };
- delete newErrors[id as keyof SignInWithOtp];
- return newErrors;
- });
- }
- };
-
- // Handle select change
- const handleSelectChange = (value: string) => {
- setFormData((prev) => ({ ...prev, typeMessage: value }));
-
- // Clear error when selecting
- if (errors.email) {
- setErrors((prev) => {
- const newErrors = { ...prev };
- delete newErrors.email;
- return newErrors;
- });
- }
- };
-
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
- const validation = validateSignInWithOtp(formData);
- if (!validation.success) {
- setErrors(validation.errors);
- return;
- }
-
- setIsSubmitting(true);
- try {
- const response = await contactRepository.signInWithPasswordless(formData);
-
- if (!response.success) {
- if (response.errors) {
- setErrors(response.errors);
- } else {
- toast({
- title: "Error",
- description: response.error || "An unexpected error occurred.",
- variant: "destructive",
- });
- }
- return;
- }
- // Add redirect handling
- if (response.redirectTo) {
- router.push(response.redirectTo);
- }
-
- toast({
- title: "Success",
- description:
- response.message || `OTP has been sent to ${formData.email}`,
- });
-
- setFormData({
- email: "",
- });
- setErrors({});
- } catch (error) {
- toast({
- title: "Error",
- description: "An unexpected error occurred. Please try again later.",
- variant: "destructive",
- });
- } finally {
- setIsSubmitting(false);
- }
- };
-
- return {
- formData,
- errors,
- isSubmitting,
- setFormData,
- handleChange,
- handleSelectChange,
- handleSubmit,
- };
-};
diff --git a/sigap-website/hooks/use-toast.ts b/sigap-website/hooks/use-toast.ts
new file mode 100644
index 0000000..75827f2
--- /dev/null
+++ b/sigap-website/hooks/use-toast.ts
@@ -0,0 +1,197 @@
+"use client";
+
+// Inspired by react-hot-toast library
+import * as React from "react";
+
+const TOAST_LIMIT = 1;
+const TOAST_REMOVE_DELAY = 1000000;
+
+// Define ToastProps type
+type ToastProps = {
+ open?: boolean;
+ onOpenChange?: (open: boolean) => void;
+};
+
+type ToastActionElement = React.ReactNode; // Define the type
+
+type ToasterToast = ToastProps & {
+ id: string;
+ title?: React.ReactNode;
+ description?: React.ReactNode;
+ action?: ToastActionElement;
+};
+
+const actionTypes = {
+ ADD_TOAST: "ADD_TOAST",
+ UPDATE_TOAST: "UPDATE_TOAST",
+ DISMISS_TOAST: "DISMISS_TOAST",
+ REMOVE_TOAST: "REMOVE_TOAST",
+} as const;
+
+let count = 0;
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
+ return count.toString();
+}
+
+type ActionType = typeof actionTypes;
+
+type Action =
+ | {
+ type: ActionType["ADD_TOAST"];
+ toast: ToasterToast;
+ }
+ | {
+ type: ActionType["UPDATE_TOAST"];
+ toast: Partial;
+ }
+ | {
+ type: ActionType["DISMISS_TOAST"];
+ toastId?: ToasterToast["id"];
+ }
+ | {
+ type: ActionType["REMOVE_TOAST"];
+ toastId?: ToasterToast["id"];
+ };
+
+interface State {
+ toasts: ToasterToast[];
+}
+
+const toastTimeouts = new Map>();
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId);
+ dispatch({
+ type: "REMOVE_TOAST",
+ toastId: toastId,
+ });
+ }, TOAST_REMOVE_DELAY);
+
+ toastTimeouts.set(toastId, timeout);
+};
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case "ADD_TOAST":
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+ };
+
+ case "UPDATE_TOAST":
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ ),
+ };
+
+ case "DISMISS_TOAST": {
+ const { toastId } = action;
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId);
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id);
+ });
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false,
+ }
+ : t
+ ),
+ };
+ }
+ case "REMOVE_TOAST":
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: [],
+ };
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
+ };
+ }
+};
+
+const listeners: Array<(state: State) => void> = [];
+
+let memoryState: State = { toasts: [] };
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action);
+ listeners.forEach((listener) => {
+ listener(memoryState);
+ });
+}
+
+type Toast = Omit;
+
+function toast({ ...props }: Toast) {
+ const id = genId();
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: "UPDATE_TOAST",
+ toast: { ...props, id },
+ });
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id });
+
+ dispatch({
+ type: "ADD_TOAST",
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss();
+ },
+ },
+ });
+
+ return {
+ id: id,
+ dismiss,
+ update,
+ };
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState);
+
+ React.useEffect(() => {
+ listeners.push(setState);
+ return () => {
+ const index = listeners.indexOf(setState);
+ if (index > -1) {
+ listeners.splice(index, 1);
+ }
+ };
+ }, [state]);
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
+ };
+}
+
+export { useToast, toast };
diff --git a/sigap-website/lib/db.ts b/sigap-website/lib/db.ts
deleted file mode 100644
index 6c81604..0000000
--- a/sigap-website/lib/db.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { PrismaClient } from "@prisma/client";
-
-const prismaClientSingleton = () => {
- return new PrismaClient();
-};
-
-declare const globalThis: {
- prismaGlobal: ReturnType;
-} & typeof global;
-
-const db = globalThis.prismaGlobal ?? prismaClientSingleton();
-
-export default db;
-
-if (process.env.NODE_ENV !== "production") globalThis.prismaGlobal = db;
\ No newline at end of file
diff --git a/sigap-website/lib/utils.ts b/sigap-website/lib/utils.ts
index bd0c391..a5ef193 100644
--- a/sigap-website/lib/utils.ts
+++ b/sigap-website/lib/utils.ts
@@ -1,6 +1,6 @@
-import { clsx, type ClassValue } from "clsx"
-import { twMerge } from "tailwind-merge"
+import { clsx, type ClassValue } from "clsx";
+import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
+ return twMerge(clsx(inputs));
}
diff --git a/sigap-website/package-lock.json b/sigap-website/package-lock.json
index e31f500..640780c 100644
--- a/sigap-website/package-lock.json
+++ b/sigap-website/package-lock.json
@@ -1,53 +1,46 @@
{
"name": "sigap-website",
- "version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "sigap-website",
- "version": "1.0.0",
- "license": "ISC",
"dependencies": {
- "@hookform/resolvers": "^4.0.0",
- "@prisma/client": "^6.3.1",
+ "@hookform/resolvers": "^4.1.2",
+ "@prisma/client": "^6.4.1",
+ "@radix-ui/react-alert-dialog": "^1.1.6",
"@radix-ui/react-avatar": "^1.1.3",
"@radix-ui/react-checkbox": "^1.1.1",
"@radix-ui/react-collapsible": "^1.1.3",
"@radix-ui/react-dialog": "^1.1.6",
- "@radix-ui/react-dropdown-menu": "^2.1.6",
+ "@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-label": "^2.1.2",
- "@radix-ui/react-popover": "^1.1.6",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.1.2",
"@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-tabs": "^1.1.3",
- "@radix-ui/react-toast": "^1.2.6",
"@radix-ui/react-tooltip": "^1.1.8",
- "@react-email/components": "0.0.33",
"@supabase/ssr": "latest",
"@supabase/supabase-js": "latest",
- "@tabler/icons-react": "^3.30.0",
+ "@tanstack/react-query": "^5.66.9",
"@tanstack/react-table": "^8.21.2",
"autoprefixer": "10.4.20",
- "class-variance-authority": "^0.7.1",
+ "class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"date-fns": "^3.6.0",
- "framer-motion": "^12.4.7",
"input-otp": "^1.4.2",
"lucide-react": "^0.468.0",
- "mapbox-gl": "^3.10.0",
"motion": "^12.4.7",
"next": "latest",
- "next-themes": "^0.4.3",
+ "next-themes": "^0.4.4",
"prettier": "^3.3.3",
- "react": "18.3.1",
+ "react": "^18.3.1",
"react-day-picker": "^8.10.1",
- "react-dom": "18.3.1",
+ "react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
"resend": "^4.1.2",
+ "sonner": "^2.0.1",
"vaul": "^1.1.2",
"zod": "^3.24.2"
},
@@ -56,11 +49,9 @@
"@types/react": "^19.0.2",
"@types/react-dom": "19.0.2",
"postcss": "8.4.49",
- "prisma": "^6.3.1",
- "prisma-json-types-generator": "^3.2.2",
+ "prisma": "^6.4.1",
"react-email": "3.0.7",
- "supabase": "^2.12.1",
- "tailwind-merge": "^2.6.0",
+ "tailwind-merge": "^2.5.2",
"tailwindcss": "3.4.17",
"tailwindcss-animate": "^1.0.7",
"ts-node": "^10.9.2",
@@ -161,14 +152,14 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz",
- "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
+ "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.26.8",
- "@babel/types": "^7.26.8",
+ "@babel/parser": "^7.26.9",
+ "@babel/types": "^7.26.9",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -178,13 +169,13 @@
}
},
"node_modules/@babel/generator/node_modules/@babel/parser": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
- "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
+ "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.8"
+ "@babel/types": "^7.26.9"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -293,14 +284,14 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
- "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
+ "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.25.9",
- "@babel/types": "^7.26.7"
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.9"
},
"engines": {
"node": ">=6.9.0"
@@ -320,28 +311,28 @@
}
},
"node_modules/@babel/template": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz",
- "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+ "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
- "@babel/parser": "^7.26.8",
- "@babel/types": "^7.26.8"
+ "@babel/parser": "^7.26.9",
+ "@babel/types": "^7.26.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template/node_modules/@babel/parser": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
- "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
+ "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.8"
+ "@babel/types": "^7.26.9"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -351,17 +342,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz",
- "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
+ "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.8",
- "@babel/parser": "^7.26.8",
- "@babel/template": "^7.26.8",
- "@babel/types": "^7.26.8",
+ "@babel/generator": "^7.26.9",
+ "@babel/parser": "^7.26.9",
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.9",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -370,13 +361,13 @@
}
},
"node_modules/@babel/traverse/node_modules/@babel/parser": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
- "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
+ "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.8"
+ "@babel/types": "^7.26.9"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -386,9 +377,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz",
- "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
+ "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -435,9 +426,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
- "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
+ "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
"cpu": [
"ppc64"
],
@@ -452,9 +443,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz",
- "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
+ "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
"cpu": [
"arm"
],
@@ -469,9 +460,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz",
- "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
+ "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
"cpu": [
"arm64"
],
@@ -486,9 +477,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz",
- "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
+ "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
"cpu": [
"x64"
],
@@ -503,9 +494,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
- "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
+ "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
"cpu": [
"arm64"
],
@@ -520,9 +511,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz",
- "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
+ "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
"cpu": [
"x64"
],
@@ -537,9 +528,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz",
- "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
+ "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
"cpu": [
"arm64"
],
@@ -554,9 +545,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz",
- "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
+ "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
"cpu": [
"x64"
],
@@ -571,9 +562,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz",
- "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
+ "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
"cpu": [
"arm"
],
@@ -588,9 +579,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz",
- "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
+ "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
"cpu": [
"arm64"
],
@@ -605,9 +596,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz",
- "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
+ "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
"cpu": [
"ia32"
],
@@ -622,9 +613,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz",
- "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
+ "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
"cpu": [
"loong64"
],
@@ -639,9 +630,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz",
- "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
+ "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
"cpu": [
"mips64el"
],
@@ -656,9 +647,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz",
- "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
+ "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
"cpu": [
"ppc64"
],
@@ -673,9 +664,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz",
- "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
+ "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
"cpu": [
"riscv64"
],
@@ -690,9 +681,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz",
- "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
+ "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
"cpu": [
"s390x"
],
@@ -707,9 +698,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz",
- "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
+ "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
"cpu": [
"x64"
],
@@ -723,10 +714,27 @@
"node": ">=18"
}
},
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
+ "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz",
- "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
+ "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
"cpu": [
"x64"
],
@@ -741,9 +749,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz",
- "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
+ "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
"cpu": [
"arm64"
],
@@ -758,9 +766,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz",
- "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
+ "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
"cpu": [
"x64"
],
@@ -775,9 +783,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz",
- "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
+ "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
"cpu": [
"x64"
],
@@ -792,9 +800,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz",
- "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
+ "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
"cpu": [
"arm64"
],
@@ -809,9 +817,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz",
- "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
+ "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
"cpu": [
"ia32"
],
@@ -826,9 +834,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz",
- "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==",
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
+ "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
"cpu": [
"x64"
],
@@ -881,10 +889,13 @@
"license": "MIT"
},
"node_modules/@hookform/resolvers": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-4.0.0.tgz",
- "integrity": "sha512-93ZueVlTaeMF0pRbrLbcnzrxeb2mGA/xyO3RgfrsKs5OCtcfjoWcdjBJm+N7096Jfg/JYlGPjuyQCgqVEodSTg==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-4.1.2.tgz",
+ "integrity": "sha512-wl6H9c9wLOZMJAqGLEVKzbCkxJuV+BYuLFZFCQtCwMe0b3qQk4kUBd/ZAj13SwcSqcx86rCgSCyngQfmA6DOWg==",
"license": "MIT",
+ "dependencies": {
+ "@standard-schema/utils": "^0.3.0"
+ },
"peerDependencies": {
"react-hook-form": "^7.0.0"
}
@@ -1286,19 +1297,6 @@
"node": ">=12"
}
},
- "node_modules/@isaacs/fs-minipass": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
- "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.4"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
@@ -1352,66 +1350,16 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@mapbox/jsonlint-lines-primitives": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
- "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/@mapbox/mapbox-gl-supported": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-3.0.0.tgz",
- "integrity": "sha512-2XghOwu16ZwPJLOFVuIOaLbN0iKMn867evzXFyf0P22dqugezfJwLmdanAgU25ITvz1TvOfVP4jsDImlDJzcWg==",
- "license": "BSD-3-Clause"
- },
- "node_modules/@mapbox/point-geometry": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
- "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==",
- "license": "ISC"
- },
- "node_modules/@mapbox/tiny-sdf": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz",
- "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==",
- "license": "BSD-2-Clause"
- },
- "node_modules/@mapbox/unitbezier": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz",
- "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==",
- "license": "BSD-2-Clause"
- },
- "node_modules/@mapbox/vector-tile": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz",
- "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@mapbox/point-geometry": "~0.1.0"
- }
- },
- "node_modules/@mapbox/whoots-js": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz",
- "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==",
- "license": "ISC",
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@next/env": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.7.tgz",
- "integrity": "sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.0.tgz",
+ "integrity": "sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==",
"license": "MIT"
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.7.tgz",
- "integrity": "sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.0.tgz",
+ "integrity": "sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==",
"cpu": [
"arm64"
],
@@ -1425,9 +1373,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.7.tgz",
- "integrity": "sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.0.tgz",
+ "integrity": "sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==",
"cpu": [
"x64"
],
@@ -1441,9 +1389,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.7.tgz",
- "integrity": "sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.0.tgz",
+ "integrity": "sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==",
"cpu": [
"arm64"
],
@@ -1457,9 +1405,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.7.tgz",
- "integrity": "sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.0.tgz",
+ "integrity": "sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==",
"cpu": [
"arm64"
],
@@ -1473,9 +1421,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.7.tgz",
- "integrity": "sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.0.tgz",
+ "integrity": "sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==",
"cpu": [
"x64"
],
@@ -1489,9 +1437,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.7.tgz",
- "integrity": "sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.0.tgz",
+ "integrity": "sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==",
"cpu": [
"x64"
],
@@ -1505,9 +1453,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.7.tgz",
- "integrity": "sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.0.tgz",
+ "integrity": "sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==",
"cpu": [
"arm64"
],
@@ -1521,9 +1469,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.7.tgz",
- "integrity": "sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.0.tgz",
+ "integrity": "sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==",
"cpu": [
"x64"
],
@@ -1591,9 +1539,9 @@
}
},
"node_modules/@prisma/client": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.3.1.tgz",
- "integrity": "sha512-ARAJaPs+eBkemdky/XU3cvGRl+mIPHCN2lCXsl5Vlb0E2gV+R6IN7aCI8CisRGszEZondwIsW9Iz8EJkTdykyA==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.4.1.tgz",
+ "integrity": "sha512-A7Mwx44+GVZVexT5e2GF/WcKkEkNNKbgr059xpr5mn+oUm2ZW1svhe+0TRNBwCdzhfIZ+q23jEgsNPvKD9u+6g==",
"hasInstallScript": true,
"license": "Apache-2.0",
"engines": {
@@ -1613,70 +1561,53 @@
}
},
"node_modules/@prisma/debug": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.3.1.tgz",
- "integrity": "sha512-RrEBkd+HLZx+ydfmYT0jUj7wjLiS95wfTOSQ+8FQbvb6vHh5AeKfEPt/XUQ5+Buljj8hltEfOslEW57/wQIVeA==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.4.1.tgz",
+ "integrity": "sha512-Q9xk6yjEGIThjSD8zZegxd5tBRNHYd13GOIG0nLsanbTXATiPXCLyvlYEfvbR2ft6dlRsziQXfQGxAgv7zcMUA==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/engines": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.3.1.tgz",
- "integrity": "sha512-sXdqEVLyGAJ5/iUoG/Ea5AdHMN71m6PzMBWRQnLmhhOejzqAaEr8rUd623ql6OJpED4s/U4vIn4dg1qkF7vGag==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.4.1.tgz",
+ "integrity": "sha512-KldENzMHtKYwsOSLThghOIdXOBEsfDuGSrxAZjMnimBiDKd3AE4JQ+Kv+gBD/x77WoV9xIPf25GXMWffXZ17BA==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/debug": "6.3.1",
- "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0",
- "@prisma/fetch-engine": "6.3.1",
- "@prisma/get-platform": "6.3.1"
+ "@prisma/debug": "6.4.1",
+ "@prisma/engines-version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d",
+ "@prisma/fetch-engine": "6.4.1",
+ "@prisma/get-platform": "6.4.1"
}
},
"node_modules/@prisma/engines-version": {
- "version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0",
- "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0.tgz",
- "integrity": "sha512-R/ZcMuaWZT2UBmgX3Ko6PAV3f8//ZzsjRIG1eKqp3f2rqEqVtCv+mtzuH2rBPUC9ujJ5kCb9wwpxeyCkLcHVyA==",
+ "version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d",
+ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d.tgz",
+ "integrity": "sha512-Xq54qw55vaCGrGgIJqyDwOq0TtjZPJEWsbQAHugk99hpDf2jcEeQhUcF+yzEsSqegBaDNLA4IC8Nn34sXmkiTQ==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/fetch-engine": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.3.1.tgz",
- "integrity": "sha512-HOf/0umOgt+/S2xtZze+FHKoxpVg4YpVxROr6g2YG09VsI3Ipyb+rGvD6QGbCqkq5NTWAAZoOGNL+oy7t+IhaQ==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.4.1.tgz",
+ "integrity": "sha512-uZ5hVeTmDspx7KcaRCNoXmcReOD+84nwlO2oFvQPRQh9xiFYnnUKDz7l9bLxp8t4+25CsaNlgrgilXKSQwrIGQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/debug": "6.3.1",
- "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0",
- "@prisma/get-platform": "6.3.1"
+ "@prisma/debug": "6.4.1",
+ "@prisma/engines-version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d",
+ "@prisma/get-platform": "6.4.1"
}
},
- "node_modules/@prisma/generator-helper": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-6.0.0.tgz",
- "integrity": "sha512-5DkG7hspZo6U4OtqI2W0JcgtY37sr7HgT8Q0W/sjL4VoV4px6ivzK6Eif5bKM7q+S4yFUHtjUt/3s69ErfLn7A==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@prisma/debug": "6.0.0"
- }
- },
- "node_modules/@prisma/generator-helper/node_modules/@prisma/debug": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.0.0.tgz",
- "integrity": "sha512-eUjoNThlDXdyJ1iQ2d7U6aTVwm59EwvODb5zFVNJEokNoSiQmiYWNzZIwZyDmZ+j51j42/0iTaHIJ4/aZPKFRg==",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/@prisma/get-platform": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.3.1.tgz",
- "integrity": "sha512-AYLq6Hk9xG73JdLWJ3Ip9Wg/vlP7xPvftGBalsPzKDOHr/ImhwJ09eS8xC2vNT12DlzGxhfk8BkL0ve2OriNhQ==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.4.1.tgz",
+ "integrity": "sha512-gXqZaDI5scDkBF8oza7fOD3Q3QMD0e0rBynlzDDZdTWbWmzjuW58PRZtj+jkvKje2+ZigCWkH8SsWZAsH6q1Yw==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/debug": "6.3.1"
+ "@prisma/debug": "6.4.1"
}
},
"node_modules/@radix-ui/number": {
@@ -1691,6 +1622,34 @@
"integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
"license": "MIT"
},
+ "node_modules/@radix-ui/react-alert-dialog": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.6.tgz",
+ "integrity": "sha512-p4XnPqgej8sZAAReCAKgz1REYZEBLR8hU9Pg27wFnCWIMc8g1ccCs0FjBcy05V15VTu8pAePw/VDYeOm/uZ6yQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.1",
+ "@radix-ui/react-compose-refs": "1.1.1",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dialog": "1.1.6",
+ "@radix-ui/react-primitive": "2.0.2",
+ "@radix-ui/react-slot": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@radix-ui/react-arrow": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz",
@@ -2084,43 +2043,6 @@
}
}
},
- "node_modules/@radix-ui/react-popover": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.6.tgz",
- "integrity": "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-focus-guards": "1.1.1",
- "@radix-ui/react-focus-scope": "1.1.2",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-popper": "1.2.2",
- "@radix-ui/react-portal": "1.1.4",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-slot": "1.1.2",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-popper": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz",
@@ -2429,40 +2351,6 @@
}
}
},
- "node_modules/@radix-ui/react-toast": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.6.tgz",
- "integrity": "sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-portal": "1.1.4",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-callback-ref": "1.1.0",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "@radix-ui/react-use-layout-effect": "1.1.0",
- "@radix-ui/react-visually-hidden": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-tooltip": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz",
@@ -2643,253 +2531,6 @@
"integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==",
"license": "MIT"
},
- "node_modules/@react-email/body": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.11.tgz",
- "integrity": "sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/button": {
- "version": "0.0.19",
- "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.19.tgz",
- "integrity": "sha512-HYHrhyVGt7rdM/ls6FuuD6XE7fa7bjZTJqB2byn6/oGsfiEZaogY77OtoLL/mrQHjHjZiJadtAMSik9XLcm7+A==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/code-block": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.11.tgz",
- "integrity": "sha512-4D43p+LIMjDzm66gTDrZch0Flkip5je91mAT7iGs6+SbPyalHgIA+lFQoQwhz/VzHHLxuD0LV6gwmU/WUQ2WEg==",
- "license": "MIT",
- "dependencies": {
- "prismjs": "1.29.0"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/code-inline": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/@react-email/code-inline/-/code-inline-0.0.5.tgz",
- "integrity": "sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/column": {
- "version": "0.0.13",
- "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.13.tgz",
- "integrity": "sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/components": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.33.tgz",
- "integrity": "sha512-/GKdT3YijT1iEWPAXF644jr12w5xVgzUr0zlbZGt2KOkGeFHNZUCL5UtRopmnjrH/Fayf8Gjv6q/4E2cZgDtdQ==",
- "license": "MIT",
- "dependencies": {
- "@react-email/body": "0.0.11",
- "@react-email/button": "0.0.19",
- "@react-email/code-block": "0.0.11",
- "@react-email/code-inline": "0.0.5",
- "@react-email/column": "0.0.13",
- "@react-email/container": "0.0.15",
- "@react-email/font": "0.0.9",
- "@react-email/head": "0.0.12",
- "@react-email/heading": "0.0.15",
- "@react-email/hr": "0.0.11",
- "@react-email/html": "0.0.11",
- "@react-email/img": "0.0.11",
- "@react-email/link": "0.0.12",
- "@react-email/markdown": "0.0.14",
- "@react-email/preview": "0.0.12",
- "@react-email/render": "1.0.5",
- "@react-email/row": "0.0.12",
- "@react-email/section": "0.0.16",
- "@react-email/tailwind": "1.0.4",
- "@react-email/text": "0.0.11"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/components/node_modules/@react-email/render": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.5.tgz",
- "integrity": "sha512-CA69HYXPk21HhtAXATIr+9JJwpDNmAFCvdMUjWmeoD1+KhJ9NAxusMRxKNeibdZdslmq3edaeOKGbdQ9qjK8LQ==",
- "license": "MIT",
- "dependencies": {
- "html-to-text": "9.0.5",
- "prettier": "3.4.2",
- "react-promise-suspense": "0.3.4"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/components/node_modules/prettier": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
- "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
- "license": "MIT",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/@react-email/container": {
- "version": "0.0.15",
- "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.15.tgz",
- "integrity": "sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/font": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.9.tgz",
- "integrity": "sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/head": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.12.tgz",
- "integrity": "sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/heading": {
- "version": "0.0.15",
- "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.15.tgz",
- "integrity": "sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/hr": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.11.tgz",
- "integrity": "sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/html": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.11.tgz",
- "integrity": "sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/img": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.11.tgz",
- "integrity": "sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/link": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.12.tgz",
- "integrity": "sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/markdown": {
- "version": "0.0.14",
- "resolved": "https://registry.npmjs.org/@react-email/markdown/-/markdown-0.0.14.tgz",
- "integrity": "sha512-5IsobCyPkb4XwnQO8uFfGcNOxnsg3311GRXhJ3uKv51P7Jxme4ycC/MITnwIZ10w2zx7HIyTiqVzTj4XbuIHbg==",
- "license": "MIT",
- "dependencies": {
- "md-to-react-email": "5.0.5"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/preview": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.12.tgz",
- "integrity": "sha512-g/H5fa9PQPDK6WUEG7iTlC19sAktI23qyoiJtMLqQiXFCfWeQMhqjLGKeLSKkfzszqmfJCjZtpSiKtBoOdxp3Q==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
"node_modules/@react-email/render": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.1.tgz",
@@ -2908,54 +2549,6 @@
"react-dom": "^18.0 || ^19.0 || ^19.0.0-rc"
}
},
- "node_modules/@react-email/row": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.12.tgz",
- "integrity": "sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/section": {
- "version": "0.0.16",
- "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.16.tgz",
- "integrity": "sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/tailwind": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-1.0.4.tgz",
- "integrity": "sha512-tJdcusncdqgvTUYZIuhNC6LYTfL9vNTSQpwWdTCQhQ1lsrNCEE4OKCSdzSV3S9F32pi0i0xQ+YPJHKIzGjdTSA==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
- "node_modules/@react-email/text": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.11.tgz",
- "integrity": "sha512-a7nl/2KLpRHOYx75YbYZpWspUbX1DFY7JIZbOv5x0QU8SvwDbJt+Hm01vG34PffFyYvHEXrc6Qnip2RTjljNjg==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0 || ^19.0.0-rc"
- }
- },
"node_modules/@selderee/plugin-htmlparser2": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz",
@@ -2976,10 +2569,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@standard-schema/utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
+ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
+ "license": "MIT"
+ },
"node_modules/@supabase/auth-js": {
- "version": "2.67.3",
- "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.67.3.tgz",
- "integrity": "sha512-NJDaW8yXs49xMvWVOkSIr8j46jf+tYHV0wHhrwOaLLMZSFO4g6kKAf+MfzQ2RaD06OCUkUHIzctLAxjTgEVpzw==",
+ "version": "2.68.0",
+ "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.68.0.tgz",
+ "integrity": "sha512-odG7nb7aOmZPUXk6SwL2JchSsn36Ppx11i2yWMIc/meUO2B2HK9YwZHPK06utD9Ql9ke7JKDbwGin/8prHKxxQ==",
"license": "MIT",
"dependencies": {
"@supabase/node-fetch": "^2.6.14"
@@ -3007,9 +2606,9 @@
}
},
"node_modules/@supabase/postgrest-js": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.18.1.tgz",
- "integrity": "sha512-dWDnoC0MoDHKhaEOrsEKTadWQcBNknZVQcSgNE/Q2wXh05mhCL1ut/jthRUrSbYcqIw/CEjhaeIPp7dLarT0bg==",
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.19.2.tgz",
+ "integrity": "sha512-MXRbk4wpwhWl9IN6rIY1mR8uZCCG4MZAEji942ve6nMwIqnBgBnZhZlON6zTTs6fgveMnoCILpZv1+K91jN+ow==",
"license": "MIT",
"dependencies": {
"@supabase/node-fetch": "^2.6.14"
@@ -3050,15 +2649,15 @@
}
},
"node_modules/@supabase/supabase-js": {
- "version": "2.48.1",
- "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.48.1.tgz",
- "integrity": "sha512-VMD+CYk/KxfwGbI4fqwSUVA7CLr1izXpqfFerhnYPSi6LEKD8GoR4kuO5Cc8a+N43LnfSQwLJu4kVm2e4etEmA==",
+ "version": "2.49.1",
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.49.1.tgz",
+ "integrity": "sha512-lKaptKQB5/juEF5+jzmBeZlz69MdHZuxf+0f50NwhL+IE//m4ZnOeWlsKRjjsM0fVayZiQKqLvYdBn0RLkhGiQ==",
"license": "MIT",
"dependencies": {
- "@supabase/auth-js": "2.67.3",
+ "@supabase/auth-js": "2.68.0",
"@supabase/functions-js": "2.4.4",
"@supabase/node-fetch": "2.6.15",
- "@supabase/postgrest-js": "1.18.1",
+ "@supabase/postgrest-js": "1.19.2",
"@supabase/realtime-js": "2.11.2",
"@supabase/storage-js": "2.7.1"
}
@@ -3078,30 +2677,30 @@
"tslib": "^2.8.0"
}
},
- "node_modules/@tabler/icons": {
- "version": "3.30.0",
- "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.30.0.tgz",
- "integrity": "sha512-c8OKLM48l00u9TFbh2qhSODMONIzML8ajtCyq95rW8vzkWcBrKRPM61tdkThz2j4kd5u17srPGIjqdeRUZdfdw==",
+ "node_modules/@tanstack/query-core": {
+ "version": "5.66.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.66.4.tgz",
+ "integrity": "sha512-skM/gzNX4shPkqmdTCSoHtJAPMTtmIJNS0hE+xwTTUVYwezArCT34NMermABmBVUg5Ls5aiUXEDXfqwR1oVkcA==",
"license": "MIT",
"funding": {
"type": "github",
- "url": "https://github.com/sponsors/codecalm"
+ "url": "https://github.com/sponsors/tannerlinsley"
}
},
- "node_modules/@tabler/icons-react": {
- "version": "3.30.0",
- "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.30.0.tgz",
- "integrity": "sha512-9KZ9D1UNAyjlLkkYp2HBPHdf6lAJ2aelDqh8YYAnnmLF3xwprWKxxW8+zw5jlI0IwdfN4XFFuzqePkaw+DpIOg==",
+ "node_modules/@tanstack/react-query": {
+ "version": "5.66.9",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.66.9.tgz",
+ "integrity": "sha512-NRI02PHJsP5y2gAuWKP+awamTIBFBSKMnO6UVzi03GTclmHHHInH5UzVgzi5tpu4+FmGfsdT7Umqegobtsp23A==",
"license": "MIT",
"dependencies": {
- "@tabler/icons": "3.30.0"
+ "@tanstack/query-core": "5.66.4"
},
"funding": {
"type": "github",
- "url": "https://github.com/sponsors/codecalm"
+ "url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
- "react": ">= 16"
+ "react": "^18 || ^19"
}
},
"node_modules/@tanstack/react-table": {
@@ -3181,38 +2780,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/geojson": {
- "version": "7946.0.16",
- "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
- "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
- "license": "MIT"
- },
- "node_modules/@types/geojson-vt": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz",
- "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/mapbox__point-geometry": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz",
- "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==",
- "license": "MIT"
- },
- "node_modules/@types/mapbox__vector-tile": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz",
- "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*",
- "@types/mapbox__point-geometry": "*",
- "@types/pbf": "*"
- }
- },
"node_modules/@types/node": {
"version": "22.10.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
@@ -3222,12 +2789,6 @@
"undici-types": "~6.20.0"
}
},
- "node_modules/@types/pbf": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz",
- "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==",
- "license": "MIT"
- },
"node_modules/@types/phoenix": {
"version": "1.6.6",
"resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz",
@@ -3235,9 +2796,9 @@
"license": "MIT"
},
"node_modules/@types/react": {
- "version": "19.0.8",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz",
- "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==",
+ "version": "19.0.10",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz",
+ "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -3254,15 +2815,6 @@
"@types/react": "^19.0.0"
}
},
- "node_modules/@types/supercluster": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz",
- "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
"node_modules/@types/ws": {
"version": "8.5.14",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz",
@@ -3273,12 +2825,12 @@
}
},
"node_modules/abbrev": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz",
- "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
"license": "ISC",
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/accepts": {
@@ -3321,16 +2873,6 @@
"node": ">=0.4.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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
@@ -3469,23 +3011,6 @@
"node": "^4.5.0 || >= 5.9"
}
},
- "node_modules/bin-links": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz",
- "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "cmd-shim": "^7.0.0",
- "npm-normalize-package-bin": "^4.0.0",
- "proc-log": "^5.0.0",
- "read-cmd-shim": "^5.0.0",
- "write-file-atomic": "^6.0.0"
- },
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
@@ -3612,9 +3137,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001699",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
- "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
+ "version": "1.0.30001701",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz",
+ "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==",
"funding": [
{
"type": "opencollective",
@@ -3664,12 +3189,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/cheap-ruler": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cheap-ruler/-/cheap-ruler-4.0.0.tgz",
- "integrity": "sha512-0BJa8f4t141BYKQyn9NSQt1PguFQXMXwZiA5shfoaBYHAb2fFk2RAX+tiWMoQU+Agtzt3mdt0JtuyshAXqZ+Vw==",
- "license": "ISC"
- },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
@@ -3708,16 +3227,6 @@
"node": ">= 6"
}
},
- "node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/class-variance-authority": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
@@ -3781,16 +3290,6 @@
"node": ">=6"
}
},
- "node_modules/cmd-shim": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz",
- "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -3905,12 +3404,6 @@
"node": ">= 8"
}
},
- "node_modules/csscolorparser": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
- "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==",
- "license": "MIT"
- },
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -3931,16 +3424,6 @@
"devOptional": true,
"license": "MIT"
},
- "node_modules/data-uri-to-buffer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
- "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 12"
- }
- },
"node_modules/date-fns": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
@@ -3968,7 +3451,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==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -4099,12 +3582,6 @@
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
- "node_modules/earcut": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz",
- "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==",
- "license": "ISC"
- },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -4154,9 +3631,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.97",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz",
- "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==",
+ "version": "1.5.109",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.109.tgz",
+ "integrity": "sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@@ -4249,10 +3726,10 @@
}
},
"node_modules/esbuild": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz",
- "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==",
- "dev": true,
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
+ "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
+ "devOptional": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -4262,30 +3739,44 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.23.0",
- "@esbuild/android-arm": "0.23.0",
- "@esbuild/android-arm64": "0.23.0",
- "@esbuild/android-x64": "0.23.0",
- "@esbuild/darwin-arm64": "0.23.0",
- "@esbuild/darwin-x64": "0.23.0",
- "@esbuild/freebsd-arm64": "0.23.0",
- "@esbuild/freebsd-x64": "0.23.0",
- "@esbuild/linux-arm": "0.23.0",
- "@esbuild/linux-arm64": "0.23.0",
- "@esbuild/linux-ia32": "0.23.0",
- "@esbuild/linux-loong64": "0.23.0",
- "@esbuild/linux-mips64el": "0.23.0",
- "@esbuild/linux-ppc64": "0.23.0",
- "@esbuild/linux-riscv64": "0.23.0",
- "@esbuild/linux-s390x": "0.23.0",
- "@esbuild/linux-x64": "0.23.0",
- "@esbuild/netbsd-x64": "0.23.0",
- "@esbuild/openbsd-arm64": "0.23.0",
- "@esbuild/openbsd-x64": "0.23.0",
- "@esbuild/sunos-x64": "0.23.0",
- "@esbuild/win32-arm64": "0.23.0",
- "@esbuild/win32-ia32": "0.23.0",
- "@esbuild/win32-x64": "0.23.0"
+ "@esbuild/aix-ppc64": "0.25.0",
+ "@esbuild/android-arm": "0.25.0",
+ "@esbuild/android-arm64": "0.25.0",
+ "@esbuild/android-x64": "0.25.0",
+ "@esbuild/darwin-arm64": "0.25.0",
+ "@esbuild/darwin-x64": "0.25.0",
+ "@esbuild/freebsd-arm64": "0.25.0",
+ "@esbuild/freebsd-x64": "0.25.0",
+ "@esbuild/linux-arm": "0.25.0",
+ "@esbuild/linux-arm64": "0.25.0",
+ "@esbuild/linux-ia32": "0.25.0",
+ "@esbuild/linux-loong64": "0.25.0",
+ "@esbuild/linux-mips64el": "0.25.0",
+ "@esbuild/linux-ppc64": "0.25.0",
+ "@esbuild/linux-riscv64": "0.25.0",
+ "@esbuild/linux-s390x": "0.25.0",
+ "@esbuild/linux-x64": "0.25.0",
+ "@esbuild/netbsd-arm64": "0.25.0",
+ "@esbuild/netbsd-x64": "0.25.0",
+ "@esbuild/openbsd-arm64": "0.25.0",
+ "@esbuild/openbsd-x64": "0.25.0",
+ "@esbuild/sunos-x64": "0.25.0",
+ "@esbuild/win32-arm64": "0.25.0",
+ "@esbuild/win32-ia32": "0.25.0",
+ "@esbuild/win32-x64": "0.25.0"
+ }
+ },
+ "node_modules/esbuild-register": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+ "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.12 <1"
}
},
"node_modules/escalade": {
@@ -4334,39 +3825,15 @@
}
},
"node_modules/fastq": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
- "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
},
- "node_modules/fetch-blob": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
- "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "node-domexception": "^1.0.0",
- "web-streams-polyfill": "^3.0.3"
- },
- "engines": {
- "node": "^12.20 || >= 14.13"
- }
- },
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -4381,12 +3848,12 @@
}
},
"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==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"license": "ISC",
"dependencies": {
- "cross-spawn": "^7.0.0",
+ "cross-spawn": "^7.0.6",
"signal-exit": "^4.0.1"
},
"engines": {
@@ -4396,19 +3863,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/formdata-polyfill": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
- "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fetch-blob": "^3.1.2"
- },
- "engines": {
- "node": ">=12.20.0"
- }
- },
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
@@ -4484,12 +3938,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/geojson-vt": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz",
- "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==",
- "license": "ISC"
- },
"node_modules/get-nonce": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
@@ -4499,12 +3947,6 @@
"node": ">=6"
}
},
- "node_modules/gl-matrix": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
- "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==",
- "license": "MIT"
- },
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -4548,12 +3990,6 @@
"node": ">=4"
}
},
- "node_modules/grid-index": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz",
- "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==",
- "license": "ISC"
- },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -4612,24 +4048,11 @@
"entities": "^4.4.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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -4646,16 +4069,6 @@
],
"license": "BSD-3-Clause"
},
- "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",
@@ -4812,16 +4225,16 @@
}
},
"node_modules/js-beautify": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.3.tgz",
- "integrity": "sha512-rKKGuyTxGNlyN4EQKWzNndzXpi0bOl8Gl8YQAW1as/oMz0XhD6sHJO1hTvoBDOSzKuJb9WkwoAb34FfdkKMv2A==",
+ "version": "1.15.4",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz",
+ "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==",
"license": "MIT",
"dependencies": {
"config-chain": "^1.1.13",
"editorconfig": "^1.0.4",
"glob": "^10.4.2",
"js-cookie": "^3.0.5",
- "nopt": "^8.0.0"
+ "nopt": "^7.2.1"
},
"bin": {
"css-beautify": "js/bin/css-beautify.js",
@@ -4873,12 +4286,6 @@
"node": ">=6"
}
},
- "node_modules/kdbush": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
- "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==",
- "license": "ISC"
- },
"node_modules/leac": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz",
@@ -4959,70 +4366,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/mapbox-gl": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.10.0.tgz",
- "integrity": "sha512-YnQxjlthuv/tidcxGYU2C8nRDVXMlAHa3qFhuOJeX4AfRP72OMRBf9ApL+M+k5VWcAXi2fcNOUVgphknjLumjA==",
- "license": "SEE LICENSE IN LICENSE.txt",
- "workspaces": [
- "src/style-spec",
- "test/build/typings"
- ],
- "dependencies": {
- "@mapbox/jsonlint-lines-primitives": "^2.0.2",
- "@mapbox/mapbox-gl-supported": "^3.0.0",
- "@mapbox/point-geometry": "^0.1.0",
- "@mapbox/tiny-sdf": "^2.0.6",
- "@mapbox/unitbezier": "^0.0.1",
- "@mapbox/vector-tile": "^1.3.1",
- "@mapbox/whoots-js": "^3.1.0",
- "@types/geojson": "^7946.0.16",
- "@types/geojson-vt": "^3.2.5",
- "@types/mapbox__point-geometry": "^0.1.4",
- "@types/mapbox__vector-tile": "^1.3.4",
- "@types/pbf": "^3.0.5",
- "@types/supercluster": "^7.1.3",
- "cheap-ruler": "^4.0.0",
- "csscolorparser": "~1.0.3",
- "earcut": "^3.0.0",
- "geojson-vt": "^4.0.2",
- "gl-matrix": "^3.4.3",
- "grid-index": "^1.1.0",
- "kdbush": "^4.0.2",
- "murmurhash-js": "^1.0.0",
- "pbf": "^3.2.1",
- "potpack": "^2.0.0",
- "quickselect": "^3.0.0",
- "serialize-to-js": "^3.1.2",
- "supercluster": "^8.0.1",
- "tinyqueue": "^3.0.0",
- "vt-pbf": "^3.1.3"
- }
- },
- "node_modules/marked": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.4.tgz",
- "integrity": "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==",
- "license": "MIT",
- "bin": {
- "marked": "bin/marked.js"
- },
- "engines": {
- "node": ">= 16"
- }
- },
- "node_modules/md-to-react-email": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/md-to-react-email/-/md-to-react-email-5.0.5.tgz",
- "integrity": "sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A==",
- "license": "MIT",
- "dependencies": {
- "marked": "7.0.4"
- },
- "peerDependencies": {
- "react": "^18.0 || ^19.0"
- }
- },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -5104,36 +4447,6 @@
"node": ">=16 || 14 >=14.17"
}
},
- "node_modules/minizlib": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz",
- "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.0.4",
- "rimraf": "^5.0.5"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/mkdirp": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
- "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "dist/cjs/src/bin.js"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/motion": {
"version": "12.4.7",
"resolved": "https://registry.npmjs.org/motion/-/motion-12.4.7.tgz",
@@ -5179,13 +4492,7 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/murmurhash-js": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
- "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/mz": {
@@ -5229,12 +4536,12 @@
}
},
"node_modules/next": {
- "version": "15.1.7",
- "resolved": "https://registry.npmjs.org/next/-/next-15.1.7.tgz",
- "integrity": "sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==",
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.2.0.tgz",
+ "integrity": "sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==",
"license": "MIT",
"dependencies": {
- "@next/env": "15.1.7",
+ "@next/env": "15.2.0",
"@swc/counter": "0.1.3",
"@swc/helpers": "0.5.15",
"busboy": "1.6.0",
@@ -5249,14 +4556,14 @@
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "15.1.7",
- "@next/swc-darwin-x64": "15.1.7",
- "@next/swc-linux-arm64-gnu": "15.1.7",
- "@next/swc-linux-arm64-musl": "15.1.7",
- "@next/swc-linux-x64-gnu": "15.1.7",
- "@next/swc-linux-x64-musl": "15.1.7",
- "@next/swc-win32-arm64-msvc": "15.1.7",
- "@next/swc-win32-x64-msvc": "15.1.7",
+ "@next/swc-darwin-arm64": "15.2.0",
+ "@next/swc-darwin-x64": "15.2.0",
+ "@next/swc-linux-arm64-gnu": "15.2.0",
+ "@next/swc-linux-arm64-musl": "15.2.0",
+ "@next/swc-linux-x64-gnu": "15.2.0",
+ "@next/swc-linux-x64-musl": "15.2.0",
+ "@next/swc-win32-arm64-msvc": "15.2.0",
+ "@next/swc-win32-x64-msvc": "15.2.0",
"sharp": "^0.33.5"
},
"peerDependencies": {
@@ -5320,45 +4627,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "github",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=10.5.0"
- }
- },
- "node_modules/node-fetch": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
- "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/node-fetch"
- }
- },
"node_modules/node-releases": {
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
@@ -5366,18 +4634,18 @@
"license": "MIT"
},
"node_modules/nopt": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
- "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
"license": "ISC",
"dependencies": {
- "abbrev": "^3.0.0"
+ "abbrev": "^2.0.0"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/normalize-path": {
@@ -5399,16 +4667,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/npm-normalize-package-bin": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
- "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -5543,19 +4801,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/pbf": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz",
- "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "ieee754": "^1.1.12",
- "resolve-protobuf-schema": "^2.1.0"
- },
- "bin": {
- "pbf": "bin/pbf"
- }
- },
"node_modules/peberminta": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz",
@@ -5752,16 +4997,10 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"license": "MIT"
},
- "node_modules/potpack": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz",
- "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==",
- "license": "ISC"
- },
"node_modules/prettier": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz",
- "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==",
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz",
+ "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==",
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
@@ -5774,14 +5013,16 @@
}
},
"node_modules/prisma": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.3.1.tgz",
- "integrity": "sha512-JKCZWvBC3enxk51tY4TWzS4b5iRt4sSU1uHn2I183giZTvonXaQonzVtjLzpOHE7qu9MxY510kAtFGJwryKe3Q==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.4.1.tgz",
+ "integrity": "sha512-q2uJkgXnua/jj66mk6P9bX/zgYJFI/jn4Yp0aS6SPRrjH/n6VyOV7RDe1vHD0DX8Aanx4MvgmUPPoYnR6MJnPg==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
- "@prisma/engines": "6.3.1"
+ "@prisma/engines": "6.4.1",
+ "esbuild": ">=0.12 <1",
+ "esbuild-register": "3.6.0"
},
"bin": {
"prisma": "build/index.js"
@@ -5801,61 +5042,12 @@
}
}
},
- "node_modules/prisma-json-types-generator": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/prisma-json-types-generator/-/prisma-json-types-generator-3.2.2.tgz",
- "integrity": "sha512-kvEbJPIP5gxk65KmLs0nAvY+CxpqVMWb4OsEvXlyXZmp2IGfi5f52BUV7ezTYQNjRPZyR4QlayWJXffoqVVAfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@prisma/generator-helper": "6.0.0",
- "tslib": "2.8.1"
- },
- "bin": {
- "prisma-json-types-generator": "index.js"
- },
- "engines": {
- "node": ">=14.0"
- },
- "funding": {
- "url": "https://github.com/arthurfiorette/prisma-json-types-generator?sponsor=1"
- },
- "peerDependencies": {
- "prisma": "^5 || ^6",
- "typescript": "^5.6.2"
- }
- },
- "node_modules/prismjs": {
- "version": "1.29.0",
- "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
- "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/proc-log": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
- "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
"license": "ISC"
},
- "node_modules/protocol-buffers-schema": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
- "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==",
- "license": "MIT"
- },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -5877,12 +5069,6 @@
],
"license": "MIT"
},
- "node_modules/quickselect": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz",
- "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==",
- "license": "ISC"
- },
"node_modules/react": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
@@ -5951,6 +5137,414 @@
"node": ">=18.0.0"
}
},
+ "node_modules/react-email/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
+ "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/android-arm": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz",
+ "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/android-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz",
+ "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/android-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz",
+ "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
+ "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/darwin-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz",
+ "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz",
+ "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz",
+ "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-arm": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz",
+ "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz",
+ "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-ia32": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz",
+ "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-loong64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz",
+ "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz",
+ "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz",
+ "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz",
+ "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-s390x": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz",
+ "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/linux-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz",
+ "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz",
+ "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz",
+ "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz",
+ "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/sunos-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz",
+ "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/win32-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz",
+ "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/win32-ia32": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz",
+ "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-email/node_modules/@esbuild/win32-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz",
+ "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/react-email/node_modules/@next/env": {
"version": "15.1.2",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.2.tgz",
@@ -6120,6 +5714,46 @@
"node": ">=16"
}
},
+ "node_modules/react-email/node_modules/esbuild": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz",
+ "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.23.0",
+ "@esbuild/android-arm": "0.23.0",
+ "@esbuild/android-arm64": "0.23.0",
+ "@esbuild/android-x64": "0.23.0",
+ "@esbuild/darwin-arm64": "0.23.0",
+ "@esbuild/darwin-x64": "0.23.0",
+ "@esbuild/freebsd-arm64": "0.23.0",
+ "@esbuild/freebsd-x64": "0.23.0",
+ "@esbuild/linux-arm": "0.23.0",
+ "@esbuild/linux-arm64": "0.23.0",
+ "@esbuild/linux-ia32": "0.23.0",
+ "@esbuild/linux-loong64": "0.23.0",
+ "@esbuild/linux-mips64el": "0.23.0",
+ "@esbuild/linux-ppc64": "0.23.0",
+ "@esbuild/linux-riscv64": "0.23.0",
+ "@esbuild/linux-s390x": "0.23.0",
+ "@esbuild/linux-x64": "0.23.0",
+ "@esbuild/netbsd-x64": "0.23.0",
+ "@esbuild/openbsd-arm64": "0.23.0",
+ "@esbuild/openbsd-x64": "0.23.0",
+ "@esbuild/sunos-x64": "0.23.0",
+ "@esbuild/win32-arm64": "0.23.0",
+ "@esbuild/win32-ia32": "0.23.0",
+ "@esbuild/win32-x64": "0.23.0"
+ }
+ },
"node_modules/react-email/node_modules/glob": {
"version": "10.3.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz",
@@ -6247,9 +5881,9 @@
}
},
"node_modules/react-email/node_modules/readdirp": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz",
- "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6364,16 +5998,6 @@
"pify": "^2.3.0"
}
},
- "node_modules/read-cmd-shim": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz",
- "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -6435,15 +6059,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/resolve-protobuf-schema": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
- "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
- "license": "MIT",
- "dependencies": {
- "protocol-buffers-schema": "^3.3.1"
- }
- },
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -6466,9 +6081,9 @@
"license": "ISC"
},
"node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6476,22 +6091,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/rimraf": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
- "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^10.3.7"
- },
- "bin": {
- "rimraf": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -6570,15 +6169,6 @@
"node": ">=10"
}
},
- "node_modules/serialize-to-js": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-3.1.2.tgz",
- "integrity": "sha512-owllqNuDDEimQat7EPG0tH7JjO090xKNzUtYz6X+Sk2BXDnOCilDdNLwjWeFywG9xkJul1ULvtUQa9O4pUaY0w==",
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/sharp": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
@@ -6782,6 +6372,16 @@
}
}
},
+ "node_modules/sonner": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.1.tgz",
+ "integrity": "sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -6951,35 +6551,6 @@
"node": ">=16 || 14 >=14.17"
}
},
- "node_modules/supabase": {
- "version": "2.15.8",
- "resolved": "https://registry.npmjs.org/supabase/-/supabase-2.15.8.tgz",
- "integrity": "sha512-yY4kVpdd7x9u5QqTW/8zUXIrMgdkBDGqQwkDugBLe8uoFdH9tVZKt0L5RmuM21RJ0MEQkby2sQrTfiXvgGyx9w==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "bin-links": "^5.0.0",
- "https-proxy-agent": "^7.0.2",
- "node-fetch": "^3.3.2",
- "tar": "7.4.3"
- },
- "bin": {
- "supabase": "bin/supabase"
- },
- "engines": {
- "npm": ">=8"
- }
- },
- "node_modules/supercluster": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz",
- "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==",
- "license": "ISC",
- "dependencies": {
- "kdbush": "^4.0.2"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -7065,34 +6636,6 @@
"tailwindcss": ">=3.0.0 || insiders"
}
},
- "node_modules/tar": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
- "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.0.1",
- "mkdirp": "^3.0.1",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/tar/node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -7116,12 +6659,6 @@
"node": ">=0.8"
}
},
- "node_modules/tinyqueue": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz",
- "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==",
- "license": "ISC"
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -7226,9 +6763,9 @@
"license": "MIT"
},
"node_modules/update-browserslist-db": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
- "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"funding": [
{
"type": "opencollective",
@@ -7335,17 +6872,6 @@
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
}
},
- "node_modules/vt-pbf": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz",
- "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==",
- "license": "MIT",
- "dependencies": {
- "@mapbox/point-geometry": "0.1.0",
- "@mapbox/vector-tile": "^1.3.1",
- "pbf": "^3.2.1"
- }
- },
"node_modules/wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
@@ -7356,16 +6882,6 @@
"defaults": "^1.0.3"
}
},
- "node_modules/web-streams-polyfill": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
- "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -7488,24 +7004,10 @@
"node": ">=8"
}
},
- "node_modules/write-file-atomic": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz",
- "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/ws": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
- "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
diff --git a/sigap-website/package.json b/sigap-website/package.json
index 8ec7a25..d4030eb 100644
--- a/sigap-website/package.json
+++ b/sigap-website/package.json
@@ -10,45 +10,42 @@
"seed": "ts-node prisma/seed.ts"
},
"dependencies": {
- "@hookform/resolvers": "^4.0.0",
- "@prisma/client": "^6.3.1",
+ "@hookform/resolvers": "^4.1.2",
+ "@prisma/client": "^6.4.1",
+ "@radix-ui/react-alert-dialog": "^1.1.6",
"@radix-ui/react-avatar": "^1.1.3",
"@radix-ui/react-checkbox": "^1.1.1",
"@radix-ui/react-collapsible": "^1.1.3",
"@radix-ui/react-dialog": "^1.1.6",
- "@radix-ui/react-dropdown-menu": "^2.1.6",
+ "@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-label": "^2.1.2",
- "@radix-ui/react-popover": "^1.1.6",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.1.2",
"@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-tabs": "^1.1.3",
- "@radix-ui/react-toast": "^1.2.6",
"@radix-ui/react-tooltip": "^1.1.8",
- "@react-email/components": "0.0.33",
"@supabase/ssr": "latest",
"@supabase/supabase-js": "latest",
- "@tabler/icons-react": "^3.30.0",
+ "@tanstack/react-query": "^5.66.9",
"@tanstack/react-table": "^8.21.2",
"autoprefixer": "10.4.20",
- "class-variance-authority": "^0.7.1",
+ "class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"date-fns": "^3.6.0",
- "framer-motion": "^12.4.7",
"input-otp": "^1.4.2",
"lucide-react": "^0.468.0",
- "mapbox-gl": "^3.10.0",
"motion": "^12.4.7",
"next": "latest",
- "next-themes": "^0.4.3",
+ "next-themes": "^0.4.4",
"prettier": "^3.3.3",
- "react": "18.3.1",
+ "react": "^18.3.1",
"react-day-picker": "^8.10.1",
- "react-dom": "18.3.1",
+ "react-dom": "^18.3.1",
"react-hook-form": "^7.54.2",
"resend": "^4.1.2",
+ "sonner": "^2.0.1",
"vaul": "^1.1.2",
"zod": "^3.24.2"
},
@@ -57,24 +54,12 @@
"@types/react": "^19.0.2",
"@types/react-dom": "19.0.2",
"postcss": "8.4.49",
- "prisma": "^6.3.1",
- "prisma-json-types-generator": "^3.2.2",
+ "prisma": "^6.4.1",
"react-email": "3.0.7",
- "supabase": "^2.12.1",
- "tailwind-merge": "^2.6.0",
+ "tailwind-merge": "^2.5.2",
"tailwindcss": "3.4.17",
"tailwindcss-animate": "^1.0.7",
"ts-node": "^10.9.2",
"typescript": "^5.7.2"
- },
- "name": "sigap-website",
- "version": "1.0.0",
- "description": " Next.js and Supabase Starter Kit ",
- "main": "postcss.config.js",
- "directories": {
- "lib": "lib"
- },
- "keywords": [],
- "author": "",
- "license": "ISC"
+ }
}
diff --git a/sigap-website/prisma/data/crime-category.ts b/sigap-website/prisma/data/crime-category.ts
index aad5730..75f5432 100644
--- a/sigap-website/prisma/data/crime-category.ts
+++ b/sigap-website/prisma/data/crime-category.ts
@@ -1,4 +1,3 @@
-import { CrimeCategoryInterface } from "@/src/entities/models/crime-category.model";
const crimeCategories = [
{
diff --git a/sigap-website/prisma/data/nav.ts b/sigap-website/prisma/data/nav.ts
index a1fe123..333a69d 100644
--- a/sigap-website/prisma/data/nav.ts
+++ b/sigap-website/prisma/data/nav.ts
@@ -41,17 +41,17 @@ export const navData = {
teams: [
{
name: "Acme Inc",
- logo: IconAlbum,
+ icon: IconAlbum,
plan: "Enterprise",
},
{
name: "Acme Corp.",
- logo: IconMusicBolt,
+ icon: IconMusicBolt,
plan: "Startup",
},
{
name: "Evil Corp.",
- logo: IconCommand,
+ icon: IconCommand,
plan: "Free",
},
],
diff --git a/sigap-website/prisma/migrations/20250227114657_/migration.sql b/sigap-website/prisma/migrations/20250227114657_/migration.sql
deleted file mode 100644
index 7b1477b..0000000
--- a/sigap-website/prisma/migrations/20250227114657_/migration.sql
+++ /dev/null
@@ -1,224 +0,0 @@
--- CreateExtension
-CREATE EXTENSION IF NOT EXISTS "pgcrypto";
-
--- CreateEnum
-CREATE TYPE "roles" AS ENUM ('admin', 'staff', 'user');
-
--- CreateEnum
-CREATE TYPE "status_contact_messages" AS ENUM ('new', 'read', 'replied', 'resolved');
-
--- CreateEnum
-CREATE TYPE "crime_rates" AS ENUM ('low', 'medium', 'high');
-
--- CreateEnum
-CREATE TYPE "crime_status" AS ENUM ('new', 'in_progress', 'resolved');
-
--- CreateTable
-CREATE TABLE "users" (
- "id" UUID NOT NULL,
- "email" VARCHAR(255) NOT NULL,
- "email_verified" BOOLEAN NOT NULL DEFAULT false,
- "password" VARCHAR(255),
- "first_name" VARCHAR(255),
- "last_name" VARCHAR(255),
- "avatar" VARCHAR(255),
- "role" "roles" NOT NULL DEFAULT 'user',
- "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updated_at" TIMESTAMP(3) NOT NULL,
- "last_signed_in" TIMESTAMP(3),
- "metadata" JSONB,
-
- CONSTRAINT "users_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "profiles" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "user_id" UUID NOT NULL,
- "bio" TEXT,
- "phone" VARCHAR(20),
- "address" VARCHAR(255),
- "city" VARCHAR(100),
- "country" VARCHAR(100),
- "birth_date" TIMESTAMP(3),
-
- CONSTRAINT "profiles_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "contact_messages" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "name" VARCHAR(255),
- "email" VARCHAR(255),
- "phone" VARCHAR(20),
- "message_type" VARCHAR(50),
- "message_type_label" VARCHAR(50),
- "message" TEXT,
- "status" "status_contact_messages" NOT NULL DEFAULT 'new',
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL,
-
- CONSTRAINT "contact_messages_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "cities" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "geographic_id" UUID,
- "name" VARCHAR(100) NOT NULL,
- "code" VARCHAR(10) NOT NULL,
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
-
- CONSTRAINT "cities_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "districts" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "city_id" UUID NOT NULL,
- "name" VARCHAR(100) NOT NULL,
- "code" VARCHAR(10) NOT NULL,
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
-
- CONSTRAINT "districts_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "geographics" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "district_id" UUID,
- "latitude" DOUBLE PRECISION,
- "longitude" DOUBLE PRECISION,
- "land_area" DOUBLE PRECISION,
- "polygon" JSONB,
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
-
- CONSTRAINT "geographics_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "demographics" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "district_id" UUID,
- "city_id" UUID,
- "province_id" UUID,
- "year" INTEGER NOT NULL,
- "population" INTEGER NOT NULL,
- "population_density" DOUBLE PRECISION NOT NULL,
- "poverty_rate" DOUBLE PRECISION NOT NULL,
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
-
- CONSTRAINT "demographics_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "crimes" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "district_id" UUID,
- "city_id" UUID,
- "year" INTEGER NOT NULL,
- "number_of_crime" INTEGER NOT NULL,
- "rate" "crime_rates" NOT NULL DEFAULT 'low',
- "heat_map" JSONB,
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
-
- CONSTRAINT "crimes_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "crime_cases" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "crime_id" UUID,
- "crime_category_id" UUID,
- "date" TIMESTAMPTZ(6) NOT NULL,
- "time" TIMESTAMPTZ(6) NOT NULL,
- "location" VARCHAR(255) NOT NULL,
- "latitude" DOUBLE PRECISION NOT NULL,
- "longitude" DOUBLE PRECISION NOT NULL,
- "description" TEXT NOT NULL,
- "victim_count" INTEGER NOT NULL,
- "status" "crime_status" NOT NULL DEFAULT 'new',
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
-
- CONSTRAINT "crime_cases_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "crime_categories" (
- "id" UUID NOT NULL DEFAULT gen_random_uuid(),
- "name" VARCHAR(255) NOT NULL,
- "description" TEXT NOT NULL,
- "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
- "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(),
-
- CONSTRAINT "crime_categories_pkey" PRIMARY KEY ("id")
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
-
--- CreateIndex
-CREATE INDEX "users_role_idx" ON "users"("role");
-
--- CreateIndex
-CREATE UNIQUE INDEX "profiles_user_id_key" ON "profiles"("user_id");
-
--- CreateIndex
-CREATE INDEX "profiles_user_id_idx" ON "profiles"("user_id");
-
--- CreateIndex
-CREATE INDEX "cities_name_idx" ON "cities"("name");
-
--- CreateIndex
-CREATE INDEX "districts_name_idx" ON "districts"("name");
-
--- CreateIndex
-CREATE UNIQUE INDEX "geographics_district_id_key" ON "geographics"("district_id");
-
--- CreateIndex
-CREATE UNIQUE INDEX "demographics_district_id_year_key" ON "demographics"("district_id", "year");
-
--- CreateIndex
-CREATE UNIQUE INDEX "demographics_city_id_year_key" ON "demographics"("city_id", "year");
-
--- CreateIndex
-CREATE UNIQUE INDEX "crimes_district_id_year_key" ON "crimes"("district_id", "year");
-
--- CreateIndex
-CREATE UNIQUE INDEX "crimes_city_id_year_key" ON "crimes"("city_id", "year");
-
--- AddForeignKey
-ALTER TABLE "profiles" ADD CONSTRAINT "profiles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "cities" ADD CONSTRAINT "cities_geographic_id_fkey" FOREIGN KEY ("geographic_id") REFERENCES "geographics"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "districts" ADD CONSTRAINT "districts_city_id_fkey" FOREIGN KEY ("city_id") REFERENCES "cities"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "geographics" ADD CONSTRAINT "geographics_district_id_fkey" FOREIGN KEY ("district_id") REFERENCES "districts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "demographics" ADD CONSTRAINT "demographics_district_id_fkey" FOREIGN KEY ("district_id") REFERENCES "districts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "demographics" ADD CONSTRAINT "demographics_city_id_fkey" FOREIGN KEY ("city_id") REFERENCES "cities"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "crimes" ADD CONSTRAINT "crimes_district_id_fkey" FOREIGN KEY ("district_id") REFERENCES "districts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "crimes" ADD CONSTRAINT "crimes_city_id_fkey" FOREIGN KEY ("city_id") REFERENCES "cities"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "crime_cases" ADD CONSTRAINT "crime_cases_crime_id_fkey" FOREIGN KEY ("crime_id") REFERENCES "crimes"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "crime_cases" ADD CONSTRAINT "crime_cases_crime_category_id_fkey" FOREIGN KEY ("crime_category_id") REFERENCES "crime_categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
diff --git a/sigap-website/prisma/migrations/20250227123948_sync_custom_users_public_to_auth_user/migration.sql b/sigap-website/prisma/migrations/20250227123948_sync_custom_users_public_to_auth_user/migration.sql
deleted file mode 100644
index 7a44b67..0000000
--- a/sigap-website/prisma/migrations/20250227123948_sync_custom_users_public_to_auth_user/migration.sql
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Warnings:
-
- - You are about to drop the column `last_signed_in` on the `users` table. All the data in the column will be lost.
- - You are about to drop the column `metadata` on the `users` table. All the data in the column will be lost.
- - You are about to drop the column `password` on the `users` table. All the data in the column will be lost.
-
-*/
--- AlterTable
-ALTER TABLE "cities" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "contact_messages" ALTER COLUMN "created_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "crime_cases" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "crime_categories" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "crimes" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "demographics" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "districts" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "geographics" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "users" DROP COLUMN "last_signed_in",
-DROP COLUMN "metadata",
-DROP COLUMN "password",
-ADD COLUMN "banned_until" TIMESTAMP(3),
-ADD COLUMN "confirmation_sent_at" TIMESTAMP(3),
-ADD COLUMN "confirmation_token" VARCHAR(255),
-ADD COLUMN "deleted_at" TIMESTAMP(3),
-ADD COLUMN "email_change" VARCHAR(255),
-ADD COLUMN "email_change_sent_at" TIMESTAMP(3),
-ADD COLUMN "email_change_token" VARCHAR(255),
-ADD COLUMN "email_confirmed_at" TIMESTAMP(3),
-ADD COLUMN "encrypted_password" VARCHAR(255),
-ADD COLUMN "is_anonymous" BOOLEAN DEFAULT false,
-ADD COLUMN "is_sso_user" BOOLEAN DEFAULT false,
-ADD COLUMN "last_sign_in_at" TIMESTAMP(3),
-ADD COLUMN "phone" VARCHAR(20),
-ADD COLUMN "phone_confirmed_at" TIMESTAMP(3),
-ADD COLUMN "providers" TEXT[] DEFAULT ARRAY[]::TEXT[],
-ADD COLUMN "raw_app_meta_data" JSONB,
-ADD COLUMN "raw_user_meta_data" JSONB,
-ADD COLUMN "reauthentication_sent_at" TIMESTAMP(3),
-ADD COLUMN "reauthentication_token" VARCHAR(255),
-ADD COLUMN "recovery_sent_at" TIMESTAMP(3),
-ADD COLUMN "recovery_token" VARCHAR(255);
diff --git a/sigap-website/prisma/migrations/20250227125002_sync_custom_users_public_to_auth_user/migration.sql b/sigap-website/prisma/migrations/20250227125002_sync_custom_users_public_to_auth_user/migration.sql
deleted file mode 100644
index a09b5fd..0000000
--- a/sigap-website/prisma/migrations/20250227125002_sync_custom_users_public_to_auth_user/migration.sql
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- Warnings:
-
- - The `providers` column on the `users` table would be dropped and recreated. This will lead to data loss if there is data in the column.
-
-*/
--- AlterTable
-ALTER TABLE "cities" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "contact_messages" ALTER COLUMN "created_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "crime_cases" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "crime_categories" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "crimes" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "demographics" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "districts" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "geographics" ALTER COLUMN "created_at" SET DEFAULT now(),
-ALTER COLUMN "updated_at" SET DEFAULT now();
-
--- AlterTable
-ALTER TABLE "users" DROP COLUMN "providers",
-ADD COLUMN "providers" JSONB DEFAULT '[]';
diff --git a/sigap-website/prisma/migrations/migration_lock.toml b/sigap-website/prisma/migrations/migration_lock.toml
deleted file mode 100644
index 648c57f..0000000
--- a/sigap-website/prisma/migrations/migration_lock.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Please do not edit this file manually
-# It should be added in your version-control system (e.g., Git)
-provider = "postgresql"
\ No newline at end of file
diff --git a/sigap-website/prisma/schema.prisma b/sigap-website/prisma/schema.prisma
index 4ce83be..48f3295 100644
--- a/sigap-website/prisma/schema.prisma
+++ b/sigap-website/prisma/schema.prisma
@@ -1,9 +1,3 @@
-// This is your Prisma schema file,
-// learn more about it in the docs: https://pris.ly/d/prisma-schema
-
-// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
-// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
-
generator client {
provider = "prisma-client-js"
previewFeatures = ["postgresqlExtensions"]
@@ -13,228 +7,198 @@ datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
- extensions = [pgcrypto]
+ extensions = [pgcrypto, uuid_ossp(map: "uuid-ossp", schema: "extensions")]
}
-model User {
- id String @id @db.Uuid
- email String @unique @db.VarChar(255)
- emailVerified Boolean @default(false) @map("email_verified")
- encryptedPassword String? @map("encrypted_password") @db.VarChar(255)
- firstName String? @map("first_name") @db.VarChar(255)
- lastName String? @map("last_name") @db.VarChar(255)
- avatar String? @db.VarChar(255)
- role Role @default(user)
- createdAt DateTime @default(now()) @map("created_at")
- updatedAt DateTime @updatedAt @map("updated_at")
- lastSignedIn DateTime? @map("last_sign_in_at")
- phone String? @db.VarChar(20)
- phoneConfirmedAt DateTime? @map("phone_confirmed_at")
- emailConfirmedAt DateTime? @map("email_confirmed_at")
- confirmationToken String? @map("confirmation_token") @db.VarChar(255)
- confirmationSentAt DateTime? @map("confirmation_sent_at")
- recoveryToken String? @map("recovery_token") @db.VarChar(255)
- recoverySentAt DateTime? @map("recovery_sent_at")
- emailChangeToken String? @map("email_change_token") @db.VarChar(255)
- emailChange String? @map("email_change") @db.VarChar(255)
- emailChangeSentAt DateTime? @map("email_change_sent_at")
- reauthenticationToken String? @map("reauthentication_token") @db.VarChar(255)
- reauthenticationSentAt DateTime? @map("reauthentication_sent_at")
- isAnonymous Boolean? @default(false) @map("is_anonymous")
- providers Json? @default("[]")
- rawAppMetadata Json? @map("raw_app_meta_data")
- rawUserMetadata Json? @map("raw_user_meta_data")
- bannedUntil DateTime? @map("banned_until")
- deletedAt DateTime? @map("deleted_at")
- isSsoUser Boolean? @default(false) @map("is_sso_user")
+model cities {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ geographic_id String? @db.Uuid
+ name String @db.VarChar(100)
+ code String @db.VarChar(10)
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ geographics geographics? @relation(fields: [geographic_id], references: [id])
+ crimes crimes[]
+ demographics demographics[]
+ districts districts[]
- profile Profile?
+ @@index([name])
+}
+
+model contact_messages {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ name String? @db.VarChar(255)
+ email String? @db.VarChar(255)
+ phone String? @db.VarChar(20)
+ message_type String? @db.VarChar(50)
+ message_type_label String? @db.VarChar(50)
+ message String?
+ status status_contact_messages @default(new)
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @db.Timestamptz(6)
+}
+
+model crime_cases {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ crime_id String? @db.Uuid
+ crime_category_id String? @db.Uuid
+ date DateTime @db.Timestamptz(6)
+ time DateTime @db.Timestamptz(6)
+ location String @db.VarChar(255)
+ latitude Float
+ longitude Float
+ description String
+ victim_count Int
+ status crime_status @default(new)
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ crime_categories crime_categories? @relation(fields: [crime_category_id], references: [id])
+ crimes crimes? @relation(fields: [crime_id], references: [id])
+}
+
+model crime_categories {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ name String @db.VarChar(255)
+ description String
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ crime_cases crime_cases[]
+}
+
+model crimes {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ district_id String? @db.Uuid
+ city_id String? @db.Uuid
+ year Int
+ number_of_crime Int
+ rate crime_rates @default(low)
+ heat_map Json?
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ crime_cases crime_cases[]
+ cities cities? @relation(fields: [city_id], references: [id])
+ districts districts? @relation(fields: [district_id], references: [id])
+
+ @@unique([city_id, year])
+ @@unique([district_id, year])
+}
+
+model demographics {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ district_id String? @db.Uuid
+ city_id String? @db.Uuid
+ province_id String? @db.Uuid
+ year Int
+ population Int
+ population_density Float
+ poverty_rate Float
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ cities cities? @relation(fields: [city_id], references: [id])
+ districts districts? @relation(fields: [district_id], references: [id])
+
+ @@unique([city_id, year])
+ @@unique([district_id, year])
+}
+
+model districts {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ city_id String @db.Uuid
+ name String @db.VarChar(100)
+ code String @db.VarChar(10)
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ crimes crimes[]
+ demographics demographics[]
+ cities cities @relation(fields: [city_id], references: [id], onDelete: Cascade)
+ geographics geographics?
+
+ @@index([name])
+}
+
+model geographics {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ district_id String? @unique @db.Uuid
+ latitude Float?
+ longitude Float?
+ land_area Float?
+ polygon Json?
+ created_at DateTime @default(now()) @db.Timestamptz(6)
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
+ cities cities[]
+ districts districts? @relation(fields: [district_id], references: [id])
+}
+
+model profiles {
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
+ user_id String @unique @db.Uuid
+ bio String?
+ address String? @db.VarChar(255)
+ city String? @db.VarChar(100)
+ country String? @db.VarChar(100)
+ birth_date DateTime?
+ users users @relation(fields: [user_id], references: [id])
+
+ @@index([user_id])
+}
+
+model users {
+ id String @id @db.Uuid
+ email String @unique @db.VarChar(255)
+ email_verified Boolean @default(false)
+ first_name String? @db.VarChar(255)
+ last_name String? @db.VarChar(255)
+ avatar String? @db.VarChar(255)
+ role roles @default(user)
+ created_at DateTime @default(now())
+ updated_at DateTime
+ banned_until DateTime?
+ confirmation_sent_at DateTime?
+ confirmation_token String? @db.VarChar(255)
+ deleted_at DateTime?
+ email_change String? @db.VarChar(255)
+ email_change_sent_at DateTime?
+ email_change_token String? @db.VarChar(255)
+ email_confirmed_at DateTime?
+ encrypted_password String? @db.VarChar(255)
+ is_anonymous Boolean? @default(false)
+ is_sso_user Boolean? @default(false)
+ last_sign_in_at DateTime?
+ phone String? @db.VarChar(20)
+ phone_confirmed_at DateTime?
+ raw_app_meta_data Json?
+ raw_user_meta_data Json?
+ reauthentication_sent_at DateTime?
+ reauthentication_token String? @db.VarChar(255)
+ recovery_sent_at DateTime?
+ recovery_token String? @db.VarChar(255)
+ providers Json? @default("[]")
+ profiles profiles?
@@index([role])
- @@map("users")
}
-model Profile {
- id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- userId String @unique @map("user_id") @db.Uuid
- bio String? @db.Text
- phone String? @db.VarChar(20)
- address String? @db.VarChar(255)
- city String? @db.VarChar(100)
- country String? @db.VarChar(100)
- birthDate DateTime? @map("birth_date")
- user User @relation(fields: [userId], references: [id])
-
- @@index([userId])
- @@map("profiles") // Maps to Supabase's 'profiles' table
+enum crime_rates {
+ low
+ medium
+ high
}
-model SupportRequest {
- id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
- name String? @db.VarChar(255)
- email String? @db.VarChar(255)
- phone String? @db.VarChar(20)
- messageType String? @map("message_type") @db.VarChar(50)
- messageTypeLabel String? @map("message_type_label") @db.VarChar(50)
- message String? @db.Text
- status StatusSupportRequest @default(new)
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- @@map("contact_messages") // Maps to Supabase's 'contact_messages' table
+enum crime_status {
+ new
+ in_progress
+ resolved
}
-model City {
- id String @id @default(dbgenerated("gen_random_uuid()")) @map("id") @db.Uuid
- geographicId String? @map("geographic_id") @db.Uuid
- name String @map("name") @db.VarChar(100)
- code String @map("code") @db.VarChar(10)
- demographics Demographic[]
- crimes Crime[]
- districts District[]
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @default(dbgenerated("now()")) @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- geographic Geographic? @relation(fields: [geographicId], references: [id])
-
- @@index([name])
- @@map("cities")
-}
-
-model District {
- id String @id @default(dbgenerated("gen_random_uuid()")) @map("id") @db.Uuid
- cityId String @map("city_id") @db.Uuid
- name String @map("name") @db.VarChar(100)
- code String @map("code") @db.VarChar(10)
- geographic Geographic?
- demographics Demographic[]
- crimes Crime[]
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @default(dbgenerated("now()")) @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- city City @relation(fields: [cityId], references: [id], onDelete: Cascade)
-
- @@index([name])
- @@map("districts")
-}
-
-model Geographic {
- id String @id @default(dbgenerated("gen_random_uuid()")) @map("id") @db.Uuid
- districtId String? @unique @map("district_id") @db.Uuid
- latitude Float? @map("latitude")
- longitude Float? @map("longitude")
- landArea Float? @map("land_area")
- polygon Json? @map("polygon")
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @default(dbgenerated("now()")) @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- district District? @relation(fields: [districtId], references: [id])
- cities City[]
-
- @@map("geographics")
-}
-
-model Demographic {
- id String @id @default(dbgenerated("gen_random_uuid()")) @map("id") @db.Uuid
- districtId String? @map("district_id") @db.Uuid
- cityId String? @map("city_id") @db.Uuid
- provinceId String? @map("province_id") @db.Uuid
- year Int @map("year")
- population Int @map("population")
- populationDensity Float @map("population_density")
- povertyRate Float @map("poverty_rate")
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @default(dbgenerated("now()")) @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- district District? @relation(fields: [districtId], references: [id])
- city City? @relation(fields: [cityId], references: [id])
-
- @@unique([districtId, year])
- @@unique([cityId, year])
- @@map("demographics")
-}
-
-model Crime {
- id String @id @default(dbgenerated("gen_random_uuid()")) @map("id") @db.Uuid
- districtId String? @map("district_id") @db.Uuid
- cityId String? @map("city_id") @db.Uuid
- year Int @map("year")
- numberOfCrime Int @map("number_of_crime")
- rate CrimeRate @default(low) @map("rate")
- heatMap Json? @map("heat_map")
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @default(dbgenerated("now()")) @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- district District? @relation(fields: [districtId], references: [id])
- city City? @relation(fields: [cityId], references: [id])
- crimeCases CrimeCase[]
-
- @@unique([districtId, year])
- @@unique([cityId, year])
- @@map("crimes")
-}
-
-model CrimeCase {
- id String @id @default(dbgenerated("gen_random_uuid()")) @map("id") @db.Uuid
- crimeId String? @map("crime_id") @db.Uuid
- crimeCategoryId String? @map("crime_category_id") @db.Uuid
- date DateTime @map("date") @db.Timestamptz(6)
- time DateTime @map("time") @db.Timestamptz(6)
- location String @map("location") @db.VarChar(255)
- latitude Float @map("latitude")
- longitude Float @map("longitude")
- description String @map("description") @db.Text
- victimCount Int @map("victim_count")
- status CrimeStatus @default(new) @map("status")
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @default(dbgenerated("now()")) @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- crime Crime? @relation(fields: [crimeId], references: [id])
- crimeCategory CrimeCategory? @relation(fields: [crimeCategoryId], references: [id])
-
- @@map("crime_cases")
-}
-
-model CrimeCategory {
- id String @id @default(dbgenerated("gen_random_uuid()")) @map("id") @db.Uuid
- name String @map("name") @db.VarChar(255)
- description String @map("description") @db.Text
- crimeCases CrimeCase[]
- createdAt DateTime @default(dbgenerated("now()")) @map("created_at") @db.Timestamptz(6)
- updatedAt DateTime @default(dbgenerated("now()")) @updatedAt @map("updated_at") @db.Timestamptz(6)
-
- @@map("crime_categories")
-}
-
-enum Role {
+enum roles {
admin
staff
user
-
- @@map("roles")
}
-enum StatusSupportRequest {
+enum status_contact_messages {
new
read
replied
resolved
-
- @@map("status_contact_messages")
-}
-
-enum CrimeRate {
- low
- medium
- high
-
- @@map("crime_rates")
-}
-
-enum CrimeStatus {
- new
- inProgress @map("in_progress")
- resolved
-
- @@map("crime_status")
}
diff --git a/sigap-website/prisma/seed.ts b/sigap-website/prisma/seed.ts
deleted file mode 100644
index 8e6308b..0000000
--- a/sigap-website/prisma/seed.ts
+++ /dev/null
@@ -1,298 +0,0 @@
-const crimeCategories = require("../data/crime-category");
-
-const { PrismaClient } = require("@prisma/client");
-const prisma = new PrismaClient();
-// Navigation data structure
-// const navItemDatas = [
-// {
-// title: "Dashboard",
-// url: "/dashboard",
-// slug: "dashboard",
-// orderSeq: 1,
-// icon: "IconHome",
-// isActive: true,
-// subItems: [],
-// },
-// {
-// title: "Crime Management",
-// url: "/crime-management",
-// slug: "crime-management",
-// orderSeq: 2,
-// icon: "IconAlertTriangle",
-// isActive: true,
-// subItems: [
-// {
-// title: "Crime Overview",
-// url: "/crime-management/crime-overview",
-// slug: "crime-overview",
-// icon: "IconAlertTriangle",
-// orderSeq: 1,
-// isActive: true,
-// },
-// {
-// title: "Crime Categories",
-// url: "/crime-management/crime-categories",
-// slug: "crime-categories",
-// icon: "IconSettings",
-// orderSeq: 2,
-// isActive: true,
-// },
-// {
-// title: "Cases",
-// url: "/crime-management/crime-cases",
-// slug: "crime-cases",
-// icon: "IconAlertTriangle",
-// orderSeq: 3,
-// isActive: true,
-// subItems: [
-// {
-// title: "New Case",
-// url: "/crime-management/crime-cases/case-new",
-// slug: "new-case",
-// icon: "IconAlertTriangle",
-// orderSeq: 1,
-// isActive: true,
-// },
-// {
-// title: "Active Cases",
-// url: "/crime-management/crime-cases/case-active",
-// slug: "active-cases",
-// icon: "IconAlertTriangle",
-// orderSeq: 2,
-// isActive: true,
-// },
-// {
-// title: "Resolved Cases",
-// url: "/crime-management/crime-cases/case-closed",
-// slug: "resolved-cases",
-// icon: "IconAlertTriangle",
-// orderSeq: 3,
-// isActive: true,
-// },
-// ],
-// },
-// ],
-// },
-// {
-// title: "Geographic Data",
-// url: "/geographic-data",
-// slug: "geographic-data",
-// orderSeq: 3,
-// icon: "IconMap",
-// isActive: true,
-// subItems: [
-// {
-// title: "Locations",
-// url: "/geographic-data/locations",
-// slug: "locations",
-// icon: "IconMap",
-// orderSeq: 1,
-// isActive: true,
-// subItems: [
-// {
-// title: "Cities",
-// url: "/geographic-data/cities",
-// slug: "cities",
-// icon: "IconMap",
-// orderSeq: 1,
-// isActive: true,
-// },
-// {
-// title: "Districts",
-// url: "/geographic-data/districts",
-// slug: "districts",
-// icon: "IconMap",
-// orderSeq: 2,
-// isActive: true,
-// },
-// ],
-// },
-// {
-// title: "Geographic Info",
-// url: "/geographic-data/geographic-info",
-// slug: "geographic-info",
-// icon: "IconMap",
-// orderSeq: 3,
-// isActive: true,
-// },
-// ],
-// },
-// {
-// title: "Demographics",
-// url: "/demographics",
-// slug: "demographics",
-// orderSeq: 4,
-// icon: "IconDatabase",
-// isActive: true,
-// subItems: [
-// {
-// title: "Demographics Data",
-// url: "/demographics/demographics-data",
-// slug: "demographics-data",
-// icon: "IconDatabase",
-// orderSeq: 1,
-// isActive: true,
-// },
-// ],
-// },
-// {
-// title: "User Management",
-// url: "/user-management",
-// slug: "user-management",
-// orderSeq: 5,
-// icon: "IconUsers",
-// isActive: true,
-// subItems: [
-// {
-// title: "Users",
-// url: "/user-management/users",
-// slug: "users",
-// icon: "IconUsers",
-// orderSeq: 1,
-// isActive: true,
-// },
-// ],
-// },
-// {
-// title: "Communication",
-// url: "/communication",
-// slug: "communication",
-// orderSeq: 6,
-// icon: "IconMessageCircle",
-// isActive: true,
-// subItems: [
-// {
-// title: "Contact Messages",
-// url: "/communication/contact-messages",
-// slug: "contact-messages",
-// icon: "IconMessageCircle",
-// orderSeq: 1,
-// isActive: true,
-// },
-// ],
-// },
-// {
-// title: "Settings",
-// url: "/settings",
-// slug: "settings",
-// orderSeq: 7,
-// icon: "IconSettings",
-// isActive: true,
-// subItems: [
-// {
-// title: "Navigation",
-// url: "/settings/navigation",
-// slug: "navigation",
-// icon: "IconMenu2",
-// orderSeq: 1,
-// isActive: true,
-// subItems: [
-// {
-// title: "Nav Items",
-// url: "/settings/navigation/nav-items",
-// slug: "nav-items",
-// icon: "IconMenu2",
-// orderSeq: 1,
-// isActive: true,
-// subSubItems: [
-// {
-// title: "Nav Sub Items",
-// url: "/settings/navigation/nav-sub-items",
-// slug: "nav-sub-items",
-// icon: "IconMenu2",
-// orderSeq: 1,
-// isActive: true,
-// },
-// ],
-// },
-// ],
-// },
-// ],
-// },
-// ];
-
-// // Helper function to create path
-// const createPath = (currentPath: string, orderSeq: number): string => {
-// return currentPath ? `${currentPath}.${orderSeq}` : `${orderSeq}`;
-// };
-
-// // Helper function to calculate level from path
-// const calculateLevel = (path: string): number => {
-// return path.split(".").length - 1;
-// };
-
-// // Helper function to process navigation items recursively
-// const processNavigationItems = (
-// items: any[],
-// parentPath: string = ""
-// ): any[] => {
-// const processed: any[] = [];
-
-// items.forEach((item) => {
-// const currentPath = createPath(parentPath, item.orderSeq);
-
-// const navigationItem = {
-// title: item.title,
-// url: item.url,
-// slug: item.slug,
-// icon: item.icon,
-// path: currentPath,
-// level: calculateLevel(currentPath),
-// isActive: item.isActive,
-// orderSeq: item.orderSeq,
-// };
-
-// processed.push(navigationItem);
-
-// // Process subItems if they exist
-// if (item.subItems && item.subItems.length > 0) {
-// const subItems = processNavigationItems(item.subItems, currentPath);
-// processed.push(...subItems);
-// }
-
-// // Process subSubItems if they exist (for backward compatibility)
-// if (item.subSubItems && item.subSubItems.length > 0) {
-// const subSubItems = processNavigationItems(item.subSubItems, currentPath);
-// processed.push(...subSubItems);
-// }
-// });
-
-// return processed;
-// };
-
-function toTitleCase(text: string): string {
- return text
- .toLowerCase()
- .split(" ")
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
- .join(" ");
-}
-
-async function main() {
- // Transform the data to title case
- const transformedData = crimeCategories.map(
- (category: { name: string; description: string }) => ({
- name: toTitleCase(category.name),
- description: category.description,
- })
- );
-
- console.log(`Start seeding crime categories...`);
-
- // Use createMany for better performance
- await prisma.crimeCategory.createMany({
- data: transformedData,
- skipDuplicates: true, // Skip any duplicate records
- });
-
- console.log(`Seeding crime categories completed.`);
-}
-
-main()
- .catch((e) => {
- console.error(e);
- process.exit(1);
- })
- .finally(async () => {
- await prisma.$disconnect();
- });
diff --git a/sigap-website/providers/react-query-provider.tsx b/sigap-website/providers/react-query-provider.tsx
new file mode 100644
index 0000000..f452338
--- /dev/null
+++ b/sigap-website/providers/react-query-provider.tsx
@@ -0,0 +1,14 @@
+"use client";
+
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { useState } from "react";
+
+const ReactQueryProvider = ({ children }: { children: React.ReactNode }) => {
+ const [queryClient] = useState(() => new QueryClient());
+
+ return (
+ {children}
+ );
+};
+
+export default ReactQueryProvider;
diff --git a/sigap-website/shadcn-ui.json b/sigap-website/shadcn-ui.json
deleted file mode 100644
index 3534563..0000000
--- a/sigap-website/shadcn-ui.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ui": "@/app/_components/ui",
- "components": "@/app/_components"
-}
diff --git a/sigap-website/src/application/repositories/contact-us.repository.ts b/sigap-website/src/application/repositories/contact-us.repository.ts
deleted file mode 100644
index 3af4065..0000000
--- a/sigap-website/src/application/repositories/contact-us.repository.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import {
- ContactUs,
- ContactUsInsert,
- ContactUsResponse,
-} from "../../entities/models/contact-us.model";
-
-export interface ContactUsRepository {
- createContactUs(contact: ContactUsInsert): Promise;
-}
diff --git a/sigap-website/src/application/repositories/nav-items.repository.ts b/sigap-website/src/application/repositories/nav-items.repository.ts
deleted file mode 100644
index 8c60f1f..0000000
--- a/sigap-website/src/application/repositories/nav-items.repository.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {
- NavItemsDelete,
- NavItemsGet,
- NavItemsInsert,
- NavItemsResponse,
- NavItemsUpdate,
-} from "../../entities/models/nav-items.model";
-
-export interface NavItemsRepository {
- getNavItems(): Promise;
- createNavItems(navItems: NavItemsInsert): Promise;
- updateNavItems(
- id: string,
- navItems: NavItemsUpdate
- ): Promise;
- deleteNavItems(id: string): Promise;
-}
diff --git a/sigap-website/src/application/repositories/navigation-item.repository.ts b/sigap-website/src/application/repositories/navigation-item.repository.ts
deleted file mode 100644
index 8fe2649..0000000
--- a/sigap-website/src/application/repositories/navigation-item.repository.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import {
- CreateNavigationItemDTO,
- NavigationItem,
- UpdateNavigationItemDTO,
-} from "../../entities/models/navigation-item.model";
-
-export interface NavigationRepository {
- findAll(): Promise;
- findById(id: string): Promise;
- findByPath(path: string): Promise;
- create(data: CreateNavigationItemDTO): Promise;
- update(id: string, data: UpdateNavigationItemDTO): Promise;
- delete(id: string): Promise;
- reorder(items: { id: string; orderSeq: number }[]): Promise;
-}
diff --git a/sigap-website/src/application/repositories/signin.repository.ts b/sigap-website/src/application/repositories/signin.repository.ts
deleted file mode 100644
index 32c84dd..0000000
--- a/sigap-website/src/application/repositories/signin.repository.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import {
- SignInResponse,
- SignInWithOtp,
-} from "../../entities/models/users.model";
-
-export interface SignInRepository {
- signInWithPasswordless(email: SignInWithOtp): Promise;
-}
diff --git a/sigap-website/src/application/repositories/users.repository.interface.ts b/sigap-website/src/application/repositories/users.repository.interface.ts
deleted file mode 100644
index 1094649..0000000
--- a/sigap-website/src/application/repositories/users.repository.interface.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { ITransaction } from "@/src/entities/models/transaction.interface.model";
-import { CreateUser, User } from "@/src/entities/models/users.model";
-
-export interface IUsersRepository {
- getUserById(id: string): Promise;
- getUserByUsername(username: string): Promise;
- getUserByEmail(email: string): Promise;
- createUser(input: CreateUser, tx?: ITransaction): Promise;
-}
diff --git a/sigap-website/src/application/services/authentication.service.interface.ts b/sigap-website/src/application/services/authentication.service.interface.ts
deleted file mode 100644
index a5f9ddd..0000000
--- a/sigap-website/src/application/services/authentication.service.interface.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-// src/application/services/authentication.service.interface.ts
-import { User } from "@/src/entities/models/users.model";
-
-export interface IAuthenticationService {
- signIn(email: string, password: string): Promise;
- signOut(): Promise;
- requestOtp(email: string): Promise;
- verifyOtp(email: string, token: string): Promise;
- requestMagicLink(email: string, redirectTo?: string): Promise;
-// getSession(): Promise;
-// validateCurrentSession(): Promise<{ user: User } | null>;
-}
\ No newline at end of file
diff --git a/sigap-website/src/application/services/crash-reporter.service.interface.ts b/sigap-website/src/application/services/crash-reporter.service.interface.ts
deleted file mode 100644
index b94f6b7..0000000
--- a/sigap-website/src/application/services/crash-reporter.service.interface.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export interface ICrashReporterService {
- report(error: any): string;
- }
\ No newline at end of file
diff --git a/sigap-website/src/application/services/instrumentation.service.interface.ts b/sigap-website/src/application/services/instrumentation.service.interface.ts
deleted file mode 100644
index 3628f48..0000000
--- a/sigap-website/src/application/services/instrumentation.service.interface.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export interface IInstrumentationService {
- startSpan(
- options: { name: string; op?: string; attributes?: Record },
- callback: () => T
- ): T;
- instrumentServerAction(
- name: string,
- options: Record,
- callback: () => T
- ): Promise;
-}
diff --git a/sigap-website/src/application/services/transaction-manager.service.interface.ts b/sigap-website/src/application/services/transaction-manager.service.interface.ts
deleted file mode 100644
index 7c19fd7..0000000
--- a/sigap-website/src/application/services/transaction-manager.service.interface.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { ITransaction } from "@/src/entities/models/transaction.interface.model";
-
-export interface ITransactionManagerService {
- startTransaction(
- clb: (tx: ITransaction) => Promise,
- parent?: ITransaction
- ): Promise;
-}
diff --git a/sigap-website/src/application/usecases/auth/request-magic-link.use-case.ts.ts b/sigap-website/src/application/usecases/auth/request-magic-link.use-case.ts.ts
deleted file mode 100644
index 36ef743..0000000
--- a/sigap-website/src/application/usecases/auth/request-magic-link.use-case.ts.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// src/application/usecases/auth/request-magic-link.use-case.ts
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import type { IAuthenticationService } from "@/src/application/services/authentication.service.interface";
-
-export type IRequestMagicLinkUseCase = ReturnType<
- typeof requestMagicLinkUseCase
->;
-
-export const requestMagicLinkUseCase =
- (
- instrumentationService: IInstrumentationService,
- authService: IAuthenticationService
- ) =>
- async (input: { email: string; redirectTo?: string }): Promise => {
- return instrumentationService.startSpan(
- { name: "requestMagicLink Use Case", op: "function" },
- async () => {
- // Request magic link via auth service
- await authService.requestMagicLink(input.email, input.redirectTo);
- }
- );
- };
diff --git a/sigap-website/src/application/usecases/auth/request-otp.use-case.ts b/sigap-website/src/application/usecases/auth/request-otp.use-case.ts
deleted file mode 100644
index d99a1f2..0000000
--- a/sigap-website/src/application/usecases/auth/request-otp.use-case.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import type { IUsersRepository } from "@/src/application/repositories/users.repository.interface";
-import type { IAuthenticationService } from "@/src/application/services/authentication.service.interface";
-
-export type IRequestOtpUseCase = ReturnType;
-
-export const requestOtpUseCase =
- (
- instrumentationService: IInstrumentationService,
- usersRepository: IUsersRepository,
- authService: IAuthenticationService
- ) =>
- async (input: { email: string }): Promise => {
- return instrumentationService.startSpan(
- { name: "requestOtp Use Case", op: "function" },
- async () => {
- // Optionally check if user exists before requesting OTP
- // const existingUser = await usersRepository.getUserByEmail(input.email);
-
- // If you want to handle new users differently, you can check here
- // For security reasons, some implementations don't reveal if a user exists
- // and just process the request anyway to prevent email enumeration attacks
-
- // Request OTP via auth service
- await authService.requestOtp(input.email);
- }
- );
- };
diff --git a/sigap-website/src/application/usecases/auth/sign-in.use-case.ts b/sigap-website/src/application/usecases/auth/sign-in.use-case.ts
deleted file mode 100644
index f9461fb..0000000
--- a/sigap-website/src/application/usecases/auth/sign-in.use-case.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-// sign-in.use-case.ts
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import type { IUsersRepository } from "@/src/application/repositories/users.repository.interface";
-import type { IAuthenticationService } from "@/src/application/services/authentication.service.interface";
-import { User } from "@/src/entities/models/users.model";
-
-export type ISignInUseCase = ReturnType;
-
-export const signInUseCase =
- (
- instrumentationService: IInstrumentationService,
- usersRepository: IUsersRepository,
- authService: IAuthenticationService
- ) =>
- async (input: { email: string; password: string }): Promise => {
- return instrumentationService.startSpan(
- { name: "signIn Use Case", op: "function" },
- async () => {
- // Validate existing user
- const existingUser = await usersRepository.getUserByEmail(input.email);
-
- if (!existingUser) {
- throw new Error("User not found");
- }
-
- // Let the auth service handle the Supabase authentication
- await authService.signIn(input.email, input.password);
- }
- );
- };
diff --git a/sigap-website/src/application/usecases/auth/sign-out.use-case.ts b/sigap-website/src/application/usecases/auth/sign-out.use-case.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/sigap-website/src/application/usecases/auth/sign-up.use-case.ts b/sigap-website/src/application/usecases/auth/sign-up.use-case.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/sigap-website/src/application/usecases/auth/verify-otp.use-case.ts b/sigap-website/src/application/usecases/auth/verify-otp.use-case.ts
deleted file mode 100644
index 5c336ef..0000000
--- a/sigap-website/src/application/usecases/auth/verify-otp.use-case.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-// src/application/usecases/auth/verify-otp.use-case.ts
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import type { IUsersRepository } from "@/src/application/repositories/users.repository.interface";
-import type { IAuthenticationService } from "@/src/application/services/authentication.service.interface";
-import { User } from "@/src/entities/models/users.model";
-
-export type IVerifyOtpUseCase = ReturnType;
-
-export const verifyOtpUseCase =
- (
- instrumentationService: IInstrumentationService,
- usersRepository: IUsersRepository,
- authService: IAuthenticationService
- ) =>
- async (input: { email: string; otp: string }): Promise => {
- return instrumentationService.startSpan(
- { name: "verifyOtp Use Case", op: "function" },
- async () => {
- // Verify OTP via auth service
- await authService.verifyOtp(input.email, input.otp);
- }
- );
- };
diff --git a/sigap-website/src/application/usecases/auth/verify-session.use-case.ts b/sigap-website/src/application/usecases/auth/verify-session.use-case.ts
deleted file mode 100644
index 0f1651c..0000000
--- a/sigap-website/src/application/usecases/auth/verify-session.use-case.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-// // src/application/usecases/auth/verify-session.use-case.ts
-// import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-// import type { IUsersRepository } from "@/src/application/repositories/users.repository.interface";
-// import type { IAuthenticationService } from "@/src/application/services/authentication.service.interface";
-// import { User } from "@/src/entities/models/users.model";
-
-// export type IVerifySessionUseCase = ReturnType;
-
-// export const verifySessionUseCase =
-// (
-// instrumentationService: IInstrumentationService,
-// usersRepository: IUsersRepository,
-// authService: IAuthenticationService
-// ) =>
-// async (): Promise => {
-// return instrumentationService.startSpan(
-// { name: "verifySession Use Case", op: "function" },
-// async () => {
-// // Verify the current session
-// const session = await authService.validateCurrentSession();
-
-// // No active session
-// if (!session) {
-// return null;
-// }
-
-// // User from session
-// const { user } = session;
-
-// return user;
-// }
-// );
-// };
diff --git a/sigap-website/src/application/usecases/contact-us.usecase.ts b/sigap-website/src/application/usecases/contact-us.usecase.ts
deleted file mode 100644
index a2b20bd..0000000
--- a/sigap-website/src/application/usecases/contact-us.usecase.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import {
- ContactUs,
- ContactUsInsert,
- ContactUsResponse,
-} from "../../entities/models/contact-us.model";
-import { ContactUsRepository } from "../repositories/contact-us.repository";
-
-export class CreateContactUseCase {
- constructor(private contactRepository: ContactUsRepository) {}
-
- async execute(contact: ContactUsInsert): Promise {
- return this.contactRepository.createContactUs(contact);
- }
-}
diff --git a/sigap-website/src/application/usecases/nav-items.usecase.ts b/sigap-website/src/application/usecases/nav-items.usecase.ts
deleted file mode 100644
index 8173e3b..0000000
--- a/sigap-website/src/application/usecases/nav-items.usecase.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import {
- NavItemsDelete,
- NavItemsGet,
- NavItemsInsert,
- NavItemsResponse,
- NavItemsUpdate,
-} from "../../entities/models/nav-items.model";
-import { NavItemsRepository } from "../repositories/nav-items.repository";
-
-export class NavItemsUseCase {
- constructor(private navItemsRepository: NavItemsRepository) {}
-
- async executeGetNavItems(): Promise {
- return this.navItemsRepository.getNavItems();
- }
-
- async executeCreateNavItems(
- navItems: NavItemsInsert
- ): Promise {
- return this.navItemsRepository.createNavItems(navItems);
- }
-
- async executeUpdateNavItems(
- id: string,
- navItems: NavItemsUpdate
- ): Promise {
- return this.navItemsRepository.updateNavItems(id, navItems);
- }
-
- async executeDeleteNavItems(id: string): Promise {
- return this.navItemsRepository.deleteNavItems(id);
- }
-}
diff --git a/sigap-website/src/application/usecases/navigation-item.usecase.ts b/sigap-website/src/application/usecases/navigation-item.usecase.ts
deleted file mode 100644
index ef1c6d0..0000000
--- a/sigap-website/src/application/usecases/navigation-item.usecase.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-// useCases/navigationUseCases.ts
-
-import {
- CreateNavigationItemDTO,
- NavigationItem,
- UpdateNavigationItemDTO,
-} from "../../entities/models/navigation-item.model";
-import { NavigationRepository } from "../repositories/navigation-item.repository";
-
-export class NavigationUseCases {
- constructor(private repository: NavigationRepository) {}
-
- async getNavigationTree(): Promise {
- return this.repository.findAll();
- }
-
- async getChildren(parentPath: string): Promise {
- return this.repository.findByPath(parentPath);
- }
-
- async createNavigationItem(
- data: CreateNavigationItemDTO
- ): Promise {
- // Calculate level based on path
- const level = data.path.split(".").length - 1;
- return this.repository.create({ ...data, level });
- }
-
- async updateNavigationItem(
- id: string,
- data: UpdateNavigationItemDTO
- ): Promise {
- if (data.path) {
- data.level = data.path.split(".").length - 1;
- }
- return this.repository.update(id, data);
- }
-
- async deleteNavigationItem(id: string): Promise {
- return this.repository.delete(id);
- }
-
- async reorderItems(items: { id: string; orderSeq: number }[]): Promise {
- return this.repository.reorder(items);
- }
-
- async moveItem(
- id: string,
- newParentPath: string,
- newOrderSeq: number
- ): Promise {
- const item = await this.repository.findById(id);
- if (!item) throw new Error("Item not found");
-
- const oldPath = item.path;
- const newPath = newParentPath
- ? `${newParentPath}.${newOrderSeq}`
- : `${newOrderSeq}`;
-
- // Update all children paths
- const children = await this.repository.findByPath(oldPath);
- for (const child of children) {
- const relativePath = child.path.slice(oldPath.length);
- await this.repository.update(child.id, {
- path: newPath + relativePath,
- });
- }
-
- return this.repository.update(id, {
- path: newPath,
- orderSeq: newOrderSeq,
- level: newPath.split(".").length - 1,
- });
- }
-}
diff --git a/sigap-website/src/application/usecases/signin.usecases.ts b/sigap-website/src/application/usecases/signin.usecases.ts
deleted file mode 100644
index ab181b6..0000000
--- a/sigap-website/src/application/usecases/signin.usecases.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import {
- SignInResponse,
- SignInWithOtp,
-} from "../../entities/models/users.model";
-import { SignInRepository } from "../repositories/signin.repository";
-
-export class SignInUseCase {
- constructor(private signInRepository: SignInRepository) {}
-
- async executeSignInWithPasswordless(
- email: SignInWithOtp
- ): Promise {
- return this.signInRepository.signInWithPasswordless(email);
- }
-}
diff --git a/sigap-website/src/controller/auth/sign-in-controller.tsx b/sigap-website/src/controller/auth/sign-in-controller.tsx
new file mode 100644
index 0000000..af6a482
--- /dev/null
+++ b/sigap-website/src/controller/auth/sign-in-controller.tsx
@@ -0,0 +1,97 @@
+// src/controllers/sign-in.controller.tsx
+"use client";
+
+
+import { useRouter } from "next/navigation";
+import {
+ defaultSignInValues,
+ SignInFormData,
+ signInSchema,
+} from "@/src/models/auth/sign-in.model";
+import { useState, type FormEvent, type ChangeEvent } from "react";
+import { toast } from "sonner";
+import { z } from "zod";
+import { signIn } from "@/app/(auth-pages)/action";
+
+type SignInFormErrors = Partial>;
+
+export function useSignInForm() {
+ const [formData, setFormData] = useState(defaultSignInValues);
+ const [errors, setErrors] = useState({});
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [message, setMessage] = useState(null);
+ const router = useRouter();
+
+ const validateForm = (): boolean => {
+ try {
+ signInSchema.parse(formData);
+ setErrors({});
+ return true;
+ } catch (error) {
+ if (error instanceof z.ZodError) {
+ const formattedErrors: SignInFormErrors = {};
+ error.errors.forEach((err) => {
+ const path = err.path[0] as keyof SignInFormData;
+ formattedErrors[path] = err.message;
+ });
+ setErrors(formattedErrors);
+ }
+ return false;
+ }
+ };
+
+ const handleChange = (e: ChangeEvent) => {
+ const { name, value } = e.target;
+ setFormData((prev) => ({
+ ...prev,
+ [name]: value,
+ }));
+ };
+
+ const handleSubmit = async (e: FormEvent) => {
+ e.preventDefault();
+ if (!validateForm()) {
+ return;
+ }
+
+ setIsSubmitting(true);
+ setMessage(null);
+
+ try {
+ const result = await signIn(formData);
+
+ if (result.success) {
+ setMessage(result.message);
+ toast.success(result.message);
+
+ // Handle client-side navigation
+ if (result.redirectTo) {
+ router.push(result.redirectTo);
+ }
+ } else {
+ setErrors({
+ email: result.message || "Sign in failed. Please try again.",
+ });
+ toast.error(result.message || "Sign in failed. Please try again.");
+ }
+ } catch (error) {
+ console.error("Sign in failed", error);
+ setErrors({
+ email: "An unexpected error occurred. Please try again.",
+ });
+ toast.error("An unexpected error occurred. Please try again.");
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ return {
+ formData,
+ errors,
+ isSubmitting,
+ message,
+ setFormData,
+ handleChange,
+ handleSubmit,
+ };
+}
\ No newline at end of file
diff --git a/sigap-website/src/controller/auth/verify-otp.controller.tsx b/sigap-website/src/controller/auth/verify-otp.controller.tsx
new file mode 100644
index 0000000..420c08b
--- /dev/null
+++ b/sigap-website/src/controller/auth/verify-otp.controller.tsx
@@ -0,0 +1,55 @@
+// src/hooks/useVerifyOtpForm.ts
+"use client";
+
+import { useState } from "react";
+import { useForm } from "react-hook-form";
+import { zodResolver } from "@hookform/resolvers/zod";
+
+import { verifyOtp } from "@/app/(auth-pages)/action";
+import { defaultVerifyOtpValues, VerifyOtpFormData, verifyOtpSchema } from "@/src/models/auth/verify-otp.model";
+import { useNavigations } from "@/hooks/use-navigations";
+
+export function useVerifyOtpForm(initialEmail: string) {
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [message, setMessage] = useState(null);
+ const {router} = useNavigations();
+
+ const form = useForm({
+ resolver: zodResolver(verifyOtpSchema),
+ defaultValues: { ...defaultVerifyOtpValues, email: initialEmail }
+ });
+
+ const onSubmit = async (data: VerifyOtpFormData) => {
+ setIsSubmitting(true);
+ setMessage(null);
+
+ try {
+ const result = await verifyOtp(data);
+
+ if (result.success) {
+ setMessage(result.message);
+ // Redirect or update UI state as needed
+ if (result.redirectTo) {
+ router.push(result.redirectTo);
+ }
+ } else {
+ form.setError("token", { type: "manual", message: result.message });
+ }
+ } catch (error) {
+ console.error("OTP verification failed", error);
+ form.setError("token", {
+ type: "manual",
+ message: "An unexpected error occurred. Please try again."
+ });
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ return {
+ form,
+ isSubmitting,
+ message,
+ onSubmit
+ };
+}
\ No newline at end of file
diff --git a/sigap-website/src/entities/errors/auth.error.ts b/sigap-website/src/entities/errors/auth.error.ts
deleted file mode 100644
index 39cbb76..0000000
--- a/sigap-website/src/entities/errors/auth.error.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-export class AuthenticationError extends Error {
- constructor(message: string, options?: ErrorOptions) {
- super(message, options);
- }
-}
-
-export class UnauthenticatedError extends Error {
- constructor(message: string, options?: ErrorOptions) {
- super(message, options);
- }
-}
-
-export class UnauthorizedError extends Error {
- constructor(message: string, options?: ErrorOptions) {
- super(message, options);
- }
-}
diff --git a/sigap-website/src/entities/errors/common.error.ts b/sigap-website/src/entities/errors/common.error.ts
deleted file mode 100644
index 575aae2..0000000
--- a/sigap-website/src/entities/errors/common.error.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-export class DatabaseOperationError extends Error {
- constructor(message: string, options?: ErrorOptions) {
- super(message, options);
- }
-}
-
-export class NotFoundError extends Error {
- constructor(message: string, options?: ErrorOptions) {
- super(message, options);
- }
-}
-
-export class InputParseError extends Error {
- constructor(message: string, options?: ErrorOptions) {
- super(message, options);
- }
-}
diff --git a/sigap-website/src/entities/models/contact-us.model.ts b/sigap-website/src/entities/models/contact-us.model.ts
deleted file mode 100644
index 30533ac..0000000
--- a/sigap-website/src/entities/models/contact-us.model.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { z } from "zod";
-
-// Define the message type mapping
-export const typeMessage = [
- { value: "1", label: "Request to become a user" },
- { value: "2", label: "OTP problem" },
- { value: "3", label: "Request for a feature" },
- { value: "4", label: "Other" },
-];
-
-export const typeMessageMap = new Map(
- typeMessage.map((item) => [item.value, item.label])
-);
-
-export const statusEnum = {
- NEW: "new",
- READ: "read",
- REPLIED: "replied",
- RESOLVED: "resolved",
-};
-
-export type StatusEnum = typeof statusEnum;
-
-// Schema for what's stored in Supabase
-export const selectContactUsSchema = z.object({
- id: z.string(),
- name: z.string(),
- email: z.string(),
- phone: z.string(),
- typeMessage: z.string(),
- message_type_label: z.string(),
- message: z.string(),
- status: z.nativeEnum(statusEnum),
- createdAt: z.string(),
- updatedAt: z.string(),
-});
-
-export type ContactUs = z.infer;
-
-// Schema for form input
-export const insertContactUsSchema = selectContactUsSchema.pick({
- name: true,
- email: true,
- phone: true,
- typeMessage: true,
- message: true,
-});
-
-export type ContactUsInsert = z.infer;
-
-// Type for the response from the server action
-export interface ContactUsResponse {
- success: boolean;
- message?: string;
- error?: string;
- errors?: Record;
-}
diff --git a/sigap-website/src/entities/models/cookies.model.ts b/sigap-website/src/entities/models/cookies.model.ts
deleted file mode 100644
index f3dfa4a..0000000
--- a/sigap-website/src/entities/models/cookies.model.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-type CookieAttributes = {
- secure?: boolean;
- path?: string;
- domain?: string;
- sameSite?: "lax" | "strict" | "none";
- httpOnly?: boolean;
- maxAge?: number;
- expires?: Date;
-};
-
-export type Cookie = {
- name: string;
- value: string;
- attributes: CookieAttributes;
-};
diff --git a/sigap-website/src/entities/models/crime-category.model.ts b/sigap-website/src/entities/models/crime-category.model.ts
deleted file mode 100644
index bb23e67..0000000
--- a/sigap-website/src/entities/models/crime-category.model.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { z } from "zod";
-
-export interface CrimeCategoryInterface {
- id?: string;
- name: string;
- description: string;
- createdAt?: Date;
- updatedAt?: Date;
-}
-
-
diff --git a/sigap-website/src/entities/models/nav-items.model.ts b/sigap-website/src/entities/models/nav-items.model.ts
deleted file mode 100644
index 3564503..0000000
--- a/sigap-website/src/entities/models/nav-items.model.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { z } from "zod";
-
-export const navSubItemsSchema = z.object({
- id: z.string().uuid(),
- title: z.string(),
- url: z.string(),
- slug: z.string(),
- icon: z.string(),
- isActive: z.boolean().default(false),
- orderSeq: z.number().int(),
- navItemId: z.string().uuid(),
- createdAt: z.date(),
- updatedAt: z.date(),
- createdBy: z.string().uuid().nullable(),
- updatedBy: z.string().uuid().nullable(),
-});
-
-export type NavSubItems = z.infer;
-
-export const navItemsSchema = z.object({
- id: z.string().uuid(),
- title: z.string(),
- url: z.string(),
- slug: z.string(),
- icon: z.string(),
- isActive: z.boolean().default(false),
- orderSeq: z.number().int(),
- createdAt: z.date(),
- updatedAt: z.date(),
- createdBy: z.string().uuid().nullable(),
- updatedBy: z.string().uuid().nullable(),
- subItems: z.array(navSubItemsSchema),
-});
-
-export type NavItems = z.infer;
-
-export const navItemsGetSchema = z.array(navItemsSchema);
-
-export type NavItemsGet = z.infer;
-
-export const navItemsInsertSchema = navItemsSchema.pick({
- title: true,
- url: true,
- slug: true,
- icon: true,
- isActive: true,
- orderSeq: true,
- subItems: true,
-});
-
-export type NavItemsInsert = z.infer;
-
-export const navItemsUpdateSchema = navItemsSchema.pick({
- title: true,
- url: true,
- slug: true,
- icon: true,
- isActive: true,
- orderSeq: true,
- subItems: true,
-});
-
-export type NavItemsUpdate = z.infer;
-
-export const navItemsDeleteSchema = z.object({
- id: z.string().uuid(),
-});
-
-export type NavItemsDelete = z.infer;
-
-export interface NavItemsResponse {
- success: boolean;
- message?: string;
- error?: string;
- errors?: Record;
- data?: NavItems | NavItemsGet;
-}
diff --git a/sigap-website/src/entities/models/navigation-item.model.ts b/sigap-website/src/entities/models/navigation-item.model.ts
deleted file mode 100644
index 4d0da05..0000000
--- a/sigap-website/src/entities/models/navigation-item.model.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { z } from "zod";
-
-// Define the Zod schemas
-export const navigationItemSchema = z.object({
- id: z.string().uuid(),
- title: z.string(),
- url: z.string().nullable(),
- slug: z.string(),
- icon: z.string().nullable(),
- path: z.string(),
- level: z.number().int(),
- isActive: z.boolean().default(false),
- orderSeq: z.number().int(),
- createdAt: z.date(),
- updatedAt: z.date(),
- createdBy: z.string().uuid().nullable(),
- updatedBy: z.string().uuid().nullable(),
-});
-
-export const createNavigationItemDTOSchema = z.object({
- title: z.string(),
- url: z.string(),
- slug: z.string(),
- icon: z.string(),
- path: z.string(),
- level: z.number().int(),
- isActive: z.boolean().default(false),
- orderSeq: z.number().int(),
- createdBy: z.string().uuid().nullable(),
-});
-
-export const updateNavigationItemDTOSchema = z.object({
- title: z.string().optional(),
- url: z.string().optional(),
- slug: z.string().optional(),
- icon: z.string().optional(),
- path: z.string().optional(),
- level: z.number().int().optional(),
- isActive: z.boolean().optional(),
- orderSeq: z.number().int().optional(),
- updatedBy: z.string().uuid().nullable().optional(),
-});
-
-export const NavigationItemResponseSchema = z.object({
- success: z.boolean(),
- message: z.string().optional(),
- error: z.string().optional(),
- errors: z.record(z.string()).optional(),
- data: navigationItemSchema,
-});
-
-// Infer the types from the schemas
-export type NavigationItem = z.infer;
-export type CreateNavigationItemDTO = z.infer<
- typeof createNavigationItemDTOSchema
->;
-export type UpdateNavigationItemDTO = z.infer<
- typeof updateNavigationItemDTOSchema
->;
-export type NavigationItemResponse = z.infer<
- typeof NavigationItemResponseSchema
->;
diff --git a/sigap-website/src/entities/models/session.model.ts b/sigap-website/src/entities/models/session.model.ts
deleted file mode 100644
index cedf8a9..0000000
--- a/sigap-website/src/entities/models/session.model.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { z } from "zod";
-
-export const sessionSchema = z.object({
- id: z.string(),
- userId: z.string(),
- expiresAt: z.date(),
-});
-
-export type Session = z.infer;
diff --git a/sigap-website/src/entities/models/transaction.interface.model.ts b/sigap-website/src/entities/models/transaction.interface.model.ts
deleted file mode 100644
index d3ffedf..0000000
--- a/sigap-website/src/entities/models/transaction.interface.model.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export interface ITransaction {
- rollback: () => void;
-}
diff --git a/sigap-website/src/entities/models/users.model.ts b/sigap-website/src/entities/models/users.model.ts
deleted file mode 100644
index 418575d..0000000
--- a/sigap-website/src/entities/models/users.model.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import { z } from "zod";
-
-export const Roles = {
- ADMIN: "admin",
- USER: "user",
- STAFF: "staff",
-};
-
-export type Roles = typeof Roles;
-
-export const userSchema = z.object({
- id: z.string(),
- email: z.string().email(),
- emailVerified: z.boolean().default(false),
- password: z.string().min(8).max(255).nullable(),
- firstName: z.string().min(1).max(50).nullable(),
- lastName: z.string().min(1).max(50).nullable(),
- avatar: z.string().url().nullable(),
- role: z.nativeEnum(Roles).default(Roles.USER),
- createdAt: z.date(),
- updatedAt: z.date(),
- lastSignedIn: z.date().nullable(),
- metadata: z.any().nullable(),
- profile: z
- .object({
- id: z.string(),
- userId: z.string(),
- bio: z.string().max(500).nullable(),
- phone: z.string().min(10).max(15).nullable(),
- address: z.string().max(255).nullable(),
- city: z.string().max(100).nullable(),
- country: z.string().max(100).nullable(),
- birthDate: z.date().nullable(),
- })
- .nullable(),
-});
-
-export type User = z.infer;
-
-export const userAuthSchema = userSchema.pick({
- id: true,
- email: true,
- emailVerified: true,
- role: true,
- profile: true,
-})
-
-export const createUserSchema = userSchema
- .pick({
- id: true,
- email: true,
- firstName: true,
- lastName: true,
- role: true,
- profile: true,
- })
- .merge(
- z.object({
- password: z.string().min(8).max(255).nullable(),
- })
- );
-
-export type CreateUser = z.infer;
-
-// export const insertSupabaseAuthToDbSchema = z.object({
-// id: z.string(),
-// phone: z.string(),
-// email: z.string().email(),
-// emailVerified: z.boolean().default(false),
-// createdAt: z.date(),
-// updatedAt: z.date(),
-// lastSignInAt: z.date().nullable(),
-// metadata: z.any().nullable(),
-// profile: z
-// .object({
-// id: z.string(),
-// userId: z.string(),
-// })
-// .nullable(),
-// });
-
-export const signInSchema = z.object({
- email: z.string(),
- password: z.string(),
- phone: z.string(),
- username: z.string(),
-});
-
-export type SignIn = z.infer;
-
-export const SignInWithOtp = signInSchema.pick({
- email: true,
-});
-
-export type SignInWithOtp = z.infer;
-
-export interface SignInResponse {
- success: boolean;
- message?: string;
- error?: string;
- errors?: Record;
- redirectTo?: string;
-}
diff --git a/sigap-website/src/infrastructure/repositories/contact-us.repository.impl.ts b/sigap-website/src/infrastructure/repositories/contact-us.repository.impl.ts
deleted file mode 100644
index 3a620b5..0000000
--- a/sigap-website/src/infrastructure/repositories/contact-us.repository.impl.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// src/infrastructure/repositories/contact-us.repository.impl.ts
-
-import {
- ContactUsInsert,
- ContactUsResponse,
-} from "@/src/entities/models/contact-us.model";
-import { ContactUsRepository } from "@/src/application/repositories/contact-us.repository";
-import { sendContactEmail } from "@/app/(auth-pages)/actions";
-
-export class ContactRepositoryImpl implements ContactUsRepository {
- async createContactUs(contact: ContactUsInsert): Promise {
- try {
- return await sendContactEmail(contact);
- } catch (error) {
- console.error("Error in ContactRepositoryImpl:", error);
- return {
- success: false,
- error: "An unexpected error occurred. Please try again later.",
- };
- }
- }
-}
diff --git a/sigap-website/src/infrastructure/repositories/nav-items.repository.impl.ts b/sigap-website/src/infrastructure/repositories/nav-items.repository.impl.ts
deleted file mode 100644
index 30bb196..0000000
--- a/sigap-website/src/infrastructure/repositories/nav-items.repository.impl.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import db from "@/lib/db";
-import {
- NavItemsDelete,
- NavItemsGet,
- NavItemsInsert,
- NavItemsResponse,
- navItemsSchema,
- NavItemsUpdate,
-} from "@/src/entities/models/nav-items.model";
-import { NavItemsRepository } from "@/src/application/repositories/nav-items.repository";
-
-export class NavItemsRepositoryImpl implements NavItemsRepository {
- async getNavItems(): Promise {
- const data = await db.navItem.findMany({
- where: {
- isActive: true,
- },
- include: {
- subItems: true,
- },
- });
- return {
- success: true,
- data,
- };
- }
-
- async createNavItems(navItems: NavItemsInsert): Promise {
- return {
- success: true,
- };
- }
-
- async updateNavItems(
- id: string,
- navItems: NavItemsUpdate
- ): Promise {
- return {
- success: true,
- };
- }
-
- async deleteNavItems(id: string): Promise {
- await db.navItem.delete({
- where: {
- id,
- },
- });
- return {
- success: true,
- message: "Navigation item deleted",
- };
- }
-}
diff --git a/sigap-website/src/infrastructure/repositories/navigation-item.repository.impl.ts b/sigap-website/src/infrastructure/repositories/navigation-item.repository.impl.ts
deleted file mode 100644
index 785444c..0000000
--- a/sigap-website/src/infrastructure/repositories/navigation-item.repository.impl.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-// repositories/navigationRepository.ts
-
-import db from "@/lib/db";
-import {
- CreateNavigationItemDTO,
- NavigationItem,
- UpdateNavigationItemDTO,
-} from "@/src/entities/models/navigation-item.model";
-import { NavigationRepository } from "@/src/application/repositories/navigation-item.repository";
-
-export class NavigationItemRepositoryImpl implements NavigationRepository {
- async findAll(): Promise {
- return db.navigationItem.findMany({
- orderBy: [{ path: "asc" }, { orderSeq: "asc" }],
- });
- }
-
- async findById(id: string): Promise {
- return db.navigationItem.findUnique({
- where: { id },
- });
- }
-
- async findByPath(path: string): Promise {
- return db.navigationItem.findMany({
- where: {
- path: { startsWith: path },
- },
- orderBy: [{ path: "asc" }, { orderSeq: "asc" }],
- });
- }
-
- async create(data: CreateNavigationItemDTO): Promise {
- return db.navigationItem.create({
- data,
- });
- }
-
- async update(
- id: string,
- data: UpdateNavigationItemDTO
- ): Promise {
- return db.navigationItem.update({
- where: { id },
- data,
- });
- }
-
- async delete(id: string): Promise {
- // Get the item to be deleted
- const item = await db.navigationItem.findUnique({
- where: { id },
- });
-
- if (!item) return;
-
- // Delete all items with paths that start with itdbem's path
- await db.navigationItem.deleteMany({
- where: {
- path: { startsWith: item.path },
- },
- });
- }
-
- async reorder(items: { id: string; orderSeq: number }[]): Promise {
- await db.$transaction(
- items.map((item) =>
- db.navigationItem.update({
- where: { id: item.id },
- data: { orderSeq: item.orderSeq },
- })
- )
- );
- }
-}
diff --git a/sigap-website/src/infrastructure/repositories/signin.repository.impl.ts b/sigap-website/src/infrastructure/repositories/signin.repository.impl.ts
deleted file mode 100644
index 275e46c..0000000
--- a/sigap-website/src/infrastructure/repositories/signin.repository.impl.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-
-import {
- SignInResponse,
- SignInWithOtp,
-} from "@/src/entities/models/users.model";
-import { SignInRepository } from "@/src/application/repositories/signin.repository";
-import Router from "next/router";
-import { signInAction } from "@/app/(auth-pages)/actions";
-
-export class SignInRepositoryImpl implements SignInRepository {
- async signInWithPasswordless(email: SignInWithOtp): Promise {
- try {
- const result = await signInAction(email);
-
- return result;
- } catch (error) {
- console.error("Error in SignInRepositoryImpl:", error);
- return {
- success: false,
- error: "An unexpected error occurred. Please try again later.",
- };
- }
- }
-}
diff --git a/sigap-website/src/infrastructure/repositories/users.repository.ts b/sigap-website/src/infrastructure/repositories/users.repository.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/sigap-website/src/infrastructure/services/authentication.service.ts b/sigap-website/src/infrastructure/services/authentication.service.ts
deleted file mode 100644
index 859ac69..0000000
--- a/sigap-website/src/infrastructure/services/authentication.service.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-import { createClient } from "@/utils/supabase/server";
-import { IAuthenticationService } from "@/src/application/services/authentication.service.interface";
-import { User } from "@/src/entities/models/users.model";
-import {
- AuthenticationError,
- UnauthenticatedError,
-} from "@/src/entities/errors/auth.error";
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import type { IUsersRepository } from "@/src/application/repositories/users.repository.interface";
-
-export class AuthenticationServiceImpl implements IAuthenticationService {
- constructor(
- private readonly _usersRepository: IUsersRepository,
- private readonly _instrumentationService: IInstrumentationService
- ) {}
-
- async signIn(email: string, password: string): Promise {
- return await this._instrumentationService.startSpan(
- { name: "AuthenticationService > signIn" },
- async () => {
- const supabase = await createClient();
-
- const { data, error } = await this._instrumentationService.startSpan(
- { name: "supabase.auth.signInWithPassword", op: "function" },
- () =>
- supabase.auth.signInWithPassword({
- email,
- password,
- })
- );
-
- if (error) {
- throw new AuthenticationError(error.message);
- }
- }
- );
- }
-
- async requestOtp(email: string): Promise {
- return await this._instrumentationService.startSpan(
- { name: "AuthenticationService > requestOtp" },
- async () => {
- const supabase = await createClient();
-
- const { error } = await this._instrumentationService.startSpan(
- { name: "supabase.auth.signInWithOtp", op: "function" },
- () =>
- supabase.auth.signInWithOtp({
- email,
- options: {
- emailRedirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`,
- },
- })
- );
-
- if (error) {
- throw new AuthenticationError(error.message);
- }
- }
- );
- }
-
- async verifyOtp(email: string, otp: string): Promise {
- return await this._instrumentationService.startSpan(
- { name: "AuthenticationService > verifyOtp" },
- async () => {
- const supabase = await createClient();
-
- const { data, error } = await this._instrumentationService.startSpan(
- { name: "supabase.auth.verifyOtp", op: "function" },
- () =>
- supabase.auth.verifyOtp({
- email,
- token: otp,
- type: "email",
- })
- );
-
- if (error) {
- throw new AuthenticationError(error.message);
- }
- }
- );
- }
-
- async requestMagicLink(email: string, redirectTo?: string): Promise {
- return await this._instrumentationService.startSpan(
- { name: "AuthenticationService > requestMagicLink" },
- async () => {
- const supabase = await createClient();
-
- const { error } = await this._instrumentationService.startSpan(
- { name: "supabase.auth.signInWithOtp", op: "function" },
- () =>
- supabase.auth.signInWithOtp({
- email,
- options: {
- emailRedirectTo:
- redirectTo ||
- `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`,
- },
- })
- );
-
- if (error) {
- throw new AuthenticationError(error.message);
- }
- }
- );
- }
-
- async getSession(): Promise {
- return await this._instrumentationService.startSpan(
- { name: "AuthenticationService > getSession" },
- async () => {
- const supabase = await createClient();
-
- const { data, error } = await this._instrumentationService.startSpan(
- { name: "supabase.auth.session", op: "function" },
- () => supabase.auth.getSession()
- );
-
- if (error) {
- throw new UnauthenticatedError(error.message);
- }
- }
- );
- }
-
- async signOut(): Promise {
- return await this._instrumentationService.startSpan(
- { name: "AuthenticationService > signOut" },
- async () => {
- const supabase = await createClient();
-
- const { error } = await this._instrumentationService.startSpan(
- { name: "supabase.auth.signOut", op: "function" },
- () => supabase.auth.signOut()
- );
-
- if (error) {
- throw new AuthenticationError(error.message);
- }
- }
- );
- }
-}
diff --git a/sigap-website/src/infrastructure/validators/contact-us.validator.ts b/sigap-website/src/infrastructure/validators/contact-us.validator.ts
deleted file mode 100644
index 0a0fc81..0000000
--- a/sigap-website/src/infrastructure/validators/contact-us.validator.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { ContactUsInsert } from "@/src/entities/models/contact-us.model";
-import { TValidator } from "@/utils/validator";
-
-/**
- * Validate the contact form
- * @param {Object} formData - The form data to validate
- * @returns {Object} - Validation result with success flag and errors object
- */
-export const validateContactForm = (
- formData: ContactUsInsert
-): { success: boolean; errors: Record } => {
- const errors: Record = {};
- let isValid = true;
-
- // Validate name
- const nameResult = TValidator.validateEmptyValue(formData.name, "Name");
- if (!nameResult.success) {
- errors.name = nameResult.error!;
- isValid = false;
- }
-
- // Validate email
- const emailResult = TValidator.validateEmail(formData.email);
- if (!emailResult.success) {
- errors.email = emailResult.error!;
- isValid = false;
- }
-
- // Validate phone
- const phoneResult = TValidator.validatePhone(formData.phone);
- if (!phoneResult.success) {
- errors.phone = phoneResult.error!;
- isValid = false;
- }
-
- // Validate type message
- const typeMessageResult = TValidator.validateEmptyValue(
- formData.typeMessage,
- "Type message"
- );
- if (!typeMessageResult.success) {
- errors.typeMessage = typeMessageResult.error!;
- isValid = false;
- }
-
- // Validate message
- const messageResult = TValidator.validateEmptyValue(
- formData.message,
- "Message"
- );
- if (!messageResult.success) {
- errors.message = messageResult.error!;
- isValid = false;
- }
-
- return {
- success: isValid,
- errors: isValid ? {} : errors,
- };
-};
diff --git a/sigap-website/src/infrastructure/validators/navigation-item.validator.ts b/sigap-website/src/infrastructure/validators/navigation-item.validator.ts
deleted file mode 100644
index c717a13..0000000
--- a/sigap-website/src/infrastructure/validators/navigation-item.validator.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-// validators/navigationValidator.ts
-
-import { z } from "zod";
-
-export const navigationItemSchema = z.object({
- title: z
- .string()
- .min(1, "Title is required")
- .max(255, "Title must be less than 255 characters"),
- url: z
- .string()
- .min(1, "URL is required")
- .max(255, "URL must be less than 255 characters")
- .regex(/^\//, "URL must start with /")
- .regex(
- /^[a-zA-Z0-9\-/_]+$/,
- "URL can only contain letters, numbers, hyphens, and forward slashes"
- ),
- slug: z
- .string()
- .min(1, "Slug is required")
- .max(255, "Slug must be less than 255 characters")
- .regex(
- /^[a-z0-9\-]+$/,
- "Slug can only contain lowercase letters, numbers, and hyphens"
- ),
- icon: z
- .string()
- .min(1, "Icon is required")
- .max(100, "Icon name must be less than 100 characters"),
- isActive: z.boolean(),
- orderSeq: z
- .number()
- .int("Order must be an integer")
- .min(1, "Order must be greater than 0"),
- parentId: z.string().uuid().optional().nullable(),
-});
-
-export type NavigationItemFormData = z.infer;
diff --git a/sigap-website/src/infrastructure/validators/signin.validator.ts b/sigap-website/src/infrastructure/validators/signin.validator.ts
deleted file mode 100644
index 6465b5d..0000000
--- a/sigap-website/src/infrastructure/validators/signin.validator.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { ContactUsInsert } from "@/src/entities/models/contact-us.model";
-import { SignInWithOtp } from "@/src/entities/models/users.model";
-import { TValidator } from "@/utils/validator";
-
-/**
- * Validate the contact form
- * @param {Object} formData - The form data to validate
- * @returns {Object} - Validation result with success flag and errors object
- */
-export const validateSignInWithOtp = (
- formData: SignInWithOtp
-): { success: boolean; errors: Record } => {
- const errors: Record = {};
- let isValid = true;
-
- // Validate email
- const emailResult = TValidator.validateEmail(formData.email);
- if (!emailResult.success) {
- errors.email = emailResult.error!;
- isValid = false;
- }
-
- return {
- success: isValid,
- errors: isValid ? {} : errors,
- };
-};
diff --git a/sigap-website/src/interface/controllers/auth/auth-callback.controller.ts b/sigap-website/src/interface/controllers/auth/auth-callback.controller.ts
deleted file mode 100644
index 272206a..0000000
--- a/sigap-website/src/interface/controllers/auth/auth-callback.controller.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-// // src/interface/controllers/auth/auth-callback.controller.ts
-// import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-// import { IVerifySessionUseCase } from "@/src/application/usecases/auth/verify-session.use-case";
-// import { User } from "@/src/entities/models/users.model";
-
-// export type IAuthCallbackController = ReturnType;
-
-// export const authCallbackController =
-// (
-// instrumentationService: IInstrumentationService,
-// verifySessionUseCase: IVerifySessionUseCase
-// ) =>
-// async (): Promise<{ user: User | null; redirectTo: string }> => {
-// return await instrumentationService.startSpan(
-// { name: "authCallback Controller" },
-// async () => {
-// // Verify session after magic link click
-// const user = await verifySessionUseCase();
-
-// // Determine where to redirect based on authentication result
-// const redirectTo = user
-// ? "/dashboard" // Authenticated users go to dashboard
-// : "/login?error=session_verification_failed"; // Failed authentication
-
-// return { user, redirectTo };
-// }
-// );
-// };
diff --git a/sigap-website/src/interface/controllers/auth/request-magic-link.controller.ts b/sigap-website/src/interface/controllers/auth/request-magic-link.controller.ts
deleted file mode 100644
index 22f0d35..0000000
--- a/sigap-website/src/interface/controllers/auth/request-magic-link.controller.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-// src/interface/controllers/auth/request-magic-link.controller.ts
-import { z } from "zod";
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import { IRequestMagicLinkUseCase } from "@/src/application/usecases/auth/request-magic-link.use-case.ts";
-import { InputParseError } from "@/src/entities/errors/common.error";
-
-const inputSchema = z.object({
- email: z.string().email("Invalid email address"),
- redirectTo: z.string().url().optional(),
-});
-
-export type IRequestMagicLinkController = ReturnType<
- typeof requestMagicLinkController
->;
-
-export const requestMagicLinkController =
- (
- instrumentationService: IInstrumentationService,
- requestMagicLinkUseCase: IRequestMagicLinkUseCase
- ) =>
- async (
- input: Partial>
- ): Promise<{ success: boolean; message: string }> => {
- return await instrumentationService.startSpan(
- { name: "requestMagicLink Controller" },
- async () => {
- const { data, error: inputParseError } = inputSchema.safeParse(input);
-
- if (inputParseError) {
- throw new InputParseError("Invalid input", {
- cause: inputParseError,
- });
- }
-
- const { email, redirectTo } = data;
-
- // Default redirect URL if not provided
- const finalRedirectUrl =
- redirectTo || `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`;
-
- // Request magic link through use case
- await requestMagicLinkUseCase({
- email,
- redirectTo: finalRedirectUrl,
- });
-
- // Return a generic success message
- return {
- success: true,
- message:
- "If an account exists with this email, a magic link has been sent",
- };
- }
- );
- };
diff --git a/sigap-website/src/interface/controllers/auth/request-otp.controller.ts b/sigap-website/src/interface/controllers/auth/request-otp.controller.ts
deleted file mode 100644
index 12146ce..0000000
--- a/sigap-website/src/interface/controllers/auth/request-otp.controller.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-// src/interface/controllers/auth/request-otp.controller.ts
-import { z } from "zod";
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import { IRequestOtpUseCase } from "@/src/application/usecases/auth/request-otp.use-case";
-import { InputParseError } from "@/src/entities/errors/common.error";
-
-const inputSchema = z.object({
- email: z.string().email("Invalid email address"),
-});
-
-export type IRequestOtpController = ReturnType;
-
-export const requestOtpController =
- (
- instrumentationService: IInstrumentationService,
- requestOtpUseCase: IRequestOtpUseCase
- ) =>
- async (
- input: Partial>
- ): Promise<{ success: boolean; message: string }> => {
- return await instrumentationService.startSpan(
- { name: "requestOtp Controller" },
- async () => {
- const { data, error: inputParseError } = inputSchema.safeParse(input);
-
- if (inputParseError) {
- throw new InputParseError("Invalid email", {
- cause: inputParseError,
- });
- }
-
- const { email } = data;
-
- // Request OTP through use case
- await requestOtpUseCase({ email });
-
- // Return a generic success message to avoid email enumeration
- return {
- success: true,
- message:
- "If an account exists with this email, a verification code has been sent",
- };
- }
- );
- };
diff --git a/sigap-website/src/interface/controllers/auth/sign-in.controller.ts b/sigap-website/src/interface/controllers/auth/sign-in.controller.ts
deleted file mode 100644
index a9d0a98..0000000
--- a/sigap-website/src/interface/controllers/auth/sign-in.controller.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-// sign-in.controller.ts
-import { z } from "zod";
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import { ISignInUseCase } from "@/src/application/usecases/auth/sign-in.use-case";
-import { InputParseError } from "@/src/entities/errors/common.error";
-import { User } from "@/src/entities/models/users.model";
-
-const inputSchema = z.object({
- email: z.string().min(3).max(31),
- password: z.string().min(6).max(31),
-});
-
-export type ISignInController = ReturnType;
-
-export const signInController =
- (
- instrumentationService: IInstrumentationService,
- signInUseCase: ISignInUseCase
- ) =>
- async (input: Partial>): Promise => {
- return await instrumentationService.startSpan(
- { name: "signIn Controller" },
- async () => {
- const { data, error: inputParseError } = inputSchema.safeParse(input);
-
- if (inputParseError) {
- throw new InputParseError("Invalid data", { cause: inputParseError });
- }
-
- const { email, password } = data;
-
- // Use the use case to handle authentication
- return await signInUseCase({ email, password });
- }
- );
- };
diff --git a/sigap-website/src/interface/controllers/auth/sign-out.controller.ts b/sigap-website/src/interface/controllers/auth/sign-out.controller.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/sigap-website/src/interface/controllers/auth/sign-up.controller.ts b/sigap-website/src/interface/controllers/auth/sign-up.controller.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/sigap-website/src/interface/controllers/auth/verify-otp.controller.ts b/sigap-website/src/interface/controllers/auth/verify-otp.controller.ts
deleted file mode 100644
index daba317..0000000
--- a/sigap-website/src/interface/controllers/auth/verify-otp.controller.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-// src/interface/controllers/auth/verify-otp.controller.ts
-import { z } from "zod";
-import type { IInstrumentationService } from "@/src/application/services/instrumentation.service.interface";
-import { IVerifyOtpUseCase } from "@/src/application/usecases/auth/verify-otp.use-case";
-import { InputParseError } from "@/src/entities/errors/common.error";
-import { User } from "@/src/entities/models/users.model";
-
-const inputSchema = z.object({
- email: z.string().email("Invalid email address"),
- otp: z.string().min(6).max(8), // Adjust according to your OTP length
-});
-
-export type IVerifyOtpController = ReturnType;
-
-export const verifyOtpController =
- (
- instrumentationService: IInstrumentationService,
- verifyOtpUseCase: IVerifyOtpUseCase
- ) =>
- async (input: Partial>): Promise => {
- return await instrumentationService.startSpan(
- { name: "verifyOtp Controller" },
- async () => {
- const { data, error: inputParseError } = inputSchema.safeParse(input);
-
- if (inputParseError) {
- throw new InputParseError("Invalid verification data", {
- cause: inputParseError,
- });
- }
-
- const { email, otp } = data;
-
-
- await verifyOtpUseCase({ email, otp });
- }
- );
- };
diff --git a/sigap-website/src/models/auth/sign-in.model.ts b/sigap-website/src/models/auth/sign-in.model.ts
new file mode 100644
index 0000000..286f315
--- /dev/null
+++ b/sigap-website/src/models/auth/sign-in.model.ts
@@ -0,0 +1,17 @@
+import { z } from "zod";
+
+// Define the sign-in form schema using Zod
+export const signInSchema = z.object({
+ email: z
+ .string()
+ .min(1, { message: "Email is required" })
+ .email({ message: "Invalid email address" }),
+});
+
+// Export the type derived from the schema
+export type SignInFormData = z.infer;
+
+// Default values for the form
+export const defaultSignInValues: SignInFormData = {
+ email: "",
+};
diff --git a/sigap-website/src/models/auth/verify-otp.model.ts b/sigap-website/src/models/auth/verify-otp.model.ts
new file mode 100644
index 0000000..ec6a627
--- /dev/null
+++ b/sigap-website/src/models/auth/verify-otp.model.ts
@@ -0,0 +1,13 @@
+import { z } from "zod";
+
+export const verifyOtpSchema = z.object({
+ email: z.string().email({ message: "Invalid email address" }),
+ token: z.string().length(6, { message: "OTP must be 6 characters long" }),
+});
+
+export type VerifyOtpFormData = z.infer;
+
+export const defaultVerifyOtpValues: VerifyOtpFormData = {
+ email: "",
+ token: "",
+};
diff --git a/sigap-website/src/repositories/authentication.repository.ts b/sigap-website/src/repositories/authentication.repository.ts
new file mode 100644
index 0000000..e48e876
--- /dev/null
+++ b/sigap-website/src/repositories/authentication.repository.ts
@@ -0,0 +1,65 @@
+// src/repositories/auth.repository.ts
+import { createClient } from "@/utils/supabase/server";
+import { SignInFormData } from "../models/auth/sign-in.model";
+import { VerifyOtpFormData } from "../models/auth/verify-otp.model";
+
+export class AuthRepository {
+ async signIn({ email }: SignInFormData) {
+ const supabase = await createClient();
+ const { data, error } = await supabase.auth.signInWithOtp({
+ email,
+ options: {
+ shouldCreateUser: false,
+ },
+ });
+
+ if (error) {
+ throw new Error(error.message);
+ }
+
+ return {
+ data,
+ redirectTo: `/verify-otp?email=${encodeURIComponent(email)}`
+ };
+ }
+
+ async signOut() {
+ const supabase = await createClient();
+ const { error } = await supabase.auth.signOut();
+
+ if (error) {
+ throw new Error(error.message);
+ }
+
+ return {
+ success: true,
+ redirectTo: "/"
+ };
+ }
+
+ async getUser() {
+ const supabase = await createClient();
+ const { data: { user } } = await supabase.auth.getUser();
+ return user;
+ }
+
+ async verifyOtp({ email, token }: VerifyOtpFormData) {
+ const supabase = await createClient();
+ const { data, error } = await supabase.auth.verifyOtp({
+ email,
+ token,
+ type: "email",
+ });
+
+ if (error) {
+ throw new Error(error.message);
+ }
+
+ return {
+ data,
+ redirectTo: "/protected/dashboard"
+ };
+ }
+}
+
+export const authRepository = new AuthRepository();
\ No newline at end of file
diff --git a/sigap-website/tailwind.config.ts b/sigap-website/tailwind.config.ts
index 5851492..41668a3 100644
--- a/sigap-website/tailwind.config.ts
+++ b/sigap-website/tailwind.config.ts
@@ -10,94 +10,69 @@ const config = {
],
prefix: "",
theme: {
- container: {
- center: true,
- padding: '2rem',
- screens: {
- '2xl': '1400px'
- }
- },
- extend: {
- colors: {
- border: 'hsl(var(--border))',
- input: 'hsl(var(--input))',
- ring: 'hsl(var(--ring))',
- background: 'hsl(var(--background))',
- foreground: 'hsl(var(--foreground))',
- primary: {
- DEFAULT: 'hsl(var(--primary))',
- foreground: 'hsl(var(--primary-foreground))'
- },
- secondary: {
- DEFAULT: 'hsl(var(--secondary))',
- foreground: 'hsl(var(--secondary-foreground))'
- },
- destructive: {
- DEFAULT: 'hsl(var(--destructive))',
- foreground: 'hsl(var(--destructive-foreground))'
- },
- muted: {
- DEFAULT: 'hsl(var(--muted))',
- foreground: 'hsl(var(--muted-foreground))'
- },
- accent: {
- DEFAULT: 'hsl(var(--accent))',
- foreground: 'hsl(var(--accent-foreground))'
- },
- popover: {
- DEFAULT: 'hsl(var(--popover))',
- foreground: 'hsl(var(--popover-foreground))'
- },
- card: {
- DEFAULT: 'hsl(var(--card))',
- foreground: 'hsl(var(--card-foreground))'
- },
- chart: {
- '1': 'hsl(var(--chart-1))',
- '2': 'hsl(var(--chart-2))',
- '3': 'hsl(var(--chart-3))',
- '4': 'hsl(var(--chart-4))',
- '5': 'hsl(var(--chart-5))'
- },
- sidebar: {
- DEFAULT: 'hsl(var(--sidebar-background))',
- foreground: 'hsl(var(--sidebar-foreground))',
- primary: 'hsl(var(--sidebar-primary))',
- 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
- accent: 'hsl(var(--sidebar-accent))',
- 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
- border: 'hsl(var(--sidebar-border))',
- ring: 'hsl(var(--sidebar-ring))'
- }
- },
- borderRadius: {
- lg: 'var(--radius)',
- md: 'calc(var(--radius) - 2px)',
- sm: 'calc(var(--radius) - 4px)'
- },
- keyframes: {
- 'accordion-down': {
- from: {
- height: '0'
- },
- to: {
- height: 'var(--radix-accordion-content-height)'
- }
- },
- 'accordion-up': {
- from: {
- height: 'var(--radix-accordion-content-height)'
- },
- to: {
- height: '0'
- }
- }
- },
- animation: {
- 'accordion-down': 'accordion-down 0.2s ease-out',
- 'accordion-up': 'accordion-up 0.2s ease-out'
- }
- }
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ extend: {
+ colors: {
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: "0" },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ },
+ },
},
plugins: [require("tailwindcss-animate")],
} satisfies Config;
diff --git a/sigap-website/utils/supabase/middleware.ts b/sigap-website/utils/supabase/middleware.ts
index f050f5f..8619ec0 100644
--- a/sigap-website/utils/supabase/middleware.ts
+++ b/sigap-website/utils/supabase/middleware.ts
@@ -22,17 +22,17 @@ export const updateSession = async (request: NextRequest) => {
},
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value }) =>
- request.cookies.set(name, value)
+ request.cookies.set(name, value),
);
response = NextResponse.next({
request,
});
cookiesToSet.forEach(({ name, value, options }) =>
- response.cookies.set(name, value, options)
+ response.cookies.set(name, value, options),
);
},
},
- }
+ },
);
// This will refresh session if expired - required for Server Components
@@ -40,16 +40,14 @@ export const updateSession = async (request: NextRequest) => {
const user = await supabase.auth.getUser();
// protected routes
- if (request.nextUrl.pathname === "/" && !user.error) {
- return NextResponse.redirect(
- new URL("/protected/dashboard", request.url)
- );
- }
-
if (request.nextUrl.pathname.startsWith("/protected") && user.error) {
return NextResponse.redirect(new URL("/sign-in", request.url));
}
+ if (request.nextUrl.pathname === "/" && !user.error) {
+ return NextResponse.redirect(new URL("/protected", request.url));
+ }
+
return response;
} catch (e) {
// If you are here, a Supabase client could not be created!
diff --git a/sigap-website/utils/validator.ts b/sigap-website/utils/validator.ts
deleted file mode 100644
index aee8989..0000000
--- a/sigap-website/utils/validator.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { z } from "zod";
-
-export class TValidator {
- /**
- * Validate an empty value
- * @param {string} value - The value to validate
- * @param {string} fieldName - The name of the field for error message
- * @returns {Object} - Validation result object with success and optional error message
- */
- static validateEmptyValue(value: string, fieldName: string) {
- const schema = z.string().min(1, `${fieldName} cannot be empty`);
- const result = schema.safeParse(value);
-
- if (!result.success) {
- return {
- success: false,
- error: `${fieldName} cannot be empty`,
- };
- }
-
- return {
- success: true,
- };
- }
-
- /**
- * Validate an email address
- * @param {string} email - The email address to validate
- * @returns {Object} - Validation result object with success and optional error message
- */
- static validateEmail(email: string) {
- const emptyCheck = this.validateEmptyValue(email, "Email");
- if (!emptyCheck.success) return emptyCheck;
-
- const schema = z.string().email("Invalid email address");
- const result = schema.safeParse(email);
-
- if (!result.success) {
- return {
- success: false,
- error: "Invalid email address",
- };
- }
-
- return {
- success: true,
- };
- }
-
- /**
- * Validate a phone number for Indonesia
- * @param {string} phone - The phone number to validate
- * @returns {Object} - Validation result object with success and optional error message
- */
- static validatePhone(phone: string) {
- const emptyCheck = this.validateEmptyValue(phone, "Phone");
- if (!emptyCheck.success) return emptyCheck;
-
- // Regex for Indonesian phone numbers:
- // - Allows format starting with +62 or 0
- // - For +62 format: +62 followed by 8-12 digits
- // - For 0 format: 0 followed by 9-12 digits (usually starts with 08)
- // - Handles common mobile prefixes (8xx) and landline prefixes
- const schema = z
- .string()
- .regex(
- /^(?:\+62[0-9]{8,12}|0[0-9]{9,12})$/,
- "Invalid Indonesian phone number format"
- );
- const result = schema.safeParse(phone);
-
- if (!result.success) {
- return {
- success: false,
- error:
- "Invalid Indonesian phone number format. Use format +62xxxxxxxxxx or 08xxxxxxxxx",
- };
- }
-
- return {
- success: true,
- };
- }
-
-}
|