From 9457566efacc45c365731220a6e85bd6335d14ca Mon Sep 17 00:00:00 2001 From: atridadl Date: Fri, 1 Dec 2023 14:57:31 -0700 Subject: [PATCH] Redis --- .env.example | 1 + app/routes/api.room.create.tsx | 4 +- app/routes/api.room.delete.$roomId.tsx | 4 +- app/routes/api.room.get.$roomId.tsx | 23 +- app/routes/api.room.get.all.tsx | 53 ++- app/routes/api.room.presence.get.$roomId.tsx | 4 +- app/routes/api.room.set.$roomId.tsx | 4 +- app/routes/api.vote.set.$roomId.tsx | 2 +- app/services/emitter.server.ts | 18 + app/services/redis.server.ts | 75 ++++ package.json | 9 +- pnpm-lock.yaml | 426 +++++++++++-------- 12 files changed, 406 insertions(+), 217 deletions(-) create mode 100644 app/services/redis.server.ts diff --git a/.env.example b/.env.example index 3b5fade..2b0d336 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,7 @@ #Database DATABASE_URL="" DATABASE_AUTH_TOKEN="" +REDIS_URL="" #Auth CLERK_SIGN_UP_URL="/sign-up" diff --git a/app/routes/api.room.create.tsx b/app/routes/api.room.create.tsx index d26de04..6ed0403 100644 --- a/app/routes/api.room.create.tsx +++ b/app/routes/api.room.create.tsx @@ -4,6 +4,7 @@ import { createId } from "@paralleldrive/cuid2"; import { db } from "~/services/db.server"; import { emitter } from "~/services/emitter.server"; import { rooms } from "~/services/schema"; +import { invalidateCache } from "~/services/redis.server"; export async function action({ request, params, context }: ActionFunctionArgs) { const { userId } = await getAuth({ context, params, request }); @@ -33,7 +34,8 @@ export async function action({ request, params, context }: ActionFunctionArgs) { const success = room.length > 0; if (success) { - emitter.emit("roomlist"); + await invalidateCache(`kv_roomlist_${userId}`); + emitter.emit("nodes", "roomlist"); return json(room, { status: 200, diff --git a/app/routes/api.room.delete.$roomId.tsx b/app/routes/api.room.delete.$roomId.tsx index 76a18e1..ce10b25 100644 --- a/app/routes/api.room.delete.$roomId.tsx +++ b/app/routes/api.room.delete.$roomId.tsx @@ -3,6 +3,7 @@ import { ActionFunctionArgs, json } from "@remix-run/node"; import { eq } from "drizzle-orm"; import { db } from "~/services/db.server"; import { emitter } from "~/services/emitter.server"; +import { invalidateCache } from "~/services/redis.server"; import { rooms } from "~/services/schema"; export async function action({ request, params, context }: ActionFunctionArgs) { @@ -32,7 +33,8 @@ export async function action({ request, params, context }: ActionFunctionArgs) { const success = deletedRoom.length > 0; if (success) { - emitter.emit("roomlist"); + await invalidateCache(`kv_roomlist_${userId}`); + emitter.emit("nodes", "roomlist"); return json(deletedRoom, { status: 200, diff --git a/app/routes/api.room.get.$roomId.tsx b/app/routes/api.room.get.$roomId.tsx index f847381..d8f2c0b 100644 --- a/app/routes/api.room.get.$roomId.tsx +++ b/app/routes/api.room.get.$roomId.tsx @@ -39,16 +39,19 @@ export async function loader({ context, params, request }: LoaderFunctionArgs) { return eventStream(request.signal, function setup(send) { async function handler() { - const roomFromDb = await db.query.rooms.findFirst({ - where: eq(rooms.id, roomId || ""), - with: { - logs: true, - }, - }); - send({ - event: `room-${roomId}`, - data: JSON.stringify(roomFromDb), - }); + db.query.rooms + .findFirst({ + where: eq(rooms.id, roomId || ""), + with: { + logs: true, + }, + }) + .then((roomFromDb) => { + return send({ + event: `room-${roomId}`, + data: JSON.stringify(roomFromDb), + }); + }); } // Initial fetch diff --git a/app/routes/api.room.get.all.tsx b/app/routes/api.room.get.all.tsx index 2941158..f157a0c 100644 --- a/app/routes/api.room.get.all.tsx +++ b/app/routes/api.room.get.all.tsx @@ -4,6 +4,7 @@ import { eq } from "drizzle-orm"; import { eventStream } from "remix-utils/sse/server"; import { db } from "~/services/db.server"; import { emitter } from "~/services/emitter.server"; +import { fetchCache, setCache } from "~/services/redis.server"; import { rooms } from "~/services/schema"; // Get Room List @@ -19,21 +20,51 @@ export async function loader({ context, params, request }: LoaderFunctionArgs) { return eventStream(request.signal, function setup(send) { async function handler() { - const roomList = await db.query.rooms.findMany({ - where: eq(rooms.userId, userId || ""), + fetchCache< + { + id: string; + createdAt: Date; + roomName: string; + }[] + >(`kv_roomlist_${userId}`).then((cachedResult) => { + if (cachedResult) { + send({ event: userId!, data: JSON.stringify(cachedResult) }); + } else { + db.query.rooms + .findMany({ + where: eq(rooms.userId, userId || ""), + }) + .then((roomList) => { + setCache(`kv_roomlist_${userId}`, roomList).then(() => { + send({ event: userId!, data: JSON.stringify(roomList) }); + }); + }); + } }); - - send({ event: userId!, data: JSON.stringify(roomList) }); } // Initial fetch - db.query.rooms - .findMany({ - where: eq(rooms.userId, userId || ""), - }) - .then((roomList) => { - send({ event: userId!, data: JSON.stringify(roomList) }); - }); + fetchCache< + { + id: string; + createdAt: Date; + roomName: string; + }[] + >(`kv_roomlist_${userId}`).then((cachedResult) => { + if (cachedResult) { + send({ event: userId!, data: JSON.stringify(cachedResult) }); + } else { + db.query.rooms + .findMany({ + where: eq(rooms.userId, userId || ""), + }) + .then((roomList) => { + setCache(`kv_roomlist_${userId}`, roomList).then(() => { + send({ event: userId!, data: JSON.stringify(roomList) }); + }); + }); + } + }); emitter.on("roomlist", handler); diff --git a/app/routes/api.room.presence.get.$roomId.tsx b/app/routes/api.room.presence.get.$roomId.tsx index ffdcd7c..f7cd99b 100644 --- a/app/routes/api.room.presence.get.$roomId.tsx +++ b/app/routes/api.room.presence.get.$roomId.tsx @@ -75,7 +75,7 @@ export async function loader({ context, params, request }: LoaderFunctionArgs) { }, }) .then(async () => { - emitter.emit("presence"); + emitter.emit("nodes", "presence"); }); // Initial fetch @@ -86,7 +86,7 @@ export async function loader({ context, params, request }: LoaderFunctionArgs) { .where(and(eq(presence.roomId, roomId), eq(presence.userId, userId))) .returning() .then(async () => { - emitter.emit("presence"); + emitter.emit("nodes", "presence"); }); emitter.off("presence", handler); }; diff --git a/app/routes/api.room.set.$roomId.tsx b/app/routes/api.room.set.$roomId.tsx index ea673a7..a0224c5 100644 --- a/app/routes/api.room.set.$roomId.tsx +++ b/app/routes/api.room.set.$roomId.tsx @@ -76,8 +76,8 @@ export async function action({ request, params, context }: ActionFunctionArgs) { if (success) { console.log(success); - emitter.emit("room"); - emitter.emit("votes"); + emitter.emit("nodes", "room"); + emitter.emit("nodes", "votes"); return json(newRoom, { status: 200, diff --git a/app/routes/api.vote.set.$roomId.tsx b/app/routes/api.vote.set.$roomId.tsx index 4be7231..8a6c95b 100644 --- a/app/routes/api.vote.set.$roomId.tsx +++ b/app/routes/api.vote.set.$roomId.tsx @@ -40,7 +40,7 @@ export async function action({ request, params, context }: ActionFunctionArgs) { const success = upsertResult.rowsAffected > 0; if (success) { - emitter.emit("votes"); + emitter.emit("nodes", "votes"); return json(upsertResult, { status: 200, diff --git a/app/services/emitter.server.ts b/app/services/emitter.server.ts index 27baefc..8b72fab 100644 --- a/app/services/emitter.server.ts +++ b/app/services/emitter.server.ts @@ -1,4 +1,5 @@ import { EventEmitter } from "events"; +import { publishToChannel, subscribeToChannel } from "./redis.server"; let emitter: EventEmitter; @@ -15,4 +16,21 @@ if (process.env.NODE_ENV === "production") { emitter = global.__emitter; } +if (process.env.REDIS_URL) { + subscribeToChannel("nodes", (message: string) => { + console.log(`[MULTI-NODE] RECEIVED ${message} EVENT FROM ANOTHER NODE!`); + const parsedMessage = message.split('"')[1]; + emitter.emit(parsedMessage); + }); + + emitter.on("nodes", async (message: string) => { + await publishToChannel("nodes", message); + }); +} else { + emitter.on("nodes", async (message: string) => { + console.log(`[SINGLE NODE] RECEIVED ${message} EVENT!`); + emitter.emit(message); + }); +} + export { emitter }; diff --git a/app/services/redis.server.ts b/app/services/redis.server.ts new file mode 100644 index 0000000..25f5dcc --- /dev/null +++ b/app/services/redis.server.ts @@ -0,0 +1,75 @@ +import Redis from "ioredis"; + +export const cache = process.env.REDIS_URL + ? new Redis(process.env.REDIS_URL, { + family: 6, + }) + : null; + +export const pub = process.env.REDIS_URL + ? new Redis(process.env.REDIS_URL, { + family: 6, + }) + : null; + +export const sub = process.env.REDIS_URL + ? new Redis(process.env.REDIS_URL, { + family: 6, + }) + : null; + +export const publishToChannel = async (channel: string, message: string) => { + await pub?.publish(channel, JSON.stringify(message)); +}; + +export const subscribeToChannel = async ( + channel: string, + callback: Function +) => { + await sub?.subscribe(channel, (err, count) => { + if (err) { + console.error("Failed to subscribe: %s", err.message); + } else { + console.log( + `Subscribed successfully! This client is currently subscribed to ${count} channels.` + ); + } + }); + + sub?.on("message", (channel, message) => { + console.log(`Received ${message} from ${channel}`); + callback(message); + }); +}; + +export const unsubscribeToChannel = (channel: string) => { + `Unsubscribed successfully from ${channel}!`; + Promise.resolve([sub?.unsubscribe(channel)]); +}; + +export const setCache = async (key: string, value: T) => { + try { + await cache?.set(key, JSON.stringify(value)); + return true; + } catch { + return false; + } +}; + +export const fetchCache = async (key: string) => { + try { + const result = (await cache?.get(key)) as string; + return JSON.parse(result) as T; + } catch { + return null; + } +}; + +export const invalidateCache = async (key: string) => { + try { + await cache?.del(key); + return true; + } catch { + return false; + } +}; diff --git a/package.json b/package.json index 9ee0cd9..97c080b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sprintpadawan", - "version": "4.0.4", + "version": "4.1.0", "private": true, "sideEffects": false, "type": "module", @@ -12,14 +12,15 @@ }, "dependencies": { "@clerk/remix": "^3.1.6", - "@libsql/client": "0.4.0-pre.4", + "@libsql/client": "0.4.0-pre.5", "@paralleldrive/cuid2": "^2.2.2", "@remix-run/css-bundle": "^2.3.1", "@remix-run/node": "^2.3.1", "@remix-run/react": "^2.3.1", "@remix-run/serve": "^2.3.1", "csv42": "^5.0.0", - "drizzle-orm": "^0.29.0", + "drizzle-orm": "^0.29.1", + "ioredis": "^5.3.2", "isbot": "^3.7.1", "lucide-react": "^0.294.0", "react": "^18.2.0", @@ -35,7 +36,7 @@ "@types/react-dom": "^18.2.17", "autoprefixer": "^10.4.16", "better-sqlite3": "^9.1.1", - "daisyui": "^4.4.14", + "daisyui": "^4.4.17", "dotenv": "^16.3.1", "drizzle-kit": "^0.20.6", "eslint": "^8.54.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27b44ed..9655da0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ dependencies: specifier: ^3.1.6 version: 3.1.6(@remix-run/react@2.3.1)(@remix-run/server-runtime@2.3.1)(react-dom@18.2.0)(react@18.2.0) '@libsql/client': - specifier: 0.4.0-pre.4 - version: 0.4.0-pre.4 + specifier: 0.4.0-pre.5 + version: 0.4.0-pre.5 '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 @@ -30,8 +30,11 @@ dependencies: specifier: ^5.0.0 version: 5.0.0 drizzle-orm: - specifier: ^0.29.0 - version: 0.29.0(@libsql/client@0.4.0-pre.4)(better-sqlite3@9.1.1) + specifier: ^0.29.1 + version: 0.29.1(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.1.1) + ioredis: + specifier: ^5.3.2 + version: 5.3.2 isbot: specifier: ^3.7.1 version: 3.7.1 @@ -74,8 +77,8 @@ devDependencies: specifier: ^9.1.1 version: 9.1.1 daisyui: - specifier: ^4.4.14 - version: 4.4.14(postcss@8.4.31) + specifier: ^4.4.17 + version: 4.4.17(postcss@8.4.31) dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -115,33 +118,33 @@ packages: '@jridgewell/trace-mapping': 0.3.20 dev: true - /@babel/code-frame@7.23.4: - resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 dev: true - /@babel/compat-data@7.23.3: - resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.23.3: - resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + /@babel/core@7.23.5: + resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) - '@babel/helpers': 7.23.4 - '@babel/parser': 7.23.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) + '@babel/helpers': 7.23.5 + '@babel/parser': 7.23.5 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -151,25 +154,25 @@ packages: - supports-color dev: true - /@babel/eslint-parser@7.23.3(@babel/core@7.23.3)(eslint@8.54.0): + /@babel/eslint-parser@7.23.3(@babel/core@7.23.5)(eslint@8.54.0): resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.54.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 dev: true - /@babel/generator@7.23.4: - resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} + /@babel/generator@7.23.5: + resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 @@ -179,33 +182,33 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.3 - '@babel/helper-validator-option': 7.22.15 + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.3): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + /@babel/helper-create-class-features-plugin@7.23.5(@babel/core@7.23.5): + resolution: {integrity: sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.3) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.5) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 @@ -221,37 +224,37 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -263,7 +266,7 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -271,13 +274,13 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.3): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.5): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -287,21 +290,21 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true /@babel/helper-string-parser@7.23.4: @@ -314,18 +317,18 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.23.4: - resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} + /@babel/helpers@7.23.5: + resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 transitivePeerDependencies: - supports-color dev: true @@ -339,145 +342,145 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.23.4: - resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} + /@babel/parser@7.23.5: + resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.5 dev: true - /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.3): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.5): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.3) + '@babel/core': 7.23.5 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.5) dev: true - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.3): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.5): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) - '@babel/types': 7.23.4 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) + '@babel/types': 7.23.5 dev: true - /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.23.4(@babel/core@7.23.3): - resolution: {integrity: sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==} + /@babel/plugin-transform-typescript@7.23.5(@babel/core@7.23.5): + resolution: {integrity: sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/helper-create-class-features-plugin': 7.23.5(@babel/core@7.23.5) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.5) dev: true - /@babel/preset-react@7.23.3(@babel/core@7.23.3): + /@babel/preset-react@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.3) - '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.3) + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.5) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.5) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.5) dev: true - /@babel/preset-typescript@7.23.3(@babel/core@7.23.3): + /@babel/preset-typescript@7.23.3(@babel/core@7.23.5): resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-typescript': 7.23.4(@babel/core@7.23.3) + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.23.5) dev: true - /@babel/runtime@7.23.4: - resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + /@babel/runtime@7.23.5: + resolution: {integrity: sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 @@ -487,31 +490,31 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 dev: true - /@babel/traverse@7.23.4: - resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} + /@babel/traverse@7.23.5: + resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.23.4: - resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} + /@babel/types@7.23.5: + resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 @@ -1490,8 +1493,8 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -1549,6 +1552,10 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1595,28 +1602,28 @@ packages: resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} dev: true - /@libsql/client@0.4.0-pre.4: - resolution: {integrity: sha512-QAVHr1NDtISwbdzddeS5i3FRmVw5L96VFJ54Lu0ansTJCtGfY4h5dTG/NUcQiAfa6QYLZl0bi4UqUQWSnFULlg==} + /@libsql/client@0.4.0-pre.5: + resolution: {integrity: sha512-GyKigCBslE5uztwT7mpvp9Zn0z3iWjnufcfeTeDSFPMyXCPjSAHUOiwSLAaHii909w6EQacA692CXmYYFo/eig==} dependencies: '@libsql/hrana-client': 0.5.5 js-base64: 3.7.5 - libsql: 0.2.0-pre.3 + libsql: 0.2.0-pre.4 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/darwin-arm64@0.2.0-pre.3: - resolution: {integrity: sha512-2D8QRtxpI7IBmrBEulKWK2GUfGFmWuwPTBTJLWE1PD4Rz9wVwK+L/4VTduM2JFN40/VVGOHBjtB+qUp5A1pqbg==} + /@libsql/darwin-arm64@0.2.0-pre.4: + resolution: {integrity: sha512-kb0f/FeZxzeqa+j6O7xI9toOeoTNCJnErOcNyWWzoqA5JZ4LJ9dCMrLPWe4Np22+Rg57NPmFz/Z7MFNP2y5Gow==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /@libsql/darwin-x64@0.2.0-pre.3: - resolution: {integrity: sha512-8rm7tnO/jkTK8xsOyNuMmAjQ+uBngVjEYz22ROhxEF7iCfWqAYJtLT9DqpBMqjoveL7nZcnAO+85q43v0N6Lrg==} + /@libsql/darwin-x64@0.2.0-pre.4: + resolution: {integrity: sha512-HQM9cmGP4t+ujbyhA6rjQ8K4iHw5DStq3YnL8030k5z4KHGkAOIcRbVj3m65J72Gy+tCsisUCZTrBjIFkjOFhA==} cpu: [x64] os: [darwin] requiresBuild: true @@ -1655,40 +1662,40 @@ packages: - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.2.0-pre.3: - resolution: {integrity: sha512-DIQ8cb3X+WNjmXhks6spoLXH53LG8x5Pza6EZKoPGQDzxrykhzPNyiUeKgnD6JtsboL5W3irekz+AsTfgxb8iQ==} + /@libsql/linux-arm64-gnu@0.2.0-pre.4: + resolution: {integrity: sha512-1VVhnSx+vSDCLXxfUP9kRGbZyy+Si6tvPQZ8JqZftt9EJG1Dvzp1E1TT8zFYMeBQeVyoV4KryctW5b5uZkqVQA==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-arm64-musl@0.2.0-pre.3: - resolution: {integrity: sha512-kyWatVz8eNlJ/gqv/BU+/S7p/Iitkr237QrhXcmjOIZkWbiQfwj6mJSBrX/m70Qk8qpWiAMMF1vji+wxp54XVw==} + /@libsql/linux-arm64-musl@0.2.0-pre.4: + resolution: {integrity: sha512-lbSeR5agUDkpHTT3OOnuINWEr7OsX+XCwJ21bkceoXu/napW7A3auiOjzK7mneI+vT7fRjay0caivrdoqgeKKg==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-x64-gnu@0.2.0-pre.3: - resolution: {integrity: sha512-eb+gLUo06xDpnRfQL5hqiv8B+RUOv/PJtjNsObMHdbt2BD1/zxlmlIBnsJlupuOf/dXPxsbp7g25AZ5UYHOIXg==} + /@libsql/linux-x64-gnu@0.2.0-pre.4: + resolution: {integrity: sha512-OBiu0+tEVj2daJJrcg1uhEtHx7CsED8QesEqz8dhoK0Dad1oSn8XUpulhiMiXP1JFlcr7Zz37eKJdQxv17WTfw==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-x64-musl@0.2.0-pre.3: - resolution: {integrity: sha512-0qw9A/28Lcgf3/c6vjz9Ycf5Op+7R2cUrtdKmBW79Oyzt+ToF24/o65lcodDiVSd4xq81q6qfKoFauNAfYzHAw==} + /@libsql/linux-x64-musl@0.2.0-pre.4: + resolution: {integrity: sha512-iJr3XiUTsB8ic4+DTG8412o9NZ3ifCEM+FaZ0/uxh3xlERbYUMUZhAIylxJqYjovld0edd6Nns7OJfu5b8Ae2g==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/win32-x64-msvc@0.2.0-pre.3: - resolution: {integrity: sha512-s83xO5pGzVYnwxGbWMAk64yGBIEk+0xmTKUV6ZQAiJK3exvWPw91HLh5EoQX6wjae4F73LjsXC/utOtKa45ntA==} + /@libsql/win32-x64-msvc@0.2.0-pre.4: + resolution: {integrity: sha512-kV/Bl6RBMCm24LFmlowl//TvD8jhRjSmUjComXdQ4j5JrAW29MVEb5EtrA16qGzeWb06tSMII0z5yqEaYxvQbQ==} cpu: [x64] os: [win32] requiresBuild: true @@ -1860,14 +1867,14 @@ packages: vite: optional: true dependencies: - '@babel/core': 7.23.3 - '@babel/generator': 7.23.4 - '@babel/parser': 7.23.4 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.3) - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/core': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.5) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.5) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.5) + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 '@remix-run/node': 2.3.1(typescript@5.3.2) @@ -1916,7 +1923,7 @@ packages: tar-fs: 2.1.1 tsconfig-paths: 4.2.0 typescript: 5.3.2 - undici: 5.28.1 + undici: 5.28.2 ws: 7.5.9 transitivePeerDependencies: - '@types/node' @@ -1945,9 +1952,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.23.3 - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.3)(eslint@8.54.0) - '@babel/preset-react': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.5 + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.5)(eslint@8.54.0) + '@babel/preset-react': 7.23.3(@babel/core@7.23.5) '@rushstack/eslint-patch': 1.6.0 '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@5.3.2) '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@5.3.2) @@ -2106,8 +2113,8 @@ packages: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/runtime': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.23.5 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -2176,22 +2183,22 @@ packages: /@types/node-fetch@2.6.9: resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.10.2 form-data: 4.0.0 dev: false /@types/node-forge@1.3.10: resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.10.2 dev: true /@types/node@16.18.6: resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} dev: false - /@types/node@20.10.0: - resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} + /@types/node@20.10.2: + resolution: {integrity: sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==} dependencies: undici-types: 5.26.5 @@ -2228,7 +2235,7 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.10.2 dev: false /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@5.3.2): @@ -2368,7 +2375,7 @@ packages: /@vanilla-extract/babel-plugin-debug-ids@1.0.3: resolution: {integrity: sha512-vm4jYu1xhSa6ofQ9AhIpR3DkAp4c+eoR1Rpm8/TQI4DmWbmGbOjYRcqV0aWsfaIlNhN4kFuxFMKBNN9oG6iRzA==} dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.5 transitivePeerDependencies: - supports-color dev: true @@ -2392,8 +2399,8 @@ packages: /@vanilla-extract/integration@6.2.4: resolution: {integrity: sha512-+AfymNMVq9sEUe0OJpdCokmPZg4Zi6CqKaW/PnUOfDwEn53ighHOMOBl5hAgxYR8Kiz9NG43Bn00mkjWlFi+ng==} dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.5) '@vanilla-extract/babel-plugin-debug-ids': 1.0.3 '@vanilla-extract/css': 1.14.0 esbuild: 0.17.6 @@ -2785,8 +2792,8 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001565 - electron-to-chromium: 1.4.596 - node-releases: 2.0.13 + electron-to-chromium: 1.4.601 + node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true @@ -2977,6 +2984,11 @@ packages: engines: {node: '>=0.8'} dev: true + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -3130,8 +3142,8 @@ packages: type: 1.2.0 dev: true - /daisyui@4.4.14(postcss@8.4.31): - resolution: {integrity: sha512-1g37QzzDFM0QLQe+qRBswkGKyaGijk84t01UMg1ytkFhQxru3zeMh5nWcpC9KnqzKgnITkpSebpGqq4gP8zRrg==} + /daisyui@4.4.17(postcss@8.4.31): + resolution: {integrity: sha512-vcxLKoWiqPjEtcBkSayi9sDW1kWgWRdy1GjSu3zNtMiCsXwqDpCzNkdijuY9RuJ/2tBCtnwxhBv72Yizfi7KAQ==} engines: {node: '>=16.9.0'} dependencies: css-selector-tokenizer: 0.8.0 @@ -3190,7 +3202,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -3220,7 +3231,7 @@ packages: isarray: 2.0.5 object-is: 1.1.5 object-keys: 1.1.1 - object.assign: 4.1.4 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.1 side-channel: 1.0.4 which-boxed-primitive: 1.0.2 @@ -3278,6 +3289,11 @@ packages: engines: {node: '>=0.4.0'} dev: false + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -3374,7 +3390,7 @@ packages: json-diff: 0.9.0 minimatch: 7.4.6 semver: 7.5.4 - wrangler: 3.17.1 + wrangler: 3.18.0 zod: 3.22.4 transitivePeerDependencies: - bufferutil @@ -3382,8 +3398,8 @@ packages: - utf-8-validate dev: true - /drizzle-orm@0.29.0(@libsql/client@0.4.0-pre.4)(better-sqlite3@9.1.1): - resolution: {integrity: sha512-AC+CuW4GezVjsZDGU9u9B4HyikudOyYVhjm6he3Xn1D6Kky7bHGKob97MMX2piO+t9b6UuajLzlii/T/lu1qwA==} + /drizzle-orm@0.29.1(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.1.1): + resolution: {integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -3444,7 +3460,7 @@ packages: sqlite3: optional: true dependencies: - '@libsql/client': 0.4.0-pre.4 + '@libsql/client': 0.4.0-pre.5 better-sqlite3: 9.1.1 dev: false @@ -3472,8 +3488,8 @@ packages: jake: 10.8.7 dev: true - /electron-to-chromium@1.4.596: - resolution: {integrity: sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg==} + /electron-to-chromium@1.4.601: + resolution: {integrity: sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==} dev: true /emoji-regex@8.0.0: @@ -3535,7 +3551,7 @@ packages: is-weakref: 1.0.2 object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.4 + object.assign: 4.1.5 regexp.prototype.flags: 1.5.1 safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 @@ -3965,7 +3981,7 @@ packages: peerDependencies: eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.5 '@testing-library/dom': 8.20.1 eslint: 8.54.0 requireindex: 1.2.0 @@ -3998,7 +4014,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.5 aria-query: 5.3.0 array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 @@ -4124,7 +4140,7 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 + '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.54.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 @@ -4264,7 +4280,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 20.10.0 + '@types/node': 20.10.2 require-like: 0.1.2 dev: true @@ -4898,6 +4914,23 @@ packages: side-channel: 1.0.4 dev: true + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -5285,7 +5318,7 @@ packages: dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 - object.assign: 4.1.4 + object.assign: 4.1.5 object.values: 1.1.7 dev: true @@ -5319,21 +5352,21 @@ packages: type-check: 0.4.0 dev: true - /libsql@0.2.0-pre.3: - resolution: {integrity: sha512-gI07833LA8UoVkGKZOOYkU0hbVGbVdntMcVQoztKyG3fvfGHumBfpnEqJe5ZQbp2sxXEifVvdPEmTZIxGFG3Bw==} + /libsql@0.2.0-pre.4: + resolution: {integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==} cpu: [x64, arm64] os: [darwin, linux, win32] dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.2.0-pre.3 - '@libsql/darwin-x64': 0.2.0-pre.3 - '@libsql/linux-arm64-gnu': 0.2.0-pre.3 - '@libsql/linux-arm64-musl': 0.2.0-pre.3 - '@libsql/linux-x64-gnu': 0.2.0-pre.3 - '@libsql/linux-x64-musl': 0.2.0-pre.3 - '@libsql/win32-x64-msvc': 0.2.0-pre.3 + '@libsql/darwin-arm64': 0.2.0-pre.4 + '@libsql/darwin-x64': 0.2.0-pre.4 + '@libsql/linux-arm64-gnu': 0.2.0-pre.4 + '@libsql/linux-arm64-musl': 0.2.0-pre.4 + '@libsql/linux-x64-gnu': 0.2.0-pre.4 + '@libsql/linux-x64-musl': 0.2.0-pre.4 + '@libsql/win32-x64-msvc': 0.2.0-pre.4 dev: false /lilconfig@2.1.0: @@ -5375,6 +5408,14 @@ packages: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -5600,7 +5641,7 @@ packages: /media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} dependencies: - '@babel/runtime': 7.23.4 + '@babel/runtime': 7.23.5 dev: true /media-typer@0.3.0: @@ -5945,8 +5986,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - /miniflare@3.20231030.1: - resolution: {integrity: sha512-Y+EkgV/aFg/3Y/xfFtImK36sLZGXvNS45avVEz0cUCA2pGpg4hGdPu1Udmz5b06SyeUEFVf/dEDMJwdRYVEgLw==} + /miniflare@3.20231030.2: + resolution: {integrity: sha512-+DYdMqWlUaY4wBylIjewNu8OVsPFquYjQkxoSb2jGIMBmlKaef65Hn2Bu8sub5tQzQ8tLO0FRklmD2Upx0HCCQ==} engines: {node: '>=16.13'} hasBin: true dependencies: @@ -5957,7 +5998,7 @@ packages: glob-to-regexp: 0.4.1 source-map-support: 0.5.21 stoppable: 1.1.0 - undici: 5.28.1 + undici: 5.28.2 workerd: 1.20231030.0 ws: 8.14.2 youch: 3.3.3 @@ -6092,7 +6133,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -6182,8 +6222,8 @@ packages: engines: {node: '>= 6.13.0'} dev: true - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true /normalize-package-data@5.0.0: @@ -6270,8 +6310,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.5 @@ -6918,6 +6958,18 @@ packages: dependencies: picomatch: 2.3.1 + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + /reflect.getprototypeof@1.0.4: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} @@ -7393,6 +7445,10 @@ packages: get-source: 2.0.12 dev: true + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -7875,8 +7931,8 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici@5.28.1: - resolution: {integrity: sha512-xcIIvj1LOQH9zAL54iWFkuDEaIVEjLrru7qRpa3GrEEHk6OBhb/LycuUY2m7VCcTuDeLziXCxobQVyKExyGeIA==} + /undici@5.28.2: + resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.0 @@ -8239,8 +8295,8 @@ packages: '@cloudflare/workerd-windows-64': 1.20231030.0 dev: true - /wrangler@3.17.1: - resolution: {integrity: sha512-Pr9+/tjFkthzG63uoVm1NtVvgokT6p92fy1UsOgrntHyTu0pZMC1VJzG0NC8Vhs+z/+yTT8AqVV6AiJb3w8ZOQ==} + /wrangler@3.18.0: + resolution: {integrity: sha512-3UrmldsD84JDBa7HRZ5ACFr1nH+ZZs+Hth37Iv/mAaW2DiQOGcrevKwn4dofmTQO2qYP01u1vtfVJxLM0mq+1w==} engines: {node: '>=16.17.0'} hasBin: true dependencies: @@ -8250,7 +8306,7 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.17.19 - miniflare: 3.20231030.1 + miniflare: 3.20231030.2 nanoid: 3.3.7 path-to-regexp: 6.2.1 resolve.exports: 2.0.2