tokens fr

This commit is contained in:
2025-08-18 17:47:39 -04:00
parent 601e3660d3
commit 3f1635880a
11 changed files with 204 additions and 106 deletions

View File

@@ -60,7 +60,4 @@ const App = () => (
</Router> </Router>
); );
// todo: fix this api.whoami.post().then(() => render(App, document.getElementById("app")!));
(Cookies.get("token") == null ? api.whoami.post() : Promise.resolve()).then(
() => render(App, document.getElementById("app")!)
);

View File

@@ -0,0 +1,45 @@
/*
Warnings:
- The required column `token` was added to the `Human` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required.
*/
-- CreateTable
CREATE TABLE "_HumanToInstance" (
"A" TEXT NOT NULL,
"B" TEXT NOT NULL,
CONSTRAINT "_HumanToInstance_A_fkey" FOREIGN KEY ("A") REFERENCES "Human" ("key") ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT "_HumanToInstance_B_fkey" FOREIGN KEY ("B") REFERENCES "Instance" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_Human" (
"key" TEXT NOT NULL PRIMARY KEY,
"token" TEXT NOT NULL,
"name" TEXT NOT NULL DEFAULT '__name__',
"lastActive" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO "new_Human" ("key", "name") SELECT "key", "name" FROM "Human";
DROP TABLE "Human";
ALTER TABLE "new_Human" RENAME TO "Human";
CREATE UNIQUE INDEX "Human_token_key" ON "Human"("token");
CREATE TABLE "new_Instance" (
"id" TEXT NOT NULL PRIMARY KEY,
"createdByKey" TEXT NOT NULL,
"gameKey" TEXT NOT NULL,
"gameState" JSONB NOT NULL,
CONSTRAINT "Instance_gameKey_fkey" FOREIGN KEY ("gameKey") REFERENCES "Game" ("key") ON DELETE RESTRICT ON UPDATE CASCADE
);
INSERT INTO "new_Instance" ("createdByKey", "gameKey", "gameState", "id") SELECT "createdByKey", "gameKey", "gameState", "id" FROM "Instance";
DROP TABLE "Instance";
ALTER TABLE "new_Instance" RENAME TO "Instance";
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;
-- CreateIndex
CREATE UNIQUE INDEX "_HumanToInstance_AB_unique" ON "_HumanToInstance"("A", "B");
-- CreateIndex
CREATE INDEX "_HumanToInstance_B_index" ON "_HumanToInstance"("B");

View File

@@ -17,16 +17,21 @@ model Game {
} }
model Human { model Human {
key String @id @default(cuid(2)) key String @id @default(cuid())
name String @default("") token String @unique @default(cuid())
Instance Instance[] name String @default("__name__")
lastActive DateTime @default(now())
playingInstances Instance[]
} }
model Instance { model Instance {
id String @id @default(cuid(2)) id String @id @default(cuid())
createdByKey String createdByKey String
createdBy Human @relation(fields: [createdByKey], references: [key])
gameKey String gameKey String
players Human[]
game Game @relation(fields: [gameKey], references: [key]) game Game @relation(fields: [gameKey], references: [key])
gameState Json gameState Json
} }

View File

@@ -16,7 +16,10 @@
"@elysiajs/static": "^1.3.0", "@elysiajs/static": "^1.3.0",
"@games/shared": "workspace:*", "@games/shared": "workspace:*",
"@prisma/client": "6.13.0", "@prisma/client": "6.13.0",
"dayjs": "^1.11.13",
"elysia": "^1.3.8", "elysia": "^1.3.8",
"elysia-ip": "^1.0.10",
"elysia-rate-limit": "^4.4.0",
"object-hash": "^3.0.0" "object-hash": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -1,16 +1,20 @@
import { prisma } from "./db/db";
import { Elysia, t } from "elysia"; import { Elysia, t } from "elysia";
import { Prisma } from "@prisma/client";
import { simpleApi } from "./games/simple"; import { simpleApi } from "./games/simple";
import { human } from "./human"; import { human } from "./human";
import dayjs from "dayjs";
import db from "./db";
const api = new Elysia({ prefix: "/api" }) const api = new Elysia({ prefix: "/api" })
.post("/whoami", async ({ cookie: { token } }) => { .post("/whoami", async ({ cookie: { token } }) => {
if (token.value == null) { if (token.value == null) {
const newHuman = await prisma.human.create({ const newHuman = await db.human.create({
data: {}, data: {},
}); });
token.value = newHuman.key; token.set({
value: newHuman.token,
expires: dayjs().add(1, "year").toDate(),
httpOnly: true,
});
} }
return token.value; return token.value;
}) })
@@ -18,7 +22,7 @@ const api = new Elysia({ prefix: "/api" })
.post( .post(
"/setName", "/setName",
({ body: { name }, humanKey }) => ({ body: { name }, humanKey }) =>
prisma.human.update({ db.human.update({
where: { where: {
key: humanKey, key: humanKey,
}, },
@@ -33,16 +37,21 @@ const api = new Elysia({ prefix: "/api" })
} }
) )
.get("/profile", ({ humanKey }) => .get("/profile", ({ humanKey }) =>
prisma.human.findFirst({ where: { key: humanKey } }) db.human.findFirst({ where: { key: humanKey } })
) )
.get("/games", () => prisma.game.findMany()) .get("/games", () => [{ key: "simple", name: "simple" }])
.get("/instances", ({ query: { game } }) => .get("/instances", ({ query: { game }, humanKey }) =>
prisma.instance.findMany({ db.instance.findMany({
where: { where: {
game: { game: {
name: game, name: game,
}, },
players: {
some: {
key: humanKey,
},
},
}, },
select: { select: {
id: true, id: true,

View File

@@ -2,4 +2,4 @@
import { PrismaClient } from "@prisma/client"; import { PrismaClient } from "@prisma/client";
export const prisma = new PrismaClient(); export default new PrismaClient();

View File

@@ -1,4 +0,0 @@
"use server";
import { prisma } from "./db";
export const queryAll = async () => await prisma.game.findMany();

View File

@@ -1,25 +0,0 @@
"use server";
import { GameState, newDeck, shuffle } from "../types/cards";
import { prisma } from "./db";
export const queryInstances = async (gameName: string) =>
prisma.instance.findMany({ where: { game: { name: gameName } } });
export const createInstance = (gameName: string) =>
prisma.instance.create({
data: {
gameState: { deck: shuffle(newDeck()), hand: [] } as GameState,
game: { connect: { name: gameName } },
},
});
export const getGameState = (instanceId: number) =>
prisma.instance
.findUnique({ where: { id: instanceId } })
.then((i) => i?.gameState as GameState | undefined);
export const updateGameState = async (
instanceId: number,
gameState: GameState
) => prisma.instance.update({ where: { id: instanceId }, data: { gameState } });

View File

@@ -1,14 +1,7 @@
import { import { Card, Hand, newDeck, Pile, shuffle, vCard } from "@games/shared/cards";
Card,
Hand,
newDeck,
Pile,
shuffle,
vCard,
} from "../../../shared/cards";
import { heq } from "@games/shared/utils"; import { heq } from "@games/shared/utils";
import { Elysia, t } from "elysia"; import { Elysia, t } from "elysia";
import { prisma } from "../db/db"; import db from "../db";
import { human } from "../human"; import { human } from "../human";
// omniscient game state // omniscient game state
@@ -114,18 +107,22 @@ export const resolveAction = (
export const simpleApi = new Elysia({ prefix: "/simple" }) export const simpleApi = new Elysia({ prefix: "/simple" })
.use(human) .use(human)
.post("/newGame", ({ humanKey }) => { .post("/newGame", ({ humanKey }) => {
return prisma.instance.create({ console.log("KEY", humanKey);
return db.instance.create({
data: { data: {
gameState: newGame([humanKey]), gameState: newGame([humanKey]),
gameKey: "simple", gameKey: "simple",
createdByKey: humanKey, createdByKey: humanKey,
players: {
connect: [{ key: humanKey }],
},
}, },
}); });
}) })
.group("/:instanceId", (app) => .group("/:instanceId", (app) =>
app app
.get("/", ({ params: { instanceId }, humanKey }) => .get("/", ({ params: { instanceId }, humanKey }) =>
prisma.instance db.instance
.findUnique({ .findUnique({
where: { where: {
id: instanceId, id: instanceId,
@@ -144,7 +141,7 @@ export const simpleApi = new Elysia({ prefix: "/simple" })
.post( .post(
"/", "/",
({ params: { instanceId }, body: { action }, humanKey }) => ({ params: { instanceId }, body: { action }, humanKey }) =>
prisma.instance db.instance
.findUniqueOrThrow({ .findUniqueOrThrow({
where: { where: {
id: instanceId, id: instanceId,
@@ -156,7 +153,7 @@ export const simpleApi = new Elysia({ prefix: "/simple" })
humanKey, humanKey,
action action
); );
await prisma.instance.update({ await db.instance.update({
data: { gameState: newState }, data: { gameState: newState },
where: { where: {
id: instanceId, id: instanceId,

View File

@@ -1,8 +1,13 @@
import Elysia from "elysia"; import Elysia from "elysia";
import db from "./db";
export const human = new Elysia({ name: "human" }) export const human = new Elysia({ name: "human" })
.derive(async ({ cookie: { token }, status }) => { .derive(async ({ cookie: { token }, status }) => {
const humanKey = token.value; const humanKey = await db.human
.findUnique({
where: { token: token.value },
})
.then((human) => human?.key);
return humanKey != null ? { humanKey } : status(401); return humanKey != null ? { humanKey } : status(401);
}) })
.as("scoped"); .as("scoped");

150
pnpm-lock.yaml generated
View File

@@ -19,13 +19,13 @@ importers:
dependencies: dependencies:
'@elysiajs/eden': '@elysiajs/eden':
specifier: ^1.3.2 specifier: ^1.3.2
version: 1.3.2(elysia@1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)) version: 1.3.2(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))
'@solid-primitives/scheduled': '@solid-primitives/scheduled':
specifier: ^1.5.2 specifier: ^1.5.2
version: 1.5.2(solid-js@1.9.8) version: 1.5.2(solid-js@1.9.9)
'@solidjs/router': '@solidjs/router':
specifier: ^0.15.3 specifier: ^0.15.3
version: 0.15.3(solid-js@1.9.8) version: 0.15.3(solid-js@1.9.9)
js-cookie: js-cookie:
specifier: ^3.0.5 specifier: ^3.0.5
version: 3.0.5 version: 3.0.5
@@ -34,7 +34,7 @@ importers:
version: 3.0.0 version: 3.0.0
solid-js: solid-js:
specifier: ^1.9.5 specifier: ^1.9.5
version: 1.9.8 version: 1.9.9
devDependencies: devDependencies:
'@iconify-json/solar': '@iconify-json/solar':
specifier: ^1.2.4 specifier: ^1.2.4
@@ -56,25 +56,34 @@ importers:
version: 4.5.14(@types/node@24.2.0) version: 4.5.14(@types/node@24.2.0)
vite-plugin-solid: vite-plugin-solid:
specifier: ^2.11.8 specifier: ^2.11.8
version: 2.11.8(solid-js@1.9.8)(vite@4.5.14(@types/node@24.2.0)) version: 2.11.8(solid-js@1.9.9)(vite@4.5.14(@types/node@24.2.0))
packages/server: packages/server:
dependencies: dependencies:
'@elysiajs/cors': '@elysiajs/cors':
specifier: ^1.3.3 specifier: ^1.3.3
version: 1.3.3(elysia@1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)) version: 1.3.3(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))
'@elysiajs/static': '@elysiajs/static':
specifier: ^1.3.0 specifier: ^1.3.0
version: 1.3.0(elysia@1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)) version: 1.3.0(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))
'@games/shared': '@games/shared':
specifier: workspace:* specifier: workspace:*
version: link:../shared version: link:../shared
'@prisma/client': '@prisma/client':
specifier: 6.13.0 specifier: 6.13.0
version: 6.13.0(prisma@6.13.0(typescript@5.9.2))(typescript@5.9.2) version: 6.13.0(prisma@6.13.0(typescript@5.9.2))(typescript@5.9.2)
dayjs:
specifier: ^1.11.13
version: 1.11.13
elysia: elysia:
specifier: ^1.3.8 specifier: ^1.3.8
version: 1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2) version: 1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)
elysia-ip:
specifier: ^1.0.10
version: 1.0.10(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))
elysia-rate-limit:
specifier: ^4.4.0
version: 4.4.0(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))
object-hash: object-hash:
specifier: ^3.0.0 specifier: ^3.0.0
version: 3.0.0 version: 3.0.0
@@ -97,6 +106,10 @@ importers:
packages: packages:
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
'@ampproject/remapping@2.3.0': '@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
@@ -188,6 +201,9 @@ packages:
resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@borewit/text-codec@0.1.1':
resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==}
'@elysiajs/cors@1.3.3': '@elysiajs/cors@1.3.3':
resolution: {integrity: sha512-mYIU6PyMM6xIJuj7d27Vt0/wuzVKIEnFPjcvlkyd7t/m9xspAG37cwNjFxVOnyvY43oOd2I/oW2DB85utXpA2Q==} resolution: {integrity: sha512-mYIU6PyMM6xIJuj7d27Vt0/wuzVKIEnFPjcvlkyd7t/m9xspAG37cwNjFxVOnyvY43oOd2I/oW2DB85utXpA2Q==}
peerDependencies: peerDependencies:
@@ -658,6 +674,18 @@ packages:
csstype@3.1.3: csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
dayjs@1.11.13:
resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
debug@4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
debug@4.4.1: debug@4.4.1:
resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
engines: {node: '>=6.0'} engines: {node: '>=6.0'}
@@ -690,8 +718,18 @@ packages:
electron-to-chromium@1.5.198: electron-to-chromium@1.5.198:
resolution: {integrity: sha512-G5COfnp3w+ydVu80yprgWSfmfQaYRh9DOxfhAxstLyetKaLyl55QrNjx8C38Pc/C+RaDmb1M0Lk8wPEMQ+bGgQ==} resolution: {integrity: sha512-G5COfnp3w+ydVu80yprgWSfmfQaYRh9DOxfhAxstLyetKaLyl55QrNjx8C38Pc/C+RaDmb1M0Lk8wPEMQ+bGgQ==}
elysia@1.3.8: elysia-ip@1.0.10:
resolution: {integrity: sha512-kxYFhegJbUEf5otzmisEvGt3R7d/dPBNVERO2nHo0kFqKBHyj5slArc90mSRKLfi1vamMtPcz67rL6Zeg5F2yg==} resolution: {integrity: sha512-xmCxPOl4266sq6CLk5d82P3BZOatG9z0gMP473cYEnORssuopbEI8GAwpOhiaz69X76AOrkYgvCdLkqMJC49dQ==}
peerDependencies:
elysia: '>= 1.0.9'
elysia-rate-limit@4.4.0:
resolution: {integrity: sha512-pyQdFEdjgf5ELx5CAEfOZ2IWhPaYv8WIQMrXimzHzslsJ9awDHoK6rcF9K7k/yAOh4qB1UhiasNeMMBGtxAwYQ==}
peerDependencies:
elysia: '>= 1.0.0'
elysia@1.3.11:
resolution: {integrity: sha512-iTBdfLe+CL8UvnqP+TB4NlUUqxhlKGEIxLMUZqlylUp4yGq2lTdFbxlItZuA7Z4/mlv5wC3GfjTd587Iwo552Q==}
peerDependencies: peerDependencies:
exact-mirror: '>= 0.0.9' exact-mirror: '>= 0.0.9'
file-type: '>= 20.0.0' file-type: '>= 20.0.0'
@@ -879,6 +917,9 @@ packages:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
ms@2.1.3: ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -1034,8 +1075,8 @@ packages:
resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
engines: {node: '>=18'} engines: {node: '>=18'}
solid-js@1.9.8: solid-js@1.9.9:
resolution: {integrity: sha512-zF9Whfqk+s8wWuyDKnE7ekl+dJburjdZq54O6X1k4XChA57uZ5FOauYAa0s4I44XkBOM3CZmPrZC0DGjH9fKjQ==} resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==}
solid-refresh@0.6.3: solid-refresh@0.6.3:
resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
@@ -1089,8 +1130,8 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'} engines: {node: '>=8.0'}
token-types@6.0.4: token-types@6.1.1:
resolution: {integrity: sha512-MD9MjpVNhVyH4fyd5rKphjvt/1qj+PtQUz65aFqAZA6XniWAuSFRjLk3e2VALEFlh9OwBpXUN7rfeqSnT/Fmkw==} resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==}
engines: {node: '>=14.16'} engines: {node: '>=14.16'}
totalist@3.0.1: totalist@3.0.1:
@@ -1116,8 +1157,8 @@ packages:
ufo@1.6.1: ufo@1.6.1:
resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
uint8array-extras@1.4.0: uint8array-extras@1.4.1:
resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} resolution: {integrity: sha512-+NWHrac9dvilNgme+gP4YrBSumsaMZP0fNBtXXFIf33RLLKEcBUKaQZ7ULUbS0sBfcjxIZ4V96OTRkCbM7hxpw==}
engines: {node: '>=18'} engines: {node: '>=18'}
unconfig@7.3.2: unconfig@7.3.2:
@@ -1228,6 +1269,8 @@ packages:
snapshots: snapshots:
'@alloc/quick-lru@5.2.0': {}
'@ampproject/remapping@2.3.0': '@ampproject/remapping@2.3.0':
dependencies: dependencies:
'@jridgewell/gen-mapping': 0.3.12 '@jridgewell/gen-mapping': 0.3.12
@@ -1351,17 +1394,19 @@ snapshots:
'@babel/helper-string-parser': 7.27.1 '@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.27.1 '@babel/helper-validator-identifier': 7.27.1
'@elysiajs/cors@1.3.3(elysia@1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))': '@borewit/text-codec@0.1.1': {}
dependencies:
elysia: 1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)
'@elysiajs/eden@1.3.2(elysia@1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))': '@elysiajs/cors@1.3.3(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))':
dependencies: dependencies:
elysia: 1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2) elysia: 1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)
'@elysiajs/static@1.3.0(elysia@1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))': '@elysiajs/eden@1.3.2(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))':
dependencies: dependencies:
elysia: 1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2) elysia: 1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)
'@elysiajs/static@1.3.0(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2))':
dependencies:
elysia: 1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)
node-cache: 5.1.2 node-cache: 5.1.2
'@esbuild/android-arm64@0.18.20': '@esbuild/android-arm64@0.18.20':
@@ -1507,13 +1552,13 @@ snapshots:
'@sinclair/typebox@0.34.38': '@sinclair/typebox@0.34.38':
optional: true optional: true
'@solid-primitives/scheduled@1.5.2(solid-js@1.9.8)': '@solid-primitives/scheduled@1.5.2(solid-js@1.9.9)':
dependencies: dependencies:
solid-js: 1.9.8 solid-js: 1.9.9
'@solidjs/router@0.15.3(solid-js@1.9.8)': '@solidjs/router@0.15.3(solid-js@1.9.9)':
dependencies: dependencies:
solid-js: 1.9.8 solid-js: 1.9.9
'@standard-schema/spec@1.0.0': {} '@standard-schema/spec@1.0.0': {}
@@ -1521,7 +1566,7 @@ snapshots:
dependencies: dependencies:
debug: 4.4.1 debug: 4.4.1
fflate: 0.8.2 fflate: 0.8.2
token-types: 6.0.4 token-types: 6.1.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -1741,12 +1786,12 @@ snapshots:
parse5: 7.3.0 parse5: 7.3.0
validate-html-nesting: 1.2.3 validate-html-nesting: 1.2.3
babel-preset-solid@1.9.8(@babel/core@7.28.0)(solid-js@1.9.8): babel-preset-solid@1.9.8(@babel/core@7.28.0)(solid-js@1.9.9):
dependencies: dependencies:
'@babel/core': 7.28.0 '@babel/core': 7.28.0
babel-plugin-jsx-dom-expressions: 0.40.0(@babel/core@7.28.0) babel-plugin-jsx-dom-expressions: 0.40.0(@babel/core@7.28.0)
optionalDependencies: optionalDependencies:
solid-js: 1.9.8 solid-js: 1.9.9
binary-extensions@2.3.0: {} binary-extensions@2.3.0: {}
@@ -1853,6 +1898,12 @@ snapshots:
csstype@3.1.3: {} csstype@3.1.3: {}
dayjs@1.11.13: {}
debug@4.3.4:
dependencies:
ms: 2.1.2
debug@4.4.1: debug@4.4.1:
dependencies: dependencies:
ms: 2.1.3 ms: 2.1.3
@@ -1874,7 +1925,19 @@ snapshots:
electron-to-chromium@1.5.198: {} electron-to-chromium@1.5.198: {}
elysia@1.3.8(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2): elysia-ip@1.0.10(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)):
dependencies:
elysia: 1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)
elysia-rate-limit@4.4.0(elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)):
dependencies:
'@alloc/quick-lru': 5.2.0
debug: 4.3.4
elysia: 1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2)
transitivePeerDependencies:
- supports-color
elysia@1.3.11(exact-mirror@0.1.5(@sinclair/typebox@0.34.38))(file-type@21.0.0)(typescript@5.9.2):
dependencies: dependencies:
cookie: 1.0.2 cookie: 1.0.2
exact-mirror: 0.1.5(@sinclair/typebox@0.34.38) exact-mirror: 0.1.5(@sinclair/typebox@0.34.38)
@@ -1938,8 +2001,8 @@ snapshots:
dependencies: dependencies:
'@tokenizer/inflate': 0.2.7 '@tokenizer/inflate': 0.2.7
strtok3: 10.3.4 strtok3: 10.3.4
token-types: 6.0.4 token-types: 6.1.1
uint8array-extras: 1.4.0 uint8array-extras: 1.4.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2048,6 +2111,8 @@ snapshots:
mrmime@2.0.1: {} mrmime@2.0.1: {}
ms@2.1.2: {}
ms@2.1.3: {} ms@2.1.3: {}
nanoid@3.3.11: {} nanoid@3.3.11: {}
@@ -2195,18 +2260,18 @@ snapshots:
mrmime: 2.0.1 mrmime: 2.0.1
totalist: 3.0.1 totalist: 3.0.1
solid-js@1.9.8: solid-js@1.9.9:
dependencies: dependencies:
csstype: 3.1.3 csstype: 3.1.3
seroval: 1.3.2 seroval: 1.3.2
seroval-plugins: 1.3.2(seroval@1.3.2) seroval-plugins: 1.3.2(seroval@1.3.2)
solid-refresh@0.6.3(solid-js@1.9.8): solid-refresh@0.6.3(solid-js@1.9.9):
dependencies: dependencies:
'@babel/generator': 7.28.0 '@babel/generator': 7.28.0
'@babel/helper-module-imports': 7.27.1 '@babel/helper-module-imports': 7.27.1
'@babel/types': 7.28.2 '@babel/types': 7.28.2
solid-js: 1.9.8 solid-js: 1.9.9
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2259,8 +2324,9 @@ snapshots:
dependencies: dependencies:
is-number: 7.0.0 is-number: 7.0.0
token-types@6.0.4: token-types@6.1.1:
dependencies: dependencies:
'@borewit/text-codec': 0.1.1
'@tokenizer/token': 0.3.0 '@tokenizer/token': 0.3.0
ieee754: 1.2.1 ieee754: 1.2.1
@@ -2276,7 +2342,7 @@ snapshots:
ufo@1.6.1: {} ufo@1.6.1: {}
uint8array-extras@1.4.0: {} uint8array-extras@1.4.1: {}
unconfig@7.3.2: unconfig@7.3.2:
dependencies: dependencies:
@@ -2334,14 +2400,14 @@ snapshots:
spdx-correct: 3.2.0 spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1 spdx-expression-parse: 3.0.1
vite-plugin-solid@2.11.8(solid-js@1.9.8)(vite@4.5.14(@types/node@24.2.0)): vite-plugin-solid@2.11.8(solid-js@1.9.9)(vite@4.5.14(@types/node@24.2.0)):
dependencies: dependencies:
'@babel/core': 7.28.0 '@babel/core': 7.28.0
'@types/babel__core': 7.20.5 '@types/babel__core': 7.20.5
babel-preset-solid: 1.9.8(@babel/core@7.28.0)(solid-js@1.9.8) babel-preset-solid: 1.9.8(@babel/core@7.28.0)(solid-js@1.9.9)
merge-anything: 5.1.7 merge-anything: 5.1.7
solid-js: 1.9.8 solid-js: 1.9.9
solid-refresh: 0.6.3(solid-js@1.9.8) solid-refresh: 0.6.3(solid-js@1.9.9)
vite: 4.5.14(@types/node@24.2.0) vite: 4.5.14(@types/node@24.2.0)
vitefu: 1.1.1(vite@4.5.14(@types/node@24.2.0)) vitefu: 1.1.1(vite@4.5.14(@types/node@24.2.0))
transitivePeerDependencies: transitivePeerDependencies: