feat/build-branch #4
@ -1,9 +1,7 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { decodeJwt } from "jose";
|
import { decodeJwt } from "jose";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:8583";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
try {
|
try {
|
||||||
const { email, currentPassword, newPassword } = await request.json();
|
const { email, currentPassword, newPassword } = await request.json();
|
||||||
@ -11,7 +9,7 @@ export async function POST(request: Request) {
|
|||||||
// Get the auth token from cookies first
|
// Get the auth token from cookies first
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = cookies();
|
const cookieStore = cookies();
|
||||||
const token = (await cookieStore).get(COOKIE_NAME)?.value;
|
const token = (await cookieStore).get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
@ -99,7 +97,7 @@ export async function POST(request: Request) {
|
|||||||
} catch {}
|
} catch {}
|
||||||
|
|
||||||
response.cookies.set({
|
response.cookies.set({
|
||||||
name: COOKIE_NAME,
|
name: AUTH_COOKIE_NAME,
|
||||||
value: newToken,
|
value: newToken,
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
secure: process.env.NODE_ENV === "production",
|
secure: process.env.NODE_ENV === "production",
|
||||||
|
|||||||
@ -1,10 +1,8 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { cookies } from "next/headers";
|
import { cookies } from "next/headers";
|
||||||
import { decodeJwt } from "jose";
|
import { decodeJwt } from "jose";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:8583";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
try {
|
try {
|
||||||
const { email, password } = await request.json();
|
const { email, password } = await request.json();
|
||||||
@ -59,7 +57,7 @@ export async function POST(request: Request) {
|
|||||||
|
|
||||||
// Set the cookie
|
// Set the cookie
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
cookieStore.set(COOKIE_NAME, token, {
|
cookieStore.set(AUTH_COOKIE_NAME, token, {
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
secure: process.env.NODE_ENV === "production",
|
secure: process.env.NODE_ENV === "production",
|
||||||
sameSite: "lax",
|
sameSite: "lax",
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { cookies } from "next/headers";
|
import { cookies } from "next/headers";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:3000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function DELETE() {
|
export async function DELETE() {
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (token) {
|
if (token) {
|
||||||
try {
|
try {
|
||||||
@ -23,6 +21,6 @@ export async function DELETE() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cookieStore.delete(COOKIE_NAME);
|
cookieStore.delete(AUTH_COOKIE_NAME);
|
||||||
return NextResponse.json({ success: true, message: "Logged out" });
|
return NextResponse.json({ success: true, message: "Logged out" });
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,7 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { cookies } from "next/headers";
|
import { cookies } from "next/headers";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:8583";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
// Interface matching the backend RegisterRequest and frontend IEditUserForm
|
// Interface matching the backend RegisterRequest and frontend IEditUserForm
|
||||||
interface RegisterRequest {
|
interface RegisterRequest {
|
||||||
creator: string;
|
creator: string;
|
||||||
@ -23,7 +21,7 @@ export async function POST(request: Request) {
|
|||||||
|
|
||||||
// Get the auth token from cookies
|
// Get the auth token from cookies
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse, type NextRequest } from "next/server";
|
import { NextResponse, type NextRequest } from "next/server";
|
||||||
import { cookies } from "next/headers";
|
import { cookies } from "next/headers";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:8583";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function PUT(
|
export async function PUT(
|
||||||
request: NextRequest,
|
request: NextRequest,
|
||||||
context: { params: Promise<{ id: string }> }
|
context: { params: Promise<{ id: string }> }
|
||||||
@ -21,7 +19,7 @@ export async function PUT(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import { cookies } from "next/headers";
|
import { cookies } from "next/headers";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:8583";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function POST() {
|
export async function POST() {
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json({ valid: false }, { status: 401 });
|
return NextResponse.json({ valid: false }, { status: 401 });
|
||||||
|
|||||||
@ -1,14 +1,12 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { buildFilterParam } from "../utils";
|
import { buildFilterParam } from "../utils";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,14 +1,12 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { buildFilterParam } from "../utils";
|
import { buildFilterParam } from "../utils";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,14 +1,12 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
import { buildFilterParam } from "../utils";
|
import { buildFilterParam } from "../utils";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,9 +1,7 @@
|
|||||||
// app/api/users/[id]/route.ts
|
// app/api/users/[id]/route.ts
|
||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
// Field mapping: snake_case input -> { snake_case for data, PascalCase for fields }
|
// Field mapping: snake_case input -> { snake_case for data, PascalCase for fields }
|
||||||
// Matches API metadata field_names.users mapping
|
// Matches API metadata field_names.users mapping
|
||||||
const FIELD_MAPPING: Record<string, { dataKey: string; fieldName: string }> = {
|
const FIELD_MAPPING: Record<string, { dataKey: string; fieldName: string }> = {
|
||||||
@ -75,7 +73,7 @@ export async function PUT(
|
|||||||
// Get the auth token from cookies
|
// Get the auth token from cookies
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
@ -114,7 +112,7 @@ export async function DELETE(
|
|||||||
const { id } = await context.params;
|
const { id } = await context.params;
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,13 +1,11 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function GET(request: Request) {
|
export async function GET(request: Request) {
|
||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
@ -29,6 +27,7 @@ export async function GET(request: Request) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
return NextResponse.json(data, { status: response.status });
|
return NextResponse.json(data, { status: response.status });
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
console.error("Proxy GET /api/v1/users/list error:", err);
|
console.error("Proxy GET /api/v1/users/list error:", err);
|
||||||
|
|||||||
@ -1,11 +1,6 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
|
||||||
const AUDITS_BASE_URL =
|
|
||||||
process.env.AUDITS_BASE_URL ||
|
|
||||||
process.env.BE_BASE_URL ||
|
|
||||||
"http://localhost:8583";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
const DEFAULT_LIMIT = "25";
|
const DEFAULT_LIMIT = "25";
|
||||||
const DEFAULT_PAGE = "1";
|
const DEFAULT_PAGE = "1";
|
||||||
|
|
||||||
@ -13,7 +8,7 @@ export async function GET(request: NextRequest) {
|
|||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
@ -38,7 +33,7 @@ export async function GET(request: NextRequest) {
|
|||||||
proxiedParams.set("page", DEFAULT_PAGE);
|
proxiedParams.set("page", DEFAULT_PAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
const backendUrl = `${AUDITS_BASE_URL}/api/v1/audit${
|
const backendUrl = `${BE_BASE_URL}/api/v1/audit${
|
||||||
proxiedParams.size ? `?${proxiedParams.toString()}` : ""
|
proxiedParams.size ? `?${proxiedParams.toString()}` : ""
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
@ -48,7 +43,10 @@ export async function GET(request: NextRequest) {
|
|||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
Authorization: `Bearer ${token}`,
|
Authorization: `Bearer ${token}`,
|
||||||
},
|
},
|
||||||
cache: "no-store",
|
next: {
|
||||||
|
revalidate: 60,
|
||||||
|
tags: ["audits"],
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
@ -65,11 +63,8 @@ export async function GET(request: NextRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
console.log("[AUDITS] data:", data);
|
|
||||||
return NextResponse.json(data, { status: response.status });
|
return NextResponse.json(data, { status: response.status });
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
console.log("[AUDITS] error:", err);
|
|
||||||
|
|
||||||
console.error("Proxy GET /api/v1/audits error:", err);
|
console.error("Proxy GET /api/v1/audits error:", err);
|
||||||
const errorMessage = err instanceof Error ? err.message : "Unknown error";
|
const errorMessage = err instanceof Error ? err.message : "Unknown error";
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,8 +1,6 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function PUT(
|
export async function PUT(
|
||||||
request: NextRequest,
|
request: NextRequest,
|
||||||
context: { params: Promise<{ id: string }> }
|
context: { params: Promise<{ id: string }> }
|
||||||
@ -11,7 +9,7 @@ export async function PUT(
|
|||||||
const { id } = await context.params;
|
const { id } = await context.params;
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
@ -32,7 +30,6 @@ export async function PUT(
|
|||||||
});
|
});
|
||||||
|
|
||||||
const data = await upstream.json();
|
const data = await upstream.json();
|
||||||
console.log("[DEBUG] [TRANSACTIONS] [PUT] Response data:", data);
|
|
||||||
return NextResponse.json(data, { status: upstream.status });
|
return NextResponse.json(data, { status: upstream.status });
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
const errorMessage = err instanceof Error ? err.message : "Unknown error";
|
const errorMessage = err instanceof Error ? err.message : "Unknown error";
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
type FilterValue =
|
type FilterValue =
|
||||||
| string
|
| string
|
||||||
@ -13,7 +12,7 @@ export async function POST(request: NextRequest) {
|
|||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,13 +1,11 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
@ -100,8 +98,6 @@ export async function POST(request: NextRequest) {
|
|||||||
const queryString = queryParts.join("&");
|
const queryString = queryParts.join("&");
|
||||||
const backendUrl = `${BE_BASE_URL}/api/v1/transactions${queryString ? `?${queryString}` : ""}`;
|
const backendUrl = `${BE_BASE_URL}/api/v1/transactions${queryString ? `?${queryString}` : ""}`;
|
||||||
|
|
||||||
console.log("[DEBUG] [TRANSACTIONS] Backend URL:", backendUrl);
|
|
||||||
|
|
||||||
const response = await fetch(backendUrl, {
|
const response = await fetch(backendUrl, {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: {
|
headers: {
|
||||||
@ -125,7 +121,6 @@ export async function POST(request: NextRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
console.log("[DEBUG] [TRANSACTIONS] Response data:", data);
|
|
||||||
|
|
||||||
return NextResponse.json(data, { status: response.status });
|
return NextResponse.json(data, { status: response.status });
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
|
|||||||
@ -1,243 +0,0 @@
|
|||||||
import { GridColDef } from "@mui/x-data-grid";
|
|
||||||
|
|
||||||
export const withdrawalTransactionDummyData = [
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
userId: 17,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Error",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
manualCorrectionFlag: "-",
|
|
||||||
informationWhoApproved: "-",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
userId: 17,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Error",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
manualCorrectionFlag: "-",
|
|
||||||
informationWhoApproved: "-",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
userId: 17,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Completed",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-18 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
userId: 19,
|
|
||||||
transactionId: 1049136973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Completed",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-18 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 5,
|
|
||||||
userId: 19,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Error",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
manualCorrectionFlag: "-",
|
|
||||||
informationWhoApproved: "-",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 6,
|
|
||||||
userId: 27,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Error",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
manualCorrectionFlag: "-",
|
|
||||||
informationWhoApproved: "-",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 7,
|
|
||||||
userId: 1,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Error",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
manualCorrectionFlag: "-",
|
|
||||||
informationWhoApproved: "-",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 8,
|
|
||||||
userId: 172,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Card",
|
|
||||||
status: "Pending",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-12 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 9,
|
|
||||||
userId: 174,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Inprogress",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 10,
|
|
||||||
userId: 1,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Error",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
manualCorrectionFlag: "-",
|
|
||||||
informationWhoApproved: "-",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 11,
|
|
||||||
userId: 1,
|
|
||||||
transactionId: 1049131973,
|
|
||||||
withdrawalMethod: "Bank Transfer",
|
|
||||||
status: "Error",
|
|
||||||
options: [
|
|
||||||
{ value: "Pending", label: "Pending" },
|
|
||||||
{ value: "Completed", label: "Completed" },
|
|
||||||
{ value: "Inprogress", label: "Inprogress" },
|
|
||||||
{ value: "Error", label: "Error" },
|
|
||||||
],
|
|
||||||
amount: 4000,
|
|
||||||
dateTime: "2025-06-17 10:10:30",
|
|
||||||
errorInfo: "-",
|
|
||||||
fraudScore: "frad score 1234",
|
|
||||||
manualCorrectionFlag: "-",
|
|
||||||
informationWhoApproved: "-",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export const withdrawalTransactionsColumns: GridColDef[] = [
|
|
||||||
{ field: "userId", headerName: "User ID", width: 130 },
|
|
||||||
{ field: "transactionId", headerName: "Transaction ID", width: 130 },
|
|
||||||
{ field: "withdrawalMethod", headerName: "Withdrawal Method", width: 130 },
|
|
||||||
{ field: "status", headerName: "Status", width: 130 },
|
|
||||||
{ field: "actions", headerName: "Actions", width: 150 },
|
|
||||||
{ field: "amount", headerName: "Amount", width: 130 },
|
|
||||||
{ field: "dateTime", headerName: "Date / Time", width: 130 },
|
|
||||||
{ field: "errorInfo", headerName: "Error Info", width: 130 },
|
|
||||||
{ field: "fraudScore", headerName: "Fraud Score", width: 130 },
|
|
||||||
{
|
|
||||||
field: "manualCorrectionFlag",
|
|
||||||
headerName: "Manual Correction Flag",
|
|
||||||
width: 130,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: "informationWhoApproved",
|
|
||||||
headerName: "Information who approved",
|
|
||||||
width: 130,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export const withdrawalTransactionsSearchLabels = [
|
|
||||||
{
|
|
||||||
label: "Status",
|
|
||||||
field: "status",
|
|
||||||
type: "select",
|
|
||||||
options: ["Pending", "Inprogress", "Completed", "Failed"],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "Payment Method",
|
|
||||||
field: "depositMethod",
|
|
||||||
type: "select",
|
|
||||||
options: ["Card", "Bank Transfer"],
|
|
||||||
},
|
|
||||||
{ label: "Date / Time", field: "dateTime", type: "date" },
|
|
||||||
];
|
|
||||||
@ -1,67 +1,13 @@
|
|||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import {
|
|
||||||
withdrawalTransactionDummyData,
|
|
||||||
withdrawalTransactionsColumns,
|
|
||||||
withdrawalTransactionsSearchLabels,
|
|
||||||
} from "./mockData";
|
|
||||||
|
|
||||||
export async function GET(request: NextRequest) {
|
/**
|
||||||
const { searchParams } = new URL(request.url);
|
* Placeholder Whitdrawal API route.
|
||||||
|
* Keeps the module valid while the real implementation
|
||||||
const userId = searchParams.get("userId");
|
* is being built, and makes the intent obvious to clients.
|
||||||
const status = searchParams.get("status");
|
*/
|
||||||
const withdrawalMethod = searchParams.get("withdrawalMethod");
|
export async function GET() {
|
||||||
|
|
||||||
const dateTimeStart = searchParams.get("dateTime_start");
|
|
||||||
const dateTimeEnd = searchParams.get("dateTime_end");
|
|
||||||
|
|
||||||
let filteredTransactions = [...withdrawalTransactionDummyData];
|
|
||||||
|
|
||||||
if (userId) {
|
|
||||||
filteredTransactions = filteredTransactions.filter(
|
|
||||||
tx => tx.userId.toString() === userId
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status) {
|
|
||||||
filteredTransactions = filteredTransactions.filter(
|
|
||||||
tx => tx.status.toLowerCase() === status.toLowerCase()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dateTimeStart && dateTimeEnd) {
|
|
||||||
const start = new Date(dateTimeStart);
|
|
||||||
const end = new Date(dateTimeEnd);
|
|
||||||
|
|
||||||
if (isNaN(start.getTime()) || isNaN(end.getTime())) {
|
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{
|
{ message: "Settings endpoint not implemented" },
|
||||||
error: "Invalid date range",
|
{ status: 501 }
|
||||||
},
|
|
||||||
{ status: 400 }
|
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
filteredTransactions = filteredTransactions.filter(tx => {
|
|
||||||
const txDate = new Date(tx.dateTime);
|
|
||||||
|
|
||||||
if (isNaN(txDate.getTime())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return txDate >= start && txDate <= end;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (withdrawalMethod) {
|
|
||||||
filteredTransactions = filteredTransactions.filter(
|
|
||||||
tx => tx.withdrawalMethod.toLowerCase() === withdrawalMethod.toLowerCase()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NextResponse.json({
|
|
||||||
tableRows: filteredTransactions,
|
|
||||||
tableSearchLabels: withdrawalTransactionsSearchLabels,
|
|
||||||
tableColumns: withdrawalTransactionsColumns,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
|
import { AUTH_COOKIE_NAME, BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextRequest, NextResponse } from "next/server";
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
|
|
||||||
type FilterValue =
|
type FilterValue =
|
||||||
| string
|
| string
|
||||||
@ -13,7 +12,7 @@ export async function POST(request: NextRequest) {
|
|||||||
try {
|
try {
|
||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get(COOKIE_NAME)?.value;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import { BE_BASE_URL } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
// Proxy to backend metadata endpoint. Assumes BACKEND_BASE_URL is set.
|
// Proxy to backend metadata endpoint. Assumes BACKEND_BASE_URL is set.
|
||||||
@ -5,7 +6,6 @@ export async function GET() {
|
|||||||
const { cookies } = await import("next/headers");
|
const { cookies } = await import("next/headers");
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const token = cookieStore.get("auth_token")?.value;
|
const token = cookieStore.get("auth_token")?.value;
|
||||||
const BE_BASE_URL = process.env.BE_BASE_URL || "http://localhost:5000";
|
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
|||||||
@ -1,10 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
export default function BackOfficeUsersPage() {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
{/* This page will now be rendered on the client-side */}
|
|
||||||
hello
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
214
app/dashboard/audits/AuditTableClient.tsx
Normal file
214
app/dashboard/audits/AuditTableClient.tsx
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useEffect, useMemo, useState } from "react";
|
||||||
|
import {
|
||||||
|
DataGrid,
|
||||||
|
GridColDef,
|
||||||
|
GridPaginationModel,
|
||||||
|
GridSortModel,
|
||||||
|
} from "@mui/x-data-grid";
|
||||||
|
import TextField from "@mui/material/TextField";
|
||||||
|
import { Box, debounce } from "@mui/material";
|
||||||
|
import useSWR from "swr";
|
||||||
|
import { getAudits } from "@/app/services/audits";
|
||||||
|
import {
|
||||||
|
AuditQueryResult,
|
||||||
|
AuditRow,
|
||||||
|
DEFAULT_PAGE_SIZE,
|
||||||
|
} from "./auditTransforms";
|
||||||
|
|
||||||
|
const FALLBACK_COLUMNS: GridColDef[] = [
|
||||||
|
{
|
||||||
|
field: "placeholder",
|
||||||
|
headerName: "Audit Data",
|
||||||
|
flex: 1,
|
||||||
|
sortable: false,
|
||||||
|
filterable: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const toTitle = (field: string) =>
|
||||||
|
field
|
||||||
|
.replace(/_/g, " ")
|
||||||
|
.replace(/-/g, " ")
|
||||||
|
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
||||||
|
.replace(/\s+/g, " ")
|
||||||
|
.trim()
|
||||||
|
.replace(/^\w/g, char => char.toUpperCase());
|
||||||
|
|
||||||
|
const deriveColumns = (rows: AuditRow[]): GridColDef[] => {
|
||||||
|
if (!rows.length) return [];
|
||||||
|
|
||||||
|
return Object.keys(rows[0]).map(field => ({
|
||||||
|
field,
|
||||||
|
headerName: toTitle(field),
|
||||||
|
flex: field === "id" ? 0 : 1,
|
||||||
|
minWidth: field === "id" ? 140 : 200,
|
||||||
|
sortable: true,
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
interface AuditTableClientProps {
|
||||||
|
initialData: AuditQueryResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ENTITY_PREFIX = "LIKE/";
|
||||||
|
|
||||||
|
const buildSortParam = (sortModel: GridSortModel) =>
|
||||||
|
sortModel.length && sortModel[0].field && sortModel[0].sort
|
||||||
|
? `${sortModel[0].field}:${sortModel[0].sort}`
|
||||||
|
: undefined;
|
||||||
|
|
||||||
|
const buildEntityParam = (entitySearch: string) =>
|
||||||
|
entitySearch.trim() ? `${ENTITY_PREFIX}${entitySearch.trim()}` : undefined;
|
||||||
|
|
||||||
|
export default function AuditTableClient({
|
||||||
|
initialData,
|
||||||
|
}: AuditTableClientProps) {
|
||||||
|
const [paginationModel, setPaginationModel] = useState<GridPaginationModel>({
|
||||||
|
page: initialData.pageIndex ?? 0,
|
||||||
|
pageSize: DEFAULT_PAGE_SIZE,
|
||||||
|
});
|
||||||
|
const [sortModel, setSortModel] = useState<GridSortModel>([]);
|
||||||
|
const [entitySearch, setEntitySearch] = useState<string>("");
|
||||||
|
const [entitySearchInput, setEntitySearchInput] = useState<string>("");
|
||||||
|
|
||||||
|
const [columns, setColumns] = useState<GridColDef[]>(
|
||||||
|
initialData.rows.length ? deriveColumns(initialData.rows) : FALLBACK_COLUMNS
|
||||||
|
);
|
||||||
|
|
||||||
|
const debouncedSetEntitySearch = useMemo(
|
||||||
|
() =>
|
||||||
|
debounce((value: string) => {
|
||||||
|
setEntitySearch(value);
|
||||||
|
setPaginationModel(prev => ({ ...prev, page: 0 }));
|
||||||
|
}, 500),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
debouncedSetEntitySearch.clear();
|
||||||
|
};
|
||||||
|
}, [debouncedSetEntitySearch]);
|
||||||
|
|
||||||
|
const sortParam = useMemo(() => buildSortParam(sortModel), [sortModel]);
|
||||||
|
const entityParam = useMemo(
|
||||||
|
() => buildEntityParam(entitySearch),
|
||||||
|
[entitySearch]
|
||||||
|
);
|
||||||
|
|
||||||
|
const { data, error, isLoading, isValidating } = useSWR(
|
||||||
|
[
|
||||||
|
"audits",
|
||||||
|
paginationModel.page,
|
||||||
|
paginationModel.pageSize,
|
||||||
|
sortParam ?? "",
|
||||||
|
entityParam ?? "",
|
||||||
|
],
|
||||||
|
() =>
|
||||||
|
getAudits({
|
||||||
|
limit: paginationModel.pageSize,
|
||||||
|
page: paginationModel.page + 1,
|
||||||
|
sort: sortParam,
|
||||||
|
entity: entityParam,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
keepPreviousData: true,
|
||||||
|
revalidateOnFocus: true,
|
||||||
|
revalidateOnReconnect: true,
|
||||||
|
fallbackData: initialData,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const rows = data?.rows ?? initialData.rows;
|
||||||
|
const rowCount = data?.total ?? initialData.total ?? rows.length;
|
||||||
|
const loading = isLoading || (isValidating && !rows.length);
|
||||||
|
const pageTitle = useMemo(
|
||||||
|
() =>
|
||||||
|
sortModel.length && sortModel[0].field
|
||||||
|
? `Audit Logs · sorted by ${toTitle(sortModel[0].field)}`
|
||||||
|
: "Audit Logs",
|
||||||
|
[sortModel]
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setColumns(prev =>
|
||||||
|
rows.length ? deriveColumns(rows) : prev.length ? prev : FALLBACK_COLUMNS
|
||||||
|
);
|
||||||
|
}, [rows]);
|
||||||
|
|
||||||
|
const handlePaginationChange = (model: GridPaginationModel) => {
|
||||||
|
setPaginationModel(model);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSortModelChange = (model: GridSortModel) => {
|
||||||
|
setSortModel(model);
|
||||||
|
setPaginationModel(prev => ({ ...prev, page: 0 }));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleEntitySearchChange = (value: string) => {
|
||||||
|
setEntitySearchInput(value);
|
||||||
|
debouncedSetEntitySearch(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const errorMessage =
|
||||||
|
error instanceof Error
|
||||||
|
? error.message
|
||||||
|
: error
|
||||||
|
? "Failed to load audits"
|
||||||
|
: null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="audits-page">
|
||||||
|
<Box sx={{ display: "flex", gap: 2, mt: 5 }}>
|
||||||
|
<TextField
|
||||||
|
label="Search by Entity"
|
||||||
|
variant="outlined"
|
||||||
|
size="small"
|
||||||
|
value={entitySearchInput}
|
||||||
|
onChange={e => handleEntitySearchChange(e.target.value)}
|
||||||
|
sx={{ width: 300, backgroundColor: "#f0f0f0" }}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<h1 className="page-title">{pageTitle}</h1>
|
||||||
|
{errorMessage && (
|
||||||
|
<div className="error-alert" role="alert">
|
||||||
|
{errorMessage}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="table-container">
|
||||||
|
<div className="scroll-wrapper">
|
||||||
|
<div
|
||||||
|
className="table-inner"
|
||||||
|
style={{ minWidth: `${columns.length * 200}px` }}
|
||||||
|
>
|
||||||
|
<DataGrid
|
||||||
|
rows={rows}
|
||||||
|
columns={columns.length ? columns : FALLBACK_COLUMNS}
|
||||||
|
loading={loading}
|
||||||
|
paginationMode="server"
|
||||||
|
sortingMode="server"
|
||||||
|
paginationModel={paginationModel}
|
||||||
|
onPaginationModelChange={handlePaginationChange}
|
||||||
|
rowCount={rowCount}
|
||||||
|
sortModel={sortModel}
|
||||||
|
onSortModelChange={handleSortModelChange}
|
||||||
|
pageSizeOptions={[10, 25, 50, 100]}
|
||||||
|
disableRowSelectionOnClick
|
||||||
|
sx={{
|
||||||
|
border: 0,
|
||||||
|
minHeight: 500,
|
||||||
|
"& .MuiDataGrid-cell": {
|
||||||
|
whiteSpace: "nowrap",
|
||||||
|
overflow: "hidden",
|
||||||
|
textOverflow: "ellipsis",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
137
app/dashboard/audits/auditTransforms.ts
Normal file
137
app/dashboard/audits/auditTransforms.ts
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
export type AuditRow = Record<string, unknown> & { id: string | number };
|
||||||
|
|
||||||
|
export interface AuditApiResponse {
|
||||||
|
total?: number;
|
||||||
|
limit?: number;
|
||||||
|
page?: number;
|
||||||
|
data?: unknown;
|
||||||
|
items?: unknown[];
|
||||||
|
audits?: unknown[];
|
||||||
|
logs?: unknown[];
|
||||||
|
results?: unknown[];
|
||||||
|
records?: unknown[];
|
||||||
|
meta?: { total?: number };
|
||||||
|
pagination?: { total?: number };
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AuditQueryResult {
|
||||||
|
rows: AuditRow[];
|
||||||
|
total: number;
|
||||||
|
payload: AuditApiResponse;
|
||||||
|
pageIndex: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const DEFAULT_PAGE_SIZE = 25;
|
||||||
|
const CANDIDATE_ARRAY_KEYS: (keyof AuditApiResponse)[] = [
|
||||||
|
"items",
|
||||||
|
"audits",
|
||||||
|
"logs",
|
||||||
|
"results",
|
||||||
|
"records",
|
||||||
|
];
|
||||||
|
|
||||||
|
export const normalizeValue = (value: unknown): string | number => {
|
||||||
|
if (value === null || value === undefined) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof value === "string" || typeof value === "number") {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof value === "boolean") {
|
||||||
|
return value ? "true" : "false";
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const extractArray = (payload: AuditApiResponse): unknown[] => {
|
||||||
|
if (Array.isArray(payload)) {
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of CANDIDATE_ARRAY_KEYS) {
|
||||||
|
const candidate = payload[key];
|
||||||
|
if (Array.isArray(candidate)) {
|
||||||
|
return candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataRecord =
|
||||||
|
payload.data &&
|
||||||
|
typeof payload.data === "object" &&
|
||||||
|
!Array.isArray(payload.data)
|
||||||
|
? (payload.data as Record<string, unknown>)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (dataRecord) {
|
||||||
|
for (const key of CANDIDATE_ARRAY_KEYS) {
|
||||||
|
const candidate = dataRecord[key];
|
||||||
|
if (Array.isArray(candidate)) {
|
||||||
|
return candidate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(payload.data)) {
|
||||||
|
return payload.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const resolveTotal = (
|
||||||
|
payload: AuditApiResponse,
|
||||||
|
fallback: number
|
||||||
|
): number => {
|
||||||
|
const fromPayload = payload.total;
|
||||||
|
const fromMeta = payload.meta?.total;
|
||||||
|
const fromPagination = payload.pagination?.total;
|
||||||
|
const fromData =
|
||||||
|
payload.data &&
|
||||||
|
typeof payload.data === "object" &&
|
||||||
|
!Array.isArray(payload.data)
|
||||||
|
? (payload.data as { total?: number }).total
|
||||||
|
: undefined;
|
||||||
|
|
||||||
|
return (
|
||||||
|
(typeof fromPayload === "number" && fromPayload) ||
|
||||||
|
(typeof fromMeta === "number" && fromMeta) ||
|
||||||
|
(typeof fromPagination === "number" && fromPagination) ||
|
||||||
|
(typeof fromData === "number" && fromData) ||
|
||||||
|
fallback
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const normalizeRows = (
|
||||||
|
entries: unknown[],
|
||||||
|
pageIndex: number
|
||||||
|
): AuditRow[] =>
|
||||||
|
entries.map((entry, index) => {
|
||||||
|
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
||||||
|
return {
|
||||||
|
id: `${pageIndex}-${index}`,
|
||||||
|
value: normalizeValue(entry),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const record = entry as Record<string, unknown>;
|
||||||
|
|
||||||
|
const normalized: Record<string, unknown> = {};
|
||||||
|
Object.entries(record).forEach(([key, value]) => {
|
||||||
|
normalized[key] = normalizeValue(value);
|
||||||
|
});
|
||||||
|
|
||||||
|
const identifier =
|
||||||
|
record.id ??
|
||||||
|
record.audit_id ??
|
||||||
|
record.log_id ??
|
||||||
|
record._id ??
|
||||||
|
`${pageIndex}-${index}`;
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: (identifier as string | number) ?? `${pageIndex}-${index}`,
|
||||||
|
...normalized,
|
||||||
|
};
|
||||||
|
});
|
||||||
@ -1,332 +1,70 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { useEffect, useMemo, useState } from "react";
|
|
||||||
import {
|
|
||||||
DataGrid,
|
|
||||||
GridColDef,
|
|
||||||
GridPaginationModel,
|
|
||||||
GridSortModel,
|
|
||||||
} from "@mui/x-data-grid";
|
|
||||||
import { getAudits } from "@/app/services/audits";
|
|
||||||
import "./page.scss";
|
import "./page.scss";
|
||||||
import TextField from "@mui/material/TextField";
|
|
||||||
import { Box, debounce } from "@mui/material";
|
|
||||||
|
|
||||||
type AuditRow = Record<string, unknown> & { id: string | number };
|
import AuditTableClient from "./AuditTableClient";
|
||||||
|
import {
|
||||||
|
AuditApiResponse,
|
||||||
|
AuditQueryResult,
|
||||||
|
DEFAULT_PAGE_SIZE,
|
||||||
|
extractArray,
|
||||||
|
normalizeRows,
|
||||||
|
resolveTotal,
|
||||||
|
} from "./auditTransforms";
|
||||||
|
import { cookies } from "next/headers";
|
||||||
|
import {
|
||||||
|
AUDIT_CACHE_TAG,
|
||||||
|
AUTH_COOKIE_NAME,
|
||||||
|
BE_BASE_URL,
|
||||||
|
REVALIDATE_SECONDS,
|
||||||
|
} from "@/app/services/constants";
|
||||||
|
|
||||||
interface AuditApiResponse {
|
async function fetchInitialAudits(): Promise<AuditQueryResult> {
|
||||||
total?: number;
|
const cookieStore = await cookies();
|
||||||
limit?: number;
|
const token = cookieStore.get(AUTH_COOKIE_NAME)?.value;
|
||||||
page?: number;
|
|
||||||
data?: unknown;
|
|
||||||
items?: unknown[];
|
|
||||||
audits?: unknown[];
|
|
||||||
logs?: unknown[];
|
|
||||||
results?: unknown[];
|
|
||||||
records?: unknown[];
|
|
||||||
meta?: { total?: number };
|
|
||||||
pagination?: { total?: number };
|
|
||||||
}
|
|
||||||
|
|
||||||
const DEFAULT_PAGE_SIZE = 25;
|
if (!token) {
|
||||||
|
throw new Error("Missing auth token");
|
||||||
|
}
|
||||||
|
|
||||||
const FALLBACK_COLUMNS: GridColDef[] = [
|
const params = new URLSearchParams();
|
||||||
{
|
params.set("limit", DEFAULT_PAGE_SIZE.toString());
|
||||||
field: "placeholder",
|
params.set("page", "1");
|
||||||
headerName: "Audit Data",
|
|
||||||
flex: 1,
|
const backendUrl = `${BE_BASE_URL}/api/v1/audit${
|
||||||
sortable: false,
|
params.size ? `?${params.toString()}` : ""
|
||||||
filterable: false,
|
}`;
|
||||||
|
|
||||||
|
const response = await fetch(backendUrl, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${token}`,
|
||||||
|
},
|
||||||
|
next: {
|
||||||
|
revalidate: REVALIDATE_SECONDS,
|
||||||
|
tags: [AUDIT_CACHE_TAG],
|
||||||
},
|
},
|
||||||
];
|
|
||||||
|
|
||||||
const CANDIDATE_ARRAY_KEYS: (keyof AuditApiResponse)[] = [
|
|
||||||
"items",
|
|
||||||
"audits",
|
|
||||||
"logs",
|
|
||||||
"results",
|
|
||||||
"records",
|
|
||||||
];
|
|
||||||
|
|
||||||
const normalizeValue = (value: unknown): string | number => {
|
|
||||||
if (value === null || value === undefined) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof value === "string" || typeof value === "number") {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof value === "boolean") {
|
|
||||||
return value ? "true" : "false";
|
|
||||||
}
|
|
||||||
|
|
||||||
return JSON.stringify(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
const toTitle = (field: string) =>
|
|
||||||
field
|
|
||||||
.replace(/_/g, " ")
|
|
||||||
.replace(/-/g, " ")
|
|
||||||
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
|
||||||
.replace(/\s+/g, " ")
|
|
||||||
.trim()
|
|
||||||
.replace(/^\w/g, char => char.toUpperCase());
|
|
||||||
|
|
||||||
const deriveColumns = (rows: AuditRow[]): GridColDef[] => {
|
|
||||||
if (!rows.length) return [];
|
|
||||||
|
|
||||||
return Object.keys(rows[0]).map(field => ({
|
|
||||||
field,
|
|
||||||
headerName: toTitle(field),
|
|
||||||
flex: field === "id" ? 0 : 1,
|
|
||||||
minWidth: field === "id" ? 140 : 200,
|
|
||||||
sortable: true,
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
const extractArray = (payload: AuditApiResponse): unknown[] => {
|
|
||||||
if (Array.isArray(payload)) {
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const key of CANDIDATE_ARRAY_KEYS) {
|
|
||||||
const candidate = payload[key];
|
|
||||||
if (Array.isArray(candidate)) {
|
|
||||||
return candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const dataRecord =
|
|
||||||
payload.data &&
|
|
||||||
typeof payload.data === "object" &&
|
|
||||||
!Array.isArray(payload.data)
|
|
||||||
? (payload.data as Record<string, unknown>)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
if (dataRecord) {
|
|
||||||
for (const key of CANDIDATE_ARRAY_KEYS) {
|
|
||||||
const candidate = dataRecord[key];
|
|
||||||
if (Array.isArray(candidate)) {
|
|
||||||
return candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Array.isArray(payload.data)) {
|
|
||||||
return payload.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
};
|
|
||||||
|
|
||||||
const resolveTotal = (payload: AuditApiResponse, fallback: number): number => {
|
|
||||||
const fromPayload = payload.total;
|
|
||||||
const fromMeta = payload.meta?.total;
|
|
||||||
const fromPagination = payload.pagination?.total;
|
|
||||||
const fromData =
|
|
||||||
payload.data &&
|
|
||||||
typeof payload.data === "object" &&
|
|
||||||
!Array.isArray(payload.data)
|
|
||||||
? (payload.data as { total?: number }).total
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
return (
|
|
||||||
(typeof fromPayload === "number" && fromPayload) ||
|
|
||||||
(typeof fromMeta === "number" && fromMeta) ||
|
|
||||||
(typeof fromPagination === "number" && fromPagination) ||
|
|
||||||
(typeof fromData === "number" && fromData) ||
|
|
||||||
fallback
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const normalizeRows = (entries: unknown[], page: number): AuditRow[] =>
|
|
||||||
entries.map((entry, index) => {
|
|
||||||
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
||||||
return {
|
|
||||||
id: `${page}-${index}`,
|
|
||||||
value: normalizeValue(entry),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const record = entry as Record<string, unknown>;
|
|
||||||
|
|
||||||
const normalized: Record<string, unknown> = {};
|
|
||||||
Object.entries(record).forEach(([key, value]) => {
|
|
||||||
normalized[key] = normalizeValue(value);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const identifier =
|
if (!response.ok) {
|
||||||
record.id ??
|
const errorData = await response
|
||||||
record.audit_id ??
|
.json()
|
||||||
record.log_id ??
|
.catch(() => ({ message: "Failed to fetch audits" }));
|
||||||
record._id ??
|
throw new Error(errorData?.message || "Failed to fetch audits");
|
||||||
`${page}-${index}`;
|
}
|
||||||
|
|
||||||
|
const payload = (await response.json()) as AuditApiResponse;
|
||||||
|
const rows = normalizeRows(extractArray(payload), 0);
|
||||||
|
const total = resolveTotal(payload, rows.length);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: (identifier as string | number) ?? `${page}-${index}`,
|
rows,
|
||||||
...normalized,
|
total,
|
||||||
|
payload,
|
||||||
|
pageIndex: 0,
|
||||||
};
|
};
|
||||||
});
|
}
|
||||||
|
|
||||||
export default function AuditPage() {
|
export default async function AuditPage() {
|
||||||
const [rows, setRows] = useState<AuditRow[]>([]);
|
const initialData = await fetchInitialAudits();
|
||||||
const [columns, setColumns] = useState<GridColDef[]>([]);
|
return <AuditTableClient initialData={initialData} />;
|
||||||
const [rowCount, setRowCount] = useState(0);
|
|
||||||
const [loading, setLoading] = useState(false);
|
|
||||||
const [error, setError] = useState<string | null>(null);
|
|
||||||
const [paginationModel, setPaginationModel] = useState<GridPaginationModel>({
|
|
||||||
page: 0,
|
|
||||||
pageSize: DEFAULT_PAGE_SIZE,
|
|
||||||
});
|
|
||||||
const [sortModel, setSortModel] = useState<GridSortModel>([]);
|
|
||||||
const [entitySearch, setEntitySearch] = useState<string>("");
|
|
||||||
const [entitySearchInput, setEntitySearchInput] = useState<string>("");
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const controller = new AbortController();
|
|
||||||
|
|
||||||
const fetchAudits = async () => {
|
|
||||||
setLoading(true);
|
|
||||||
setError(null);
|
|
||||||
|
|
||||||
const sortParam =
|
|
||||||
sortModel.length && sortModel[0].field && sortModel[0].sort
|
|
||||||
? `${sortModel[0].field}:${sortModel[0].sort}`
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
const entityParam = entitySearch.trim()
|
|
||||||
? `LIKE/${entitySearch.trim()}`
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const payload = (await getAudits({
|
|
||||||
limit: paginationModel.pageSize,
|
|
||||||
page: paginationModel.page + 1,
|
|
||||||
sort: sortParam,
|
|
||||||
entity: entityParam,
|
|
||||||
signal: controller.signal,
|
|
||||||
})) as AuditApiResponse;
|
|
||||||
|
|
||||||
const auditEntries = extractArray(payload);
|
|
||||||
const normalized = normalizeRows(auditEntries, paginationModel.page);
|
|
||||||
|
|
||||||
setColumns(prev =>
|
|
||||||
normalized.length
|
|
||||||
? deriveColumns(normalized)
|
|
||||||
: prev.length
|
|
||||||
? prev
|
|
||||||
: FALLBACK_COLUMNS
|
|
||||||
);
|
|
||||||
|
|
||||||
setRows(normalized);
|
|
||||||
setRowCount(resolveTotal(payload, normalized.length));
|
|
||||||
} catch (err) {
|
|
||||||
if (controller.signal.aborted) return;
|
|
||||||
const message =
|
|
||||||
err instanceof Error ? err.message : "Failed to load audits";
|
|
||||||
setError(message);
|
|
||||||
setRows([]);
|
|
||||||
setColumns(prev => (prev.length ? prev : FALLBACK_COLUMNS));
|
|
||||||
} finally {
|
|
||||||
if (!controller.signal.aborted) {
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchAudits();
|
|
||||||
|
|
||||||
return () => controller.abort();
|
|
||||||
}, [paginationModel, sortModel, entitySearch]);
|
|
||||||
|
|
||||||
const handlePaginationChange = (model: GridPaginationModel) => {
|
|
||||||
setPaginationModel(model);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleSortModelChange = (model: GridSortModel) => {
|
|
||||||
setSortModel(model);
|
|
||||||
setPaginationModel(prev => ({ ...prev, page: 0 }));
|
|
||||||
};
|
|
||||||
|
|
||||||
const debouncedSetEntitySearch = useMemo(
|
|
||||||
() =>
|
|
||||||
debounce((value: string) => {
|
|
||||||
setEntitySearch(value);
|
|
||||||
setPaginationModel(prev => ({ ...prev, page: 0 }));
|
|
||||||
}, 500),
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
return () => {
|
|
||||||
debouncedSetEntitySearch.clear();
|
|
||||||
};
|
|
||||||
}, [debouncedSetEntitySearch]);
|
|
||||||
|
|
||||||
const handleEntitySearchChange = (value: string) => {
|
|
||||||
setEntitySearchInput(value);
|
|
||||||
debouncedSetEntitySearch(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
const pageTitle = useMemo(
|
|
||||||
() =>
|
|
||||||
sortModel.length && sortModel[0].field
|
|
||||||
? `Audit Logs · sorted by ${toTitle(sortModel[0].field)}`
|
|
||||||
: "Audit Logs",
|
|
||||||
[sortModel]
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="audits-page">
|
|
||||||
<Box sx={{ display: "flex", gap: 2, mt: 5 }}>
|
|
||||||
<TextField
|
|
||||||
label="Search by Entity"
|
|
||||||
variant="outlined"
|
|
||||||
size="small"
|
|
||||||
value={entitySearchInput}
|
|
||||||
onChange={e => handleEntitySearchChange(e.target.value)}
|
|
||||||
sx={{ width: 300, backgroundColor: "#f0f0f0" }}
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
<h1 className="page-title">{pageTitle}</h1>
|
|
||||||
{error && (
|
|
||||||
<div className="error-alert" role="alert">
|
|
||||||
{error}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<div className="table-container">
|
|
||||||
<div className="scroll-wrapper">
|
|
||||||
<div
|
|
||||||
className="table-inner"
|
|
||||||
style={{ minWidth: `${columns.length * 200}px` }}
|
|
||||||
>
|
|
||||||
<DataGrid
|
|
||||||
rows={rows}
|
|
||||||
columns={columns.length ? columns : FALLBACK_COLUMNS}
|
|
||||||
loading={loading}
|
|
||||||
paginationMode="server"
|
|
||||||
sortingMode="server"
|
|
||||||
paginationModel={paginationModel}
|
|
||||||
onPaginationModelChange={handlePaginationChange}
|
|
||||||
rowCount={rowCount}
|
|
||||||
sortModel={sortModel}
|
|
||||||
onSortModelChange={handleSortModelChange}
|
|
||||||
pageSizeOptions={[10, 25, 50, 100]}
|
|
||||||
disableRowSelectionOnClick
|
|
||||||
sx={{
|
|
||||||
border: 0,
|
|
||||||
minHeight: 500,
|
|
||||||
"& .MuiDataGrid-cell": {
|
|
||||||
whiteSpace: "nowrap",
|
|
||||||
overflow: "hidden",
|
|
||||||
textOverflow: "ellipsis",
|
|
||||||
},
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import { useEffect, useMemo, useState } from "react";
|
||||||
import DataTable from "@/app/features/DataTable/DataTable";
|
import DataTable from "@/app/features/DataTable/DataTable";
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import { AppDispatch } from "@/app/redux/store";
|
import { AppDispatch } from "@/app/redux/store";
|
||||||
@ -12,7 +13,6 @@ import {
|
|||||||
setStatus,
|
setStatus,
|
||||||
setError as setAdvancedSearchError,
|
setError as setAdvancedSearchError,
|
||||||
} from "@/app/redux/advanedSearch/advancedSearchSlice";
|
} from "@/app/redux/advanedSearch/advancedSearchSlice";
|
||||||
import { useEffect, useMemo, useState } from "react";
|
|
||||||
import { TransactionRow, BackendTransaction } from "../interface";
|
import { TransactionRow, BackendTransaction } from "../interface";
|
||||||
|
|
||||||
export default function DepositTransactionPage() {
|
export default function DepositTransactionPage() {
|
||||||
|
|||||||
@ -45,7 +45,6 @@ export default function AdvancedSearch({ labels }: { labels: ISearchLabel[] }) {
|
|||||||
const [operators, setOperators] = useState<Record<string, string>>({});
|
const [operators, setOperators] = useState<Record<string, string>>({});
|
||||||
const conditionOperators = useSelector(selectConditionOperators);
|
const conditionOperators = useSelector(selectConditionOperators);
|
||||||
|
|
||||||
console.log("[conditionOperators]", conditionOperators);
|
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
// SYNC REDUX FILTERS TO LOCAL STATE ON LOAD
|
// SYNC REDUX FILTERS TO LOCAL STATE ON LOAD
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
|
|||||||
@ -33,14 +33,10 @@ const DataTable = <TRow extends DataRowBase>({
|
|||||||
}: DataTableProps<TRow>) => {
|
}: DataTableProps<TRow>) => {
|
||||||
const dispatch = useDispatch<AppDispatch>();
|
const dispatch = useDispatch<AppDispatch>();
|
||||||
const [showExtraColumns, setShowExtraColumns] = useState(false);
|
const [showExtraColumns, setShowExtraColumns] = useState(false);
|
||||||
const [modalOpen, setModalOpen] = useState(false);
|
const [statusDialogData, setStatusDialogData] = useState<{
|
||||||
const [selectedRowId, setSelectedRowId] = useState<number | null>(null);
|
rowId: number;
|
||||||
const [pendingStatus, setPendingStatus] = useState<string>("");
|
newStatus: string;
|
||||||
const [reason, setReason] = useState<string>("");
|
} | null>(null);
|
||||||
const [statusUpdateError, setStatusUpdateError] = useState<string | null>(
|
|
||||||
null
|
|
||||||
);
|
|
||||||
const [isUpdatingStatus, setIsUpdatingStatus] = useState(false);
|
|
||||||
|
|
||||||
const status = useSelector(selectStatus);
|
const status = useSelector(selectStatus);
|
||||||
const errorMessage = useSelector(selectError);
|
const errorMessage = useSelector(selectError);
|
||||||
@ -49,7 +45,6 @@ const DataTable = <TRow extends DataRowBase>({
|
|||||||
|
|
||||||
const handlePaginationModelChange = useCallback(
|
const handlePaginationModelChange = useCallback(
|
||||||
(model: GridPaginationModel) => {
|
(model: GridPaginationModel) => {
|
||||||
console.log("model", model);
|
|
||||||
const nextPage = model.page + 1;
|
const nextPage = model.page + 1;
|
||||||
const nextLimit = model.pageSize;
|
const nextLimit = model.pageSize;
|
||||||
|
|
||||||
@ -61,57 +56,12 @@ const DataTable = <TRow extends DataRowBase>({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const handleStatusChange = useCallback((rowId: number, newStatus: string) => {
|
const handleStatusChange = useCallback((rowId: number, newStatus: string) => {
|
||||||
setSelectedRowId(rowId);
|
setStatusDialogData({ rowId, newStatus });
|
||||||
setPendingStatus(newStatus);
|
|
||||||
setModalOpen(true);
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const handleStatusSave = async () => {
|
const handleDialogClose = useCallback(() => {
|
||||||
if (!selectedRowId || !pendingStatus) return;
|
setStatusDialogData(null);
|
||||||
setStatusUpdateError(null);
|
}, []);
|
||||||
setIsUpdatingStatus(true);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const payload = {
|
|
||||||
data: {
|
|
||||||
status: pendingStatus,
|
|
||||||
notes: reason.trim(),
|
|
||||||
},
|
|
||||||
fields: ["Status", "Notes"],
|
|
||||||
};
|
|
||||||
|
|
||||||
const response = await fetch(
|
|
||||||
`/api/dashboard/transactions/${selectedRowId}`,
|
|
||||||
{
|
|
||||||
method: "PUT",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
},
|
|
||||||
body: JSON.stringify(payload),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const result = await response.json();
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(
|
|
||||||
result?.message || result?.error || "Failed to update transaction"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
setModalOpen(false);
|
|
||||||
setReason("");
|
|
||||||
setPendingStatus("");
|
|
||||||
setStatusUpdateError(null);
|
|
||||||
setSelectedRowId(null);
|
|
||||||
} catch (err) {
|
|
||||||
setStatusUpdateError(
|
|
||||||
err instanceof Error ? err.message : "Failed to update transaction"
|
|
||||||
);
|
|
||||||
} finally {
|
|
||||||
setIsUpdatingStatus(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const selectEnhancedColumns = useMemo(makeSelectEnhancedColumns, []);
|
const selectEnhancedColumns = useMemo(makeSelectEnhancedColumns, []);
|
||||||
|
|
||||||
@ -170,20 +120,10 @@ const DataTable = <TRow extends DataRowBase>({
|
|||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<StatusChangeDialog
|
<StatusChangeDialog
|
||||||
open={modalOpen}
|
open={Boolean(statusDialogData)}
|
||||||
newStatus={pendingStatus}
|
transactionId={statusDialogData?.rowId}
|
||||||
reason={reason}
|
newStatus={statusDialogData?.newStatus ?? ""}
|
||||||
setReason={setReason}
|
onClose={handleDialogClose}
|
||||||
handleClose={() => {
|
|
||||||
setModalOpen(false);
|
|
||||||
setReason("");
|
|
||||||
setPendingStatus("");
|
|
||||||
setStatusUpdateError(null);
|
|
||||||
setSelectedRowId(null);
|
|
||||||
}}
|
|
||||||
handleSave={handleStatusSave}
|
|
||||||
isSubmitting={isUpdatingStatus}
|
|
||||||
errorMessage={statusUpdateError}
|
|
||||||
/>
|
/>
|
||||||
</Paper>
|
</Paper>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@ -8,39 +8,90 @@ import {
|
|||||||
Alert,
|
Alert,
|
||||||
CircularProgress,
|
CircularProgress,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect, useMemo } from "react";
|
||||||
|
|
||||||
interface StatusChangeDialogProps {
|
interface StatusChangeDialogProps {
|
||||||
open: boolean;
|
open: boolean;
|
||||||
|
transactionId?: number | null;
|
||||||
newStatus: string;
|
newStatus: string;
|
||||||
reason: string;
|
onClose: () => void;
|
||||||
setReason: React.Dispatch<React.SetStateAction<string>>;
|
onStatusUpdated?: () => void;
|
||||||
handleClose: () => void;
|
|
||||||
handleSave: () => void;
|
|
||||||
isSubmitting?: boolean;
|
|
||||||
errorMessage?: string | null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const StatusChangeDialog = ({
|
const StatusChangeDialog = ({
|
||||||
open,
|
open,
|
||||||
|
transactionId,
|
||||||
newStatus,
|
newStatus,
|
||||||
reason,
|
onClose,
|
||||||
setReason,
|
onStatusUpdated,
|
||||||
handleClose,
|
|
||||||
handleSave,
|
|
||||||
isSubmitting = false,
|
|
||||||
errorMessage,
|
|
||||||
}: StatusChangeDialogProps) => {
|
}: StatusChangeDialogProps) => {
|
||||||
const [isValid, setIsValid] = useState(false);
|
const [reason, setReason] = useState("");
|
||||||
|
const [errorMessage, setErrorMessage] = useState<string | null>(null);
|
||||||
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (!open) {
|
||||||
|
setReason("");
|
||||||
|
setErrorMessage(null);
|
||||||
|
setIsSubmitting(false);
|
||||||
|
}
|
||||||
|
}, [open]);
|
||||||
|
|
||||||
|
const isValid = useMemo(() => {
|
||||||
const noSpaces = reason.replace(/\s/g, "");
|
const noSpaces = reason.replace(/\s/g, "");
|
||||||
const length = noSpaces.length;
|
const length = noSpaces.length;
|
||||||
setIsValid(length >= 12 && length <= 400);
|
return length >= 12 && length <= 400;
|
||||||
}, [reason]);
|
}, [reason]);
|
||||||
|
|
||||||
|
const handleSave = async () => {
|
||||||
|
if (!transactionId || !newStatus || !isValid) return;
|
||||||
|
|
||||||
|
setErrorMessage(null);
|
||||||
|
setIsSubmitting(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const payload = {
|
||||||
|
data: {
|
||||||
|
status: newStatus,
|
||||||
|
notes: reason.trim(),
|
||||||
|
},
|
||||||
|
fields: ["Status", "Notes"],
|
||||||
|
};
|
||||||
|
|
||||||
|
const response = await fetch(
|
||||||
|
`/api/dashboard/transactions/${transactionId}`,
|
||||||
|
{
|
||||||
|
method: "PUT",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify(payload),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(
|
||||||
|
result?.message || result?.error || "Failed to update transaction"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
setReason("");
|
||||||
|
setErrorMessage(null);
|
||||||
|
onStatusUpdated?.();
|
||||||
|
onClose();
|
||||||
|
} catch (err) {
|
||||||
|
setErrorMessage(
|
||||||
|
err instanceof Error ? err.message : "Failed to update transaction"
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
setIsSubmitting(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog open={open} onClose={handleClose} fullWidth maxWidth="sm">
|
<Dialog open={open} onClose={onClose} fullWidth maxWidth="sm">
|
||||||
<DialogTitle>Change Status</DialogTitle>
|
<DialogTitle>Change Status</DialogTitle>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
You want to change the status to <b>{newStatus}</b>. Please provide a
|
You want to change the status to <b>{newStatus}</b>. Please provide a
|
||||||
@ -63,13 +114,13 @@ const StatusChangeDialog = ({
|
|||||||
)}
|
)}
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
<Button onClick={handleClose} disabled={isSubmitting}>
|
<Button onClick={onClose} disabled={isSubmitting}>
|
||||||
Cancel
|
Cancel
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
onClick={handleSave}
|
onClick={handleSave}
|
||||||
disabled={!isValid || isSubmitting}
|
disabled={!isValid || isSubmitting || !transactionId}
|
||||||
startIcon={isSubmitting ? <CircularProgress size={18} /> : undefined}
|
startIcon={isSubmitting ? <CircularProgress size={18} /> : undefined}
|
||||||
>
|
>
|
||||||
Save
|
Save
|
||||||
|
|||||||
@ -1,20 +1,22 @@
|
|||||||
interface GetAuditsParams {
|
import {
|
||||||
limit?: number;
|
AuditApiResponse,
|
||||||
page?: number;
|
AuditQueryResult,
|
||||||
sort?: string;
|
DEFAULT_PAGE_SIZE,
|
||||||
filter?: string;
|
extractArray,
|
||||||
entity?: string;
|
normalizeRows,
|
||||||
signal?: AbortSignal;
|
resolveTotal,
|
||||||
}
|
} from "@/app/dashboard/audits/auditTransforms";
|
||||||
|
import { IGetAuditsParams } from "./types";
|
||||||
|
import { AUDIT_CACHE_TAG, REVALIDATE_SECONDS } from "./constants";
|
||||||
|
|
||||||
export async function getAudits({
|
export async function getAudits({
|
||||||
limit,
|
limit = DEFAULT_PAGE_SIZE,
|
||||||
page,
|
page = 1,
|
||||||
sort,
|
sort,
|
||||||
filter,
|
filter,
|
||||||
entity,
|
entity,
|
||||||
signal,
|
signal,
|
||||||
}: GetAuditsParams = {}) {
|
}: IGetAuditsParams = {}): Promise<AuditQueryResult> {
|
||||||
const params = new URLSearchParams();
|
const params = new URLSearchParams();
|
||||||
|
|
||||||
if (limit) params.set("limit", String(limit));
|
if (limit) params.set("limit", String(limit));
|
||||||
@ -28,8 +30,11 @@ export async function getAudits({
|
|||||||
`/api/dashboard/audits${queryString ? `?${queryString}` : ""}`,
|
`/api/dashboard/audits${queryString ? `?${queryString}` : ""}`,
|
||||||
{
|
{
|
||||||
method: "GET",
|
method: "GET",
|
||||||
cache: "no-store",
|
|
||||||
signal,
|
signal,
|
||||||
|
next: {
|
||||||
|
revalidate: REVALIDATE_SECONDS,
|
||||||
|
tags: [AUDIT_CACHE_TAG],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -40,5 +45,16 @@ export async function getAudits({
|
|||||||
throw new Error(errorData.message || "Failed to fetch audits");
|
throw new Error(errorData.message || "Failed to fetch audits");
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.json();
|
const payload = (await response.json()) as AuditApiResponse;
|
||||||
|
const pageIndex = page - 1;
|
||||||
|
const auditEntries = extractArray(payload);
|
||||||
|
const rows = normalizeRows(auditEntries, pageIndex);
|
||||||
|
const total = resolveTotal(payload, rows.length);
|
||||||
|
|
||||||
|
return {
|
||||||
|
rows,
|
||||||
|
total,
|
||||||
|
payload,
|
||||||
|
pageIndex,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
0
app/services/constants copy.ts
Normal file
0
app/services/constants copy.ts
Normal file
5
app/services/constants.ts
Normal file
5
app/services/constants.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export const AUDIT_CACHE_TAG = "audits";
|
||||||
|
export const REVALIDATE_SECONDS = 60;
|
||||||
|
|
||||||
|
export const BE_BASE_URL = process.env.BE_BASE_URL || "";
|
||||||
|
export const AUTH_COOKIE_NAME = "auth_token";
|
||||||
8
app/services/types.ts
Normal file
8
app/services/types.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export interface IGetAuditsParams {
|
||||||
|
limit?: number;
|
||||||
|
page?: number;
|
||||||
|
sort?: string;
|
||||||
|
filter?: string;
|
||||||
|
entity?: string;
|
||||||
|
signal?: AbortSignal;
|
||||||
|
}
|
||||||
@ -1,8 +1,7 @@
|
|||||||
|
import { AUTH_COOKIE_NAME } from "@/app/services/constants";
|
||||||
import { NextResponse } from "next/server";
|
import { NextResponse } from "next/server";
|
||||||
import type { NextRequest } from "next/server";
|
import type { NextRequest } from "next/server";
|
||||||
import { jwtVerify } from "jose";
|
import { jwtVerify } from "jose";
|
||||||
|
|
||||||
const COOKIE_NAME = "auth_token";
|
|
||||||
const JWT_SECRET = new TextEncoder().encode(process.env.JWT_SECRET!);
|
const JWT_SECRET = new TextEncoder().encode(process.env.JWT_SECRET!);
|
||||||
|
|
||||||
// Define route-to-role mappings
|
// Define route-to-role mappings
|
||||||
@ -71,7 +70,7 @@ async function validateToken(token: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function middleware(request: NextRequest) {
|
export async function middleware(request: NextRequest) {
|
||||||
const token = request.cookies.get(COOKIE_NAME)?.value;
|
const token = request.cookies.get(AUTH_COOKIE_NAME)?.value;
|
||||||
const loginUrl = new URL("/login", request.url);
|
const loginUrl = new URL("/login", request.url);
|
||||||
const currentPath = request.nextUrl.pathname;
|
const currentPath = request.nextUrl.pathname;
|
||||||
|
|
||||||
@ -87,7 +86,7 @@ export async function middleware(request: NextRequest) {
|
|||||||
|
|
||||||
if (!payload) {
|
if (!payload) {
|
||||||
const res = NextResponse.redirect(loginUrl);
|
const res = NextResponse.redirect(loginUrl);
|
||||||
res.cookies.delete(COOKIE_NAME);
|
res.cookies.delete(AUTH_COOKIE_NAME);
|
||||||
loginUrl.searchParams.set("reason", "invalid-token");
|
loginUrl.searchParams.set("reason", "invalid-token");
|
||||||
loginUrl.searchParams.set("redirect", currentPath);
|
loginUrl.searchParams.set("redirect", currentPath);
|
||||||
return res;
|
return res;
|
||||||
@ -96,7 +95,7 @@ export async function middleware(request: NextRequest) {
|
|||||||
// 3️⃣ Expiry check
|
// 3️⃣ Expiry check
|
||||||
if (isExpired(payload.exp)) {
|
if (isExpired(payload.exp)) {
|
||||||
const res = NextResponse.redirect(loginUrl);
|
const res = NextResponse.redirect(loginUrl);
|
||||||
res.cookies.delete(COOKIE_NAME);
|
res.cookies.delete(AUTH_COOKIE_NAME);
|
||||||
loginUrl.searchParams.set("reason", "expired-token");
|
loginUrl.searchParams.set("reason", "expired-token");
|
||||||
loginUrl.searchParams.set("redirect", currentPath);
|
loginUrl.searchParams.set("redirect", currentPath);
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
153
package-lock.json
generated
153
package-lock.json
generated
@ -24,9 +24,13 @@
|
|||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-date-range": "^2.0.1",
|
"react-date-range": "^2.0.1",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
|
"react-hot-toast": "^2.6.0",
|
||||||
"react-redux": "^9.2.0",
|
"react-redux": "^9.2.0",
|
||||||
"recharts": "^2.15.3",
|
"recharts": "^2.15.3",
|
||||||
|
"redux-observable": "^3.0.0-rc.2",
|
||||||
|
"rxjs": "^7.8.2",
|
||||||
"sass": "^1.89.2",
|
"sass": "^1.89.2",
|
||||||
|
"swr": "^2.3.6",
|
||||||
"xlsx": "^0.18.5"
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -37,9 +41,13 @@
|
|||||||
"@types/react-date-range": "^1.4.10",
|
"@types/react-date-range": "^1.4.10",
|
||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
"@types/react-redux": "^7.1.34",
|
"@types/react-redux": "^7.1.34",
|
||||||
|
"@types/redux-persist": "^4.3.1",
|
||||||
|
"cross-env": "^10.1.0",
|
||||||
"eslint": "^9",
|
"eslint": "^9",
|
||||||
"eslint-config-next": "15.3.3",
|
"eslint-config-next": "15.3.3",
|
||||||
|
"husky": "^9.1.7",
|
||||||
"msw": "^2.10.2",
|
"msw": "^2.10.2",
|
||||||
|
"prettier": "^3.6.2",
|
||||||
"typescript": "^5"
|
"typescript": "^5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -392,6 +400,13 @@
|
|||||||
"integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
|
"integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/@epic-web/invariant": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@eslint-community/eslint-utils": {
|
"node_modules/@eslint-community/eslint-utils": {
|
||||||
"version": "4.7.0",
|
"version": "4.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
|
||||||
@ -2361,6 +2376,17 @@
|
|||||||
"@types/react": "*"
|
"@types/react": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/redux-persist": {
|
||||||
|
"version": "4.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/redux-persist/-/redux-persist-4.3.1.tgz",
|
||||||
|
"integrity": "sha512-YkMnMUk+4//wPtiSTMfsxST/F9Gh9sPWX0LVxHuOidGjojHtMdpep2cYvQgfiDMnj34orXyZI+QJCQMZDlafKA==",
|
||||||
|
"deprecated": "This is a stub types definition for redux-persist (https://github.com/rt2zz/redux-persist). redux-persist provides its own type definitions, so you don't need @types/redux-persist installed!",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"redux-persist": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/statuses": {
|
"node_modules/@types/statuses": {
|
||||||
"version": "2.0.6",
|
"version": "2.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz",
|
||||||
@ -3621,6 +3647,24 @@
|
|||||||
"node": ">=0.8"
|
"node": ">=0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/cross-env": {
|
||||||
|
"version": "10.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz",
|
||||||
|
"integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@epic-web/invariant": "^1.0.0",
|
||||||
|
"cross-spawn": "^7.0.6"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"cross-env": "dist/bin/cross-env.js",
|
||||||
|
"cross-env-shell": "dist/bin/cross-env-shell.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cross-spawn": {
|
"node_modules/cross-spawn": {
|
||||||
"version": "7.0.6",
|
"version": "7.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||||
@ -3906,6 +3950,15 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/dequal": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
|
||||||
|
"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/detect-libc": {
|
"node_modules/detect-libc": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
|
||||||
@ -4941,6 +4994,15 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/goober": {
|
||||||
|
"version": "2.1.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz",
|
||||||
|
"integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"csstype": "^3.0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/gopd": {
|
"node_modules/gopd": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
||||||
@ -5080,6 +5142,22 @@
|
|||||||
"react-is": "^16.7.0"
|
"react-is": "^16.7.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/husky": {
|
||||||
|
"version": "9.1.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
|
||||||
|
"integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"husky": "bin.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/typicode"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ignore": {
|
"node_modules/ignore": {
|
||||||
"version": "5.3.2",
|
"version": "5.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
|
||||||
@ -6355,6 +6433,22 @@
|
|||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/prettier": {
|
||||||
|
"version": "3.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
|
||||||
|
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"prettier": "bin/prettier.cjs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/prop-types": {
|
"node_modules/prop-types": {
|
||||||
"version": "15.8.1",
|
"version": "15.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
|
||||||
@ -6454,6 +6548,23 @@
|
|||||||
"react": "^19.1.0"
|
"react": "^19.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/react-hot-toast": {
|
||||||
|
"version": "2.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz",
|
||||||
|
"integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"csstype": "^3.1.3",
|
||||||
|
"goober": "^2.1.16"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": ">=16",
|
||||||
|
"react-dom": ">=16"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/react-is": {
|
"node_modules/react-is": {
|
||||||
"version": "16.13.1",
|
"version": "16.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||||
@ -6580,6 +6691,26 @@
|
|||||||
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
|
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/redux-observable": {
|
||||||
|
"version": "3.0.0-rc.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/redux-observable/-/redux-observable-3.0.0-rc.2.tgz",
|
||||||
|
"integrity": "sha512-gG/pWIKgSrcTyyavm2so5tc7tuyCQ47p3VdCAG6wt+CV0WGhDr50cMQHLcYKxFZSGgTm19a8ZmyfJGndmGDpYg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"redux": ">=5 <6",
|
||||||
|
"rxjs": ">=7 <8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/redux-persist": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"redux": ">4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/redux-thunk": {
|
"node_modules/redux-thunk": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
|
||||||
@ -6730,6 +6861,15 @@
|
|||||||
"queue-microtask": "^1.2.2"
|
"queue-microtask": "^1.2.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rxjs": {
|
||||||
|
"version": "7.8.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
|
||||||
|
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/safe-array-concat": {
|
"node_modules/safe-array-concat": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
|
||||||
@ -7344,6 +7484,19 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/swr": {
|
||||||
|
"version": "2.3.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz",
|
||||||
|
"integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"dequal": "^2.0.3",
|
||||||
|
"use-sync-external-store": "^1.4.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tiny-invariant": {
|
"node_modules/tiny-invariant": {
|
||||||
"version": "1.3.3",
|
"version": "1.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
|
||||||
|
|||||||
@ -41,6 +41,7 @@
|
|||||||
"redux-observable": "^3.0.0-rc.2",
|
"redux-observable": "^3.0.0-rc.2",
|
||||||
"rxjs": "^7.8.2",
|
"rxjs": "^7.8.2",
|
||||||
"sass": "^1.89.2",
|
"sass": "^1.89.2",
|
||||||
|
"swr": "^2.3.6",
|
||||||
"xlsx": "^0.18.5"
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
454
yarn.lock
454
yarn.lock
@ -104,28 +104,6 @@
|
|||||||
"@types/tough-cookie" "^4.0.5"
|
"@types/tough-cookie" "^4.0.5"
|
||||||
tough-cookie "^4.1.4"
|
tough-cookie "^4.1.4"
|
||||||
|
|
||||||
"@emnapi/core@^1.4.3":
|
|
||||||
version "1.4.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.5.tgz#bfbb0cbbbb9f96ec4e2c4fd917b7bbe5495ceccb"
|
|
||||||
integrity sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==
|
|
||||||
dependencies:
|
|
||||||
"@emnapi/wasi-threads" "1.0.4"
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@emnapi/runtime@^1.4.3":
|
|
||||||
version "1.4.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.5.tgz#c67710d0661070f38418b6474584f159de38aba9"
|
|
||||||
integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@emnapi/wasi-threads@1.0.4":
|
|
||||||
version "1.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz#703fc094d969e273b1b71c292523b2f792862bf4"
|
|
||||||
integrity sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@emotion/babel-plugin@^11.13.5":
|
"@emotion/babel-plugin@^11.13.5":
|
||||||
version "11.13.5"
|
version "11.13.5"
|
||||||
resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
|
resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
|
||||||
@ -171,7 +149,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
|
||||||
integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
|
integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
|
||||||
|
|
||||||
"@emotion/react@^11.14.0":
|
"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.14.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0":
|
||||||
version "11.14.0"
|
version "11.14.0"
|
||||||
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
|
||||||
integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
|
integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
|
||||||
@ -201,7 +179,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
|
||||||
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
|
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
|
||||||
|
|
||||||
"@emotion/styled@^11.14.0":
|
"@emotion/styled@^11.14.0", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1":
|
||||||
version "11.14.0"
|
version "11.14.0"
|
||||||
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz"
|
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz"
|
||||||
integrity sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==
|
integrity sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==
|
||||||
@ -235,7 +213,7 @@
|
|||||||
|
|
||||||
"@epic-web/invariant@^1.0.0":
|
"@epic-web/invariant@^1.0.0":
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/@epic-web/invariant/-/invariant-1.0.0.tgz#1073e5dee6dd540410784990eb73e4acd25c9813"
|
resolved "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz"
|
||||||
integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==
|
integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==
|
||||||
|
|
||||||
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0":
|
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0":
|
||||||
@ -339,124 +317,6 @@
|
|||||||
resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz"
|
resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz"
|
||||||
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
|
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
|
||||||
|
|
||||||
"@img/sharp-darwin-arm64@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz#65049ef7c6be7857da742cd028f97602ce209635"
|
|
||||||
integrity sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-darwin-arm64" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-darwin-x64@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz#d37ff7c75c46d5a68a3756e3f1924ef7ca7b285e"
|
|
||||||
integrity sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-darwin-x64" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-libvips-darwin-arm64@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz#843f7c09c7245dc0d3cfec2b3c83bb08799a704f"
|
|
||||||
integrity sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-darwin-x64@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz#1239c24426c06a8e833815562f78047a3bfbaaf8"
|
|
||||||
integrity sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-linux-arm64@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz#20d276cefd903ee483f0441ba35961679c286315"
|
|
||||||
integrity sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-linux-arm@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz#067c0b566eae8063738cf1b1db8f8a8573b5465c"
|
|
||||||
integrity sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-linux-ppc64@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz#682334595f2ca00e0a07a675ba170af165162802"
|
|
||||||
integrity sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-linux-s390x@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz#82fcd68444b3666384235279c145c2b28d8ee302"
|
|
||||||
integrity sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-linux-x64@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz#65b2b908bf47156b0724fde9095676c83a18cf5a"
|
|
||||||
integrity sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-linuxmusl-arm64@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz#72accf924e80b081c8db83b900b444a67c203f01"
|
|
||||||
integrity sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==
|
|
||||||
|
|
||||||
"@img/sharp-libvips-linuxmusl-x64@1.1.0":
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz#1fa052737e203f46bf44192acd01f9faf11522d7"
|
|
||||||
integrity sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==
|
|
||||||
|
|
||||||
"@img/sharp-linux-arm64@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz#c9690fac5f3137eaab3f7ad6065390d10f66f1fa"
|
|
||||||
integrity sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-linux-arm64" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-linux-arm@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz#771dd2ec645f85f98441359bfc118afaf38cbd8b"
|
|
||||||
integrity sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-linux-arm" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-linux-s390x@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz#82132d158abff57bd90b53574f2865f72f94e6c8"
|
|
||||||
integrity sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-linux-s390x" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-linux-x64@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz#d815fb87899d462b28b62a9252ad127f02fe0740"
|
|
||||||
integrity sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-linux-x64" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-linuxmusl-arm64@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz#cfac45b2abbc04628f676e123bfe3aeb300266c7"
|
|
||||||
integrity sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-linuxmusl-arm64" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-linuxmusl-x64@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz#b876c23ff51d0fb6d9f3b0a07e2f4d1436c203ad"
|
|
||||||
integrity sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==
|
|
||||||
optionalDependencies:
|
|
||||||
"@img/sharp-libvips-linuxmusl-x64" "1.1.0"
|
|
||||||
|
|
||||||
"@img/sharp-wasm32@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz#b1dd0bab547dccf517586eb1fa5852160bba3b82"
|
|
||||||
integrity sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==
|
|
||||||
dependencies:
|
|
||||||
"@emnapi/runtime" "^1.4.3"
|
|
||||||
|
|
||||||
"@img/sharp-win32-arm64@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz#f37bee0f60c167f825a09d2b8de6849b823e8b30"
|
|
||||||
integrity sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==
|
|
||||||
|
|
||||||
"@img/sharp-win32-ia32@0.34.2":
|
|
||||||
version "0.34.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz#8fc30b6655bc6ff8910344a2020d334aa6361672"
|
|
||||||
integrity sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==
|
|
||||||
|
|
||||||
"@img/sharp-win32-x64@0.34.2":
|
"@img/sharp-win32-x64@0.34.2":
|
||||||
version "0.34.2"
|
version "0.34.2"
|
||||||
resolved "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz"
|
resolved "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz"
|
||||||
@ -550,7 +410,7 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.27.1"
|
"@babel/runtime" "^7.27.1"
|
||||||
|
|
||||||
"@mui/material@^7.1.2":
|
"@mui/material@^5.15.14 || ^6.0.0 || ^7.0.0", "@mui/material@^7.1.2":
|
||||||
version "7.1.2"
|
version "7.1.2"
|
||||||
resolved "https://registry.npmjs.org/@mui/material/-/material-7.1.2.tgz"
|
resolved "https://registry.npmjs.org/@mui/material/-/material-7.1.2.tgz"
|
||||||
integrity sha512-Z5PYKkA6Kd8vS04zKxJNpwuvt6IoMwqpbidV7RCrRQQKwczIwcNcS8L6GnN4pzFYfEs+N9v6co27DmG07rcnoA==
|
integrity sha512-Z5PYKkA6Kd8vS04zKxJNpwuvt6IoMwqpbidV7RCrRQQKwczIwcNcS8L6GnN4pzFYfEs+N9v6co27DmG07rcnoA==
|
||||||
@ -589,7 +449,7 @@
|
|||||||
csstype "^3.1.3"
|
csstype "^3.1.3"
|
||||||
prop-types "^15.8.1"
|
prop-types "^15.8.1"
|
||||||
|
|
||||||
"@mui/system@^7.1.1":
|
"@mui/system@^5.15.14 || ^6.0.0 || ^7.0.0", "@mui/system@^7.1.1":
|
||||||
version "7.1.1"
|
version "7.1.1"
|
||||||
resolved "https://registry.npmjs.org/@mui/system/-/system-7.1.1.tgz"
|
resolved "https://registry.npmjs.org/@mui/system/-/system-7.1.1.tgz"
|
||||||
integrity sha512-Kj1uhiqnj4Zo7PDjAOghtXJtNABunWvhcRU0O7RQJ7WOxeynoH6wXPcilphV8QTFtkKaip8EiNJRiCD+B3eROA==
|
integrity sha512-Kj1uhiqnj4Zo7PDjAOghtXJtNABunWvhcRU0O7RQJ7WOxeynoH6wXPcilphV8QTFtkKaip8EiNJRiCD+B3eROA==
|
||||||
@ -656,15 +516,6 @@
|
|||||||
"@mui/utils" "^7.1.1"
|
"@mui/utils" "^7.1.1"
|
||||||
reselect "^5.1.1"
|
reselect "^5.1.1"
|
||||||
|
|
||||||
"@napi-rs/wasm-runtime@^0.2.11":
|
|
||||||
version "0.2.12"
|
|
||||||
resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2"
|
|
||||||
integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==
|
|
||||||
dependencies:
|
|
||||||
"@emnapi/core" "^1.4.3"
|
|
||||||
"@emnapi/runtime" "^1.4.3"
|
|
||||||
"@tybys/wasm-util" "^0.10.0"
|
|
||||||
|
|
||||||
"@next/env@15.3.3":
|
"@next/env@15.3.3":
|
||||||
version "15.3.3"
|
version "15.3.3"
|
||||||
resolved "https://registry.npmjs.org/@next/env/-/env-15.3.3.tgz"
|
resolved "https://registry.npmjs.org/@next/env/-/env-15.3.3.tgz"
|
||||||
@ -677,41 +528,6 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
fast-glob "3.3.1"
|
fast-glob "3.3.1"
|
||||||
|
|
||||||
"@next/swc-darwin-arm64@15.3.3":
|
|
||||||
version "15.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.3.tgz#994de8515cdfb74d337bdad645c33605de44c68b"
|
|
||||||
integrity sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==
|
|
||||||
|
|
||||||
"@next/swc-darwin-x64@15.3.3":
|
|
||||||
version "15.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.3.tgz#71588bad245180ffd1af1e1f894477287e739eb0"
|
|
||||||
integrity sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-gnu@15.3.3":
|
|
||||||
version "15.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.3.tgz#66a15f749c14f04a89f8c7e21c7a8d343fc34e6e"
|
|
||||||
integrity sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==
|
|
||||||
|
|
||||||
"@next/swc-linux-arm64-musl@15.3.3":
|
|
||||||
version "15.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.3.tgz#14bd66213f7f33d6909574750bcb05037221a2ac"
|
|
||||||
integrity sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-gnu@15.3.3":
|
|
||||||
version "15.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.3.tgz#4a19434545e5e752d9a3ed71f9b34982725f6293"
|
|
||||||
integrity sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==
|
|
||||||
|
|
||||||
"@next/swc-linux-x64-musl@15.3.3":
|
|
||||||
version "15.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.3.tgz#41ab140dd0a04ab7291adbec5836c1ce251a588c"
|
|
||||||
integrity sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==
|
|
||||||
|
|
||||||
"@next/swc-win32-arm64-msvc@15.3.3":
|
|
||||||
version "15.3.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.3.tgz#fcd1d7e0007b7b73d1acdbf0ad6d91f7aa2deb15"
|
|
||||||
integrity sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==
|
|
||||||
|
|
||||||
"@next/swc-win32-x64-msvc@15.3.3":
|
"@next/swc-win32-x64-msvc@15.3.3":
|
||||||
version "15.3.3"
|
version "15.3.3"
|
||||||
resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.3.tgz"
|
resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.3.tgz"
|
||||||
@ -725,7 +541,7 @@
|
|||||||
"@nodelib/fs.stat" "2.0.5"
|
"@nodelib/fs.stat" "2.0.5"
|
||||||
run-parallel "^1.1.9"
|
run-parallel "^1.1.9"
|
||||||
|
|
||||||
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
|
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
||||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||||
@ -761,66 +577,6 @@
|
|||||||
resolved "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz"
|
resolved "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz"
|
||||||
integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==
|
integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==
|
||||||
|
|
||||||
"@parcel/watcher-android-arm64@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1"
|
|
||||||
integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==
|
|
||||||
|
|
||||||
"@parcel/watcher-darwin-arm64@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67"
|
|
||||||
integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==
|
|
||||||
|
|
||||||
"@parcel/watcher-darwin-x64@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8"
|
|
||||||
integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==
|
|
||||||
|
|
||||||
"@parcel/watcher-freebsd-x64@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b"
|
|
||||||
integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==
|
|
||||||
|
|
||||||
"@parcel/watcher-linux-arm-glibc@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1"
|
|
||||||
integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==
|
|
||||||
|
|
||||||
"@parcel/watcher-linux-arm-musl@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e"
|
|
||||||
integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==
|
|
||||||
|
|
||||||
"@parcel/watcher-linux-arm64-glibc@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30"
|
|
||||||
integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==
|
|
||||||
|
|
||||||
"@parcel/watcher-linux-arm64-musl@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2"
|
|
||||||
integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==
|
|
||||||
|
|
||||||
"@parcel/watcher-linux-x64-glibc@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e"
|
|
||||||
integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==
|
|
||||||
|
|
||||||
"@parcel/watcher-linux-x64-musl@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee"
|
|
||||||
integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==
|
|
||||||
|
|
||||||
"@parcel/watcher-win32-arm64@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243"
|
|
||||||
integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==
|
|
||||||
|
|
||||||
"@parcel/watcher-win32-ia32@2.5.1":
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6"
|
|
||||||
integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==
|
|
||||||
|
|
||||||
"@parcel/watcher-win32-x64@2.5.1":
|
"@parcel/watcher-win32-x64@2.5.1":
|
||||||
version "2.5.1"
|
version "2.5.1"
|
||||||
resolved "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz"
|
resolved "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz"
|
||||||
@ -899,13 +655,6 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.8.0"
|
tslib "^2.8.0"
|
||||||
|
|
||||||
"@tybys/wasm-util@^0.10.0":
|
|
||||||
version "0.10.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz#2fd3cd754b94b378734ce17058d0507c45c88369"
|
|
||||||
integrity sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==
|
|
||||||
dependencies:
|
|
||||||
tslib "^2.4.0"
|
|
||||||
|
|
||||||
"@types/cookie@^0.6.0":
|
"@types/cookie@^0.6.0":
|
||||||
version "0.6.0"
|
version "0.6.0"
|
||||||
resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz"
|
resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz"
|
||||||
@ -989,7 +738,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
|
resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
|
||||||
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
|
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
|
||||||
|
|
||||||
"@types/node@^20":
|
"@types/node@^20", "@types/node@>=18":
|
||||||
version "20.19.1"
|
version "20.19.1"
|
||||||
resolved "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz"
|
resolved "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz"
|
||||||
integrity sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==
|
integrity sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==
|
||||||
@ -1034,7 +783,7 @@
|
|||||||
resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
|
resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
|
||||||
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
|
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
|
||||||
|
|
||||||
"@types/react@*", "@types/react@^19":
|
"@types/react@*", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^18.2.25 || ^19", "@types/react@^19", "@types/react@^19.0.0":
|
||||||
version "19.1.8"
|
version "19.1.8"
|
||||||
resolved "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz"
|
resolved "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz"
|
||||||
integrity sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==
|
integrity sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==
|
||||||
@ -1043,7 +792,7 @@
|
|||||||
|
|
||||||
"@types/redux-persist@^4.3.1":
|
"@types/redux-persist@^4.3.1":
|
||||||
version "4.3.1"
|
version "4.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/redux-persist/-/redux-persist-4.3.1.tgz#aa4c876859e0bea5155e5f7980e5b8c4699dc2e6"
|
resolved "https://registry.npmjs.org/@types/redux-persist/-/redux-persist-4.3.1.tgz"
|
||||||
integrity sha512-YkMnMUk+4//wPtiSTMfsxST/F9Gh9sPWX0LVxHuOidGjojHtMdpep2cYvQgfiDMnj34orXyZI+QJCQMZDlafKA==
|
integrity sha512-YkMnMUk+4//wPtiSTMfsxST/F9Gh9sPWX0LVxHuOidGjojHtMdpep2cYvQgfiDMnj34orXyZI+QJCQMZDlafKA==
|
||||||
dependencies:
|
dependencies:
|
||||||
redux-persist "*"
|
redux-persist "*"
|
||||||
@ -1078,7 +827,7 @@
|
|||||||
natural-compare "^1.4.0"
|
natural-compare "^1.4.0"
|
||||||
ts-api-utils "^2.1.0"
|
ts-api-utils "^2.1.0"
|
||||||
|
|
||||||
"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0":
|
"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser@^8.34.1":
|
||||||
version "8.34.1"
|
version "8.34.1"
|
||||||
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz"
|
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz"
|
||||||
integrity sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==
|
integrity sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==
|
||||||
@ -1106,7 +855,7 @@
|
|||||||
"@typescript-eslint/types" "8.34.1"
|
"@typescript-eslint/types" "8.34.1"
|
||||||
"@typescript-eslint/visitor-keys" "8.34.1"
|
"@typescript-eslint/visitor-keys" "8.34.1"
|
||||||
|
|
||||||
"@typescript-eslint/tsconfig-utils@8.34.1", "@typescript-eslint/tsconfig-utils@^8.34.1":
|
"@typescript-eslint/tsconfig-utils@^8.34.1", "@typescript-eslint/tsconfig-utils@8.34.1":
|
||||||
version "8.34.1"
|
version "8.34.1"
|
||||||
resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz"
|
resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz"
|
||||||
integrity sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==
|
integrity sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==
|
||||||
@ -1121,7 +870,7 @@
|
|||||||
debug "^4.3.4"
|
debug "^4.3.4"
|
||||||
ts-api-utils "^2.1.0"
|
ts-api-utils "^2.1.0"
|
||||||
|
|
||||||
"@typescript-eslint/types@8.34.1", "@typescript-eslint/types@^8.34.1":
|
"@typescript-eslint/types@^8.34.1", "@typescript-eslint/types@8.34.1":
|
||||||
version "8.34.1"
|
version "8.34.1"
|
||||||
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz"
|
resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz"
|
||||||
integrity sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==
|
integrity sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==
|
||||||
@ -1160,98 +909,6 @@
|
|||||||
"@typescript-eslint/types" "8.34.1"
|
"@typescript-eslint/types" "8.34.1"
|
||||||
eslint-visitor-keys "^4.2.1"
|
eslint-visitor-keys "^4.2.1"
|
||||||
|
|
||||||
"@unrs/resolver-binding-android-arm-eabi@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.0.tgz#e91317973356eb845c9186db5f9ec43e8d0002eb"
|
|
||||||
integrity sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-android-arm64@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.0.tgz#fbdd79b2a8e478e02e1c0751dfbc100017522161"
|
|
||||||
integrity sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-darwin-arm64@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.0.tgz#24bb42710227ae2f4fea191151f3acc6a75b50d6"
|
|
||||||
integrity sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-darwin-x64@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.0.tgz#4a205940ec311ac8396c3f25043644b78cc98a20"
|
|
||||||
integrity sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-freebsd-x64@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.0.tgz#ed82e000f7248011696ecc8894f574caa197b0be"
|
|
||||||
integrity sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.0.tgz#534a8b32118590f7fb9edd21c6576243a89a8aad"
|
|
||||||
integrity sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-arm-musleabihf@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.0.tgz#b31718752e77cecbbcf7ba1e01dea97c1a5ee7e0"
|
|
||||||
integrity sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-arm64-gnu@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.0.tgz#0f11ba195020cfa869533fb74733d68162349d14"
|
|
||||||
integrity sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-arm64-musl@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.0.tgz#8b6bc086cf9efaa22e8f2fef381786d6636b8e19"
|
|
||||||
integrity sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-ppc64-gnu@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.0.tgz#5cd15899af31c2bbf90bfca5f798f64a16770e23"
|
|
||||||
integrity sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-riscv64-gnu@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.0.tgz#4f2c75af52437eb10b48ea5b72750fb65fb174be"
|
|
||||||
integrity sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-riscv64-musl@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.0.tgz#6a87e82e0dd39d34ff37ddba6accf73cdb396e86"
|
|
||||||
integrity sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-s390x-gnu@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.0.tgz#6524cc3c01309022de86c4a7317fe7d9f9fb855c"
|
|
||||||
integrity sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-x64-gnu@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.0.tgz#85fb8a45dccf3823cd73ea4b61b2c3f2e8ab6653"
|
|
||||||
integrity sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-linux-x64-musl@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.0.tgz#235e539da5872df51c03e0e050a1c715e25044ca"
|
|
||||||
integrity sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-wasm32-wasi@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.0.tgz#1bc614ce2ba61330c16bffa1e50f41d95d25c0a6"
|
|
||||||
integrity sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==
|
|
||||||
dependencies:
|
|
||||||
"@napi-rs/wasm-runtime" "^0.2.11"
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-win32-arm64-msvc@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.0.tgz#0d8704275a9f2634d81b35d8a00a2f4bd8dec7fa"
|
|
||||||
integrity sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-win32-ia32-msvc@1.9.0":
|
|
||||||
version "1.9.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.0.tgz#46909cbeb9a38b3f31a64833fe03aa1aebb8da2b"
|
|
||||||
integrity sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==
|
|
||||||
|
|
||||||
"@unrs/resolver-binding-win32-x64-msvc@1.9.0":
|
"@unrs/resolver-binding-win32-x64-msvc@1.9.0":
|
||||||
version "1.9.0"
|
version "1.9.0"
|
||||||
resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.0.tgz"
|
resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.0.tgz"
|
||||||
@ -1262,7 +919,7 @@ acorn-jsx@^5.3.2:
|
|||||||
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
|
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
|
||||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||||
|
|
||||||
acorn@^8.15.0:
|
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0:
|
||||||
version "8.15.0"
|
version "8.15.0"
|
||||||
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
|
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
|
||||||
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
|
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
|
||||||
@ -1626,7 +1283,7 @@ crc-32@~1.2.0, crc-32@~1.2.1:
|
|||||||
|
|
||||||
cross-env@^10.1.0:
|
cross-env@^10.1.0:
|
||||||
version "10.1.0"
|
version "10.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-10.1.0.tgz#cfd2a6200df9ed75bfb9cb3d7ce609c13ea21783"
|
resolved "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz"
|
||||||
integrity sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==
|
integrity sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@epic-web/invariant" "^1.0.0"
|
"@epic-web/invariant" "^1.0.0"
|
||||||
@ -1641,12 +1298,12 @@ cross-spawn@^7.0.6:
|
|||||||
shebang-command "^2.0.0"
|
shebang-command "^2.0.0"
|
||||||
which "^2.0.1"
|
which "^2.0.1"
|
||||||
|
|
||||||
csstype@^3.0.2, csstype@^3.1.3:
|
csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.3:
|
||||||
version "3.1.3"
|
version "3.1.3"
|
||||||
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
|
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
|
||||||
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
||||||
|
|
||||||
"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6:
|
d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3":
|
||||||
version "3.2.4"
|
version "3.2.4"
|
||||||
resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
|
resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
|
||||||
integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
|
integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
|
||||||
@ -1668,7 +1325,7 @@ d3-ease@^3.0.1:
|
|||||||
resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
|
resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
|
||||||
integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
|
integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
|
||||||
|
|
||||||
"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
|
d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3":
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
|
resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
|
||||||
integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
|
integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
|
||||||
@ -1705,7 +1362,7 @@ d3-shape@^3.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
d3-time "1 - 3"
|
d3-time "1 - 3"
|
||||||
|
|
||||||
"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0:
|
d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3":
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
|
resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
|
||||||
integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
|
integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
|
||||||
@ -1756,12 +1413,12 @@ date-fns@^2.16.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.21.0"
|
"@babel/runtime" "^7.21.0"
|
||||||
|
|
||||||
date-fns@^4.1.0:
|
"date-fns@^2.25.0 || ^3.2.0 || ^4.0.0", date-fns@^4.1.0, "date-fns@3.0.6 || >=3.0.0":
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz"
|
resolved "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz"
|
||||||
integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
|
integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
|
||||||
|
|
||||||
dayjs@^1.11.13:
|
dayjs@^1.10.7, dayjs@^1.11.13:
|
||||||
version "1.11.13"
|
version "1.11.13"
|
||||||
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz"
|
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz"
|
||||||
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
|
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
|
||||||
@ -1808,6 +1465,11 @@ define-properties@^1.1.3, define-properties@^1.2.1:
|
|||||||
has-property-descriptors "^1.0.0"
|
has-property-descriptors "^1.0.0"
|
||||||
object-keys "^1.1.1"
|
object-keys "^1.1.1"
|
||||||
|
|
||||||
|
dequal@^2.0.3:
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"
|
||||||
|
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
|
||||||
|
|
||||||
detect-libc@^1.0.3:
|
detect-libc@^1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz"
|
resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz"
|
||||||
@ -2039,7 +1701,7 @@ eslint-module-utils@^2.12.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
debug "^3.2.7"
|
debug "^3.2.7"
|
||||||
|
|
||||||
eslint-plugin-import@^2.31.0:
|
eslint-plugin-import@*, eslint-plugin-import@^2.31.0:
|
||||||
version "2.31.0"
|
version "2.31.0"
|
||||||
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz"
|
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz"
|
||||||
integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
|
integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
|
||||||
@ -2132,7 +1794,7 @@ eslint-visitor-keys@^4.2.1:
|
|||||||
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
|
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
|
||||||
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
||||||
|
|
||||||
eslint@^9:
|
eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0 || ^9.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9:
|
||||||
version "9.29.0"
|
version "9.29.0"
|
||||||
resolved "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz"
|
resolved "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz"
|
||||||
integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==
|
integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==
|
||||||
@ -2221,17 +1883,6 @@ fast-equals@^5.0.1:
|
|||||||
resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz"
|
resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz"
|
||||||
integrity sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==
|
integrity sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==
|
||||||
|
|
||||||
fast-glob@3.3.1:
|
|
||||||
version "3.3.1"
|
|
||||||
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz"
|
|
||||||
integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
|
|
||||||
dependencies:
|
|
||||||
"@nodelib/fs.stat" "^2.0.2"
|
|
||||||
"@nodelib/fs.walk" "^1.2.3"
|
|
||||||
glob-parent "^5.1.2"
|
|
||||||
merge2 "^1.3.0"
|
|
||||||
micromatch "^4.0.4"
|
|
||||||
|
|
||||||
fast-glob@^3.3.2:
|
fast-glob@^3.3.2:
|
||||||
version "3.3.3"
|
version "3.3.3"
|
||||||
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz"
|
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz"
|
||||||
@ -2243,6 +1894,17 @@ fast-glob@^3.3.2:
|
|||||||
merge2 "^1.3.0"
|
merge2 "^1.3.0"
|
||||||
micromatch "^4.0.8"
|
micromatch "^4.0.8"
|
||||||
|
|
||||||
|
fast-glob@3.3.1:
|
||||||
|
version "3.3.1"
|
||||||
|
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz"
|
||||||
|
integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
|
||||||
|
dependencies:
|
||||||
|
"@nodelib/fs.stat" "^2.0.2"
|
||||||
|
"@nodelib/fs.walk" "^1.2.3"
|
||||||
|
glob-parent "^5.1.2"
|
||||||
|
merge2 "^1.3.0"
|
||||||
|
micromatch "^4.0.4"
|
||||||
|
|
||||||
fast-json-stable-stringify@^2.0.0:
|
fast-json-stable-stringify@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
|
resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
|
||||||
@ -2423,7 +2085,7 @@ globalthis@^1.0.4:
|
|||||||
|
|
||||||
goober@^2.1.16:
|
goober@^2.1.16:
|
||||||
version "2.1.18"
|
version "2.1.18"
|
||||||
resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.18.tgz#b72d669bd24d552d441638eee26dfd5716ea6442"
|
resolved "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz"
|
||||||
integrity sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==
|
integrity sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==
|
||||||
|
|
||||||
gopd@^1.0.1, gopd@^1.2.0:
|
gopd@^1.0.1, gopd@^1.2.0:
|
||||||
@ -2498,7 +2160,7 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1:
|
|||||||
|
|
||||||
husky@^9.1.7:
|
husky@^9.1.7:
|
||||||
version "9.1.7"
|
version "9.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d"
|
resolved "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz"
|
||||||
integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==
|
integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==
|
||||||
|
|
||||||
ignore@^5.2.0:
|
ignore@^5.2.0:
|
||||||
@ -3166,7 +2828,7 @@ picomatch@^2.3.1:
|
|||||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
||||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||||
|
|
||||||
picomatch@^4.0.2:
|
"picomatch@^3 || ^4", picomatch@^4.0.2:
|
||||||
version "4.0.2"
|
version "4.0.2"
|
||||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz"
|
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz"
|
||||||
integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
|
integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
|
||||||
@ -3192,7 +2854,7 @@ prelude-ls@^1.2.1:
|
|||||||
|
|
||||||
prettier@^3.6.2:
|
prettier@^3.6.2:
|
||||||
version "3.6.2"
|
version "3.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
|
resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz"
|
||||||
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
|
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
|
||||||
|
|
||||||
prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
|
prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
|
||||||
@ -3236,7 +2898,7 @@ react-date-range@^2.0.1:
|
|||||||
react-list "^0.8.13"
|
react-list "^0.8.13"
|
||||||
shallow-equal "^1.2.1"
|
shallow-equal "^1.2.1"
|
||||||
|
|
||||||
react-dom@^19.0.0:
|
"react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react-dom@^19.0.0, react-dom@>=16, react-dom@>=16.6.0:
|
||||||
version "19.1.0"
|
version "19.1.0"
|
||||||
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz"
|
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz"
|
||||||
integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==
|
integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==
|
||||||
@ -3245,7 +2907,7 @@ react-dom@^19.0.0:
|
|||||||
|
|
||||||
react-hot-toast@^2.6.0:
|
react-hot-toast@^2.6.0:
|
||||||
version "2.6.0"
|
version "2.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.6.0.tgz#4ada6ed3c75c5e42a90d562f55665ff37ee1442b"
|
resolved "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz"
|
||||||
integrity sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==
|
integrity sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==
|
||||||
dependencies:
|
dependencies:
|
||||||
csstype "^3.1.3"
|
csstype "^3.1.3"
|
||||||
@ -3271,7 +2933,7 @@ react-list@^0.8.13:
|
|||||||
resolved "https://registry.npmjs.org/react-list/-/react-list-0.8.18.tgz"
|
resolved "https://registry.npmjs.org/react-list/-/react-list-0.8.18.tgz"
|
||||||
integrity sha512-1OSdDvzuKuwDJvQNuhXxxL+jTmmdtKg1i6KtYgxI9XR98kbOql1FcSGP+Lcvo91fk3cYng+Z6YkC6X9HRJwxfw==
|
integrity sha512-1OSdDvzuKuwDJvQNuhXxxL+jTmmdtKg1i6KtYgxI9XR98kbOql1FcSGP+Lcvo91fk3cYng+Z6YkC6X9HRJwxfw==
|
||||||
|
|
||||||
react-redux@^9.2.0:
|
"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.2.0:
|
||||||
version "9.2.0"
|
version "9.2.0"
|
||||||
resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz"
|
resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz"
|
||||||
integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==
|
integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==
|
||||||
@ -3298,7 +2960,7 @@ react-transition-group@^4.4.5:
|
|||||||
loose-envify "^1.4.0"
|
loose-envify "^1.4.0"
|
||||||
prop-types "^15.6.2"
|
prop-types "^15.6.2"
|
||||||
|
|
||||||
react@^19.0.0:
|
"react@^0.14 || ^15.0.0-rc || >=15.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0 || ^19", "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", react@^19.0.0, react@^19.1.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", react@>=16, react@>=16.6.0, react@>=16.8.0, "react@0.14 || 15 - 19":
|
||||||
version "19.1.0"
|
version "19.1.0"
|
||||||
resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz"
|
resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz"
|
||||||
integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==
|
integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==
|
||||||
@ -3331,12 +2993,12 @@ recharts@^2.15.3:
|
|||||||
|
|
||||||
redux-observable@^3.0.0-rc.2:
|
redux-observable@^3.0.0-rc.2:
|
||||||
version "3.0.0-rc.2"
|
version "3.0.0-rc.2"
|
||||||
resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-3.0.0-rc.2.tgz#baef603781c5dabd9ddd70526357076cd5c128a2"
|
resolved "https://registry.npmjs.org/redux-observable/-/redux-observable-3.0.0-rc.2.tgz"
|
||||||
integrity sha512-gG/pWIKgSrcTyyavm2so5tc7tuyCQ47p3VdCAG6wt+CV0WGhDr50cMQHLcYKxFZSGgTm19a8ZmyfJGndmGDpYg==
|
integrity sha512-gG/pWIKgSrcTyyavm2so5tc7tuyCQ47p3VdCAG6wt+CV0WGhDr50cMQHLcYKxFZSGgTm19a8ZmyfJGndmGDpYg==
|
||||||
|
|
||||||
redux-persist@*:
|
redux-persist@*:
|
||||||
version "6.0.0"
|
version "6.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-6.0.0.tgz#b4d2972f9859597c130d40d4b146fecdab51b3a8"
|
resolved "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz"
|
||||||
integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==
|
integrity sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==
|
||||||
|
|
||||||
redux-thunk@^3.1.0:
|
redux-thunk@^3.1.0:
|
||||||
@ -3351,7 +3013,7 @@ redux@^4.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.9.2"
|
"@babel/runtime" "^7.9.2"
|
||||||
|
|
||||||
redux@^5.0.1:
|
redux@^5.0.0, redux@^5.0.1, "redux@>=5 <6", redux@>4.0.0:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
|
resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
|
||||||
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
|
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
|
||||||
@ -3437,9 +3099,9 @@ run-parallel@^1.1.9:
|
|||||||
dependencies:
|
dependencies:
|
||||||
queue-microtask "^1.2.2"
|
queue-microtask "^1.2.2"
|
||||||
|
|
||||||
rxjs@^7.8.2:
|
rxjs@^7.8.2, "rxjs@>=7 <8":
|
||||||
version "7.8.2"
|
version "7.8.2"
|
||||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b"
|
resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz"
|
||||||
integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==
|
integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.1.0"
|
tslib "^2.1.0"
|
||||||
@ -3472,7 +3134,7 @@ safe-regex-test@^1.0.3, safe-regex-test@^1.1.0:
|
|||||||
es-errors "^1.3.0"
|
es-errors "^1.3.0"
|
||||||
is-regex "^1.2.1"
|
is-regex "^1.2.1"
|
||||||
|
|
||||||
sass@^1.89.2:
|
sass@^1.3.0, sass@^1.89.2:
|
||||||
version "1.90.0"
|
version "1.90.0"
|
||||||
resolved "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz"
|
resolved "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz"
|
||||||
integrity sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==
|
integrity sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==
|
||||||
@ -3629,7 +3291,7 @@ simple-swizzle@^0.2.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish "^0.3.1"
|
is-arrayish "^0.3.1"
|
||||||
|
|
||||||
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
|
source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0":
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
|
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
|
||||||
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
|
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
|
||||||
@ -3792,6 +3454,14 @@ supports-preserve-symlinks-flag@^1.0.0:
|
|||||||
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
|
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
|
||||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||||
|
|
||||||
|
swr@^2.3.6:
|
||||||
|
version "2.3.6"
|
||||||
|
resolved "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz"
|
||||||
|
integrity sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==
|
||||||
|
dependencies:
|
||||||
|
dequal "^2.0.3"
|
||||||
|
use-sync-external-store "^1.4.0"
|
||||||
|
|
||||||
tiny-invariant@^1.3.1:
|
tiny-invariant@^1.3.1:
|
||||||
version "1.3.3"
|
version "1.3.3"
|
||||||
resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz"
|
resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz"
|
||||||
@ -3904,7 +3574,7 @@ typed-array-length@^1.0.7:
|
|||||||
possible-typed-array-names "^1.0.0"
|
possible-typed-array-names "^1.0.0"
|
||||||
reflect.getprototypeof "^1.0.6"
|
reflect.getprototypeof "^1.0.6"
|
||||||
|
|
||||||
typescript@^5:
|
typescript@^5, "typescript@>= 4.8.x", typescript@>=3.3.1, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0":
|
||||||
version "5.8.3"
|
version "5.8.3"
|
||||||
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
|
resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz"
|
||||||
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user