diff --git a/.example.env b/.example.env index 1e70c44..ee7c0c4 100644 --- a/.example.env +++ b/.example.env @@ -1,5 +1,5 @@ VITE_HOST=localhost VITE_PORT=4000 - ACCESS_TOKEN_SECRET=sometoken1 REFRESH_TOKEN_SECRET=sometoken2 +DATABASE_URL="mysql://janedoe:mypassword@localhost:3306/mydb" diff --git a/app/client/components/ui/provider.tsx b/app/client/components/ui/provider.tsx index 5e7cc09..bd5636b 100644 --- a/app/client/components/ui/provider.tsx +++ b/app/client/components/ui/provider.tsx @@ -1,7 +1,7 @@ -"use client"; +'use client'; -import { Theme, ChakraProvider, defaultSystem } from "@chakra-ui/react"; -import { ColorModeProvider, type ColorModeProviderProps } from "./color-mode"; +import { ChakraProvider, defaultSystem, Theme } from '@chakra-ui/react'; +import { ColorModeProvider, type ColorModeProviderProps } from './color-mode'; export function Provider(props: ColorModeProviderProps) { return ( diff --git a/app/client/main.tsx b/app/client/main.tsx index d877f27..474cf22 100644 --- a/app/client/main.tsx +++ b/app/client/main.tsx @@ -1,10 +1,10 @@ +import { ApolloClient, ApolloProvider, InMemoryCache } from '@apollo/client'; import '@client/assets/styles/index.css'; import '@client/assets/styles/nerd-fonts-icons.css'; -import { StrictMode } from 'react'; -import ReactDOM from 'react-dom/client'; import { Provider } from '@client/components/ui/provider'; import { RouterProvider, createRouter } from '@tanstack/react-router'; -import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client'; +import { StrictMode } from 'react'; +import ReactDOM from 'react-dom/client'; // TanStackRouter - Import the generated route tree import { routeTree } from './routeTree.gen'; diff --git a/app/client/pages/__root.tsx b/app/client/pages/__root.tsx index 423434c..8aa2483 100644 --- a/app/client/pages/__root.tsx +++ b/app/client/pages/__root.tsx @@ -1,28 +1,28 @@ -import { Button, Stack } from "@chakra-ui/react"; -import { createRootRoute, Link, Outlet } from "@tanstack/react-router"; -import React from "react"; +import { Button, Stack } from '@chakra-ui/react'; +import { createRootRoute, Link, Outlet } from '@tanstack/react-router'; +import React from 'react'; const TanStackRouterDevtools = - process.env.NODE_ENV === "production" + process.env.NODE_ENV === 'production' ? () => null // Render nothing in production : React.lazy(() => // Lazy load in development - import("@tanstack/router-devtools").then((res) => ({ - default: res.TanStackRouterDevtools, + import('@tanstack/router-devtools').then(res => ({ + default: res.TanStackRouterDevtools // For Embedded Mode // default: res.TanStackRouterDevtoolsPanel - })), + })) ); export const Route = createRootRoute({ component: () => ( - + - + @@ -31,9 +31,9 @@ export const Route = createRootRoute({ -
+
- ), + ) }); diff --git a/app/client/pages/book.lazy.tsx b/app/client/pages/book.lazy.tsx index ccb12eb..6537ac4 100644 --- a/app/client/pages/book.lazy.tsx +++ b/app/client/pages/book.lazy.tsx @@ -1,20 +1,20 @@ -import { createLazyFileRoute } from "@tanstack/react-router"; -import { gql, useQuery } from "@apollo/client"; +// import { gql } from '@apollo/client'; +import { createLazyFileRoute } from '@tanstack/react-router'; -export const Route = createLazyFileRoute("/book")({ - component: RouteComponent, +export const Route = createLazyFileRoute('/book')({ + component: RouteComponent }); function RouteComponent() { return
"/book"
; } -const getBookQuery = gql` - query BookOne { - booksMany { - id - author - title - } - } -`; +// const getBookQuery = gql` +// query BookOne { +// booksMany { +// id +// author +// title +// } +// } +// `; diff --git a/app/client/pages/index.tsx b/app/client/pages/index.tsx index 4e2b48c..6ba1e0e 100644 --- a/app/client/pages/index.tsx +++ b/app/client/pages/index.tsx @@ -1,4 +1,4 @@ -import { Text, Stack } from '@chakra-ui/react'; +import { Stack, Text } from '@chakra-ui/react'; import { createFileRoute } from '@tanstack/react-router'; import { gql, useQuery } from '@apollo/client'; diff --git a/app/client/pages/login.tsx b/app/client/pages/login.tsx index 263e8b3..d1c101c 100644 --- a/app/client/pages/login.tsx +++ b/app/client/pages/login.tsx @@ -1,10 +1,10 @@ -import { gql, useQuery } from '@apollo/client'; +// import { gql, useQuery } from '@apollo/client'; import { Heading, Input, Stack } from '@chakra-ui/react'; import { Button } from '@client/components/ui/button'; import { Field } from '@client/components/ui/field'; +import { valibotResolver } from '@hookform/resolvers/valibot'; import { createFileRoute } from '@tanstack/react-router'; import { useForm } from 'react-hook-form'; -import { valibotResolver } from '@hookform/resolvers/valibot'; import * as v from 'valibot'; export const Route = createFileRoute('/login')({ diff --git a/app/client/pages/register.tsx b/app/client/pages/register.tsx index b83bf96..994e548 100644 --- a/app/client/pages/register.tsx +++ b/app/client/pages/register.tsx @@ -1,10 +1,10 @@ -import { gql, useQuery } from '@apollo/client'; +// import { gql, useQuery } from '@apollo/client'; import { Heading, Input, Stack } from '@chakra-ui/react'; import { Button } from '@client/components/ui/button'; import { Field } from '@client/components/ui/field'; +import { valibotResolver } from '@hookform/resolvers/valibot'; import { createFileRoute } from '@tanstack/react-router'; import { useForm } from 'react-hook-form'; -import { valibotResolver } from '@hookform/resolvers/valibot'; import * as v from 'valibot'; export const Route = createFileRoute('/register')({ @@ -53,7 +53,7 @@ function Register() { formState: { errors } } = useForm({ resolver: valibotResolver(schema) }); - const onSubmit = handleSubmit(data => console.log(data)); + const onSubmit = handleSubmit(data => alert(data)); return (
diff --git a/app/client/routeTree.gen.ts b/app/client/routeTree.gen.ts index 14062f0..9c8b746 100644 --- a/app/client/routeTree.gen.ts +++ b/app/client/routeTree.gen.ts @@ -8,130 +8,130 @@ // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. -import { createFileRoute } from '@tanstack/react-router' +import { createFileRoute } from '@tanstack/react-router'; // Import Routes -import { Route as rootRoute } from './pages/__root' -import { Route as RegisterImport } from './pages/register' -import { Route as LoginImport } from './pages/login' -import { Route as IndexImport } from './pages/index' +import { Route as rootRoute } from './pages/__root'; +import { Route as RegisterImport } from './pages/register'; +import { Route as LoginImport } from './pages/login'; +import { Route as IndexImport } from './pages/index'; // Create Virtual Routes -const BookLazyImport = createFileRoute('/book')() +const BookLazyImport = createFileRoute('/book')(); // Create/Update Routes const BookLazyRoute = BookLazyImport.update({ id: '/book', path: '/book', - getParentRoute: () => rootRoute, -} as any).lazy(() => import('./pages/book.lazy').then((d) => d.Route)) + getParentRoute: () => rootRoute +} as any).lazy(() => import('./pages/book.lazy').then(d => d.Route)); const RegisterRoute = RegisterImport.update({ id: '/register', path: '/register', - getParentRoute: () => rootRoute, -} as any) + getParentRoute: () => rootRoute +} as any); const LoginRoute = LoginImport.update({ id: '/login', path: '/login', - getParentRoute: () => rootRoute, -} as any) + getParentRoute: () => rootRoute +} as any); const IndexRoute = IndexImport.update({ id: '/', path: '/', - getParentRoute: () => rootRoute, -} as any) + getParentRoute: () => rootRoute +} as any); // Populate the FileRoutesByPath interface declare module '@tanstack/react-router' { interface FileRoutesByPath { '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexImport - parentRoute: typeof rootRoute - } + id: '/'; + path: '/'; + fullPath: '/'; + preLoaderRoute: typeof IndexImport; + parentRoute: typeof rootRoute; + }; '/login': { - id: '/login' - path: '/login' - fullPath: '/login' - preLoaderRoute: typeof LoginImport - parentRoute: typeof rootRoute - } + id: '/login'; + path: '/login'; + fullPath: '/login'; + preLoaderRoute: typeof LoginImport; + parentRoute: typeof rootRoute; + }; '/register': { - id: '/register' - path: '/register' - fullPath: '/register' - preLoaderRoute: typeof RegisterImport - parentRoute: typeof rootRoute - } + id: '/register'; + path: '/register'; + fullPath: '/register'; + preLoaderRoute: typeof RegisterImport; + parentRoute: typeof rootRoute; + }; '/book': { - id: '/book' - path: '/book' - fullPath: '/book' - preLoaderRoute: typeof BookLazyImport - parentRoute: typeof rootRoute - } + id: '/book'; + path: '/book'; + fullPath: '/book'; + preLoaderRoute: typeof BookLazyImport; + parentRoute: typeof rootRoute; + }; } } // Create and export the route tree export interface FileRoutesByFullPath { - '/': typeof IndexRoute - '/login': typeof LoginRoute - '/register': typeof RegisterRoute - '/book': typeof BookLazyRoute + '/': typeof IndexRoute; + '/login': typeof LoginRoute; + '/register': typeof RegisterRoute; + '/book': typeof BookLazyRoute; } export interface FileRoutesByTo { - '/': typeof IndexRoute - '/login': typeof LoginRoute - '/register': typeof RegisterRoute - '/book': typeof BookLazyRoute + '/': typeof IndexRoute; + '/login': typeof LoginRoute; + '/register': typeof RegisterRoute; + '/book': typeof BookLazyRoute; } export interface FileRoutesById { - __root__: typeof rootRoute - '/': typeof IndexRoute - '/login': typeof LoginRoute - '/register': typeof RegisterRoute - '/book': typeof BookLazyRoute + __root__: typeof rootRoute; + '/': typeof IndexRoute; + '/login': typeof LoginRoute; + '/register': typeof RegisterRoute; + '/book': typeof BookLazyRoute; } export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: '/' | '/login' | '/register' | '/book' - fileRoutesByTo: FileRoutesByTo - to: '/' | '/login' | '/register' | '/book' - id: '__root__' | '/' | '/login' | '/register' | '/book' - fileRoutesById: FileRoutesById + fileRoutesByFullPath: FileRoutesByFullPath; + fullPaths: '/' | '/login' | '/register' | '/book'; + fileRoutesByTo: FileRoutesByTo; + to: '/' | '/login' | '/register' | '/book'; + id: '__root__' | '/' | '/login' | '/register' | '/book'; + fileRoutesById: FileRoutesById; } export interface RootRouteChildren { - IndexRoute: typeof IndexRoute - LoginRoute: typeof LoginRoute - RegisterRoute: typeof RegisterRoute - BookLazyRoute: typeof BookLazyRoute + IndexRoute: typeof IndexRoute; + LoginRoute: typeof LoginRoute; + RegisterRoute: typeof RegisterRoute; + BookLazyRoute: typeof BookLazyRoute; } const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, LoginRoute: LoginRoute, RegisterRoute: RegisterRoute, - BookLazyRoute: BookLazyRoute, -} + BookLazyRoute: BookLazyRoute +}; export const routeTree = rootRoute ._addFileChildren(rootRouteChildren) - ._addFileTypes() + ._addFileTypes(); /* ROUTE_MANIFEST_START { diff --git a/app/server/graphql/graphql.ts b/app/server/graphql/graphql.ts index 92e8d02..6219daa 100644 --- a/app/server/graphql/graphql.ts +++ b/app/server/graphql/graphql.ts @@ -1,15 +1,20 @@ /* gql imports */ -import { QueryResolvers } from "@generated/graphql"; +import { QueryResolvers } from '@generated/types'; /* Query */ -import { BooksManyResolver } from "./resolvers/booksManyResolver"; -import { BookOneResolver } from "./resolvers/bookOneResolver"; +import { BooksManyResolver } from './resolvers/booksManyResolver'; +import { BookOneResolver } from './resolvers/bookOneResolver'; + +/* Mutation */ +import { LoginResolver } from './resolvers/auth/login'; export const Query: QueryResolvers = { booksMany: BooksManyResolver, - bookOne: BookOneResolver, + bookOne: BookOneResolver }; -export const Mutation = {}; +export const Mutation = { + login: LoginResolver +}; export const Subscription = {}; diff --git a/app/server/graphql/resolvers/auth/login.ts b/app/server/graphql/resolvers/auth/login.ts index 28dfa01..b9408cc 100644 --- a/app/server/graphql/resolvers/auth/login.ts +++ b/app/server/graphql/resolvers/auth/login.ts @@ -1,25 +1,44 @@ +import { prisma } from '@app/server/prisma/client'; +import { MutationLoginArgs, Session } from '@generated/types'; import bcrypt from 'bcrypt'; +import jwt from 'jsonwebtoken'; -const usersDB = { - users: require('../model/users.json'), - setUsers: function (data) { - this.users = data; - } -}; +export async function LoginResolver(_: any, { input }: MutationLoginArgs): Promise { + const error = 'Invalid username or password'; -const handleLogin = async (req, res) => { - const { user, pwd } = req.body; - if (!user || !pwd) res.status(400).json({ message: 'Username and password are required.' }); - const foundUser = usersDB.users.find(person => person.username === user); - if (!foundUser) return res.sendStatus(401); // unauthorized - // evaluate password - const match = await bcrypt.compare(pwd, foundUser.password); - if (match) { - // create JWTs - res.json({ success: `User ${user} is logged in.` }); - } else { - res.sendStatus(401); - } -}; + const user = await prisma.user.findUnique({ + where: { email: input.email } + }); + if (!user) throw new Error(error); -module.exports = { handleLogin }; + const match = await bcrypt.compare(input.password, user.password); + if (!match) throw new Error(error); + + const accessTokenSecret = process.env.ACCESS_TOKEN_SECRET; + const refreshTokenSecret = process.env.REFRESH_TOKEN_SECRET; + + if (accessTokenSecret == null || refreshTokenSecret == null) throw new Error('No secrets found'); + + const accessToken = jwt.sign({ userId: user.id }, accessTokenSecret, { + expiresIn: '30s' + }); + const refreshToken = jwt.sign({ userId: user.id }, refreshTokenSecret, { + expiresIn: '1d' + }); + + await prisma.user.update({ + where: { id: user.id }, + data: { refreshToken } + }); + + return { + accessToken, + refreshToken: { + token: refreshToken, + httpOnly: true, + secure: true, + maxAge: 24 * 60 * 60 * 1000, + sameSite: 'None' + } + }; +} diff --git a/app/server/graphql/resolvers/auth/register.ts b/app/server/graphql/resolvers/auth/register.ts index acd5d6a..10e975d 100644 --- a/app/server/graphql/resolvers/auth/register.ts +++ b/app/server/graphql/resolvers/auth/register.ts @@ -1,49 +1,28 @@ +import { prisma, uuid } from '@app/server/prisma/client'; +import { RegisterInput } from '@generated/types'; import bcrypt from 'bcrypt'; -export async function SignUpResolver(_: any, input: any): Promise { - // validate +export async function SignUpResolver(_: any, input: RegisterInput): Promise { + const existingUsername = await prisma.user.findUnique({ + where: { username: input.username }, + select: { id: true } + }); + if (existingUsername != null) throw Error('User with this username already exists.'); - // db - const users = [ - { - id: '1', - email: 'joe@test.com', - username: 'Joe', - password: 'test' + const existingEmail = await prisma.user.findUnique({ + where: { email: input.email }, + select: { id: true } + }); + if (existingEmail != null) throw Error('Email is already in use.'); + + const hashedPassword = await bcrypt.hash(input.password, 10); + + await prisma.user.create({ + data: { + id: uuid(), + email: input.email, + username: input.username, + password: hashedPassword } - ]; - const usersDB = { users }; - - // check for duplicate email+username - - // encrypt the password - const hashedPwd = await bcrypt.hash(input.pwd, 10); - - // store user in the db, return new user - - return user; + }); } - -const handleNewUser = async (req, res) => { - const { user, pwd } = req.body; - if (!user || !pwd) - return res.status(400).json({ message: 'Username and password are required.' }); - // check for duplicate usernames in the db. - const duplicate = usersDB.users.find(person => person.username === user); - if (duplicate) return res.status(409); - try { - // encrypt the password - const hashedPwd = await brcypt.hash(pwd, 10); - // store the new user - const newUser = { username: user, password: hashedPwd }; - usersDB.setUsers([...usersDB.users, newUser]); - await fs_promises.writeFile( - path.join(__dirname, '..', 'model', 'users.json'), - JSON.stringify(usersDB.users) - ); - console.log(usersDB.users); - res.status(201).json({ success: `New user ${user} created!` }); - } catch (err) { - res.status(500).json({ message: err.message }); - } -}; diff --git a/app/server/graphql/resolvers/bookOneResolver.ts b/app/server/graphql/resolvers/bookOneResolver.ts index 2fd422d..3bb7055 100644 --- a/app/server/graphql/resolvers/bookOneResolver.ts +++ b/app/server/graphql/resolvers/bookOneResolver.ts @@ -1,10 +1,8 @@ -import { BookInput, Book } from "@generated/graphql"; -import { books } from "./booksManyResolver"; +import { Book, QueryBookOneArgs } from '@generated/types'; +import { books } from './booksManyResolver'; -export async function BookOneResolver(_: any, input: BookInput): Promise { - console.log("Called 'BookOneResolver' resolver..."); - - const book = books.filter((item) => item.id === input.id)[0]; +export async function BookOneResolver(_: any, { id }: QueryBookOneArgs): Promise { + const book = books.filter(item => item.id === id)[0]; return book; } diff --git a/app/server/graphql/resolvers/booksManyResolver.ts b/app/server/graphql/resolvers/booksManyResolver.ts index f690cfb..1b6a878 100644 --- a/app/server/graphql/resolvers/booksManyResolver.ts +++ b/app/server/graphql/resolvers/booksManyResolver.ts @@ -1,20 +1,18 @@ -import { Book } from "@generated/graphql"; +import { Book } from '@generated/types'; export const books = [ { - id: "1", - title: "some-title-1", - author: "someone", + id: '1', + title: 'some-title-1', + author: 'someone' }, { - id: "2", - title: "some-title-1", - author: "someone", - }, + id: '2', + title: 'some-title-1', + author: 'someone' + } ]; export async function BooksManyResolver(_: any): Promise { - console.log("Called 'BooksManyResolver' resolver..."); - return books; } diff --git a/app/server/graphql/schema.graphql b/app/server/graphql/schema.graphql index 8eee5c1..296dd19 100644 --- a/app/server/graphql/schema.graphql +++ b/app/server/graphql/schema.graphql @@ -1,6 +1,37 @@ +scalar Void + type Query { - booksMany: [Book]! - bookOne(input: BookInput!): [Book]! + booksMany: [Book!]! + bookOne(id: ID!): Book! +} + +type Mutation { + login(input: LoginInput!): Session! + register(input: RegisterInput!): Void! +} + +input LoginInput { + email: String! + password: String! +} + +input RegisterInput { + email: String! + username: String! + password: String! +} + +type Session { + accessToken: String! + refreshToken: RefreshToken! +} + +type RefreshToken { + token: String! + maxAge: Int! + secure: Boolean! + httpOnly: Boolean! + sameSite: String! } type Book { @@ -8,7 +39,3 @@ type Book { title: String! author: String! } - -input BookInput { - id: ID! -} diff --git a/app/server/main.ts b/app/server/main.ts index 5c2f104..c9b62ea 100644 --- a/app/server/main.ts +++ b/app/server/main.ts @@ -1,32 +1,31 @@ -import "dotenv/config"; -import express from "express"; -import cors from "cors"; -import ViteExpress from "vite-express"; -import { ApolloServer } from "@apollo/server"; -import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer"; -import { expressMiddleware } from "@apollo/server/express4"; -import http from "http"; -import fs from "fs"; -import path from "path"; +import { ApolloServer } from '@apollo/server'; +import { expressMiddleware } from '@apollo/server/express4'; +import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'; +import cors from 'cors'; +import 'dotenv/config'; +import express, { Request, Response } from 'express'; +import fs from 'fs'; +import http from 'http'; +import jwt from 'jsonwebtoken'; +import path from 'path'; +import ViteExpress from 'vite-express'; -import { Query, Mutation, Subscription } from "./graphql/graphql"; +import { Mutation, Query } from './graphql/graphql'; +import { prisma } from './prisma/client'; const __dirname = import.meta.dirname; -const HOST = process.env.VITE_HOST || "localhost"; -const PORT = parseInt(process.env.VITE_PORT || "3000"); +const HOST = process.env.VITE_HOST || 'localhost'; +const PORT = parseInt(process.env.VITE_PORT || '3000'); const MOTD = `\n\n\n\x1b[35m-server is listening at...-\x1b[0m\n\nhttp://${HOST}:${PORT}\nhttp://localhost:${PORT}\n\n\n`; const app = express(); const server = http.createServer(app); -const typeDefs = fs.readFileSync( - path.join(__dirname, "graphql", "schema.graphql"), - "utf8", -); +const typeDefs = fs.readFileSync(path.join(__dirname, 'graphql', 'schema.graphql'), 'utf8'); const resolvers = { Query, - // Mutation, + Mutation // Subscription, }; @@ -37,31 +36,35 @@ interface IdentityContext { const apollo = new ApolloServer({ typeDefs, resolvers, - plugins: [ApolloServerPluginDrainHttpServer({ httpServer: server })], + plugins: [ApolloServerPluginDrainHttpServer({ httpServer: server })] }); await apollo.start(); app.use( - "/graphql", + '/graphql', cors(), express.json(), expressMiddleware(apollo, { - context: async ({ req, res }) => { - const token = req.headers.authorization || ""; - // const user = await getUser(token); - - const user = "user"; - - return { user }; - }, - }), + context: getUser + }) ); -await new Promise((resolve) => - server.listen({ hostname: HOST, port: PORT }, resolve), -); +await new Promise(resolve => server.listen({ hostname: HOST, port: PORT }, resolve)); -console.log(MOTD); +process.stdout.write(MOTD); ViteExpress.bind(app, server); + +async function getUser({ req, res }: { req: Request; res: Response }) { + const authHeader = req.headers.authorization; + if (!authHeader) return { identity: null }; + const token = authHeader.split(' ')[1]; + + const accessTokenSecret = process.env.ACCESS_TOKEN_SECRET; + if (accessTokenSecret == null) throw Error('No `accessToken`'); + + const decoded = jwt.verify(token, accessTokenSecret) as { userId: string }; + const identity = await prisma.user.findUnique({ where: { id: decoded.userId } }); + return { identity }; +} diff --git a/app/server/prisma/client.ts b/app/server/prisma/client.ts new file mode 100644 index 0000000..1a29a3b --- /dev/null +++ b/app/server/prisma/client.ts @@ -0,0 +1,8 @@ +import { PrismaClient } from '@prisma/client'; +import { v4 } from 'uuid'; + +export const prisma = new PrismaClient(); + +export function uuid() { + return v4(); +} diff --git a/app/server/prisma/schema.prisma b/app/server/prisma/schema.prisma new file mode 100644 index 0000000..ef90545 --- /dev/null +++ b/app/server/prisma/schema.prisma @@ -0,0 +1,21 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") +} + +model User { + id String @id + + email String @unique @db.VarChar(255) + username String @unique @db.VarChar(255) + password String + + refreshToken String? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/codegen.ts b/codegen.ts index da756f9..791979e 100644 --- a/codegen.ts +++ b/codegen.ts @@ -2,20 +2,26 @@ import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { overwrite: true, + schema: './app/server/graphql/schema.graphql', documents: ['app/client/fragments', 'app/client/**/*.tsx'], generates: { './__generated__/': { - preset: 'client', presetConfig: { + preset: 'client', gqlTagName: 'gql' }, - plugins: ['typescript', 'typescript-resolvers'] + plugins: ['typescript', 'typescript-resolvers', 'typescript-resolvers'] }, './__generated__/types.ts': { - plugins: ['typescript', 'typescript-operations'] + plugins: ['typescript', 'typescript-operations', 'typescript-resolvers'], + config: { + scalars: { + Void: 'void' + } + } }, - './graphql.schema.json': { + './__generated__/graphql.schema.json': { plugins: ['introspection'] } }, diff --git a/graphql.schema.json b/graphql.schema.json deleted file mode 100644 index 8ee3f14..0000000 --- a/graphql.schema.json +++ /dev/null @@ -1,1246 +0,0 @@ -{ - "__schema": { - "queryType": { - "name": "Query" - }, - "mutationType": null, - "subscriptionType": null, - "types": [ - { - "kind": "OBJECT", - "name": "Book", - "description": null, - "isOneOf": null, - "fields": [ - { - "name": "author", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "id", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "title", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "BookInput", - "description": null, - "isOneOf": false, - "fields": null, - "inputFields": [ - { - "name": "id", - "description": null, - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Boolean", - "description": "The `Boolean` scalar type represents `true` or `false`.", - "isOneOf": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ID", - "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.", - "isOneOf": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Query", - "description": null, - "isOneOf": null, - "fields": [ - { - "name": "bookOne", - "description": null, - "args": [ - { - "name": "input", - "description": null, - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "BookInput", - "ofType": null - } - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Book", - "ofType": null - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "booksMany", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Book", - "ofType": null - } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "String", - "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", - "isOneOf": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Directive", - "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.", - "isOneOf": null, - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "isRepeatable", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "locations", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "__DirectiveLocation", - "ofType": null - } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "args", - "description": null, - "args": [ - { - "name": "includeDeprecated", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "defaultValue": "false", - "isDeprecated": false, - "deprecationReason": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__InputValue", - "ofType": null - } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "__DirectiveLocation", - "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.", - "isOneOf": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "QUERY", - "description": "Location adjacent to a query operation.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "MUTATION", - "description": "Location adjacent to a mutation operation.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SUBSCRIPTION", - "description": "Location adjacent to a subscription operation.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FIELD", - "description": "Location adjacent to a field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FRAGMENT_DEFINITION", - "description": "Location adjacent to a fragment definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FRAGMENT_SPREAD", - "description": "Location adjacent to a fragment spread.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INLINE_FRAGMENT", - "description": "Location adjacent to an inline fragment.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "VARIABLE_DEFINITION", - "description": "Location adjacent to a variable definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SCHEMA", - "description": "Location adjacent to a schema definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SCALAR", - "description": "Location adjacent to a scalar definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "OBJECT", - "description": "Location adjacent to an object type definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FIELD_DEFINITION", - "description": "Location adjacent to a field definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ARGUMENT_DEFINITION", - "description": "Location adjacent to an argument definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INTERFACE", - "description": "Location adjacent to an interface definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "UNION", - "description": "Location adjacent to a union definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ENUM", - "description": "Location adjacent to an enum definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ENUM_VALUE", - "description": "Location adjacent to an enum value definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INPUT_OBJECT", - "description": "Location adjacent to an input object type definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INPUT_FIELD_DEFINITION", - "description": "Location adjacent to an input object field definition.", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__EnumValue", - "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.", - "isOneOf": null, - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "isDeprecated", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deprecationReason", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Field", - "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.", - "isOneOf": null, - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "args", - "description": null, - "args": [ - { - "name": "includeDeprecated", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "defaultValue": "false", - "isDeprecated": false, - "deprecationReason": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__InputValue", - "ofType": null - } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "isDeprecated", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deprecationReason", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__InputValue", - "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.", - "isOneOf": null, - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "defaultValue", - "description": "A GraphQL-formatted string representing the default value for this input value.", - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "isDeprecated", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deprecationReason", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Schema", - "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.", - "isOneOf": null, - "fields": [ - { - "name": "description", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "types", - "description": "A list of all types supported by this server.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "queryType", - "description": "The type that query operations will be rooted at.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mutationType", - "description": "If this server supports mutation, the type that mutation operations will be rooted at.", - "args": [], - "type": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "subscriptionType", - "description": "If this server support subscription, the type that subscription operations will be rooted at.", - "args": [], - "type": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "directives", - "description": "A list of all directives supported by this server.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Directive", - "ofType": null - } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Type", - "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.", - "isOneOf": null, - "fields": [ - { - "name": "kind", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "__TypeKind", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "specifiedByURL", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "fields", - "description": null, - "args": [ - { - "name": "includeDeprecated", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "defaultValue": "false", - "isDeprecated": false, - "deprecationReason": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Field", - "ofType": null - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "interfaces", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "possibleTypes", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "enumValues", - "description": null, - "args": [ - { - "name": "includeDeprecated", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "defaultValue": "false", - "isDeprecated": false, - "deprecationReason": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__EnumValue", - "ofType": null - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "inputFields", - "description": null, - "args": [ - { - "name": "includeDeprecated", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "defaultValue": "false", - "isDeprecated": false, - "deprecationReason": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__InputValue", - "ofType": null - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ofType", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "isOneOf", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "__TypeKind", - "description": "An enum describing what kind of type a given `__Type` is.", - "isOneOf": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "SCALAR", - "description": "Indicates this type is a scalar.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "OBJECT", - "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INTERFACE", - "description": "Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "UNION", - "description": "Indicates this type is a union. `possibleTypes` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ENUM", - "description": "Indicates this type is an enum. `enumValues` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INPUT_OBJECT", - "description": "Indicates this type is an input object. `inputFields` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "LIST", - "description": "Indicates this type is a list. `ofType` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "NON_NULL", - "description": "Indicates this type is a non-null. `ofType` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - } - ], - "directives": [ - { - "name": "deprecated", - "description": "Marks an element of a GraphQL schema as no longer supported.", - "isRepeatable": false, - "locations": [ - "ARGUMENT_DEFINITION", - "ENUM_VALUE", - "FIELD_DEFINITION", - "INPUT_FIELD_DEFINITION" - ], - "args": [ - { - "name": "reason", - "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": "\"No longer supported\"", - "isDeprecated": false, - "deprecationReason": null - } - ] - }, - { - "name": "include", - "description": "Directs the executor to include this field or fragment only when the `if` argument is true.", - "isRepeatable": false, - "locations": [ - "FIELD", - "FRAGMENT_SPREAD", - "INLINE_FRAGMENT" - ], - "args": [ - { - "name": "if", - "description": "Included when true.", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - } - ] - }, - { - "name": "oneOf", - "description": "Indicates exactly one field must be supplied and this field must not be `null`.", - "isRepeatable": false, - "locations": [ - "INPUT_OBJECT" - ], - "args": [] - }, - { - "name": "skip", - "description": "Directs the executor to skip this field or fragment when the `if` argument is true.", - "isRepeatable": false, - "locations": [ - "FIELD", - "FRAGMENT_SPREAD", - "INLINE_FRAGMENT" - ], - "args": [ - { - "name": "if", - "description": "Skipped when true.", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - } - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - } - ] - }, - { - "name": "specifiedBy", - "description": "Exposes a URL that specifies the behavior of this scalar.", - "isRepeatable": false, - "locations": [ - "SCALAR" - ], - "args": [ - { - "name": "url", - "description": "The URL that specifies the behavior of this scalar.", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - } - ] - } - ] - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 37ed160..8d008ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@deftomat/opinionated": "^1.1.3", "@emotion/react": "^11.13.5", "@hookform/resolvers": "^3.9.1", + "@prisma/client": "^6.4.1", "@tanstack/react-router": "^1.85.0", "@tanstack/router-vite-plugin": "^1.84.4", "@types/cors": "^2.8.17", @@ -31,6 +32,7 @@ "react-icons": "^5.4.0", "tsx": "^4.3.0", "typescript": "^5.3.2", + "uuid": "^11.1.0", "valibot": "^1.0.0-beta.10", "vite-express": "^0.20.0" }, @@ -44,11 +46,13 @@ "@tanstack/router-plugin": "^1.84.4", "@types/bcrypt": "^5.0.2", "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.9", "@types/node": "^20.9.3", "@types/react": "^18.0.38", "@types/react-dom": "^18.2.16", "@vitejs/plugin-react": "^4.2.0", "nodemon": "^3.0.1", + "prisma": "^6.4.1", "vite": "^5.0.2", "vite-tsconfig-paths": "^5.1.4" } @@ -205,6 +209,19 @@ "node": ">=12" } }, + "node_modules/@apollo/server/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@apollo/usage-reporting-protobuf": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz", @@ -1816,9 +1833,9 @@ } }, "node_modules/@deftomat/opinionated/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -2001,9 +2018,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", "cpu": [ "ppc64" ], @@ -2017,9 +2034,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", "cpu": [ "arm" ], @@ -2033,9 +2050,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", "cpu": [ "arm64" ], @@ -2049,9 +2066,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", "cpu": [ "x64" ], @@ -2065,9 +2082,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", "cpu": [ "arm64" ], @@ -2081,9 +2098,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", "cpu": [ "x64" ], @@ -2097,9 +2114,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", "cpu": [ "arm64" ], @@ -2113,9 +2130,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", "cpu": [ "x64" ], @@ -2129,9 +2146,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", "cpu": [ "arm" ], @@ -2145,9 +2162,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", "cpu": [ "arm64" ], @@ -2161,9 +2178,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", "cpu": [ "ia32" ], @@ -2177,9 +2194,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", "cpu": [ "loong64" ], @@ -2193,9 +2210,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", "cpu": [ "mips64el" ], @@ -2209,9 +2226,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", "cpu": [ "ppc64" ], @@ -2225,9 +2242,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", "cpu": [ "riscv64" ], @@ -2241,9 +2258,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", "cpu": [ "s390x" ], @@ -2257,9 +2274,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", "cpu": [ "x64" ], @@ -2272,10 +2289,26 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", "cpu": [ "x64" ], @@ -2289,9 +2322,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", "cpu": [ "arm64" ], @@ -2305,9 +2338,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", "cpu": [ "x64" ], @@ -2321,9 +2354,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", "cpu": [ "x64" ], @@ -2337,9 +2370,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", "cpu": [ "arm64" ], @@ -2353,9 +2386,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", "cpu": [ "ia32" ], @@ -2369,9 +2402,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", "cpu": [ "x64" ], @@ -2579,9 +2612,9 @@ } }, "node_modules/@graphql-codegen/cli/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2667,9 +2700,9 @@ } }, "node_modules/@graphql-codegen/client-preset/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2710,13 +2743,13 @@ } }, "node_modules/@graphql-codegen/core/node_modules/@graphql-tools/merge": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.21.tgz", - "integrity": "sha512-5EiVL2InZeBlsZXlXjqyNMD697QP44j/dipXEogHlZcZzWEP/JTDwx9hTfFbmrePVR8+p89gFg1tE25iEgSong==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -2727,14 +2760,14 @@ } }, "node_modules/@graphql-codegen/core/node_modules/@graphql-tools/schema": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.20.tgz", - "integrity": "sha512-BmDqXS9gHJF2Cl1k+IOiPCYWApBU6LhqSEPc8WmAxn08HtmhKoCizwiUuWtt8SOV67yoMzC1zJFkBdm3wZX9Fw==", + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/merge": "^9.0.21", - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -2745,9 +2778,9 @@ } }, "node_modules/@graphql-codegen/core/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2792,9 +2825,9 @@ } }, "node_modules/@graphql-codegen/gql-tag-operations/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2862,9 +2895,9 @@ } }, "node_modules/@graphql-codegen/plugin-helpers/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2904,9 +2937,9 @@ } }, "node_modules/@graphql-codegen/schema-ast/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3026,9 +3059,9 @@ } }, "node_modules/@graphql-codegen/typescript-resolvers/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3085,9 +3118,9 @@ } }, "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3144,9 +3177,9 @@ } }, "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3192,14 +3225,14 @@ } }, "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.12.tgz", - "integrity": "sha512-ec9ZPDImceXD9gShv0VTc6q0waZ7ccpiYXNbAeGMjGQAZ8hkAeAYOXoiJsfaHO5Pt0UR+SbNVTJGP2aeFMYz0Q==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.14.tgz", + "integrity": "sha512-GMCUrFq3gXQSgWMnEBMaQUxh1rd1vi3Kp4MRQT6UKbnRycm4QmUSxp8ZIySxLQ96cpyBvonEH0BYmdQe/pWy8A==", "dev": true, "license": "MIT", "dependencies": { "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.0.0", + "@whatwg-node/promise-helpers": "^1.2.5", "busboy": "^1.6.0", "tslib": "^2.6.3" }, @@ -3226,9 +3259,9 @@ } }, "node_modules/@graphql-tools/batch-execute/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3266,9 +3299,9 @@ } }, "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3309,13 +3342,13 @@ } }, "node_modules/@graphql-tools/delegate/node_modules/@graphql-tools/merge": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.21.tgz", - "integrity": "sha512-5EiVL2InZeBlsZXlXjqyNMD697QP44j/dipXEogHlZcZzWEP/JTDwx9hTfFbmrePVR8+p89gFg1tE25iEgSong==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -3326,14 +3359,14 @@ } }, "node_modules/@graphql-tools/delegate/node_modules/@graphql-tools/schema": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.20.tgz", - "integrity": "sha512-BmDqXS9gHJF2Cl1k+IOiPCYWApBU6LhqSEPc8WmAxn08HtmhKoCizwiUuWtt8SOV67yoMzC1zJFkBdm3wZX9Fw==", + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/merge": "^9.0.21", - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -3344,9 +3377,9 @@ } }, "node_modules/@graphql-tools/delegate/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3423,9 +3456,9 @@ } }, "node_modules/@graphql-tools/executor-graphql-ws/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3467,9 +3500,9 @@ } }, "node_modules/@graphql-tools/executor-http/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3501,14 +3534,14 @@ } }, "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/node-fetch": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.12.tgz", - "integrity": "sha512-ec9ZPDImceXD9gShv0VTc6q0waZ7ccpiYXNbAeGMjGQAZ8hkAeAYOXoiJsfaHO5Pt0UR+SbNVTJGP2aeFMYz0Q==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.14.tgz", + "integrity": "sha512-GMCUrFq3gXQSgWMnEBMaQUxh1rd1vi3Kp4MRQT6UKbnRycm4QmUSxp8ZIySxLQ96cpyBvonEH0BYmdQe/pWy8A==", "dev": true, "license": "MIT", "dependencies": { "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.0.0", + "@whatwg-node/promise-helpers": "^1.2.5", "busboy": "^1.6.0", "tslib": "^2.6.3" }, @@ -3551,9 +3584,9 @@ } }, "node_modules/@graphql-tools/executor-legacy-ws/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3571,9 +3604,9 @@ } }, "node_modules/@graphql-tools/executor/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3612,9 +3645,9 @@ } }, "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3654,9 +3687,9 @@ } }, "node_modules/@graphql-tools/github-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3702,14 +3735,14 @@ } }, "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.12.tgz", - "integrity": "sha512-ec9ZPDImceXD9gShv0VTc6q0waZ7ccpiYXNbAeGMjGQAZ8hkAeAYOXoiJsfaHO5Pt0UR+SbNVTJGP2aeFMYz0Q==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.14.tgz", + "integrity": "sha512-GMCUrFq3gXQSgWMnEBMaQUxh1rd1vi3Kp4MRQT6UKbnRycm4QmUSxp8ZIySxLQ96cpyBvonEH0BYmdQe/pWy8A==", "dev": true, "license": "MIT", "dependencies": { "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.0.0", + "@whatwg-node/promise-helpers": "^1.2.5", "busboy": "^1.6.0", "tslib": "^2.6.3" }, @@ -3738,9 +3771,9 @@ } }, "node_modules/@graphql-tools/graphql-file-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3780,9 +3813,9 @@ } }, "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3818,9 +3851,9 @@ } }, "node_modules/@graphql-tools/import/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3867,9 +3900,9 @@ } }, "node_modules/@graphql-tools/json-file-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3906,13 +3939,13 @@ } }, "node_modules/@graphql-tools/load/node_modules/@graphql-tools/merge": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.21.tgz", - "integrity": "sha512-5EiVL2InZeBlsZXlXjqyNMD697QP44j/dipXEogHlZcZzWEP/JTDwx9hTfFbmrePVR8+p89gFg1tE25iEgSong==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -3923,14 +3956,14 @@ } }, "node_modules/@graphql-tools/load/node_modules/@graphql-tools/schema": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.20.tgz", - "integrity": "sha512-BmDqXS9gHJF2Cl1k+IOiPCYWApBU6LhqSEPc8WmAxn08HtmhKoCizwiUuWtt8SOV67yoMzC1zJFkBdm3wZX9Fw==", + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/merge": "^9.0.21", - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -3941,9 +3974,9 @@ } }, "node_modules/@graphql-tools/load/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4021,9 +4054,9 @@ } }, "node_modules/@graphql-tools/prisma-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4069,14 +4102,14 @@ } }, "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.12.tgz", - "integrity": "sha512-ec9ZPDImceXD9gShv0VTc6q0waZ7ccpiYXNbAeGMjGQAZ8hkAeAYOXoiJsfaHO5Pt0UR+SbNVTJGP2aeFMYz0Q==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.14.tgz", + "integrity": "sha512-GMCUrFq3gXQSgWMnEBMaQUxh1rd1vi3Kp4MRQT6UKbnRycm4QmUSxp8ZIySxLQ96cpyBvonEH0BYmdQe/pWy8A==", "dev": true, "license": "MIT", "dependencies": { "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.0.0", + "@whatwg-node/promise-helpers": "^1.2.5", "busboy": "^1.6.0", "tslib": "^2.6.3" }, @@ -4103,9 +4136,9 @@ } }, "node_modules/@graphql-tools/relay-operation-optimizer/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4165,9 +4198,9 @@ } }, "node_modules/@graphql-tools/url-loader/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4213,14 +4246,14 @@ } }, "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.7.12", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.12.tgz", - "integrity": "sha512-ec9ZPDImceXD9gShv0VTc6q0waZ7ccpiYXNbAeGMjGQAZ8hkAeAYOXoiJsfaHO5Pt0UR+SbNVTJGP2aeFMYz0Q==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.7.14.tgz", + "integrity": "sha512-GMCUrFq3gXQSgWMnEBMaQUxh1rd1vi3Kp4MRQT6UKbnRycm4QmUSxp8ZIySxLQ96cpyBvonEH0BYmdQe/pWy8A==", "dev": true, "license": "MIT", "dependencies": { "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.0.0", + "@whatwg-node/promise-helpers": "^1.2.5", "busboy": "^1.6.0", "tslib": "^2.6.3" }, @@ -4261,13 +4294,13 @@ } }, "node_modules/@graphql-tools/wrap/node_modules/@graphql-tools/merge": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.21.tgz", - "integrity": "sha512-5EiVL2InZeBlsZXlXjqyNMD697QP44j/dipXEogHlZcZzWEP/JTDwx9hTfFbmrePVR8+p89gFg1tE25iEgSong==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -4278,14 +4311,14 @@ } }, "node_modules/@graphql-tools/wrap/node_modules/@graphql-tools/schema": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.20.tgz", - "integrity": "sha512-BmDqXS9gHJF2Cl1k+IOiPCYWApBU6LhqSEPc8WmAxn08HtmhKoCizwiUuWtt8SOV67yoMzC1zJFkBdm3wZX9Fw==", + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/merge": "^9.0.21", - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -4296,9 +4329,9 @@ } }, "node_modules/@graphql-tools/wrap/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4643,6 +4676,78 @@ "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-0.41.0.tgz", "integrity": "sha512-BE6h6CsJk14ugIRrsazJtN3fcg+KDFRat1Bs93YFKH6jd4DOb1yUyVvC70jKqPVvg70zEcV8acZ7VdcU5TLu+w==" }, + "node_modules/@prisma/client": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.4.1.tgz", + "integrity": "sha512-A7Mwx44+GVZVexT5e2GF/WcKkEkNNKbgr059xpr5mn+oUm2ZW1svhe+0TRNBwCdzhfIZ+q23jEgsNPvKD9u+6g==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.4.1.tgz", + "integrity": "sha512-Q9xk6yjEGIThjSD8zZegxd5tBRNHYd13GOIG0nLsanbTXATiPXCLyvlYEfvbR2ft6dlRsziQXfQGxAgv7zcMUA==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.4.1.tgz", + "integrity": "sha512-KldENzMHtKYwsOSLThghOIdXOBEsfDuGSrxAZjMnimBiDKd3AE4JQ+Kv+gBD/x77WoV9xIPf25GXMWffXZ17BA==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.4.1", + "@prisma/engines-version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d", + "@prisma/fetch-engine": "6.4.1", + "@prisma/get-platform": "6.4.1" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d.tgz", + "integrity": "sha512-Xq54qw55vaCGrGgIJqyDwOq0TtjZPJEWsbQAHugk99hpDf2jcEeQhUcF+yzEsSqegBaDNLA4IC8Nn34sXmkiTQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.4.1.tgz", + "integrity": "sha512-uZ5hVeTmDspx7KcaRCNoXmcReOD+84nwlO2oFvQPRQh9xiFYnnUKDz7l9bLxp8t4+25CsaNlgrgilXKSQwrIGQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.4.1", + "@prisma/engines-version": "6.4.0-29.a9055b89e58b4b5bfb59600785423b1db3d0e75d", + "@prisma/get-platform": "6.4.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.4.1.tgz", + "integrity": "sha512-gXqZaDI5scDkBF8oza7fOD3Q3QMD0e0rBynlzDDZdTWbWmzjuW58PRZtj+jkvKje2+ZigCWkH8SsWZAsH6q1Yw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.4.1" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -5316,6 +5421,17 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "license": "MIT" }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", + "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -5328,6 +5444,13 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.17.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", @@ -5750,16 +5873,16 @@ } }, "node_modules/@whatwg-node/promise-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.2.1.tgz", - "integrity": "sha512-+faGtJlS4U8NSaSzRVN37xAprPdhoobYzUSUo4DgH8APtfFyizmNxp0ckwKcURoL8cy2B+bKxOWU/VIH2nFeLg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.0.tgz", + "integrity": "sha512-486CouizxHXucj8Ky153DDragfkMcHtVEToF5Pn/fInhUUSiCmt9Q4JVBa6UK5q4RammFBtGQ4C9qhGlXU9YbA==", "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.6.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@wry/caches": { @@ -8601,9 +8724,9 @@ } }, "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -8613,30 +8736,44 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" } }, "node_modules/escalade": { @@ -9900,13 +10037,13 @@ } }, "node_modules/graphql-config/node_modules/@graphql-tools/merge": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.21.tgz", - "integrity": "sha512-5EiVL2InZeBlsZXlXjqyNMD697QP44j/dipXEogHlZcZzWEP/JTDwx9hTfFbmrePVR8+p89gFg1tE25iEgSong==", + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.3", + "@graphql-tools/utils": "^10.8.6", "tslib": "^2.4.0" }, "engines": { @@ -9917,9 +10054,9 @@ } }, "node_modules/graphql-config/node_modules/@graphql-tools/utils": { - "version": "10.8.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.3.tgz", - "integrity": "sha512-4QCvx3SWRsbH7wnktl51mBek+zE9hsjsv796XVlJlOUdWpAghJmA3ID2P7/Vwuy7BivVNfuAKe4ucUdE1fG7vA==", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12469,6 +12606,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/prisma": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.4.1.tgz", + "integrity": "sha512-q2uJkgXnua/jj66mk6P9bX/zgYJFI/jn4Yp0aS6SPRrjH/n6VyOV7RDe1vHD0DX8Aanx4MvgmUPPoYnR6MJnPg==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/engines": "6.4.1", + "esbuild": ">=0.12 <1", + "esbuild-register": "3.6.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -13961,12 +14128,12 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", - "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", "license": "MIT", "dependencies": { - "esbuild": "~0.23.0", + "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -14340,16 +14507,16 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/valibot": { @@ -14385,9 +14552,9 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "devOptional": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index aab449f..cef0e69 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "start": "NODE_ENV=production tsx app/server/main.ts", "build": "vite build", "gql-types": "graphql-codegen --config codegen.ts", - "checkup": "opinionated checkup" + "checkup": "opinionated checkup", + "prisma": "prisma" }, "dependencies": { "@apollo/client": "^3.12.2", @@ -17,6 +18,7 @@ "@deftomat/opinionated": "^1.1.3", "@emotion/react": "^11.13.5", "@hookform/resolvers": "^3.9.1", + "@prisma/client": "^6.4.1", "@tanstack/react-router": "^1.85.0", "@tanstack/router-vite-plugin": "^1.84.4", "@types/cors": "^2.8.17", @@ -34,6 +36,7 @@ "react-icons": "^5.4.0", "tsx": "^4.3.0", "typescript": "^5.3.2", + "uuid": "^11.1.0", "valibot": "^1.0.0-beta.10", "vite-express": "^0.20.0" }, @@ -47,14 +50,18 @@ "@tanstack/router-plugin": "^1.84.4", "@types/bcrypt": "^5.0.2", "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.9", "@types/node": "^20.9.3", "@types/react": "^18.0.38", "@types/react-dom": "^18.2.16", "@vitejs/plugin-react": "^4.2.0", "nodemon": "^3.0.1", + "prisma": "^6.4.1", "vite": "^5.0.2", "vite-tsconfig-paths": "^5.1.4" }, - "prettier": "@deftomat/opinionated/configs/prettier.config.mjs" + "prettier": "@deftomat/opinionated/configs/prettier.config.mjs", + "prisma": { + "schema": "app/server/prisma/schema.prisma" + } } - diff --git a/tsconfig.json b/tsconfig.json index 73036a5..ffbe4d4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "useDefineForClassFields": true, "lib": ["DOM", "DOM.Iterable", "ESNext"], "allowJs": false, + "jsx": "react-jsx", "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, @@ -21,6 +22,6 @@ "@generated/*": ["./__generated__/*"], "@root/*": ["./*"] } - } - + }, + "exclude": ["./app/client/components/ui", "./app/client/assets", "./__generated__/graphql.ts"] } diff --git a/vite.config.ts b/vite.config.ts index f17b3f8..199d875 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,10 @@ // vite.config.ts -import { defineConfig } from "vite"; -import viteReact from "@vitejs/plugin-react"; -import { TanStackRouterVite } from "@tanstack/router-plugin/vite"; -import tsConfigPaths from "vite-tsconfig-paths"; +import { defineConfig } from 'vite'; +import viteReact from '@vitejs/plugin-react'; +import { TanStackRouterVite } from '@tanstack/router-plugin/vite'; +import tsConfigPaths from 'vite-tsconfig-paths'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [TanStackRouterVite(), viteReact(), tsConfigPaths()], + plugins: [TanStackRouterVite(), viteReact(), tsConfigPaths()] });