diff --git a/app/(client)/layout.tsx b/app/(client)/layout.tsx index 6972022..242a6c0 100644 --- a/app/(client)/layout.tsx +++ b/app/(client)/layout.tsx @@ -2,6 +2,9 @@ import { AblyProvider } from "ably/react"; import * as Ably from "ably"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +const queryClient = new QueryClient(); export default function RootLayout({ children, @@ -12,5 +15,9 @@ export default function RootLayout({ authUrl: "/api/internal/ably", }); - return {children}; + return ( + + {children}{" "} + + ); } diff --git a/app/(client)/room/[id]/VoteUI.tsx b/app/(client)/room/[id]/VoteUI.tsx index 9408a25..5182ea7 100644 --- a/app/(client)/room/[id]/VoteUI.tsx +++ b/app/(client)/room/[id]/VoteUI.tsx @@ -3,8 +3,7 @@ import { EventTypes } from "@/_utils/types"; import Image from "next/image"; import { useEffect, useState } from "react"; - -import { experimental_useOptimistic } from "react"; +import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import LoadingIndicator from "@/_components/LoadingIndicator"; import type { PresenceItem, RoomResponse, VoteResponse } from "@/_utils/types"; @@ -29,105 +28,134 @@ import { RiVipCrownFill } from "react-icons/ri"; import NoRoomUI from "./NoRoomUI"; const VoteUI = () => { + // State + // ================================= const params = useParams(); const roomId = params?.id as string; const { user } = useUser(); - const [storyNameText, setStoryNameText] = useState(""); const [roomScale, setRoomScale] = useState(""); const [copied, setCopied] = useState(false); - const [roomFromDb, setRoomFromDb] = useState(); - const [votesFromDb, setVotesFromDb] = useState(undefined); + const queryClient = useQueryClient(); - const [optimisticVotes, setOptimisticVotes] = - experimental_useOptimistic(votesFromDb); + const { data: roomFromDb } = useQuery({ + queryKey: ["room"], + queryFn: getRoomHandler, + }); - const getRoomHandler = () => { - fetch(`/api/internal/room/${roomId}`, { + const { data: votesFromDb } = useQuery({ + queryKey: ["votes"], + queryFn: getVotesHandler, + }); + + const { mutate: setVote } = useMutation({ + mutationFn: setVoteHandler, + // When mutate is called: + onMutate: async (newVote) => { + // Cancel any outgoing refetches + // (so they don't overwrite our optimistic update) + await queryClient.cancelQueries({ queryKey: ["votes"] }); + + // Snapshot the previous value + const previousVotes = queryClient.getQueryData(["votes"]); + + // Optimistically update to the new value + queryClient.setQueryData(["votes"], (old) => + old?.map((vote) => { + if (vote.userId === user?.id) { + return { + ...vote, + value: newVote, + }; + } else { + return vote; + } + }) + ); + + // Return a context object with the snapshotted value + return { previousVotes }; + }, + // If the mutation fails, + // use the context returned from onMutate to roll back + onError: (err, newTodo, context) => { + queryClient.setQueryData(["votes"], context?.previousVotes); + }, + // Always refetch after error or success: + onSettled: () => { + void queryClient.invalidateQueries({ queryKey: ["votes"] }); + }, + }); + + const { mutate: setRoom } = useMutation({ + mutationFn: setRoomHandler, + // When mutate is called: + onMutate: async (data: { + visible: boolean; + reset: boolean; + log: boolean; + }) => { + // Cancel any outgoing refetches + // (so they don't overwrite our optimistic update) + await queryClient.cancelQueries({ queryKey: ["room"] }); + + // Snapshot the previous value + const previousRoom = queryClient.getQueryData(["room"]); + + // Optimistically update to the new value + queryClient.setQueryData(["room"], (old) => { + return old?.created_at || old?.id || old?.userId + ? { + roomName: old?.roomName, + created_at: old?.created_at, + id: old?.id, + userId: old?.userId, + logs: old?.logs, + storyName: storyNameText, + visible: data.visible, + scale: roomScale, + reset: data.reset, + log: data.log, + } + : old; + }); + + // Return a context object with the snapshotted value + return { previousRoom }; + }, + // If the mutation fails, + // use the context returned from onMutate to roll back + onError: (err, newTodo, context) => { + queryClient.setQueryData(["room"], context?.previousRoom); + }, + // Always refetch after error or success: + onSettled: () => { + void queryClient.invalidateQueries({ queryKey: ["room"] }); + }, + }); + + // Handlers + // ================================= + async function getRoomHandler() { + const response = await fetch(`/api/internal/room/${roomId}`, { cache: "no-cache", method: "GET", - }) - .then(async (response) => { - const dbRoom = (await response.json()) as RoomResponse; - setRoomFromDb(dbRoom); - }) - .catch(() => { - setRoomFromDb(null); - }); - }; + }); - const getVotesHandler = async () => { + return (await response.json()) as RoomResponse; + } + + async function getVotesHandler() { const dbVotesResponse = await fetch(`/api/internal/room/${roomId}/votes`, { cache: "no-cache", method: "GET", }); const dbVotes = (await dbVotesResponse.json()) as VoteResponse; - setVotesFromDb(dbVotes); - }; - - useChannel( - { - channelName: `${env.NEXT_PUBLIC_APP_ENV}-${roomId}`, - }, - ({ name }: { name: string }) => { - if (name === EventTypes.ROOM_UPDATE) { - void getVotesHandler(); - void getRoomHandler(); - } else if (name === EventTypes.VOTE_UPDATE) { - void getVotesHandler(); - } - } - ); - - const { presenceData } = usePresence( - `${env.NEXT_PUBLIC_APP_ENV}-${roomId}`, - { - name: (user?.fullName ?? user?.username) || "", - image: user?.imageUrl || "", - client_id: user?.id || "unknown", - isAdmin: isAdmin(user?.publicMetadata), - isVIP: isVIP(user?.publicMetadata), - } - ); - - // Init Story name - useEffect(() => { - if (roomFromDb) { - setStoryNameText(roomFromDb.storyName || ""); - setRoomScale(roomFromDb.scale || "ERROR"); - } else { - void getRoomHandler(); - void getVotesHandler(); - } - }, [roomFromDb, roomId, user]); - - // Helper functions - const getVoteForCurrentUser = () => { - if (roomFromDb) { - return ( - optimisticVotes && - optimisticVotes.find((vote) => vote.userId === user?.id) - ); - } else { - return null; - } - }; - - const setVoteHandler = async (value: string) => { - const newVotes = optimisticVotes?.map((vote) => { - if (vote.userId === user?.id) { - return { - ...vote, - value, - }; - } else { - return vote; - } - }); - - setOptimisticVotes(newVotes); + return dbVotes; + } + async function setVoteHandler(value: string) { if (roomFromDb) { await fetch(`/api/internal/room/${roomId}/vote`, { cache: "no-cache", @@ -137,30 +165,42 @@ const VoteUI = () => { }), }); } - }; + } - const setRoomHandler = async ( - visible: boolean, - reset = false, - log = false - ) => { + async function setRoomHandler(data: { + visible: boolean; + reset: boolean | undefined; + log: boolean | undefined; + }) { if (roomFromDb) { await fetch(`/api/internal/room/${roomId}`, { cache: "no-cache", method: "PUT", body: JSON.stringify({ name: storyNameText, - visible, + visible: data.visible, scale: roomScale, - reset, - log, + reset: data.reset ? data.reset : false, + log: data.log ? data.log : false, }), }); } + } + + // Helpers + // ================================= + const getVoteForCurrentUser = () => { + if (roomFromDb) { + return ( + votesFromDb && votesFromDb.find((vote) => vote.userId === user?.id) + ); + } else { + return null; + } }; const downloadLogs = () => { - if (roomFromDb && optimisticVotes) { + if (roomFromDb && votesFromDb) { const jsonObject = roomFromDb?.logs .map((item) => { return { @@ -169,7 +209,7 @@ const VoteUI = () => { userId: item.userId, roomId: item.roomId, roomName: item.roomName, - storyName: item.storyName, + topicName: item.storyName, scale: item.scale, votes: item.votes, }; @@ -180,9 +220,9 @@ const VoteUI = () => { userId: roomFromDb.userId, roomId: roomFromDb.id, roomName: roomFromDb.roomName, - storyName: storyNameText, + topicName: storyNameText, scale: roomScale, - votes: optimisticVotes.map((vote) => { + votes: votesFromDb.map((vote) => { return { value: vote.value, }; @@ -232,6 +272,45 @@ const VoteUI = () => { } }; + // Hooks + // ================================= + useChannel( + { + channelName: `${env.NEXT_PUBLIC_APP_ENV}-${roomId}`, + }, + ({ name }: { name: string }) => { + if (name === EventTypes.ROOM_UPDATE) { + void queryClient.invalidateQueries({ queryKey: ["votes"] }); + void queryClient.invalidateQueries({ queryKey: ["room"] }); + } else if (name === EventTypes.VOTE_UPDATE) { + void queryClient.invalidateQueries({ queryKey: ["votes"] }); + } + } + ); + + const { presenceData } = usePresence( + `${env.NEXT_PUBLIC_APP_ENV}-${roomId}`, + { + name: (user?.fullName ?? user?.username) || "", + image: user?.imageUrl || "", + client_id: user?.id || "unknown", + isAdmin: isAdmin(user?.publicMetadata), + isVIP: isVIP(user?.publicMetadata), + } + ); + + useEffect(() => { + if (roomFromDb) { + setStoryNameText(roomFromDb.storyName || ""); + setRoomScale(roomFromDb.scale || "ERROR"); + } else { + void getRoomHandler(); + void getVotesHandler(); + } + }, [roomFromDb, roomId, user]); + + // UI + // ================================= // Room is loading if (roomFromDb === undefined) { return ; @@ -260,7 +339,7 @@ const VoteUI = () => { - Story: {roomFromDb.storyName} + Topic: {roomFromDb.storyName} @@ -319,10 +398,10 @@ const VoteUI = () => { {roomFromDb && - optimisticVotes && + votesFromDb && voteString( roomFromDb.visible, - optimisticVotes, + votesFromDb, presenceItem.data )} @@ -340,7 +419,7 @@ const VoteUI = () => { ? "btn btn-active btn-primary" : "btn" }`} - onClick={() => void setVoteHandler(scaleItem)} + onClick={() => void setVote(scaleItem)} > {scaleItem} @@ -372,11 +451,11 @@ const VoteUI = () => { }} /> - {"Story Name:"} + {"Topic Name:"} { @@ -388,7 +467,11 @@ const VoteUI = () => { - void setRoomHandler(!roomFromDb.visible, false) + void setRoom({ + visible: !roomFromDb.visible, + reset: false, + log: false, + }) } className="btn btn-primary inline-flex" > @@ -409,14 +492,15 @@ const VoteUI = () => { - void setRoomHandler( - false, - true, - roomFromDb.storyName === storyNameText || - optimisticVotes?.length === 0 - ? false - : true - ) + void setRoom({ + visible: false, + reset: true, + log: + roomFromDb.storyName === storyNameText || + votesFromDb?.length === 0 + ? false + : true, + }) } className="btn btn-primary inline-flex" disabled={ @@ -426,7 +510,7 @@ const VoteUI = () => { } > {roomFromDb.storyName === storyNameText || - optimisticVotes?.length === 0 ? ( + votesFromDb?.length === 0 ? ( <> Reset > @@ -438,9 +522,9 @@ const VoteUI = () => { - {optimisticVotes && + {votesFromDb && (roomFromDb.logs.length > 0 || - optimisticVotes.length > 0) && ( + votesFromDb.length > 0) && ( downloadLogs()} diff --git a/package.json b/package.json index a3bbd93..cbc014a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sprintpadawan", - "version": "3.1.4", + "version": "3.1.5", "description": "Plan. Sprint. Repeat.", "private": true, "scripts": { @@ -19,9 +19,10 @@ "@libsql/client": "^0.3.5", "@paralleldrive/cuid2": "^2.2.2", "@t3-oss/env-nextjs": "^0.7.0", + "@tanstack/react-query": "^4.36.1", "@unkey/api": "^0.10.0", "@upstash/ratelimit": "^0.4.4", - "@upstash/redis": "^1.22.1", + "@upstash/redis": "^1.23.3", "@vercel/analytics": "^1.1.0", "ably": "^1.2.45", "autoprefixer": "^10.4.16", @@ -39,12 +40,13 @@ "zod": "^3.22.4" }, "devDependencies": { - "@types/eslint": "^8.44.3", - "@types/node": "^20.8.3", - "@types/react": "^18.2.25", - "@typescript-eslint/eslint-plugin": "^6.7.4", - "@typescript-eslint/parser": "^6.7.4", - "better-sqlite3": "^8.7.0", + "@tanstack/eslint-plugin-query": "^4.36.1", + "@types/eslint": "^8.44.4", + "@types/node": "^20.8.4", + "@types/react": "^18.2.28", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.7.5", + "better-sqlite3": "^9.0.0", "bufferutil": "^4.0.7", "daisyui": "^3.9.2", "drizzle-kit": "^0.19.13", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 001bd1f..0e5590b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ dependencies: '@t3-oss/env-nextjs': specifier: ^0.7.0 version: 0.7.0(typescript@5.2.2)(zod@3.22.4) + '@tanstack/react-query': + specifier: ^4.36.1 + version: 4.36.1(react-dom@18.2.0)(react@18.2.0) '@unkey/api': specifier: ^0.10.0 version: 0.10.0 @@ -27,8 +30,8 @@ dependencies: specifier: ^0.4.4 version: 0.4.4 '@upstash/redis': - specifier: ^1.22.1 - version: 1.22.1 + specifier: ^1.23.3 + version: 1.23.3 '@vercel/analytics': specifier: ^1.1.0 version: 1.1.0 @@ -46,7 +49,7 @@ dependencies: version: 16.3.1 drizzle-orm: specifier: ^0.28.6 - version: 0.28.6(@libsql/client@0.3.5)(better-sqlite3@8.7.0) + version: 0.28.6(@libsql/client@0.3.5)(better-sqlite3@9.0.0) next: specifier: ^13.5.4 version: 13.5.4(react-dom@18.2.0)(react@18.2.0) @@ -76,24 +79,27 @@ dependencies: version: 3.22.4 devDependencies: + '@tanstack/eslint-plugin-query': + specifier: ^4.36.1 + version: 4.36.1(eslint@8.51.0) '@types/eslint': - specifier: ^8.44.3 - version: 8.44.3 + specifier: ^8.44.4 + version: 8.44.4 '@types/node': - specifier: ^20.8.3 - version: 20.8.3 + specifier: ^20.8.4 + version: 20.8.4 '@types/react': - specifier: ^18.2.25 - version: 18.2.25 + specifier: ^18.2.28 + version: 18.2.28 '@typescript-eslint/eslint-plugin': - specifier: ^6.7.4 - version: 6.7.4(@typescript-eslint/parser@6.7.4)(eslint@8.51.0)(typescript@5.2.2) + specifier: ^6.7.5 + version: 6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^6.7.4 - version: 6.7.4(eslint@8.51.0)(typescript@5.2.2) + specifier: ^6.7.5 + version: 6.7.5(eslint@8.51.0)(typescript@5.2.2) better-sqlite3: - specifier: ^8.7.0 - version: 8.7.0 + specifier: ^9.0.0 + version: 9.0.0 bufferutil: specifier: ^4.0.7 version: 4.0.7 @@ -544,23 +550,23 @@ packages: dependencies: '@libsql/hrana-client': 0.5.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) js-base64: 3.7.5 - libsql: 0.1.25 + libsql: 0.1.28 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/darwin-arm64@0.1.25: - resolution: {integrity: sha512-yJBs5NGgzDB50ik4ytFHvDiF8Y8exIhXCOq7KUZhQV3obz0M/+rzOyXG3w1h0nqnAjGFTJgeFdk2HFfIEhy8lQ==} + /@libsql/darwin-arm64@0.1.28: + resolution: {integrity: sha512-p4nldHUOhcl9ibnH1F6oiXV5Dl3PAcPB9VIjdjVvO3/URo5J7mhqRMuwJMKO5DZJJGtkKJ5IO0gu0hc90rnKIg==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /@libsql/darwin-x64@0.1.25: - resolution: {integrity: sha512-pEq3DbzQcCf5zs1PSdVsdhRKk2VebwixYRdBeXIIlkqjy/kxlbW/pZs0U6QcK2MVaW+ge/Po3RvPN+Pmf31j2w==} + /@libsql/darwin-x64@0.1.28: + resolution: {integrity: sha512-WaEK+Z+wP5sr0h8EcusSGHv4Mqc3smYICeG4P/wsbRDKQ2WUMWqZrpgqaBsm+WPbXogU2vpf+qGc8BnpFZ0ggw==} cpu: [x64] os: [darwin] requiresBuild: true @@ -592,39 +598,39 @@ packages: /@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.7)(utf-8-validate@6.0.3): resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} dependencies: - '@types/ws': 8.5.6 + '@types/ws': 8.5.7 ws: 8.14.2(bufferutil@4.0.7)(utf-8-validate@6.0.3) transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.1.25: - resolution: {integrity: sha512-KgceGjfJ1Fl6Gnk6o2hqQQlSy2/LwBDW0ZBv8GQ6qaapJXJI6fIMJsxAgU+MujYYjXBXCRxC4J0xAHSUw4nhZg==} + /@libsql/linux-arm64-gnu@0.1.28: + resolution: {integrity: sha512-a17ANBuOqH2L8gdyET4Kg3XggQvxWnoA+7x7sDEX5NyWNyvr7P04WzNPAT0xAOWLclC1fDD6jM5sh/fbJk/7NA==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-x64-gnu@0.1.25: - resolution: {integrity: sha512-+M4PnnxJ0zBDaiLvK1qOBGcawd3ld2d7yQt8S13wDMX3Qm2XVeorNspTtVOIaz+DRiNONOaZdHbh+UBJiIycTg==} + /@libsql/linux-x64-gnu@0.1.28: + resolution: {integrity: sha512-dkg+Ou7ApV0PHpZWd9c6NrYyc/WSNn5h/ScKotaMTLWlLL96XAMNwrYLpZpUj61I2y7QzU98XtMfiSD1Ux+VaA==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/linux-x64-musl@0.1.25: - resolution: {integrity: sha512-baYCmaqMfE3TuiJcdFbSV4snC2XfoMTpUwzuh6YdkTf1MuV4bmqxke8CDujat3KprLuyRPQLAEEEDh2i1Hug4Q==} + /@libsql/linux-x64-musl@0.1.28: + resolution: {integrity: sha512-ZuOxCDYlG+f1IDsxstmaxLtgG9HvlLuUKs0X3um4f5F5V+P+PF8qr08gSdD1IP2pj+JBOiwhQffaEpR1wupxhQ==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /@libsql/win32-x64-msvc@0.1.25: - resolution: {integrity: sha512-keGaG4y2xBbn2GAcB9QJkzeXxUuhK3zijgfMeZS/i6BZDsym5aYkqqHXVUEsOsBmO9t24ZaDwnS71lB0nxdUiA==} + /@libsql/win32-x64-msvc@0.1.28: + resolution: {integrity: sha512-2cmUiMIsJLHpetebGeeYqUYaCPWEnwMjqxwu1ZEEbA5x8r+DNmIhLrc0QSQ29p7a5u14vbZnShNOtT/XG7vKew==} cpu: [x64] os: [win32] requiresBuild: true @@ -837,11 +843,41 @@ packages: zod: 3.22.4 dev: false + /@tanstack/eslint-plugin-query@4.36.1(eslint@8.51.0): + resolution: {integrity: sha512-qFIYV/BuwWzg0t5mSRMcb+rzrOVtCO9EizYxeClFxuFq/c54cNhAQCnDrA3iCxFz/fqRv7I9rxxnR/ZWkX15cQ==} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.51.0 + dev: true + + /@tanstack/query-core@4.36.1: + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + dev: false + + /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.36.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + /@types/body-parser@1.19.3: resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} dependencies: '@types/connect': 3.4.36 - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false /@types/cacheable-request@6.0.3: @@ -849,14 +885,14 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.2 '@types/keyv': 3.1.4 - '@types/node': 20.8.3 + '@types/node': 20.8.4 '@types/responselike': 1.0.1 dev: false /@types/connect@3.4.36: resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} dependencies: - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false /@types/cookies@0.7.7: @@ -865,11 +901,11 @@ packages: '@types/connect': 3.4.36 '@types/express': 4.17.14 '@types/keygrip': 1.0.3 - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false - /@types/eslint@8.44.3: - resolution: {integrity: sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==} + /@types/eslint@8.44.4: + resolution: {integrity: sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==} dependencies: '@types/estree': 1.0.2 '@types/json-schema': 7.0.13 @@ -882,7 +918,7 @@ packages: /@types/express-serve-static-core@4.17.37: resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} dependencies: - '@types/node': 20.8.3 + '@types/node': 20.8.4 '@types/qs': 6.9.8 '@types/range-parser': 1.2.5 '@types/send': 0.17.2 @@ -920,7 +956,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false /@types/mime@1.3.3: @@ -934,14 +970,14 @@ packages: /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 20.8.3 + '@types/node': 20.8.4 form-data: 3.0.1 dev: false /@types/node-fetch@2.6.6: resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} dependencies: - '@types/node': 20.8.3 + '@types/node': 20.8.4 form-data: 4.0.0 dev: false @@ -949,8 +985,10 @@ packages: resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} dev: false - /@types/node@20.8.3: - resolution: {integrity: sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==} + /@types/node@20.8.4: + resolution: {integrity: sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==} + dependencies: + undici-types: 5.25.3 /@types/prop-types@15.7.8: resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} @@ -964,8 +1002,8 @@ packages: resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} dev: false - /@types/react@18.2.25: - resolution: {integrity: sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw==} + /@types/react@18.2.28: + resolution: {integrity: sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==} dependencies: '@types/prop-types': 15.7.8 '@types/scheduler': 0.16.4 @@ -975,7 +1013,7 @@ packages: /@types/responselike@1.0.1: resolution: {integrity: sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==} dependencies: - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false /@types/scheduler@0.16.4: @@ -990,7 +1028,7 @@ packages: resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} dependencies: '@types/mime': 1.3.3 - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false /@types/serve-static@1.15.3: @@ -998,17 +1036,17 @@ packages: dependencies: '@types/http-errors': 2.0.2 '@types/mime': 3.0.2 - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false - /@types/ws@8.5.6: - resolution: {integrity: sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==} + /@types/ws@8.5.7: + resolution: {integrity: sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==} dependencies: - '@types/node': 20.8.3 + '@types/node': 20.8.4 dev: false - /@typescript-eslint/eslint-plugin@6.7.4(@typescript-eslint/parser@6.7.4)(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==} + /@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -1019,11 +1057,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 6.7.4(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.7.4 - '@typescript-eslint/type-utils': 6.7.4(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.4(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.4 + '@typescript-eslint/parser': 6.7.5(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/type-utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.5 debug: 4.3.4 eslint: 8.51.0 graphemer: 1.4.0 @@ -1036,8 +1074,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.7.4(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==} + /@typescript-eslint/parser@6.7.5(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1046,10 +1084,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.7.4 - '@typescript-eslint/types': 6.7.4 - '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.4 + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.5 debug: 4.3.4 eslint: 8.51.0 typescript: 5.2.2 @@ -1057,16 +1095,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.7.4: - resolution: {integrity: sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==} + /@typescript-eslint/scope-manager@6.7.5: + resolution: {integrity: sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.4 - '@typescript-eslint/visitor-keys': 6.7.4 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/visitor-keys': 6.7.5 dev: true - /@typescript-eslint/type-utils@6.7.4(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==} + /@typescript-eslint/type-utils@6.7.5(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1075,8 +1113,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.4(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) debug: 4.3.4 eslint: 8.51.0 ts-api-utils: 1.0.3(typescript@5.2.2) @@ -1085,13 +1123,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types@6.7.4: - resolution: {integrity: sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==} + /@typescript-eslint/types@6.7.5: + resolution: {integrity: sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.7.4(typescript@5.2.2): - resolution: {integrity: sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==} + /@typescript-eslint/typescript-estree@6.7.5(typescript@5.2.2): + resolution: {integrity: sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1099,8 +1137,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.7.4 - '@typescript-eslint/visitor-keys': 6.7.4 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/visitor-keys': 6.7.5 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1111,8 +1149,8 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.7.4(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==} + /@typescript-eslint/utils@6.7.5(eslint@8.51.0)(typescript@5.2.2): + resolution: {integrity: sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1120,9 +1158,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@types/json-schema': 7.0.13 '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 6.7.4 - '@typescript-eslint/types': 6.7.4 - '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.5 + '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) eslint: 8.51.0 semver: 7.5.4 transitivePeerDependencies: @@ -1130,11 +1168,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.7.4: - resolution: {integrity: sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==} + /@typescript-eslint/visitor-keys@6.7.5: + resolution: {integrity: sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.4 + '@typescript-eslint/types': 6.7.5 eslint-visitor-keys: 3.4.3 dev: true @@ -1146,7 +1184,7 @@ packages: resolution: {integrity: sha512-cpPSR0XJAJs4Ddz9nq3tINlPS5aLfWVCqhhtHnXt4p7qr5+/Znlt1Es736poB/9rnl1hAHrOsOvVj46NEXcVqA==} engines: {node: '>=16.0.0'} dependencies: - '@upstash/redis': 1.22.1 + '@upstash/redis': 1.23.3 transitivePeerDependencies: - encoding dev: false @@ -1159,8 +1197,8 @@ packages: - encoding dev: false - /@upstash/redis@1.22.1: - resolution: {integrity: sha512-7ec2eCMkVxZzuHNb+hPKonX4b/Pu0BdDeSBsEy+jKIqiweXzCs5Dpu9642vJgf57YnEsfwgXnQMVEataarvyeQ==} + /@upstash/redis@1.23.3: + resolution: {integrity: sha512-6b66nGdkbWl/BZ4Hs9cG9szNNXF8UDgPTUyC/4fcZvDLTs552SlItMSQnmwAKMz0EHjpbVH51VQ4waHNnDy/Xw==} dependencies: isomorphic-fetch: 3.0.0 transitivePeerDependencies: @@ -1368,7 +1406,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.22.1 - caniuse-lite: 1.0.30001546 + caniuse-lite: 1.0.30001547 fraction.js: 4.3.6 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -1408,8 +1446,8 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /better-sqlite3@8.7.0: - resolution: {integrity: sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==} + /better-sqlite3@9.0.0: + resolution: {integrity: sha512-lDxQ9qg/XuUHZG6xzrQaMHkNWl37t35/LPB/VJGV8DdScSuGFNfFSqgscXEd8UIuyk/d9wU8iaMxQa4If5Wqog==} requiresBuild: true dependencies: bindings: 1.5.0 @@ -1464,8 +1502,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001546 - electron-to-chromium: 1.4.544 + caniuse-lite: 1.0.30001547 + electron-to-chromium: 1.4.549 node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: false @@ -1548,8 +1586,8 @@ packages: engines: {node: '>=14.16'} dev: true - /caniuse-lite@1.0.30001546: - resolution: {integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==} + /caniuse-lite@1.0.30001547: + resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} dev: false /chalk@4.1.2: @@ -1882,7 +1920,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.28.6(@libsql/client@0.3.5)(better-sqlite3@8.7.0): + /drizzle-orm@0.28.6(@libsql/client@0.3.5)(better-sqlite3@9.0.0): resolution: {integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -1945,11 +1983,11 @@ packages: optional: true dependencies: '@libsql/client': 0.3.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) - better-sqlite3: 8.7.0 + better-sqlite3: 9.0.0 dev: false - /electron-to-chromium@1.4.544: - resolution: {integrity: sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==} + /electron-to-chromium@1.4.549: + resolution: {integrity: sha512-gpXfJslSi4hYDkA0mTLEpYKRv9siAgSUgZ+UWyk+J5Cttpd1ThCVwdclzIwQSclz3hYn049+M2fgrP1WpvF8xg==} dev: false /emoji-regex@9.2.2: @@ -2157,11 +2195,11 @@ packages: dependencies: '@next/eslint-plugin-next': 13.5.4 '@rushstack/eslint-patch': 1.5.1 - '@typescript-eslint/parser': 6.7.4(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.5(eslint@8.51.0)(typescript@5.2.2) eslint: 8.51.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.51.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.51.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.51.0) eslint-plugin-react: 7.33.2(eslint@8.51.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.51.0) @@ -2176,12 +2214,12 @@ packages: dependencies: debug: 3.2.7 is-core-module: 2.13.0 - resolve: 1.22.6 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.51.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.51.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2191,8 +2229,8 @@ packages: debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.51.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) fast-glob: 3.3.1 get-tsconfig: 4.7.2 is-core-module: 2.13.0 @@ -2204,7 +2242,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2225,16 +2263,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.7.4(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.5(eslint@8.51.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.51.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.51.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.51.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -2244,7 +2282,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.7.4(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.5(eslint@8.51.0)(typescript@5.2.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -2253,7 +2291,7 @@ packages: doctrine: 2.1.0 eslint: 8.51.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.51.0) has: 1.0.4 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -2323,7 +2361,7 @@ packages: object.hasown: 1.1.3 object.values: 1.1.7 prop-types: 15.8.1 - resolve: 2.0.0-next.4 + resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.10 dev: true @@ -3126,20 +3164,20 @@ packages: type-check: 0.4.0 dev: true - /libsql@0.1.25: - resolution: {integrity: sha512-Wq3vmbFA64o5PCa8qIpNvMwqJB0WdINlwpEG6qOeeUbzMqyLNpB4BQaTqR9spQpLMPbmH6igjqublWp0tz9AyA==} + /libsql@0.1.28: + resolution: {integrity: sha512-yCKlT0ntV8ZIWTPGNClhQQeH/LNAzLjbbEgBvgLb+jfQwAuTbyvPpVVLwkZzesqja1nbkWApztW0pX81Jp0pkw==} cpu: [x64, arm64] os: [darwin, linux, win32] dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.1.25 - '@libsql/darwin-x64': 0.1.25 - '@libsql/linux-arm64-gnu': 0.1.25 - '@libsql/linux-x64-gnu': 0.1.25 - '@libsql/linux-x64-musl': 0.1.25 - '@libsql/win32-x64-msvc': 0.1.25 + '@libsql/darwin-arm64': 0.1.28 + '@libsql/darwin-x64': 0.1.28 + '@libsql/linux-arm64-gnu': 0.1.28 + '@libsql/linux-x64-gnu': 0.1.28 + '@libsql/linux-x64-musl': 0.1.28 + '@libsql/win32-x64-msvc': 0.1.28 dev: false /lilconfig@2.1.0: @@ -3323,7 +3361,7 @@ packages: '@next/env': 13.5.4 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001546 + caniuse-lite: 1.0.30001547 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3360,8 +3398,8 @@ packages: tslib: 2.4.1 dev: false - /node-abi@3.47.0: - resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + /node-abi@3.49.0: + resolution: {integrity: sha512-ji8IK8VT2zAQv9BeOqwnpuvJnCivxPCe2HNiPe8P1z1SDhqEFpm7GqctqTWkujb8mLfZ1PWDrjMeiq6l9TN7fA==} engines: {node: '>=10'} dependencies: semver: 7.5.4 @@ -3592,7 +3630,7 @@ packages: postcss: 8.4.31 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.6 + resolve: 1.22.8 dev: true /postcss-js@4.0.1(postcss@8.4.31): @@ -3662,7 +3700,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.47.0 + node-abi: 3.49.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -3827,8 +3865,8 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve@1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: is-core-module: 2.13.0 @@ -3836,8 +3874,8 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: is-core-module: 2.13.0 @@ -4196,7 +4234,7 @@ packages: postcss-load-config: 4.0.1(postcss@8.4.31) postcss-nested: 6.0.1(postcss@8.4.31) postcss-selector-parser: 6.0.13 - resolve: 1.22.6 + resolve: 1.22.8 sucrase: 3.34.0 transitivePeerDependencies: - ts-node @@ -4408,6 +4446,9 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /undici-types@5.25.3: + resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true