Compare commits
18 Commits
56c5e6dc0f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
017ce48835
|
|||
|
72f8791276
|
|||
|
63b1926056
|
|||
|
25dc50e05c
|
|||
|
a403832735
|
|||
|
e1f1093d84
|
|||
|
243a4d1ceb
|
|||
|
54d9bd5e82
|
|||
|
a1f4b4eabe
|
|||
|
64edc6169b
|
|||
|
cf84722418
|
|||
|
102b29c54f
|
|||
|
42f13612b1
|
|||
|
b1448ac30e
|
|||
|
bd053908a4
|
|||
|
cae1b523f5
|
|||
|
e4b31efa72
|
|||
|
5d249a7069
|
@@ -1 +1 @@
|
||||
v22.17.1
|
||||
v22.20.0
|
||||
|
||||
209
app/routes/gmm.tsx
Normal file
209
app/routes/gmm.tsx
Normal file
@@ -0,0 +1,209 @@
|
||||
import {
|
||||
Button,
|
||||
Container,
|
||||
FormControl,
|
||||
FormLabel,
|
||||
Input,
|
||||
Modal,
|
||||
ModalBody,
|
||||
ModalCloseButton,
|
||||
ModalContent,
|
||||
ModalFooter,
|
||||
ModalHeader,
|
||||
ModalOverlay,
|
||||
Table,
|
||||
TableCaption,
|
||||
TableContainer,
|
||||
Tbody,
|
||||
Td,
|
||||
Th,
|
||||
Thead,
|
||||
Tr,
|
||||
useDisclosure,
|
||||
useToast,
|
||||
} from "@chakra-ui/react";
|
||||
import { useLoaderData } from "@remix-run/react";
|
||||
import { useState } from "react";
|
||||
|
||||
export async function loader({ context }: { context: RequestContext }) {
|
||||
if (!context.data.current_user)
|
||||
throw new Response(null, {
|
||||
status: 401,
|
||||
});
|
||||
|
||||
if (
|
||||
![
|
||||
"165594923586945025",
|
||||
"289372404541554689",
|
||||
"396347223736057866",
|
||||
].includes(context.data.current_user.id)
|
||||
)
|
||||
throw new Response(null, {
|
||||
status: 403,
|
||||
});
|
||||
|
||||
return (await context.env.DATA.list({ prefix: "gamemod_" }))?.keys ?? [];
|
||||
}
|
||||
|
||||
export default function () {
|
||||
const data: { [k: string]: any }[] = useLoaderData<typeof loader>();
|
||||
const [gameModData, setGameModData] = useState(data);
|
||||
const { isOpen, onClose, onOpen } = useDisclosure();
|
||||
const [idToAdd, setIdToAdd] = useState<string>("");
|
||||
const [nameToAdd, setNameToAdd] = useState<string>("");
|
||||
const toast = useToast();
|
||||
|
||||
async function addMod(id: string, name: string) {
|
||||
const response = await fetch("/api/gme/add", {
|
||||
body: JSON.stringify({ name, user: id }),
|
||||
headers: {
|
||||
"content-type": "application/json",
|
||||
},
|
||||
method: "POST",
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
let msg = "Unknown error";
|
||||
|
||||
try {
|
||||
msg = ((await response.json()) as { error: string }).error;
|
||||
} catch {}
|
||||
|
||||
toast({
|
||||
description: msg,
|
||||
status: "error",
|
||||
title: "Cannot add game mod",
|
||||
});
|
||||
} else {
|
||||
onClose();
|
||||
location.reload();
|
||||
}
|
||||
|
||||
setIdToAdd("");
|
||||
setNameToAdd("");
|
||||
}
|
||||
|
||||
async function removeMod(user: string) {
|
||||
const response = await fetch("/api/gme/remove", {
|
||||
body: JSON.stringify({ user }),
|
||||
headers: {
|
||||
"content-type": "application/json",
|
||||
},
|
||||
method: "POST",
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
let msg = "Unknown error";
|
||||
|
||||
try {
|
||||
msg = ((await response.json()) as { error: string }).error;
|
||||
} catch {}
|
||||
toast({
|
||||
description: msg,
|
||||
status: "error",
|
||||
title: "Cannot remove game mod",
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
toast({
|
||||
description: `${data.find((i) => i.metadata.id === user)?.name} was removed as a game mod`,
|
||||
status: "success",
|
||||
title: "Game mod removed",
|
||||
});
|
||||
|
||||
setGameModData(gameModData.filter((i) => i.metadata.id !== user));
|
||||
}
|
||||
|
||||
return (
|
||||
<Container maxW="container.lg">
|
||||
<TableContainer>
|
||||
<Table variant="simple">
|
||||
<TableCaption>Currently active game mods</TableCaption>
|
||||
<Thead>
|
||||
<Tr>
|
||||
<Th>ID</Th>
|
||||
<Th>Name</Th>
|
||||
<Th>Added At</Th>
|
||||
<Th>Added By</Th>
|
||||
<Th>Remove</Th>
|
||||
</Tr>
|
||||
</Thead>
|
||||
<Tbody>
|
||||
{gameModData.map((item) => {
|
||||
return (
|
||||
<Tr key={item.metadata.id}>
|
||||
<Td>{item.metadata.id}</Td>
|
||||
<Td>{item.metadata.name}</Td>
|
||||
<Td>{item.metadata.created_at}</Td>
|
||||
<Td>{item.metadata.created_by}</Td>
|
||||
<Td>
|
||||
<Button
|
||||
onClick={async () => await removeMod(item.metadata.id)}
|
||||
>
|
||||
Remove
|
||||
</Button>
|
||||
</Td>
|
||||
</Tr>
|
||||
);
|
||||
})}
|
||||
</Tbody>
|
||||
</Table>
|
||||
</TableContainer>
|
||||
<Button alignSelf="end" mt="16px" onClick={onOpen}>
|
||||
Add
|
||||
</Button>
|
||||
<Modal isOpen={isOpen} onClose={onClose}>
|
||||
<ModalOverlay />
|
||||
<ModalContent>
|
||||
<ModalHeader>Add Game Mod</ModalHeader>
|
||||
<ModalCloseButton />
|
||||
<ModalBody>
|
||||
<FormControl>
|
||||
<FormLabel>Name</FormLabel>
|
||||
<Input
|
||||
maxLength={32}
|
||||
onChange={(e) => setNameToAdd(e.target.value)}
|
||||
value={nameToAdd}
|
||||
/>
|
||||
</FormControl>
|
||||
<br />
|
||||
<FormControl pt="16px">
|
||||
<FormLabel>ID</FormLabel>
|
||||
<Input
|
||||
maxLength={19}
|
||||
onChange={(e) => setIdToAdd(e.target.value)}
|
||||
value={idToAdd}
|
||||
/>
|
||||
</FormControl>
|
||||
</ModalBody>
|
||||
<ModalFooter gap="8px">
|
||||
<Button
|
||||
onClick={() => {
|
||||
onClose();
|
||||
setIdToAdd("");
|
||||
setNameToAdd("");
|
||||
}}
|
||||
>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button
|
||||
colorScheme="blue"
|
||||
disabled={
|
||||
!idToAdd.match(/\d{17,19}/) ||
|
||||
nameToAdd.length < 1 ||
|
||||
nameToAdd.length > 32
|
||||
}
|
||||
onClick={async () => {
|
||||
await addMod(idToAdd, nameToAdd);
|
||||
}}
|
||||
>
|
||||
Add
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
</Modal>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
@@ -169,20 +169,22 @@ export default function () {
|
||||
Decisions:
|
||||
<br />
|
||||
Approved:
|
||||
{Object.keys(currentInactivity.decisions ?? {}).filter(
|
||||
(d) => currentInactivity.decisions[d],
|
||||
)}
|
||||
{Object.keys(currentInactivity.decisions ?? {})
|
||||
.filter((d) => currentInactivity.decisions[d])
|
||||
.join(", ")}
|
||||
<br />
|
||||
Denied:
|
||||
{Object.keys(currentInactivity.decisions ?? {}).filter(
|
||||
(d) => !currentInactivity.decisions[d],
|
||||
)}
|
||||
{Object.keys(currentInactivity.decisions ?? {})
|
||||
.filter((d) => !currentInactivity.decisions[d])
|
||||
.join(", ")}
|
||||
<br />
|
||||
Pending:
|
||||
{currentInactivity.departments?.filter(
|
||||
(d: "DM" | "ET" | "FM" | "WM") =>
|
||||
typeof currentInactivity.decisions[d] === "undefined",
|
||||
)}
|
||||
{currentInactivity.departments
|
||||
?.filter(
|
||||
(d: "DM" | "ET" | "FM" | "WM") =>
|
||||
typeof currentInactivity.decisions[d] === "undefined",
|
||||
)
|
||||
.join(", ")}
|
||||
</ListItem>
|
||||
</UnorderedList>
|
||||
</ModalBody>
|
||||
|
||||
@@ -30,7 +30,6 @@ import { useLoaderData } from "@remix-run/react";
|
||||
import AppealBans from "../../components/AppealBans.js";
|
||||
import AppealCard from "../../components/AppealCard.js";
|
||||
import GameAppealCard from "../../components/GameAppealCard.js";
|
||||
import GameModManagementModal from "../../components/GameModManagementModal.js";
|
||||
import NewGameBan from "../../components/NewGameBan.js";
|
||||
import NewInfractionModal from "../../components/NewInfractionModal.js";
|
||||
import ReportCard from "../../components/ReportCard.js";
|
||||
@@ -151,7 +150,7 @@ export default function () {
|
||||
|
||||
useEffect(() => {
|
||||
if (messageChannel.current) {
|
||||
messageChannel.current.port1.onmessage = function (ev) {
|
||||
messageChannel.current.port1.onmessage = function (ev: any) {
|
||||
const { data }: { data: string } = ev;
|
||||
|
||||
setEntries([...entries].filter((entry) => entry.id !== data));
|
||||
@@ -337,7 +336,11 @@ export default function () {
|
||||
},
|
||||
appeal_bans: useDisclosure(),
|
||||
game_ban: useDisclosure(),
|
||||
gme: useDisclosure(),
|
||||
gme: {
|
||||
isOpen: false,
|
||||
onClose: () => {},
|
||||
onOpen: () => location.assign("/gmm"),
|
||||
},
|
||||
inactivity: useDisclosure(),
|
||||
infraction: useDisclosure(),
|
||||
user_lookup: {
|
||||
@@ -431,10 +434,6 @@ export default function () {
|
||||
isOpen={itemModals.appeal_bans.isOpen}
|
||||
onClose={itemModals.appeal_bans.onClose}
|
||||
/>
|
||||
<GameModManagementModal
|
||||
isOpen={itemModals.gme.isOpen}
|
||||
onClose={itemModals.gme.onClose}
|
||||
/>
|
||||
<NewGameBan
|
||||
isOpen={itemModals.game_ban.isOpen}
|
||||
onClose={itemModals.game_ban.onClose}
|
||||
|
||||
@@ -1,157 +0,0 @@
|
||||
import {
|
||||
Button,
|
||||
HStack,
|
||||
Input,
|
||||
Link,
|
||||
Modal,
|
||||
ModalBody,
|
||||
ModalCloseButton,
|
||||
ModalContent,
|
||||
ModalHeader,
|
||||
ModalOverlay,
|
||||
Table,
|
||||
TableContainer,
|
||||
Tbody,
|
||||
Td,
|
||||
Th,
|
||||
Thead,
|
||||
Tr,
|
||||
useToast,
|
||||
} from "@chakra-ui/react";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
export default function (props: { isOpen: boolean; onClose: () => void }) {
|
||||
const [mods, setMods] = useState([]);
|
||||
const [userToAdd, setUserToAdd] = useState("");
|
||||
const toast = useToast();
|
||||
|
||||
useEffect(() => {
|
||||
if (!props.isOpen) return;
|
||||
|
||||
(async function () {
|
||||
const gmeResp = await fetch("/api/gme/list");
|
||||
|
||||
if (!gmeResp.ok) {
|
||||
toast({
|
||||
description: "Failed to load GME data",
|
||||
status: "error",
|
||||
title: "Oops",
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
setMods(await gmeResp.json());
|
||||
})();
|
||||
}, [props.isOpen]);
|
||||
|
||||
async function addUser() {
|
||||
if (!userToAdd || !userToAdd.match(/^\d{17,19}$/)) {
|
||||
toast({
|
||||
description: "Please check your input and try again",
|
||||
status: "error",
|
||||
title: "Invalid user",
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const addResp = await fetch("/api/gme/add", {
|
||||
body: JSON.stringify({ user: userToAdd }),
|
||||
headers: {
|
||||
"content-type": "application/json",
|
||||
},
|
||||
method: "POST",
|
||||
});
|
||||
|
||||
if (!addResp.ok) {
|
||||
toast({
|
||||
description: ((await addResp.json()) as { error: string }).error,
|
||||
status: "error",
|
||||
title: "Oops",
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
toast({
|
||||
description: `User ${userToAdd} added`,
|
||||
status: "success",
|
||||
title: "Success",
|
||||
});
|
||||
|
||||
props.onClose();
|
||||
}
|
||||
|
||||
async function removeUser(user: string) {
|
||||
const removeResp = await fetch("/api/gme/remove", {
|
||||
body: JSON.stringify({ user }),
|
||||
headers: {
|
||||
"content-type": "application/json",
|
||||
},
|
||||
method: "POST",
|
||||
});
|
||||
|
||||
if (!removeResp.ok) {
|
||||
toast({
|
||||
description: ((await removeResp.json()) as { error: string }).error,
|
||||
status: "error",
|
||||
title: "Oops",
|
||||
});
|
||||
} else {
|
||||
toast({
|
||||
description: `User ${user} removed`,
|
||||
status: "success",
|
||||
title: "Success",
|
||||
});
|
||||
|
||||
setMods(mods.filter((mod: any) => mod.user !== user));
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Modal isCentered isOpen={props.isOpen} onClose={props.onClose}>
|
||||
<ModalOverlay />
|
||||
<ModalContent>
|
||||
<ModalHeader>Game Moderators</ModalHeader>
|
||||
<ModalCloseButton />
|
||||
<ModalBody>
|
||||
<TableContainer>
|
||||
<Table variant="simple">
|
||||
<Thead>
|
||||
<Tr>
|
||||
<Th>User</Th>
|
||||
<Th>Added At</Th>
|
||||
<Th>Added By</Th>
|
||||
<Th>Remove</Th>
|
||||
</Tr>
|
||||
</Thead>
|
||||
<Tbody>
|
||||
{mods.map((mod: any) => (
|
||||
<Tr>
|
||||
<Td>{mod.user}</Td>
|
||||
<Td>{new Date(mod.metadata.time).toLocaleString()}</Td>
|
||||
<Td>{mod.metadata.user}</Td>
|
||||
<Td>
|
||||
<Link onClick={async () => await removeUser(mod.user)}>
|
||||
Remove
|
||||
</Link>
|
||||
</Td>
|
||||
</Tr>
|
||||
))}
|
||||
</Tbody>
|
||||
</Table>
|
||||
</TableContainer>
|
||||
<HStack mt="8px">
|
||||
<Input
|
||||
maxLength={19}
|
||||
onChange={(e) => setUserToAdd(e.target.value)}
|
||||
placeholder="1234567890987654321"
|
||||
/>
|
||||
<Button onClick={async () => await addUser()}>Add</Button>
|
||||
</HStack>
|
||||
</ModalBody>
|
||||
</ModalContent>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
@@ -54,11 +54,6 @@
|
||||
"tag": "3_Row",
|
||||
"position": "Head of Wall Moderation"
|
||||
},
|
||||
{
|
||||
"id": "688414240209633441",
|
||||
"tag": "9t_d",
|
||||
"position": "Events Coordinator"
|
||||
},
|
||||
{
|
||||
"id": "884831305831948338",
|
||||
"tag": "Mustang",
|
||||
|
||||
39
functions/api/game-bans/notes/[id].ts
Normal file
39
functions/api/game-bans/notes/[id].ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { jsonError, jsonResponse } from "../../../common.js";
|
||||
|
||||
export async function onRequestDelete(context: RequestContext) {
|
||||
const noteId = context.params.id as string;
|
||||
const creatorIdResult: null | Record<string, string> =
|
||||
await context.env.D1.prepare(
|
||||
"SELECT created_by FROM game_mod_logs WHERE id = ?;",
|
||||
)
|
||||
.bind(noteId)
|
||||
.first();
|
||||
|
||||
if (creatorIdResult?.created_by !== context.data.current_user.id)
|
||||
return jsonError("Cannot delete notes that are not your own", 403);
|
||||
|
||||
await context.env.D1.prepare("DELETE FROM game_mod_logs WHERE id = ?;")
|
||||
.bind(noteId)
|
||||
.first();
|
||||
|
||||
return new Response(null, { status: 204 });
|
||||
}
|
||||
|
||||
export async function onRequestGet(context: RequestContext) {
|
||||
const noteId = context.params.id as string;
|
||||
const result = await context.env.D1.prepare(
|
||||
"SELECT * FROM game_mod_notes WHERE id = ?;",
|
||||
)
|
||||
.bind(noteId)
|
||||
.first();
|
||||
|
||||
if (!result) return jsonError("Note not found", 404);
|
||||
|
||||
const noteData = structuredClone(result);
|
||||
const gmeEntry: null | { time: number; user: string; name: string } =
|
||||
await context.env.DATA.get(`gamemod_${result.created_by}`, "json");
|
||||
|
||||
if (gmeEntry) noteData.creator_name = gmeEntry.name;
|
||||
|
||||
return jsonResponse(JSON.stringify(noteData));
|
||||
}
|
||||
8
functions/api/game-bans/notes/_middleware.ts
Normal file
8
functions/api/game-bans/notes/_middleware.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { jsonError } from "../../../common.js";
|
||||
|
||||
export async function onRequest(context: RequestContext) {
|
||||
if (!(context.data.current_user?.permissions & (1 << 5)))
|
||||
return jsonError("Forbidden", 403);
|
||||
|
||||
return await context.next();
|
||||
}
|
||||
23
functions/api/game-bans/notes/create.ts
Normal file
23
functions/api/game-bans/notes/create.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { jsonError } from "../../../common.js";
|
||||
|
||||
export async function onRequestPost(context: RequestContext) {
|
||||
const { content, target } = context.data.body;
|
||||
|
||||
if (typeof content !== "string")
|
||||
return jsonError("'content' property is not a string", 400);
|
||||
|
||||
if (typeof target !== "number" || !Number.isSafeInteger(target))
|
||||
return jsonError("'target' property is not a valid number", 400);
|
||||
|
||||
if (content.length > 1000)
|
||||
return jsonError(
|
||||
"'content' property must be less than 1000 characters",
|
||||
400,
|
||||
);
|
||||
|
||||
const id = `${Date.now()}${crypto.randomUUID().replaceAll("-", "")}`;
|
||||
|
||||
await context.env.D1.prepare(
|
||||
"INSERT INTO game_mod_notes (content, created_at, created_by, id, target) VALUES (?, ?, ?, ?, ?);",
|
||||
).bind(content, Date.now(), context.data.current_user.id, id, target).first();
|
||||
}
|
||||
@@ -1,10 +1,13 @@
|
||||
import { jsonError } from "../../common.js";
|
||||
|
||||
export async function onRequestPost(context: RequestContext) {
|
||||
const { user } = context.data.body;
|
||||
const { user, name } = context.data.body;
|
||||
|
||||
if (!user) return jsonError("No user provided", 400);
|
||||
|
||||
if (typeof name !== "string" || name.length > 32)
|
||||
return jsonError("Invalid name", 400);
|
||||
|
||||
const existingUser = await context.env.DATA.get(`gamemod_${user}`);
|
||||
|
||||
if (existingUser) return jsonError("Cannot add an existing user", 400);
|
||||
@@ -20,7 +23,12 @@ export async function onRequestPost(context: RequestContext) {
|
||||
|
||||
if (!user.match(/^\d{17,19}$/)) return jsonError("Invalid User ID", 400);
|
||||
|
||||
const data = { time: Date.now(), user: context.data.current_user.id };
|
||||
const data = {
|
||||
created_at: Date.now(),
|
||||
created_by: context.data.current_user.id,
|
||||
id: user,
|
||||
name,
|
||||
};
|
||||
|
||||
await context.env.DATA.put(`gamemod_${user}`, JSON.stringify(data), {
|
||||
metadata: data,
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
import { jsonResponse } from "../../common.js";
|
||||
|
||||
export async function onRequestGet(context: RequestContext) {
|
||||
const list = await context.env.DATA.list({ prefix: "gamemod_" });
|
||||
const entries = [];
|
||||
|
||||
for (const key of list.keys)
|
||||
entries.push({
|
||||
metadata: key.metadata,
|
||||
user: key.name.replace("gamemod_", ""),
|
||||
});
|
||||
|
||||
return jsonResponse(JSON.stringify(entries));
|
||||
}
|
||||
@@ -91,8 +91,10 @@ export async function onRequestPost(context: RequestContext) {
|
||||
requestedNotice.decisions,
|
||||
);
|
||||
|
||||
for (const department of userAdminDepartments)
|
||||
for (const department of userAdminDepartments) {
|
||||
if (!JSON.parse(requestedNotice.departments).includes(department)) continue;
|
||||
decisions[department] = accepted;
|
||||
}
|
||||
|
||||
const applicableDepartments = JSON.parse(requestedNotice.departments).length;
|
||||
|
||||
|
||||
@@ -69,10 +69,10 @@ export async function onRequestPost(context: RequestContext) {
|
||||
|
||||
// If not a ban action
|
||||
if (v === 1) {
|
||||
newActions[user].hidden_from_leaderboards = true;
|
||||
newActions[k].hidden_from_leaderboards = true;
|
||||
} else if (v === 3) {
|
||||
newActions[user].serverconfigurator_blacklist = true;
|
||||
newActions[user].BanType = 1;
|
||||
newActions[k].serverconfigurator_blacklist = true;
|
||||
newActions[k].BanType = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -183,9 +183,10 @@ export async function onRequestPost(context: RequestContext) {
|
||||
|
||||
const uploadUrlResults = await Promise.allSettled(uploadUrlPromises);
|
||||
|
||||
const reportId = `${Date.now()}${context.request.headers.get(
|
||||
"cf-ray",
|
||||
)}${crypto.randomUUID().replaceAll("-", "")}`;
|
||||
const reportId = `${Date.now()}${context.request.headers
|
||||
.get("cf-ray")
|
||||
?.split("-")
|
||||
?.at(0)}${crypto.randomUUID().replaceAll("-", "")}`;
|
||||
|
||||
const { current_user: currentUser } = context.data;
|
||||
if (filesToProcess.length)
|
||||
|
||||
231
package-lock.json
generated
231
package-lock.json
generated
@@ -11,27 +11,27 @@
|
||||
"@chakra-ui/react": "^2.10.9",
|
||||
"@emotion/react": "^11.14.0",
|
||||
"@emotion/styled": "^11.14.1",
|
||||
"@fontsource-variable/plus-jakarta-sans": "^5.2.6",
|
||||
"@remix-run/cloudflare": "^2.17.0",
|
||||
"@remix-run/cloudflare-pages": "^2.17.0",
|
||||
"@remix-run/react": "^2.17.0",
|
||||
"@sentry/react": "^10.11.0",
|
||||
"@fontsource-variable/plus-jakarta-sans": "^5.2.8",
|
||||
"@remix-run/cloudflare": "^2.17.1",
|
||||
"@remix-run/cloudflare-pages": "^2.17.1",
|
||||
"@remix-run/react": "^2.17.1",
|
||||
"@sentry/react": "^10.21.0",
|
||||
"aws4fetch": "^1.0.20",
|
||||
"dayjs": "^1.11.18",
|
||||
"framer-motion": "^12.23.12",
|
||||
"framer-motion": "^12.23.24",
|
||||
"react": "^18.3.1",
|
||||
"react-big-calendar": "^1.19.4",
|
||||
"react-dom": "^18.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@remix-run/dev": "^2.17.0",
|
||||
"@types/node": "^22.18.1",
|
||||
"@types/react": "^18.3.24",
|
||||
"@types/react-big-calendar": "^1.16.2",
|
||||
"@remix-run/dev": "^2.17.1",
|
||||
"@types/node": "^24.9.1",
|
||||
"@types/react": "^18.3.26",
|
||||
"@types/react-big-calendar": "^1.16.3",
|
||||
"@types/react-dom": "^18.3.7",
|
||||
"dotenv": "^17.2.2",
|
||||
"dotenv": "^17.2.3",
|
||||
"prettier": "^3.6.2",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@ampproject/remapping": {
|
||||
@@ -649,9 +649,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@cloudflare/workers-types": {
|
||||
"version": "4.20250911.0",
|
||||
"resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250911.0.tgz",
|
||||
"integrity": "sha512-Ardq4aDdNOfnvU/qC8anznZYSsMlfZnMgLAdwxESf3bMdgkb+GV01LpY8NzridFe7cFeprfiDNANBZoeUeEDlg==",
|
||||
"version": "4.20251014.0",
|
||||
"resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20251014.0.tgz",
|
||||
"integrity": "sha512-tEW98J/kOa0TdylIUOrLKRdwkUw0rvvYVlo+Ce0mqRH3c8kSoxLzUH9gfCvwLe0M89z1RkzFovSKAW2Nwtyn3w==",
|
||||
"license": "MIT OR Apache-2.0",
|
||||
"peer": true
|
||||
},
|
||||
@@ -1193,9 +1193,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@fontsource-variable/plus-jakarta-sans": {
|
||||
"version": "5.2.6",
|
||||
"resolved": "https://registry.npmjs.org/@fontsource-variable/plus-jakarta-sans/-/plus-jakarta-sans-5.2.6.tgz",
|
||||
"integrity": "sha512-w0954jYDlHvzABXY5NgkBtitBiHcULblm1cScowZrRV5V6KtgB17Ubw3knFr82P3qvN48kgQk5DLPhB27OlTnQ==",
|
||||
"version": "5.2.8",
|
||||
"resolved": "https://registry.npmjs.org/@fontsource-variable/plus-jakarta-sans/-/plus-jakarta-sans-5.2.8.tgz",
|
||||
"integrity": "sha512-iQecBizIdZxezODNHzOn4SvvRMrZL/S8k4MEXGDynCmUrImVW0VmX+tIAMqnADwH4haXlHSXqMgU6+kcfBQJdw==",
|
||||
"license": "OFL-1.1",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ayuhito"
|
||||
@@ -1401,13 +1401,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/cloudflare": {
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/cloudflare/-/cloudflare-2.17.0.tgz",
|
||||
"integrity": "sha512-k5uuRfHUW8WwALyKo1YwN8yirfAN/6SmwTFOJ9HDqGrR/t4SHM9upZEnr5Iisa+jDrhySmhR5ASSf+bhqxSrtw==",
|
||||
"version": "2.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/cloudflare/-/cloudflare-2.17.1.tgz",
|
||||
"integrity": "sha512-JdtThzjMgLiC7Hdg9pO3dX2LRcNdV///fAB8OjAbICfVmR4pgXRffcQLBNH3OSvnk1nwLvseugozUmZTHwbg4Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@cloudflare/kv-asset-handler": "^0.1.3",
|
||||
"@remix-run/server-runtime": "2.17.0"
|
||||
"@remix-run/server-runtime": "2.17.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
@@ -1423,12 +1423,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/cloudflare-pages": {
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/cloudflare-pages/-/cloudflare-pages-2.17.0.tgz",
|
||||
"integrity": "sha512-+Hqv/m0R7zOLsi0iEtUyRlqJjVsC/9VDYxAZcnZbLuOlj5Ik480HGQFGs4M+Iw3gZfUmaLA1hpdMdwwk21Hx4w==",
|
||||
"version": "2.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/cloudflare-pages/-/cloudflare-pages-2.17.1.tgz",
|
||||
"integrity": "sha512-ATJOyO+mu50NzPS74b/7fe6TTgMC+HM3yMd3M5SdqaLu+McPBaldnJrP+WAXNbPCJXDeoFbMneBpfnS1p2TAPQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@remix-run/cloudflare": "2.17.0"
|
||||
"@remix-run/cloudflare": "2.17.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
@@ -1444,9 +1444,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/dev": {
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.17.0.tgz",
|
||||
"integrity": "sha512-L2W8PYH3jUvCKlJeUkFMGyOMzUsM0goZg4n0NU69O85TNlB1jgiqSbSMb69xhviphGpwzAoH+D/p3/cUnw4DbQ==",
|
||||
"version": "2.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.17.1.tgz",
|
||||
"integrity": "sha512-Ou9iIewCs4IIoC5FjYBsfNzcCfdrc+3V8thRjULVMvTDfFxRoL+uNz/AlD3jC7Vm8Q08Iryy0joCOh8oghIhvQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -1460,9 +1460,9 @@
|
||||
"@babel/types": "^7.22.5",
|
||||
"@mdx-js/mdx": "^2.3.0",
|
||||
"@npmcli/package-json": "^4.0.1",
|
||||
"@remix-run/node": "2.17.0",
|
||||
"@remix-run/node": "2.17.1",
|
||||
"@remix-run/router": "1.23.0",
|
||||
"@remix-run/server-runtime": "2.17.0",
|
||||
"@remix-run/server-runtime": "2.17.1",
|
||||
"@types/mdx": "^2.0.5",
|
||||
"@vanilla-extract/integration": "^6.2.0",
|
||||
"arg": "^5.0.1",
|
||||
@@ -1671,13 +1671,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@remix-run/node": {
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.17.0.tgz",
|
||||
"integrity": "sha512-ISy3N4peKB+Fo8ddh+mU6ki3HzQqLXwJxUrAtqxYxrBDM4Pwc7EvISrcQ4QasB6ORBknJeEZSBu69WDRhGzrjA==",
|
||||
"version": "2.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.17.1.tgz",
|
||||
"integrity": "sha512-pHmHTuLE1Lwazulx3gjrHobgBCsa+Xiq8WUO0ruLeDfEw2DU0c0SNSiyNkugu3rIZautroBwRaOoy7CWJL9xhQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@remix-run/server-runtime": "2.17.0",
|
||||
"@remix-run/server-runtime": "2.17.1",
|
||||
"@remix-run/web-fetch": "^4.4.2",
|
||||
"@web3-storage/multipart-parser": "^1.0.0",
|
||||
"cookie-signature": "^1.1.0",
|
||||
@@ -1698,13 +1698,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/react": {
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.17.0.tgz",
|
||||
"integrity": "sha512-muOLHqcimMCrIk6VOuqIn51P3buYjKpdYc6qpNy6zE5HlKfyaKEY00a5pzdutRmevYTQy7FiEF/LK4M8sxk70Q==",
|
||||
"version": "2.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.17.1.tgz",
|
||||
"integrity": "sha512-5MqRK2Z5gkQMDqGfjXSACf/HzvOA+5ug9kiSqaPpK9NX0OF4NlS+cAPKXQWuzc2iLSp6r1RGu8FU1jpZbhsaug==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.23.0",
|
||||
"@remix-run/server-runtime": "2.17.0",
|
||||
"@remix-run/server-runtime": "2.17.1",
|
||||
"react-router": "6.30.0",
|
||||
"react-router-dom": "6.30.0",
|
||||
"turbo-stream": "2.4.1"
|
||||
@@ -1733,9 +1733,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/server-runtime": {
|
||||
"version": "2.17.0",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.17.0.tgz",
|
||||
"integrity": "sha512-X0zfGLgvukhuTIL0tdWKnlvHy4xUe7Z17iQ0KMQoITK0SkTZPSud/6cJCsKhPqC8kfdYT1GNFLJKRhHz7Aapmw==",
|
||||
"version": "2.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.17.1.tgz",
|
||||
"integrity": "sha512-d1Vp9FxX4KafB111vP2E5C1fmWzPI+gHZ674L1drq+N8Bp9U6FBspi7GAZSU5K5Kxa4T6UF+aE1gK6pVi9R8sw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.23.0",
|
||||
@@ -2065,88 +2065,88 @@
|
||||
]
|
||||
},
|
||||
"node_modules/@sentry-internal/browser-utils": {
|
||||
"version": "10.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.11.0.tgz",
|
||||
"integrity": "sha512-fnMlz5ntap6x4vRsLOHwPqXh7t82StgAiRt+EaqcMX0t9l8C0w0df8qwrONKXvE5GdHWTNFJj5qR15FERSkg3Q==",
|
||||
"version": "10.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.21.0.tgz",
|
||||
"integrity": "sha512-QRHpCBheLd/88Z2m3ABMriV0MweW+pcGKuVsH61/UdziKcQLdoQpOSvGg0/0CuqFm2UjL7237ZzLdZrWaCOlfQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sentry/core": "10.11.0"
|
||||
"@sentry/core": "10.21.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@sentry-internal/feedback": {
|
||||
"version": "10.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.11.0.tgz",
|
||||
"integrity": "sha512-ADey51IIaa29kepb8B7aSgSGSrcyT7QZdRsN1rhitefzrruHzpSUci5c2EPIvmWfKJq8Wnvukm9BHXZXAAIOzA==",
|
||||
"version": "10.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.21.0.tgz",
|
||||
"integrity": "sha512-6SnRR2FiW6TMwCE0PqbueHkkpeVnjOjz00R+/mX25Dp1U5BU5TzbXHzn9Y4wKnaD3Rzz4+nnzVkpHAOL3SppGw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sentry/core": "10.11.0"
|
||||
"@sentry/core": "10.21.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@sentry-internal/replay": {
|
||||
"version": "10.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.11.0.tgz",
|
||||
"integrity": "sha512-t4M2bxMp2rKGK/l7bkVWjN+xVw9H9V12jAeXmO/Fskz2RcG1ZNLQnKSx/W/zCRMk8k7xOQFsfiApq+zDN+ziKA==",
|
||||
"version": "10.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.21.0.tgz",
|
||||
"integrity": "sha512-5tfiKZJzZf9+Xk8SyvoC4ZEVLNmjBZZEaKhVyNo53CLWUWfWOqDc3DB9fj85i/yHFQ0ImdRnaPBc0CIeN00CcA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sentry-internal/browser-utils": "10.11.0",
|
||||
"@sentry/core": "10.11.0"
|
||||
"@sentry-internal/browser-utils": "10.21.0",
|
||||
"@sentry/core": "10.21.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@sentry-internal/replay-canvas": {
|
||||
"version": "10.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.11.0.tgz",
|
||||
"integrity": "sha512-brWQ90IYQyZr44IpTprlmvbtz4l2ABzLdpP94Egh12Onf/q6n4CjLKaA25N5kX0uggHqX1Rs7dNaG0mP3ETHhA==",
|
||||
"version": "10.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.21.0.tgz",
|
||||
"integrity": "sha512-TOLo5mAjJSOuJId8Po44d1hwJ5bIZDtRSoupWpYWqLw1tuUh1tc4vqID11ZXsw9pBzjVIK653BPDX/z/9+Um+Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sentry-internal/replay": "10.11.0",
|
||||
"@sentry/core": "10.11.0"
|
||||
"@sentry-internal/replay": "10.21.0",
|
||||
"@sentry/core": "10.21.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@sentry/browser": {
|
||||
"version": "10.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.11.0.tgz",
|
||||
"integrity": "sha512-qemaKCJKJHHCyGBpdLq23xL5u9Xvir20XN7YFTnHcEq4Jvj0GoWsslxKi5cQB2JvpYn62WxTiDgVLeQlleZhSg==",
|
||||
"version": "10.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.21.0.tgz",
|
||||
"integrity": "sha512-z/63bUFBQkTfJ5ElhWTYvomz+gZ1GsoH16v4/RGoPY5qZgYxcVO3fkp0opnu3gcbXS0ZW7TLRiHpqhvipDdP6g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sentry-internal/browser-utils": "10.11.0",
|
||||
"@sentry-internal/feedback": "10.11.0",
|
||||
"@sentry-internal/replay": "10.11.0",
|
||||
"@sentry-internal/replay-canvas": "10.11.0",
|
||||
"@sentry/core": "10.11.0"
|
||||
"@sentry-internal/browser-utils": "10.21.0",
|
||||
"@sentry-internal/feedback": "10.21.0",
|
||||
"@sentry-internal/replay": "10.21.0",
|
||||
"@sentry-internal/replay-canvas": "10.21.0",
|
||||
"@sentry/core": "10.21.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@sentry/core": {
|
||||
"version": "10.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.11.0.tgz",
|
||||
"integrity": "sha512-39Rxn8cDXConx3+SKOCAhW+/hklM7UDaz+U1OFzFMDlT59vXSpfI6bcXtNiFDrbOxlQ2hX8yAqx8YRltgSftoA==",
|
||||
"version": "10.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.21.0.tgz",
|
||||
"integrity": "sha512-/+gpOOb2Wr1UbW59WKqNAVVIqFz9FjtUJuPtVh4UanxGCfavMPaKpFzSlaEKJSKDkiCQgANP4O2y8Y5Bh3tvEA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@sentry/react": {
|
||||
"version": "10.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.11.0.tgz",
|
||||
"integrity": "sha512-bE4lJ5Ni/n9JUdLWGG99yucY0/zOUXjKl9gfSTkvUvOiAIX/bY0Y4WgOqeWySvbMz679ZdOwF34k8RA/gI7a8g==",
|
||||
"version": "10.21.0",
|
||||
"resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.21.0.tgz",
|
||||
"integrity": "sha512-BSCGKkepg9QPJRS8AUjtSAFd4lYJLmz3+P+oehViEHQDtRqqmXbVIBLhqwPc05KvRGIl4/kIDjyfDuHCFCJigQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@sentry/browser": "10.11.0",
|
||||
"@sentry/core": "10.11.0",
|
||||
"@sentry/browser": "10.21.0",
|
||||
"@sentry/core": "10.21.0",
|
||||
"hoist-non-react-statics": "^3.3.2"
|
||||
},
|
||||
"engines": {
|
||||
@@ -2256,13 +2256,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "22.18.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.1.tgz",
|
||||
"integrity": "sha512-rzSDyhn4cYznVG+PCzGe1lwuMYJrcBS1fc3JqSa2PvtABwWo+dZ1ij5OVok3tqfpEBCBoaR4d7upFJk73HRJDw==",
|
||||
"version": "24.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz",
|
||||
"integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~6.21.0"
|
||||
"undici-types": "~7.16.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/parse-json": {
|
||||
@@ -2278,9 +2278,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/react": {
|
||||
"version": "18.3.24",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz",
|
||||
"integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==",
|
||||
"version": "18.3.26",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz",
|
||||
"integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/prop-types": "*",
|
||||
@@ -2288,9 +2288,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@types/react-big-calendar": {
|
||||
"version": "1.16.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-big-calendar/-/react-big-calendar-1.16.2.tgz",
|
||||
"integrity": "sha512-vydU/ZyZsT17sppfiH1vXXlXeruxrzX0Hld4QJ44LgkN4DA09yDlnxsWhyKBXRxXRJ69fl/7qdF2o3DESEU7vg==",
|
||||
"version": "1.16.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-big-calendar/-/react-big-calendar-1.16.3.tgz",
|
||||
"integrity": "sha512-CR+5BKMhlr/wPgsp+sXOeNKNkoU1h/+6H1XoWuL7xnurvzGRQv/EnM8jPS9yxxBvXI8pjQBaJcI7RTSGiewG/Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -3418,9 +3418,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "17.2.2",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz",
|
||||
"integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==",
|
||||
"version": "17.2.3",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
|
||||
"integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"engines": {
|
||||
@@ -4114,12 +4114,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/framer-motion": {
|
||||
"version": "12.23.12",
|
||||
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.12.tgz",
|
||||
"integrity": "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==",
|
||||
"version": "12.23.24",
|
||||
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.24.tgz",
|
||||
"integrity": "sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"motion-dom": "^12.23.12",
|
||||
"motion-dom": "^12.23.23",
|
||||
"motion-utils": "^12.23.6",
|
||||
"tslib": "^2.4.0"
|
||||
},
|
||||
@@ -4224,6 +4224,16 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/generator-function": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
|
||||
"integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/generic-names": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz",
|
||||
@@ -4825,14 +4835,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/is-generator-function": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
|
||||
"integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
|
||||
"integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bound": "^1.0.3",
|
||||
"get-proto": "^1.0.0",
|
||||
"call-bound": "^1.0.4",
|
||||
"generator-function": "^2.0.0",
|
||||
"get-proto": "^1.0.1",
|
||||
"has-tostringtag": "^1.0.2",
|
||||
"safe-regex-test": "^1.1.0"
|
||||
},
|
||||
@@ -6548,9 +6559,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/motion-dom": {
|
||||
"version": "12.23.12",
|
||||
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.12.tgz",
|
||||
"integrity": "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==",
|
||||
"version": "12.23.23",
|
||||
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz",
|
||||
"integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"motion-utils": "^12.23.6"
|
||||
@@ -8861,9 +8872,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.9.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
|
||||
"integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
|
||||
"version": "5.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
@@ -8897,9 +8908,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/undici": {
|
||||
"version": "6.21.3",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz",
|
||||
"integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==",
|
||||
"version": "6.22.0",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz",
|
||||
"integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -8907,9 +8918,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "6.21.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
||||
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
||||
"version": "7.16.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
|
||||
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
|
||||
26
package.json
26
package.json
@@ -12,30 +12,30 @@
|
||||
"@chakra-ui/react": "^2.10.9",
|
||||
"@emotion/react": "^11.14.0",
|
||||
"@emotion/styled": "^11.14.1",
|
||||
"@fontsource-variable/plus-jakarta-sans": "^5.2.6",
|
||||
"@remix-run/cloudflare": "^2.17.0",
|
||||
"@remix-run/cloudflare-pages": "^2.17.0",
|
||||
"@remix-run/react": "^2.17.0",
|
||||
"@sentry/react": "^10.11.0",
|
||||
"@fontsource-variable/plus-jakarta-sans": "^5.2.8",
|
||||
"@remix-run/cloudflare": "^2.17.1",
|
||||
"@remix-run/cloudflare-pages": "^2.17.1",
|
||||
"@remix-run/react": "^2.17.1",
|
||||
"@sentry/react": "^10.21.0",
|
||||
"aws4fetch": "^1.0.20",
|
||||
"dayjs": "^1.11.18",
|
||||
"framer-motion": "^12.23.12",
|
||||
"framer-motion": "^12.23.24",
|
||||
"react": "^18.3.1",
|
||||
"react-big-calendar": "^1.19.4",
|
||||
"react-dom": "^18.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@remix-run/dev": "^2.17.0",
|
||||
"@types/node": "^22.18.1",
|
||||
"@types/react": "^18.3.24",
|
||||
"@types/react-big-calendar": "^1.16.2",
|
||||
"@remix-run/dev": "^2.17.1",
|
||||
"@types/node": "^24.9.1",
|
||||
"@types/react": "^18.3.26",
|
||||
"@types/react-big-calendar": "^1.16.3",
|
||||
"@types/react-dom": "^18.3.7",
|
||||
"dotenv": "^17.2.2",
|
||||
"dotenv": "^17.2.3",
|
||||
"prettier": "^3.6.2",
|
||||
"typescript": "^5.9.2"
|
||||
"typescript": "^5.9.3"
|
||||
},
|
||||
"overrides": {
|
||||
"@cloudflare/workers-types": "^4.20250911.0"
|
||||
"@cloudflare/workers-types": "^4.20251014.0"
|
||||
},
|
||||
"prettier": {
|
||||
"endOfLine": "auto"
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 57 KiB |
Reference in New Issue
Block a user