From 911f2b1dc5f9ea06e66102aba768c589bc049c6f Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 15 Mar 2024 14:57:54 +0100 Subject: [PATCH 01/50] fix: await add fees --- api/src/modules/real-world-assets/listener.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/src/modules/real-world-assets/listener.ts b/api/src/modules/real-world-assets/listener.ts index 4500d253..47069ac4 100644 --- a/api/src/modules/real-world-assets/listener.ts +++ b/api/src/modules/real-world-assets/listener.ts @@ -708,15 +708,16 @@ const surgicalOperations: Record { logger.debug({ msg: "Adding fee transactions to group transaction", input }); + // add fees for (const fee of input.fees ?? []) { - prisma.rWAGroupTransactionFee.create({ + await prisma.rWAGroupTransactionFee.create({ data: { ...fee, portfolioId: portfolio.id, - groupTransactionId: input.id ?? undefined, + groupTransactionId: input.id, id: fee.id ?? undefined } - }); + }) } }, "EDIT_GROUP_TRANSACTION_FEES": async (input: EditGroupTransactionFeesInput, portfolio: RWAPortfolio, prisma: Prisma.TransactionClient) => { From 69f20b603375dd9f60518c15e5d172cbc396e147 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 15 Mar 2024 14:59:58 +0100 Subject: [PATCH 02/50] chore: removed some not required checks --- api/src/modules/real-world-assets/listener.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/modules/real-world-assets/listener.ts b/api/src/modules/real-world-assets/listener.ts index 47069ac4..61e28b52 100644 --- a/api/src/modules/real-world-assets/listener.ts +++ b/api/src/modules/real-world-assets/listener.ts @@ -738,8 +738,8 @@ const surgicalOperations: Record Date: Fri, 15 Mar 2024 15:04:59 +0100 Subject: [PATCH 03/50] refactor: createMany fees at once --- api/src/modules/real-world-assets/listener.ts | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/api/src/modules/real-world-assets/listener.ts b/api/src/modules/real-world-assets/listener.ts index 61e28b52..e4e9fa60 100644 --- a/api/src/modules/real-world-assets/listener.ts +++ b/api/src/modules/real-world-assets/listener.ts @@ -220,15 +220,15 @@ async function rebuildRwaPortfolio(driveId: string, documentId: string, state: R }) // add fees - for (const fee of transaction.fees ?? []) { - await prisma.rWAGroupTransactionFee.create({ - data: { + if (transaction.fees) { + await prisma.rWAGroupTransactionFee.createMany({ + data: transaction.fees.map(fee => ({ ...fee, portfolioId: portfolioEntity.id, groupTransactionId: transaction.id, id: fee.id ?? undefined - } - }) + })) + }); } // add relationships for fees @@ -709,16 +709,18 @@ const surgicalOperations: Record { logger.debug({ msg: "Adding fee transactions to group transaction", input }); // add fees - for (const fee of input.fees ?? []) { - await prisma.rWAGroupTransactionFee.create({ - data: { - ...fee, - portfolioId: portfolio.id, - groupTransactionId: input.id, - id: fee.id ?? undefined - } - }) + if (!input.fees) { + return; } + + await prisma.rWAGroupTransactionFee.createMany({ + data: input.fees.map(fee => ({ + ...fee, + portfolioId: portfolio.id, + groupTransactionId: input.id, + id: fee.id ?? undefined + })) + }); }, "EDIT_GROUP_TRANSACTION_FEES": async (input: EditGroupTransactionFeesInput, portfolio: RWAPortfolio, prisma: Prisma.TransactionClient) => { logger.debug({ msg: "Editing fee transaction", input }); From de287175add27ea64ba2cb14b5e6c9dbca0c3e23 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 10:39:04 +0100 Subject: [PATCH 04/50] feat: added base path to next config --- frontend/Dockerfile | 1 + frontend/next.config.mjs | 1 + 2 files changed, 2 insertions(+) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index f387e842..4b196064 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -26,6 +26,7 @@ FROM node:lts-alpine AS runner ARG X_TAG WORKDIR /opt/app ENV NODE_ENV=production +ENV BASE_PATH=undefined EXPOSE 3000 COPY --from=builder /opt/app/next.config.mjs ./ COPY --from=builder /opt/app/public ./public diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index fea71e73..0a2b4a79 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -5,6 +5,7 @@ const nextConfig = { process.env.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST || "https://ph-switchboard-nginx-prod-c84ebf8c6e3b.herokuapp.com", }, + basePath: process.env.BASE_PATH ?? undefined, }; export default nextConfig; From 82c0c67ffc4495fc80ff5af012ac69d8075ed2de Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 10:57:04 +0100 Subject: [PATCH 05/50] feat: added assetPrefix --- frontend/next.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index 0a2b4a79..40983cb1 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -6,6 +6,7 @@ const nextConfig = { "https://ph-switchboard-nginx-prod-c84ebf8c6e3b.herokuapp.com", }, basePath: process.env.BASE_PATH ?? undefined, + assetPrefix: process.env.BASE_PATH ?? undefined, }; export default nextConfig; From a897f67fdbc684f8759aa48705e5075ea3b82494 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 11:50:49 +0100 Subject: [PATCH 06/50] fix: sub dir deployment frontend --- frontend/Dockerfile | 5 ++++- frontend/src/components/header/header.tsx | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 4b196064..c3e2910f 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -18,6 +18,8 @@ WORKDIR /opt/app COPY . . COPY --from=deps /opt/app/node_modules ./node_modules RUN npm install -g pnpm +ARG BASE_PATH=undefined +ENV BASE_PATH=${BASE_PATH} RUN pnpm build # Production image, copy all the files and run next @@ -26,7 +28,8 @@ FROM node:lts-alpine AS runner ARG X_TAG WORKDIR /opt/app ENV NODE_ENV=production -ENV BASE_PATH=undefined +ARG BASE_PATH=undefined +ENV BASE_PATH=${BASE_PATH} EXPOSE 3000 COPY --from=builder /opt/app/next.config.mjs ./ COPY --from=builder /opt/app/public ./public diff --git a/frontend/src/components/header/header.tsx b/frontend/src/components/header/header.tsx index 95a02f11..23e379fb 100644 --- a/frontend/src/components/header/header.tsx +++ b/frontend/src/components/header/header.tsx @@ -6,7 +6,8 @@ import { useRouter } from "next/navigation"; import { UserCircleIcon } from "@heroicons/react/24/solid"; import Link from "next/link"; import { useEffect, useState } from "react"; - +import logo from "../../../public/assets/logo.svg"; +import github from "../../../public/assets/github.svg"; export default function Header() { const address = authStore((state) => state.address); const gqlToken = authStore((state) => state.gqlToken); @@ -40,7 +41,13 @@ export default function Header() {
- + Switchboard Logo Switchboard API
@@ -87,12 +94,7 @@ export default function Header() { href="https://github.com/powerhouse-inc/switchboard-boilerplate" target="_blank" > - GitHub + GitHub
From 2e97e6ccedc1cfd0c0c0baa64d0326e2f37210db Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 11:55:40 +0100 Subject: [PATCH 07/50] fix: updated docker build arg --- .github/workflows/build-and-deploy-staging.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy-staging.yaml b/.github/workflows/build-and-deploy-staging.yaml index c2419b4c..0b6f648c 100644 --- a/.github/workflows/build-and-deploy-staging.yaml +++ b/.github/workflows/build-and-deploy-staging.yaml @@ -30,7 +30,7 @@ jobs: dockerfile_directory: ./frontend dockerfile_name: Dockerfile process_type: web - docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" + docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }} --build-arg BASE_PATH=/makerdao/switchboard" - name: Build, Push and Release Wundergraph to Heroku. # Your custom step name uses: gonuit/heroku-docker-deploy@v1.3.3 with: From 4831ef7a54e1f0ee8876f932744e0e5b8ceb8df2 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 14:13:10 +0100 Subject: [PATCH 08/50] fix: base path --- frontend/Dockerfile | 4 ++-- frontend/next.config.mjs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index c3e2910f..05598e22 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -18,7 +18,7 @@ WORKDIR /opt/app COPY . . COPY --from=deps /opt/app/node_modules ./node_modules RUN npm install -g pnpm -ARG BASE_PATH=undefined +ARG BASE_PATH="" ENV BASE_PATH=${BASE_PATH} RUN pnpm build @@ -28,7 +28,7 @@ FROM node:lts-alpine AS runner ARG X_TAG WORKDIR /opt/app ENV NODE_ENV=production -ARG BASE_PATH=undefined +ARG BASE_PATH="" ENV BASE_PATH=${BASE_PATH} EXPOSE 3000 COPY --from=builder /opt/app/next.config.mjs ./ diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index 40983cb1..e61a732f 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -5,8 +5,8 @@ const nextConfig = { process.env.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST || "https://ph-switchboard-nginx-prod-c84ebf8c6e3b.herokuapp.com", }, - basePath: process.env.BASE_PATH ?? undefined, - assetPrefix: process.env.BASE_PATH ?? undefined, + // basePath: process.env.BASE_PATH ?? "/", + assetPrefix: process.env.BASE_PATH ?? "/", }; export default nextConfig; From 13d39d84222b825ebdb8d8090e204cc6b974f7b7 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 14:25:21 +0100 Subject: [PATCH 09/50] feat: introduce path for nginx proxy --- frontend/next.config.mjs | 2 +- nginx/Dockerfile | 3 ++- nginx/nginx.conf | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index e61a732f..b1f0a349 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -5,7 +5,7 @@ const nextConfig = { process.env.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST || "https://ph-switchboard-nginx-prod-c84ebf8c6e3b.herokuapp.com", }, - // basePath: process.env.BASE_PATH ?? "/", + basePath: process.env.BASE_PATH ?? "/", assetPrefix: process.env.BASE_PATH ?? "/", }; diff --git a/nginx/Dockerfile b/nginx/Dockerfile index ec40ce06..6c03f0c2 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,10 +1,11 @@ FROM nginx:stable ENV PORT=80 +ENV PATH="/" ENV BACKEND=https://ph-switchboard-api-prod-2f0358a27fa5.herokuapp.com ENV FRONTEND=https://ph-switchboard-frontend-prod-2030e418555a.herokuapp.com ENV WUNDERGRAPH=https://ph-switchboard-wgraph-prod-46a95adab5b7.herokuapp.com COPY nginx.conf /etc/nginx/conf.d/default.conf.template -CMD /bin/sh -c "envsubst '\$PORT,\$BACKEND,\$FRONTEND,\$WUNDERGRAPH' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;' +CMD /bin/sh -c "envsubst '\$PATH,\$PORT,\$BACKEND,\$FRONTEND,\$WUNDERGRAPH' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;' diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 1111d51e..5e88e0fa 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -5,31 +5,31 @@ server { server_name localhost; # frontend - location / { + location ${PATH} { rewrite /(.*) /$1 break; proxy_pass ${FRONTEND}; } # drives graphql endpoint - location /drives { + location ${PATH}/drives { rewrite /drives/(.*) /drives/$1 break; proxy_pass ${BACKEND}; } # drive graphql endpoint - location /d { + location ${PATH}/d { rewrite /d/(.*) /d/$1 break; proxy_pass ${BACKEND}; } # GraphQL Explorer - location /explorer { + location ${PATH}/explorer { rewrite /explorer/(.*) /explorer/$1 break; proxy_pass ${BACKEND}; } # graphql API composition - location /wundergraph/graphql { + location ${PATH}/wundergraph/graphql { rewrite /wundergraph/graphql /graphql break; proxy_pass ${WUNDERGRAPH}; } From c1ee8d16b75953fe9a409f87371349088978485f Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 14:39:23 +0100 Subject: [PATCH 10/50] feat: introduce path for nginx proxy --- nginx/Dockerfile | 4 ++-- nginx/nginx.conf | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 6c03f0c2..0a550afb 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,11 +1,11 @@ FROM nginx:stable ENV PORT=80 -ENV PATH="/" +ENV BASE_PATH="/" ENV BACKEND=https://ph-switchboard-api-prod-2f0358a27fa5.herokuapp.com ENV FRONTEND=https://ph-switchboard-frontend-prod-2030e418555a.herokuapp.com ENV WUNDERGRAPH=https://ph-switchboard-wgraph-prod-46a95adab5b7.herokuapp.com COPY nginx.conf /etc/nginx/conf.d/default.conf.template -CMD /bin/sh -c "envsubst '\$PATH,\$PORT,\$BACKEND,\$FRONTEND,\$WUNDERGRAPH' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;' +CMD /bin/sh -c "envsubst '\$BASE_PATH,\$PORT,\$BACKEND,\$FRONTEND,\$WUNDERGRAPH' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;' diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 5e88e0fa..c2862f6c 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -5,31 +5,31 @@ server { server_name localhost; # frontend - location ${PATH} { + location ${BASE_PATH} { rewrite /(.*) /$1 break; proxy_pass ${FRONTEND}; } # drives graphql endpoint - location ${PATH}/drives { + location ${BASE_PATH}/drives { rewrite /drives/(.*) /drives/$1 break; proxy_pass ${BACKEND}; } # drive graphql endpoint - location ${PATH}/d { + location ${BASE_PATH}/d { rewrite /d/(.*) /d/$1 break; proxy_pass ${BACKEND}; } # GraphQL Explorer - location ${PATH}/explorer { + location ${BASE_PATH}/explorer { rewrite /explorer/(.*) /explorer/$1 break; proxy_pass ${BACKEND}; } # graphql API composition - location ${PATH}/wundergraph/graphql { + location ${BASE_PATH}/wundergraph/graphql { rewrite /wundergraph/graphql /graphql break; proxy_pass ${WUNDERGRAPH}; } From f79b4a698b375cd3e800de81e5babffa819bbe73 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 14:49:05 +0100 Subject: [PATCH 11/50] chore: move frontend to end of nginx --- nginx/nginx.conf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index c2862f6c..d4f69f42 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -4,12 +4,6 @@ server { listen [::]:${PORT}; server_name localhost; - # frontend - location ${BASE_PATH} { - rewrite /(.*) /$1 break; - proxy_pass ${FRONTEND}; - } - # drives graphql endpoint location ${BASE_PATH}/drives { rewrite /drives/(.*) /drives/$1 break; @@ -33,5 +27,11 @@ server { rewrite /wundergraph/graphql /graphql break; proxy_pass ${WUNDERGRAPH}; } + + # frontend + location ${BASE_PATH} { + rewrite /(.*) /$1 break; + proxy_pass ${FRONTEND}; + } } From 36ada293be9f458ec762679a3294548bdde9f836 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 14:57:36 +0100 Subject: [PATCH 12/50] fix: base path --- nginx/Dockerfile | 2 +- nginx/nginx.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 0a550afb..b0d26341 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,7 +1,7 @@ FROM nginx:stable ENV PORT=80 -ENV BASE_PATH="/" +ENV BASE_PATH="" ENV BACKEND=https://ph-switchboard-api-prod-2f0358a27fa5.herokuapp.com ENV FRONTEND=https://ph-switchboard-frontend-prod-2030e418555a.herokuapp.com ENV WUNDERGRAPH=https://ph-switchboard-wgraph-prod-46a95adab5b7.herokuapp.com diff --git a/nginx/nginx.conf b/nginx/nginx.conf index d4f69f42..5118dc53 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -29,7 +29,7 @@ server { } # frontend - location ${BASE_PATH} { + location /${BASE_PATH} { rewrite /(.*) /$1 break; proxy_pass ${FRONTEND}; } From f1e742c1ad611dd8319c6434aad65a4e2dbc0881 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 15:06:59 +0100 Subject: [PATCH 13/50] fix: base path for backend routes --- nginx/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 5118dc53..9c0a685f 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -5,25 +5,25 @@ server { server_name localhost; # drives graphql endpoint - location ${BASE_PATH}/drives { + location /${BASE_PATH}/drives { rewrite /drives/(.*) /drives/$1 break; proxy_pass ${BACKEND}; } # drive graphql endpoint - location ${BASE_PATH}/d { + location /${BASE_PATH}/d { rewrite /d/(.*) /d/$1 break; proxy_pass ${BACKEND}; } # GraphQL Explorer - location ${BASE_PATH}/explorer { + location /${BASE_PATH}/explorer { rewrite /explorer/(.*) /explorer/$1 break; proxy_pass ${BACKEND}; } # graphql API composition - location ${BASE_PATH}/wundergraph/graphql { + location /${BASE_PATH}/wundergraph/graphql { rewrite /wundergraph/graphql /graphql break; proxy_pass ${WUNDERGRAPH}; } From dc674873ba749fd2cd080eac0603b180bf19dc88 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 15:16:01 +0100 Subject: [PATCH 14/50] fix: rewrites to proper base path --- nginx/Dockerfile | 2 +- nginx/nginx.conf | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/nginx/Dockerfile b/nginx/Dockerfile index b0d26341..cd827f32 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,7 +1,7 @@ FROM nginx:stable ENV PORT=80 -ENV BASE_PATH="" +ENV BASE_PATH="/makerdao/switchboard" ENV BACKEND=https://ph-switchboard-api-prod-2f0358a27fa5.herokuapp.com ENV FRONTEND=https://ph-switchboard-frontend-prod-2030e418555a.herokuapp.com ENV WUNDERGRAPH=https://ph-switchboard-wgraph-prod-46a95adab5b7.herokuapp.com diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 9c0a685f..ce1e3fb1 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -5,31 +5,31 @@ server { server_name localhost; # drives graphql endpoint - location /${BASE_PATH}/drives { - rewrite /drives/(.*) /drives/$1 break; + location ${BASE_PATH}/drives { + rewrite ${BASE_PATH}/drives/(.*) /drives/$1 break; proxy_pass ${BACKEND}; } # drive graphql endpoint - location /${BASE_PATH}/d { - rewrite /d/(.*) /d/$1 break; + location ${BASE_PATH}/d { + rewrite ${BASE_PATH}/d/(.*) /d/$1 break; proxy_pass ${BACKEND}; } # GraphQL Explorer - location /${BASE_PATH}/explorer { - rewrite /explorer/(.*) /explorer/$1 break; + location ${BASE_PATH}/explorer { + rewrite ${BASE_PATH}/explorer/(.*) /explorer/$1 break; proxy_pass ${BACKEND}; } # graphql API composition - location /${BASE_PATH}/wundergraph/graphql { - rewrite /wundergraph/graphql /graphql break; + location ${BASE_PATH}/wundergraph/graphql { + rewrite ${BASE_PATH}/wundergraph/graphql /graphql break; proxy_pass ${WUNDERGRAPH}; } # frontend - location /${BASE_PATH} { + location ${BASE_PATH} { rewrite /(.*) /$1 break; proxy_pass ${FRONTEND}; } From d8e572086deeb0e88982ad9f22c5f204a8711ffa Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 17:03:25 +0100 Subject: [PATCH 15/50] fix: rewrite rules --- nginx/Dockerfile | 2 +- nginx/nginx.conf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nginx/Dockerfile b/nginx/Dockerfile index cd827f32..0a550afb 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,7 +1,7 @@ FROM nginx:stable ENV PORT=80 -ENV BASE_PATH="/makerdao/switchboard" +ENV BASE_PATH="/" ENV BACKEND=https://ph-switchboard-api-prod-2f0358a27fa5.herokuapp.com ENV FRONTEND=https://ph-switchboard-frontend-prod-2030e418555a.herokuapp.com ENV WUNDERGRAPH=https://ph-switchboard-wgraph-prod-46a95adab5b7.herokuapp.com diff --git a/nginx/nginx.conf b/nginx/nginx.conf index ce1e3fb1..3336c147 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -6,7 +6,7 @@ server { # drives graphql endpoint location ${BASE_PATH}/drives { - rewrite ${BASE_PATH}/drives/(.*) /drives/$1 break; + rewrite ${BASE_PATH}/drives /drives break; proxy_pass ${BACKEND}; } @@ -18,7 +18,7 @@ server { # GraphQL Explorer location ${BASE_PATH}/explorer { - rewrite ${BASE_PATH}/explorer/(.*) /explorer/$1 break; + rewrite ${BASE_PATH}/explorer(.*) /explorer$1 break; proxy_pass ${BACKEND}; } From 6f88f0d45b6d6f0d8ca1874c4f8fe303f86f91e4 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 10:19:58 +0100 Subject: [PATCH 16/50] feat: added express router for base path --- api/src/app.ts | 9 +++++---- api/src/graphql/server/index.ts | 12 +++++++++--- api/src/index.ts | 4 ++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/api/src/app.ts b/api/src/app.ts index 36bb4cd2..cea42089 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -9,11 +9,12 @@ import { const logger = getChildLogger({ msgPrefix: 'APP' }); const startupTime = new Date(); -export const createApp = (): Express => { +export const createApp = (): { app: Express, router: express.Router } => { logger.debug('Creating app'); const app = express(); + const router = express.Router(); - app.get('/healthz', async (_req, res) => { + router.get('/healthz', async (_req, res) => { try { await basePrisma.user.findFirst(); } catch (error: any) { @@ -30,7 +31,7 @@ export const createApp = (): Express => { }); }); - app.get( + router.get( '/explorer/:driveId?', (req, res) => { res.setHeader('Content-Type', 'text/html') @@ -44,5 +45,5 @@ export const createApp = (): Express => { } ); - return app; + return { app, router }; }; diff --git a/api/src/graphql/server/index.ts b/api/src/graphql/server/index.ts index fa16efab..522fde54 100644 --- a/api/src/graphql/server/index.ts +++ b/api/src/graphql/server/index.ts @@ -12,6 +12,7 @@ import { schemaWithMiddleware as driveSchema } from './drive/schema'; import { Context as IndexContext, createContext as createIndexContext } from './index/context'; import { Context as DriveContext, createContext as createDriveContext } from './drive/context'; import { getChildLogger } from '../../logger'; +import { renderPlaygroundPage } from 'graphql-playground-html'; const logger = getChildLogger({ msgPrefix: 'SERVER' }); @@ -43,16 +44,17 @@ const createApolloDriveServer = (): ApolloServer => new ApolloServ export const startServer = async ( app: express.Application, + router: express.Router, ): Promise => { logger.debug('Starting server'); - const httpServer = createHttpServer(app); + const apolloIndex = createApolloIndexServer(); const apolloDrive = createApolloDriveServer(); await apolloIndex.start(); await apolloDrive.start(); - app.use( + router.use( '/drives', cors(), cookierParser(undefined, { decode: (value: string) => value }), @@ -62,7 +64,7 @@ export const startServer = async ( }), ); - app.use( + router.use( '/d/:driveId', cors(), cookierParser(undefined, { decode: (value: string) => value }), @@ -72,6 +74,10 @@ export const startServer = async ( }), ); + const basePath = process.env.BASE_PATH || '/'; + app.use(basePath, router); + + const httpServer = createHttpServer(app); return httpServer.listen({ port: PORT }, () => { logger.info(`Running on ${PORT}`); }); diff --git a/api/src/index.ts b/api/src/index.ts index af367c3a..f0aed6e4 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -4,10 +4,10 @@ import { getChildLogger } from './logger'; const logger = getChildLogger({ msgPrefix: 'SERVER' }); -const application = createApp(); +const { app, router } = createApp(); /* istanbul ignore next @preserve */ -startServer(application) +startServer(app, router) .then((e) => { // Hot Module Replacement if (import.meta.hot) { From 5b7332dd098741e84c95add8e11d166fe6f50ea0 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 10:26:03 +0100 Subject: [PATCH 17/50] fix: removed rewrite rules --- nginx/nginx.conf | 3 --- 1 file changed, 3 deletions(-) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 3336c147..559d1bd2 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -6,19 +6,16 @@ server { # drives graphql endpoint location ${BASE_PATH}/drives { - rewrite ${BASE_PATH}/drives /drives break; proxy_pass ${BACKEND}; } # drive graphql endpoint location ${BASE_PATH}/d { - rewrite ${BASE_PATH}/d/(.*) /d/$1 break; proxy_pass ${BACKEND}; } # GraphQL Explorer location ${BASE_PATH}/explorer { - rewrite ${BASE_PATH}/explorer(.*) /explorer$1 break; proxy_pass ${BACKEND}; } From aaeaa3183e5799ba2a927bad096da90a683be6b9 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 11:04:07 +0100 Subject: [PATCH 18/50] feat: added basepath to explorer endpoint --- api/src/app.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/src/app.ts b/api/src/app.ts index cea42089..5343bbf7 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -35,7 +35,8 @@ export const createApp = (): { app: Express, router: express.Router } => { '/explorer/:driveId?', (req, res) => { res.setHeader('Content-Type', 'text/html') - const endpoint = req.params.driveId !== undefined ? `/d/${req.params.driveId}` : '/drives' + const basePath = process.env.BASE_PATH === "/" ? "" : process.env.BASE_PATH || ''; + const endpoint = basePath + req.params.driveId !== undefined ? `/d/${req.params.driveId}` : '/drives' res.send(renderPlaygroundPage({ endpoint: endpoint, settings: { From 3a731ace09116084e501192419affd1b43673547 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 11:25:30 +0100 Subject: [PATCH 19/50] fix: endpoint base path --- api/src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/app.ts b/api/src/app.ts index 5343bbf7..17faead3 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -36,7 +36,7 @@ export const createApp = (): { app: Express, router: express.Router } => { (req, res) => { res.setHeader('Content-Type', 'text/html') const basePath = process.env.BASE_PATH === "/" ? "" : process.env.BASE_PATH || ''; - const endpoint = basePath + req.params.driveId !== undefined ? `/d/${req.params.driveId}` : '/drives' + const endpoint = `${basePath}${req.params.driveId !== undefined ? `/d/${req.params.driveId}` : '/drives'}` res.send(renderPlaygroundPage({ endpoint: endpoint, settings: { From c1d965242882c81c054ea20abdd4333c5f65b3e6 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 12:02:24 +0100 Subject: [PATCH 20/50] fix: base path nginx router switchboard --- nginx/Dockerfile | 2 +- nginx/nginx.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nginx/Dockerfile b/nginx/Dockerfile index 0a550afb..b0d26341 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,7 +1,7 @@ FROM nginx:stable ENV PORT=80 -ENV BASE_PATH="/" +ENV BASE_PATH="" ENV BACKEND=https://ph-switchboard-api-prod-2f0358a27fa5.herokuapp.com ENV FRONTEND=https://ph-switchboard-frontend-prod-2030e418555a.herokuapp.com ENV WUNDERGRAPH=https://ph-switchboard-wgraph-prod-46a95adab5b7.herokuapp.com diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 559d1bd2..0c5aefe2 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -26,7 +26,7 @@ server { } # frontend - location ${BASE_PATH} { + location / { rewrite /(.*) /$1 break; proxy_pass ${FRONTEND}; } From e42b3e1f7250845387f281c2ab542417f641a8d4 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 12:51:55 +0100 Subject: [PATCH 21/50] fix: favicon path --- frontend/next.config.mjs | 1 + frontend/src/app/favicon.ico | Bin 25931 -> 0 bytes frontend/src/app/layout.tsx | 9 ++++++--- 3 files changed, 7 insertions(+), 3 deletions(-) delete mode 100644 frontend/src/app/favicon.ico diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index b1f0a349..ec83b899 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -4,6 +4,7 @@ const nextConfig = { NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST: process.env.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST || "https://ph-switchboard-nginx-prod-c84ebf8c6e3b.herokuapp.com", + NEXT_PUBLIC_BASE_PATH: process.env.BASE_PATH ?? "/", }, basePath: process.env.BASE_PATH ?? "/", assetPrefix: process.env.BASE_PATH ?? "/", diff --git a/frontend/src/app/favicon.ico b/frontend/src/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 8ed1b257..ad0a686b 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -22,16 +22,19 @@ export default function RootLayout({ + -
From 75fb4ef3f6de73ac864b18b68c2c1d5faf77b8e1 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 12:57:31 +0100 Subject: [PATCH 22/50] fix: base path for assets --- frontend/next.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs index ec83b899..e2f5615a 100644 --- a/frontend/next.config.mjs +++ b/frontend/next.config.mjs @@ -4,7 +4,7 @@ const nextConfig = { NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST: process.env.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST || "https://ph-switchboard-nginx-prod-c84ebf8c6e3b.herokuapp.com", - NEXT_PUBLIC_BASE_PATH: process.env.BASE_PATH ?? "/", + NEXT_PUBLIC_BASE_PATH: process.env.BASE_PATH ?? "", }, basePath: process.env.BASE_PATH ?? "/", assetPrefix: process.env.BASE_PATH ?? "/", From 58eb798086855e64627789bce824a2129ce9f244 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 20 Mar 2024 10:14:27 +0100 Subject: [PATCH 23/50] ci: added arbitrum deployment pipeline --- .../build-and-deploy-arbitrum-prod.yaml | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/build-and-deploy-arbitrum-prod.yaml diff --git a/.github/workflows/build-and-deploy-arbitrum-prod.yaml b/.github/workflows/build-and-deploy-arbitrum-prod.yaml new file mode 100644 index 00000000..d876ee58 --- /dev/null +++ b/.github/workflows/build-and-deploy-arbitrum-prod.yaml @@ -0,0 +1,42 @@ +name: Deploy Switchboard Arbitrum + +on: + push: + branches: [deployments/arbitrum] +jobs: + build: + environment: Arbitrum Production + runs-on: ubuntu-latest + steps: + # Check-out your repository. + - name: Checkout + uses: actions/checkout@v2 + + - name: Build, Push and Release API to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_API_NAME }} + dockerfile_directory: ./api + dockerfile_name: Dockerfile + process_type: web + - name: Build, Push and Release Frontend to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_FRONTEND_NAME }} + dockerfile_directory: ./frontend + dockerfile_name: Dockerfile + process_type: web + docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" + - name: Build, Push and Release NGINX to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_NGINX_NAME }} + dockerfile_directory: ./nginx + dockerfile_name: Dockerfile + process_type: web From b495d472e18bafbc17bdab15bc10f3774ccc6c75 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 20 Mar 2024 16:39:19 +0100 Subject: [PATCH 24/50] chore: removed codeowners file --- CODEOWNERS | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 38538df5..00000000 --- a/CODEOWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# All the files under /.github/workflows belong to the sidestream team members to prevent malicious changes to the pipeline -/.github/workflows/ @DeusAvalon @valiafetisov @BracketJohn From 4f48407f2eb043812d6bdcef1995bb097007c4e1 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 15:22:42 +0100 Subject: [PATCH 25/50] cicd: added staging deployment --- .../build-and-deploy-arbitrum-staging.yaml | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/build-and-deploy-arbitrum-staging.yaml diff --git a/.github/workflows/build-and-deploy-arbitrum-staging.yaml b/.github/workflows/build-and-deploy-arbitrum-staging.yaml new file mode 100644 index 00000000..63239f8d --- /dev/null +++ b/.github/workflows/build-and-deploy-arbitrum-staging.yaml @@ -0,0 +1,42 @@ +name: Deploy Switchboard Arbitrum Staging + +on: + push: + branches: [arb-ltip] +jobs: + build: + environment: Arbitrum Staging + runs-on: ubuntu-latest + steps: + # Check-out your repository. + - name: Checkout + uses: actions/checkout@v2 + + - name: Build, Push and Release API to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_API_NAME }} + dockerfile_directory: ./api + dockerfile_name: Dockerfile + process_type: web + - name: Build, Push and Release Frontend to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_FRONTEND_NAME }} + dockerfile_directory: ./frontend + dockerfile_name: Dockerfile + process_type: web + docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" + - name: Build, Push and Release NGINX to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_NGINX_NAME }} + dockerfile_directory: ./nginx + dockerfile_name: Dockerfile + process_type: web From 34596c573fadf9d812882bf5ccf3c8c09c3af0d4 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 27 Mar 2024 11:52:16 +0100 Subject: [PATCH 26/50] chore: bump deps --- api/package.json | 12 +- api/pnpm-lock.yaml | 1450 +++++++++++++++++++++++++++++--------------- 2 files changed, 952 insertions(+), 510 deletions(-) diff --git a/api/package.json b/api/package.json index e6d24177..738d0515 100644 --- a/api/package.json +++ b/api/package.json @@ -15,18 +15,18 @@ "watch": "vitest watch" }, "dependencies": { - "@apollo/server": "^4.10.1", + "@apollo/server": "^4.10.2", "@prisma/client": "5.8.1", "@types/cookie-parser": "^1.4.7", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "document-drive": "1.0.0-alpha.17", - "document-model": "^1.0.31", - "document-model-libs": "^1.8.0", + "document-model": "^1.0.32", + "document-model-libs": "^1.15.0", "dotenv": "^16.4.5", "ethers": "^5.7.2", - "express": "^4.18.3", + "express": "^4.19.2", "graphql": "^16.8.1", "graphql-middleware": "^6.1.35", "graphql-playground-html": "^1.6.30", @@ -41,7 +41,7 @@ "pino-pretty": "^10.3.1", "siwe": "^2.1.4", "vite-node": "^0.29.8", - "vitest": "^0.31.4", + "vitest": "^0.32.4", "wildcard-match": "^5.1.3", "zod": "^3.22.4" }, @@ -51,7 +51,7 @@ "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.6", "@types/ms": "^0.7.34", - "@types/node": "^18.19.24", + "@types/node": "^18.19.26", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@vitest/coverage-istanbul": "^0.29.8", diff --git a/api/pnpm-lock.yaml b/api/pnpm-lock.yaml index abc21125..0360874a 100644 --- a/api/pnpm-lock.yaml +++ b/api/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: dependencies: '@apollo/server': - specifier: ^4.10.1 - version: 4.10.1(graphql@16.8.1) + specifier: ^4.10.2 + version: 4.10.2(graphql@16.8.1) '@prisma/client': specifier: 5.8.1 version: 5.8.1(prisma@5.8.1) @@ -25,13 +25,13 @@ dependencies: version: 2.8.5 document-drive: specifier: 1.0.0-alpha.17 - version: 1.0.0-alpha.17(@prisma/client@5.8.1)(document-model-libs@1.8.0)(document-model@1.0.31)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7) + version: 1.0.0-alpha.17(@prisma/client@5.8.1)(document-model-libs@1.15.0)(document-model@1.0.32)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7) document-model: - specifier: ^1.0.31 - version: 1.0.31 + specifier: ^1.0.32 + version: 1.0.32 document-model-libs: - specifier: ^1.8.0 - version: 1.8.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.15.0 + version: 1.15.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -39,8 +39,8 @@ dependencies: specifier: ^5.7.2 version: 5.7.2 express: - specifier: ^4.18.3 - version: 4.18.3 + specifier: ^4.19.2 + version: 4.19.2 graphql: specifier: ^16.8.1 version: 16.8.1 @@ -52,7 +52,7 @@ dependencies: version: 1.6.30 graphql-playground-middleware-express: specifier: ^1.7.23 - version: 1.7.23(express@4.18.3) + version: 1.7.23(express@4.19.2) json-stringify-deterministic: specifier: ^1.0.12 version: 1.0.12 @@ -82,10 +82,10 @@ dependencies: version: 2.1.4(ethers@5.7.2) vite-node: specifier: ^0.29.8 - version: 0.29.8(@types/node@18.19.24) + version: 0.29.8(@types/node@18.19.26) vitest: - specifier: ^0.31.4 - version: 0.31.4 + specifier: ^0.32.4 + version: 0.32.4 wildcard-match: specifier: ^5.1.3 version: 5.1.3 @@ -110,8 +110,8 @@ devDependencies: specifier: ^0.7.34 version: 0.7.34 '@types/node': - specifier: ^18.19.24 - version: 18.19.24 + specifier: ^18.19.26 + version: 18.19.26 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5) @@ -120,7 +120,7 @@ devDependencies: version: 5.62.0(eslint@8.57.0)(typescript@4.9.5) '@vitest/coverage-istanbul': specifier: ^0.29.8 - version: 0.29.8(vitest@0.31.4) + version: 0.29.8(vitest@0.32.4) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -147,7 +147,7 @@ devDependencies: version: 4.9.5 vitest-mock-extended: specifier: ^1.3.1 - version: 1.3.1(typescript@4.9.5)(vitest@0.31.4) + version: 1.3.1(typescript@4.9.5)(vitest@0.32.4) packages: @@ -173,6 +173,10 @@ packages: - supports-color dev: false + /@adobe/css-tools@4.3.3: + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + dev: false + /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -219,8 +223,8 @@ packages: graphql: 16.8.1 dev: false - /@apollo/server@4.10.1(graphql@16.8.1): - resolution: {integrity: sha512-XGMOgTyzV4EBHQq0xQVKFry9hZF7AA/6nxxGLamqdxodhdSdGbU9jrlb5/XDveeGuXP3+5JDdrB2HcziVLJcMA==} + /@apollo/server@4.10.2(graphql@16.8.1): + resolution: {integrity: sha512-qlTZE4XyzMPprtkxFjmPxMwc2KC4nvNQrKXk2PMotEACKcaLXVZFIgstxbSqBCNl2KgzbsgU1g6vvbV6Xcfikw==} engines: {node: '>=14.16.0'} peerDependencies: graphql: ^16.6.0 @@ -242,7 +246,7 @@ packages: '@types/node-fetch': 2.6.11 async-retry: 1.3.3 cors: 2.8.5 - express: 4.18.3 + express: 4.19.2 graphql: 16.8.1 loglevel: 1.9.1 lru-cache: 7.18.3 @@ -365,13 +369,13 @@ packages: peerDependencies: graphql: '*' dependencies: - '@babel/core': 7.24.0 - '@babel/generator': 7.23.6 - '@babel/parser': 7.24.0 - '@babel/runtime': 7.24.0 - '@babel/traverse': 7.24.0 + '@babel/core': 7.24.3 + '@babel/generator': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/runtime': 7.24.1 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.24.0) + babel-preset-fbjs: 3.4.0(@babel/core@7.24.3) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5 @@ -388,30 +392,30 @@ packages: - supports-color dev: false - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + /@babel/compat-data@7.24.1: + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.0: - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4 @@ -421,8 +425,8 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 @@ -441,25 +445,25 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.24.1 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.24.0): - resolution: {integrity: sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==} + /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 @@ -489,21 +493,21 @@ packages: '@babel/types': 7.24.0 dev: false - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 @@ -520,13 +524,13 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helper-replace-supers@7.22.20(@babel/core@7.24.0): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -551,8 +555,8 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: @@ -563,318 +567,319 @@ packages: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.24.0: - resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 + '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.0 - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.0): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.3): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.0): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.3): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.24.0 + '@babel/compat-data': 7.24.1 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) dev: false - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} + /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.24.0): - resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-classes@7.23.8(@babel/core@7.24.0): - resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: false - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.0 dev: false - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} + /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.3) dev: false - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.24.0): - resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: false - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 dev: false - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) dev: false - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) '@babel/types': 7.24.0 dev: false - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: false - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.24.0): - resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3): + resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.0 + '@babel/core': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 dev: false - /@babel/runtime@7.24.0: - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + /@babel/runtime@7.24.1: + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -884,21 +889,21 @@ packages: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - /@babel/traverse@7.24.0: - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 debug: 4.3.4 globals: 11.12.0 @@ -909,7 +914,7 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 + '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 @@ -1768,26 +1773,26 @@ packages: /@internationalized/date@3.5.2: resolution: {integrity: sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==} dependencies: - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 dev: false /@internationalized/message@3.1.2: resolution: {integrity: sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==} dependencies: - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 intl-messageformat: 10.5.11 dev: false /@internationalized/number@3.5.1: resolution: {integrity: sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==} dependencies: - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 dev: false /@internationalized/string@3.2.1: resolution: {integrity: sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==} dependencies: - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 dev: false /@istanbuljs/schema@0.1.3: @@ -1795,6 +1800,12 @@ packages: engines: {node: '>=8'} dev: true + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + /@josephg/resolvable@1.0.1: resolution: {integrity: sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==} dev: false @@ -1963,7 +1974,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/breadcrumbs': 3.7.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -1978,7 +1989,7 @@ packages: '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -1997,7 +2008,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/calendar': 3.4.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2017,7 +2028,7 @@ packages: '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2041,7 +2052,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/combobox': 3.10.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2069,7 +2080,7 @@ packages: '@react-types/datepicker': 3.7.2(react@18.2.0) '@react-types/dialog': 3.5.8(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2085,7 +2096,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/dialog': 3.5.8(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2105,7 +2116,7 @@ packages: '@react-stately/dnd': 3.2.8(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2118,7 +2129,7 @@ packages: '@react-aria/interactions': 3.21.1(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 clsx: 2.1.0 react: 18.2.0 dev: false @@ -2132,7 +2143,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/form': 3.0.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2155,7 +2166,7 @@ packages: '@react-types/checkbox': 3.7.1(react@18.2.0) '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2174,7 +2185,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2191,7 +2202,7 @@ packages: '@react-aria/ssr': 3.9.2(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2203,7 +2214,7 @@ packages: '@react-aria/ssr': 3.9.2(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2214,7 +2225,7 @@ packages: dependencies: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2228,7 +2239,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/link': 3.5.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2246,7 +2257,7 @@ packages: '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/listbox': 3.4.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2254,7 +2265,7 @@ packages: /@react-aria/live-announcer@3.3.2: resolution: {integrity: sha512-aOyPcsfyY9tLCBhuUaYCruwcd1IrYLc47Ou+J7wMzjeN9v4lsaEfiN12WFl8pDqOwfy6/7It2wmlm5hOuZY8wQ==} dependencies: - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 dev: false /@react-aria/menu@3.13.1(react-dom@18.2.0)(react@18.2.0): @@ -2275,7 +2286,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/menu': 3.9.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2288,7 +2299,7 @@ packages: '@react-aria/progress': 3.4.11(react@18.2.0) '@react-types/meter': 3.3.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2308,7 +2319,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/numberfield': 3.8.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2329,7 +2340,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/overlays': 3.8.5(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2344,7 +2355,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/progress': 3.5.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2362,7 +2373,7 @@ packages: '@react-stately/radio': 3.10.2(react@18.2.0) '@react-types/radio': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2378,7 +2389,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/searchfield': 3.5.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2401,7 +2412,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/select': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2418,7 +2429,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/selection': 3.14.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2430,7 +2441,7 @@ packages: dependencies: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2447,7 +2458,7 @@ packages: '@react-stately/slider': 3.5.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/slider': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2462,7 +2473,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2473,7 +2484,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2485,7 +2496,7 @@ packages: '@react-aria/toggle': 3.10.2(react@18.2.0) '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/switch': 3.5.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2510,7 +2521,7 @@ packages: '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/table': 3.9.3(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2528,7 +2539,7 @@ packages: '@react-stately/tabs': 3.6.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/tabs': 3.3.5(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2548,7 +2559,7 @@ packages: '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2566,7 +2577,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/textfield': 3.9.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2580,7 +2591,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2593,7 +2604,7 @@ packages: '@react-aria/i18n': 3.10.2(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2608,7 +2619,7 @@ packages: '@react-stately/tooltip': 3.4.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/tooltip': 3.4.7(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2620,7 +2631,7 @@ packages: '@react-aria/ssr': 3.9.2(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 clsx: 2.1.0 react: 18.2.0 dev: false @@ -2633,7 +2644,7 @@ packages: '@react-aria/interactions': 3.21.1(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2646,7 +2657,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/calendar': 3.4.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2659,7 +2670,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2669,7 +2680,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2686,7 +2697,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/combobox': 3.10.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2696,7 +2707,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2712,7 +2723,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/datepicker': 3.7.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2723,7 +2734,7 @@ packages: dependencies: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2739,7 +2750,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2752,7 +2763,7 @@ packages: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2765,7 +2776,7 @@ packages: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2777,7 +2788,7 @@ packages: '@react-stately/overlays': 3.6.5(react@18.2.0) '@react-types/menu': 3.9.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2790,7 +2801,7 @@ packages: '@react-stately/form': 3.0.1(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/numberfield': 3.8.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2801,7 +2812,7 @@ packages: dependencies: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/overlays': 3.8.5(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2814,7 +2825,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/radio': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2825,7 +2836,7 @@ packages: dependencies: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/searchfield': 3.5.3(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2839,7 +2850,7 @@ packages: '@react-stately/overlays': 3.6.5(react@18.2.0) '@react-types/select': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2851,7 +2862,7 @@ packages: '@react-stately/collections': 3.10.5(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2863,7 +2874,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/slider': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2880,7 +2891,7 @@ packages: '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/table': 3.9.3(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2892,7 +2903,7 @@ packages: '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/tabs': 3.3.5(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2903,7 +2914,7 @@ packages: dependencies: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2914,7 +2925,7 @@ packages: dependencies: '@react-stately/overlays': 3.6.5(react@18.2.0) '@react-types/tooltip': 3.4.7(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2927,7 +2938,7 @@ packages: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2936,7 +2947,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -2947,7 +2958,7 @@ packages: dependencies: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 react: 18.2.0 dev: false @@ -3194,6 +3205,9 @@ packages: react: 18.2.0 dev: false + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + /@spruceid/siwe-parser@2.0.2: resolution: {integrity: sha512-9WuA0ios2537cWYu39MMeH0O2KdrMKgKlOBUTWRTXQjCYu5B+mHCA0JkCbFaJ/0EjxoVIcYCXIW/DoPEpw+PqA==} dependencies: @@ -3224,6 +3238,99 @@ packages: resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} dev: false + /@storybook/channels@8.0.4: + resolution: {integrity: sha512-haKV+8RbiSzLjicowUfc7h2fTClZHX/nz9SRUecf4IEZUEu2T78OgM/TzqZvL7rA3+/fKqp5iI+3PN3OA75Sdg==} + dependencies: + '@storybook/client-logger': 8.0.4 + '@storybook/core-events': 8.0.4 + '@storybook/global': 5.0.0 + telejson: 7.2.0 + tiny-invariant: 1.3.3 + dev: false + + /@storybook/client-logger@8.0.4: + resolution: {integrity: sha512-2SeEg3PT/d0l/+EAVtyj9hmMLTyTPp+bRBSzxYouBjtJPM1jrdKpFagj1o3uBRovwWm9SIVX6/ZsoRC33PEV1g==} + dependencies: + '@storybook/global': 5.0.0 + dev: false + + /@storybook/core-events@8.0.4: + resolution: {integrity: sha512-1FgLacIGi9i6/fyxw7ZJDC621RK47IMaA3keH4lc11ASRzCSwJ4YOrXjBFjfPc79EF2BuX72DDJNbhj6ynfF3g==} + dependencies: + ts-dedent: 2.2.0 + dev: false + + /@storybook/csf@0.1.3: + resolution: {integrity: sha512-IPZvXXo4b3G+gpmgBSBqVM81jbp2ePOKsvhgJdhyZJtkYQCII7rg9KKLQhvBQM5sLaF1eU6r0iuwmyynC9d9SA==} + dependencies: + type-fest: 2.19.0 + dev: false + + /@storybook/global@5.0.0: + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + dev: false + + /@storybook/instrumenter@8.0.4: + resolution: {integrity: sha512-lkHv1na12oMTZvuDbzufgqrtFlV1XqdXrAAg7YXZOia/oMz6Z/XMldEqwLPUCLGVodbFJofrpE67Wtw8dNTDQg==} + dependencies: + '@storybook/channels': 8.0.4 + '@storybook/client-logger': 8.0.4 + '@storybook/core-events': 8.0.4 + '@storybook/global': 5.0.0 + '@storybook/preview-api': 8.0.4 + '@vitest/utils': 1.4.0 + util: 0.12.5 + dev: false + + /@storybook/preview-api@8.0.4: + resolution: {integrity: sha512-uZCgZ/7BZkFTNudCBWx3YPFVdReMQSZJj9EfQVhQaPmfGORHGMvZMRsQXl0ONhPy7zDD4rVQxu5dSKWmIiYoWQ==} + dependencies: + '@storybook/channels': 8.0.4 + '@storybook/client-logger': 8.0.4 + '@storybook/core-events': 8.0.4 + '@storybook/csf': 0.1.3 + '@storybook/global': 5.0.0 + '@storybook/types': 8.0.4 + '@types/qs': 6.9.14 + dequal: 2.0.3 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.12.0 + tiny-invariant: 1.3.3 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: false + + /@storybook/test@8.0.4(vitest@0.32.4): + resolution: {integrity: sha512-/uvE8Rtu7tIcuyQBUzKq7uuDCsjmADI18BApLdwo/qthmN8ERDxRSz0Ngj2gvBMQFv99At8ESi/xh6oFGu3rWg==} + dependencies: + '@storybook/client-logger': 8.0.4 + '@storybook/core-events': 8.0.4 + '@storybook/instrumenter': 8.0.4 + '@storybook/preview-api': 8.0.4 + '@testing-library/dom': 9.3.4 + '@testing-library/jest-dom': 6.4.2(vitest@0.32.4) + '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) + '@vitest/expect': 1.3.1 + '@vitest/spy': 1.4.0 + chai: 4.4.1 + util: 0.12.5 + transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - '@types/jest' + - jest + - vitest + dev: false + + /@storybook/types@8.0.4: + resolution: {integrity: sha512-OO7QY+qZFCYkItDUBACtIV32p75O7sNziAiyS1V2Oxgo7Ln7fwZwr3mJcA1ruBed6ZcrW3c87k7Xs40T2zAWcg==} + dependencies: + '@storybook/channels': 8.0.4 + '@types/express': 4.17.21 + file-system-cache: 2.3.0 + dev: false + /@swc/helpers@0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: @@ -3237,12 +3344,67 @@ packages: tslib: 2.6.2 dev: false - /@swc/helpers@0.5.6: - resolution: {integrity: sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==} + /@swc/helpers@0.5.7: + resolution: {integrity: sha512-BVvNZhx362+l2tSwSuyEUV4h7+jk9raNdoTSdLfwTshXJSaGmYKluGRJznziCI3KX02Z19DdsQrdfrpXAU3Hfg==} dependencies: tslib: 2.6.2 dev: false + /@testing-library/dom@9.3.4: + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.1 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: false + + /@testing-library/jest-dom@6.4.2(vitest@0.32.4): + resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + dependencies: + '@adobe/css-tools': 4.3.3 + '@babel/runtime': 7.24.1 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + vitest: 0.32.4 + dev: false + + /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 9.3.4 + dev: false + /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -3250,30 +3412,34 @@ packages: dev: false optional: true + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: false + /@types/bcrypt@5.0.2: resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.26 dev: true /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.24 + '@types/node': 18.19.26 /@types/chai-subset@1.3.5: resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} dependencies: - '@types/chai': 4.3.12 + '@types/chai': 4.3.14 - /@types/chai@4.3.12: - resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} + /@types/chai@4.3.14: + resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.26 /@types/cookie-parser@1.4.7: resolution: {integrity: sha512-Fvuyi354Z+uayxzIGCwYTayFKocfV7TuDYZClCdIP9ckhvAu/ixDtCB6qx2TT0FKjPLf1f3P/J1rgf6lPs64mw==} @@ -3284,7 +3450,7 @@ packages: /@types/cors@2.8.17: resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.26 dev: true /@types/debug@4.1.12: @@ -3293,11 +3459,15 @@ packages: '@types/ms': 0.7.34 dev: false + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: - '@types/node': 18.19.24 - '@types/qs': 6.9.12 + '@types/node': 18.19.26 + '@types/qs': 6.9.14 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -3306,7 +3476,7 @@ packages: dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.12 + '@types/qs': 6.9.14 '@types/serve-static': 1.15.5 /@types/http-errors@2.0.4: @@ -3323,7 +3493,7 @@ packages: /@types/jsonwebtoken@9.0.6: resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.26 dev: true /@types/long@4.0.2: @@ -3342,17 +3512,17 @@ packages: /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.26 form-data: 4.0.0 dev: false - /@types/node@18.19.24: - resolution: {integrity: sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw==} + /@types/node@18.19.26: + resolution: {integrity: sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==} dependencies: undici-types: 5.26.5 - /@types/qs@6.9.12: - resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} + /@types/qs@6.9.14: + resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} /@types/range-parser@1.2.7: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3365,14 +3535,14 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.24 + '@types/node': 18.19.26 /@types/serve-static@1.15.5: resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 18.19.24 + '@types/node': 18.19.26 /@types/validator@13.11.9: resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} @@ -3512,7 +3682,7 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitest/coverage-istanbul@0.29.8(vitest@0.31.4): + /@vitest/coverage-istanbul@0.29.8(vitest@0.32.4): resolution: {integrity: sha512-ZCBDQFM8Quu5yQN2BNhTRL2XHxzghE1aH2pUctwrCDcafabpLE2CV8KaYHg1bBVNIKGtyLqQagv4E455uAn6dw==} peerDependencies: vitest: '>=0.28.0 <1' @@ -3523,44 +3693,81 @@ packages: istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.7 test-exclude: 6.0.0 - vitest: 0.31.4 + vitest: 0.32.4 transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@0.31.4: - resolution: {integrity: sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==} + /@vitest/expect@0.32.4: + resolution: {integrity: sha512-m7EPUqmGIwIeoU763N+ivkFjTzbaBn0n9evsTOcde03ugy2avPs3kZbYmw3DkcH1j5mxhMhdamJkLQ6dM1bk/A==} + dependencies: + '@vitest/spy': 0.32.4 + '@vitest/utils': 0.32.4 + chai: 4.4.1 + + /@vitest/expect@1.3.1: + resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} dependencies: - '@vitest/spy': 0.31.4 - '@vitest/utils': 0.31.4 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 chai: 4.4.1 + dev: false - /@vitest/runner@0.31.4: - resolution: {integrity: sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==} + /@vitest/runner@0.32.4: + resolution: {integrity: sha512-cHOVCkiRazobgdKLnczmz2oaKK9GJOw6ZyRcaPdssO1ej+wzHVIkWiCiNacb3TTYPdzMddYkCgMjZ4r8C0JFCw==} dependencies: - '@vitest/utils': 0.31.4 - concordance: 5.0.4 + '@vitest/utils': 0.32.4 p-limit: 4.0.0 pathe: 1.1.2 - /@vitest/snapshot@0.31.4: - resolution: {integrity: sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==} + /@vitest/snapshot@0.32.4: + resolution: {integrity: sha512-IRpyqn9t14uqsFlVI2d7DFMImGMs1Q9218of40bdQQgMePwVdmix33yMNnebXcTzDU5eiV3eUsoxxH5v0x/IQA==} dependencies: magic-string: 0.30.8 pathe: 1.1.2 - pretty-format: 27.5.1 + pretty-format: 29.7.0 + + /@vitest/spy@0.32.4: + resolution: {integrity: sha512-oA7rCOqVOOpE6rEoXuCOADX7Lla1LIa4hljI2MSccbpec54q+oifhziZIJXxlE/CvI2E+ElhBHzVu0VEvJGQKQ==} + dependencies: + tinyspy: 2.2.1 - /@vitest/spy@0.31.4: - resolution: {integrity: sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==} + /@vitest/spy@1.3.1: + resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} dependencies: tinyspy: 2.2.1 + dev: false + + /@vitest/spy@1.4.0: + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + dependencies: + tinyspy: 2.2.1 + dev: false - /@vitest/utils@0.31.4: - resolution: {integrity: sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==} + /@vitest/utils@0.32.4: + resolution: {integrity: sha512-Gwnl8dhd1uJ+HXrYyV0eRqfmk9ek1ASE/LWfTCuWMw+d07ogHqp4hEAV28NiecimK6UY9DpSEPh+pXBA5gtTBg==} dependencies: - concordance: 5.0.4 + diff-sequences: 29.6.3 loupe: 2.3.7 - pretty-format: 27.5.1 + pretty-format: 29.7.0 + + /@vitest/utils@1.3.1: + resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: false + + /@vitest/utils@1.4.0: + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: false /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -3687,25 +3894,37 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.3 + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: false + /array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 dev: true @@ -3715,25 +3934,15 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - - /array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 dev: true @@ -3743,7 +3952,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-shim-unscopables: 1.0.2 dev: true @@ -3753,7 +3962,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-shim-unscopables: 1.0.2 dev: true @@ -3764,7 +3973,7 @@ packages: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -3802,44 +4011,43 @@ packages: engines: {node: '>= 0.4'} dependencies: possible-typed-array-names: 1.0.0 - dev: true /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: false - /babel-preset-fbjs@3.4.0(@babel/core@7.24.0): + /babel-preset-fbjs@3.4.0(@babel/core@7.24.3): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.0) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.0) - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.0) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.24.0) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.24.0) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.0) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.24.0) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.24.0) + '@babel/core': 7.24.3 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.3) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) + '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 dev: false @@ -3868,9 +4076,6 @@ packages: readable-stream: 3.6.2 dev: false - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} dev: false @@ -3921,8 +4126,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001597 - electron-to-chromium: 1.4.704 + caniuse-lite: 1.0.30001600 + electron-to-chromium: 1.4.717 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -3980,7 +4185,7 @@ packages: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 6.2.0 + tar: 6.2.1 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird @@ -4014,8 +4219,8 @@ packages: engines: {node: '>=6'} dev: false - /caniuse-lite@1.0.30001597: - resolution: {integrity: sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==} + /caniuse-lite@1.0.30001600: + resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -4045,6 +4250,14 @@ packages: escape-string-regexp: 1.0.5 supports-color: 5.5.0 + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -4168,19 +4381,6 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.3.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.6.0 - well-known-symbols: 2.0.0 - /confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: true @@ -4231,8 +4431,8 @@ packages: engines: {node: '>= 0.6'} dev: false - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} dev: false @@ -4278,6 +4478,10 @@ packages: which: 2.0.2 dev: true + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: false + /cssfilter@0.0.10: resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} dev: false @@ -4287,20 +4491,41 @@ packages: engines: {node: '>= 12'} dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + /dataloader@2.1.0: resolution: {integrity: sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ==} dev: false - /date-fns@3.4.0: - resolution: {integrity: sha512-Akz4R8J9MXBsOgF1QeWeCsbv6pntT5KCPjU0Q9prBxVmWJYPLhwAIsNg3b0QAdr0ttiozYLD3L/af7Ra0jqYXw==} + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} dev: false - /date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: false @@ -4356,6 +4581,30 @@ packages: dependencies: type-detect: 4.0.8 + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.6 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + dev: false + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -4384,7 +4633,6 @@ packages: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -4406,16 +4654,25 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} dev: false + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4437,7 +4694,7 @@ packages: esutils: 2.0.3 dev: true - /document-drive@1.0.0-alpha.17(@prisma/client@5.8.1)(document-model-libs@1.8.0)(document-model@1.0.31)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7): + /document-drive@1.0.0-alpha.17(@prisma/client@5.8.1)(document-model-libs@1.15.0)(document-model@1.0.32)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7): resolution: {integrity: sha512-TCh2Os+ugxza2CbhWB0x5lPVwuQGStp/n5t8Wgq8TDvNJO2pimZSxL+X+kaNYjdGKUXebNcKo4CkzDKEN2OGQQ==} peerDependencies: '@prisma/client': 5.8.1 @@ -4448,8 +4705,8 @@ packages: sqlite3: ^5.1.7 dependencies: '@prisma/client': 5.8.1(prisma@5.8.1) - document-model: 1.0.31 - document-model-libs: 1.8.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0) + document-model: 1.0.32 + document-model-libs: 1.15.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) json-stringify-deterministic: 1.0.12 @@ -4462,8 +4719,8 @@ packages: - encoding dev: false - /document-model-libs@1.8.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tz6MH8tyaNkVwqe6rHTIqE1m2CKYXyrKgScy2dXrIM5EDEG/V9BH4ee9I/mqCo9l4VO96C7ckG+7p0xk0xHmGg==} + /document-model-libs@1.15.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4): + resolution: {integrity: sha512-SIN4bf/3+4el3b22GwQFz5+sKCV+Fl8GdvYzcV7DvqqosUtadSH4d1Vn1mQ+wGdC3iy1fEbfIVbPvCShHlLQdw==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 @@ -4472,24 +4729,29 @@ packages: '@graphql-codegen/core': 4.0.2(graphql@16.8.1) '@graphql-codegen/typescript': 4.0.6(graphql@16.8.1) '@internationalized/date': 3.5.2 + '@storybook/test': 8.0.4(vitest@0.32.4) copy-anything: 3.0.5 - date-fns: 3.4.0 + date-fns: 3.6.0 deep-object-diff: 1.1.9 - document-model: 1.0.31 jsonc-parser: 3.2.1 jszip: 3.10.1 react: 18.2.0 react-aria-components: 1.1.1(react-dom@18.2.0)(react@18.2.0) react-dom: 18.2.0(react@18.2.0) - tailwind-merge: 2.2.1 + tailwind-merge: 2.2.2 transitivePeerDependencies: + - '@jest/globals' + - '@types/bun' + - '@types/jest' - encoding - graphql + - jest - supports-color + - vitest dev: false - /document-model@1.0.31: - resolution: {integrity: sha512-E2SB1iNcKJfNWPjSCDFLnEFnA4HmwUF7oWwnXdX58KvryPyqTjkShIKkvbpyKYzyx54fsQid013hYkvKRVBuqw==} + /document-model@1.0.32: + resolution: {integrity: sha512-TLmOm6XGWtp5i8Idu3UDjy5n6vbG7Av2ETqM+8tlY6nA/zUWm6fKesciu9BHGL+kncHRWXcv8cprrYiuoWtmDg==} dependencies: immer: 10.0.4 json-stringify-deterministic: 1.0.12 @@ -4498,6 +4760,14 @@ packages: zod: 3.22.4 dev: false + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: false + + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: false + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: @@ -4529,8 +4799,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.704: - resolution: {integrity: sha512-OK01+86Qvby1V6cTiowVbhp25aX4DLZnwar+NocAOXdzKAByd+jq5156bmo4kHwevWMknznW18Y/Svfk2dU91A==} + /electron-to-chromium@1.4.717: + resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==} /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -4581,16 +4851,20 @@ packages: dev: false optional: true - /es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + /es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 @@ -4605,6 +4879,7 @@ packages: internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 + is-data-view: 1.0.1 is-negative-zero: 2.0.3 is-regex: 1.1.4 is-shared-array-buffer: 1.0.3 @@ -4617,21 +4892,17 @@ packages: regexp.prototype.flags: 1.5.2 safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 dev: true - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -4642,6 +4913,27 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: false + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -4723,7 +5015,7 @@ packages: eslint: 8.57.0 eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) object.assign: 4.1.5 - object.entries: 1.1.7 + object.entries: 1.1.8 semver: 6.3.1 dev: true @@ -4792,8 +5084,8 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 @@ -4805,9 +5097,9 @@ packages: is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 transitivePeerDependencies: @@ -4917,9 +5209,16 @@ packages: engines: {node: '>=4.0'} dev: true + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + dev: true /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} @@ -4979,8 +5278,8 @@ packages: engines: {node: '>=6'} dev: false - /express@4.18.3: - resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==} + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 @@ -4988,7 +5287,7 @@ packages: body-parser: 1.20.2 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.5.0 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -5023,17 +5322,14 @@ packages: engines: {node: ^10.17.0 || ^12.0.0 || >= 13.7.0} dev: true - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + /fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} dev: false /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5053,8 +5349,8 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-redact@3.4.0: - resolution: {integrity: sha512-2gwPvyna0zwBdxKnng1suu/dTL5s8XEy2ZqH8mwDUwJdDkV8w5kp+JV26mupdK68HmPMbm6yjW9m7/Ys/BHEHg==} + /fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} dev: false @@ -5107,6 +5403,13 @@ packages: flat-cache: 3.2.0 dev: true + /file-system-cache@2.3.0: + resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + dependencies: + fs-extra: 11.1.1 + ramda: 0.29.0 + dev: false + /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: false @@ -5166,7 +5469,6 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - dev: true /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} @@ -5207,6 +5509,15 @@ packages: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -5233,13 +5544,12 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 functions-have-names: 1.2.3 dev: true /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} @@ -5359,7 +5669,6 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} requiresBuild: true dev: false - optional: true /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -5387,12 +5696,12 @@ packages: xss: 1.0.15 dev: false - /graphql-playground-middleware-express@1.7.23(express@4.18.3): + /graphql-playground-middleware-express@1.7.23(express@4.19.2): resolution: {integrity: sha512-M/zbTyC1rkgiQjFSgmzAv6umMHOphYLNWZp6Ye5QrD77WfGOOoSqDsVmGUczc2pDkEPEzzGB/bvBO5rdzaTRgw==} peerDependencies: express: ^4.16.2 dependencies: - express: 4.18.3 + express: 4.19.2 graphql-playground-html: 1.6.30 dev: false @@ -5438,7 +5747,6 @@ packages: /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -5466,7 +5774,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} @@ -5620,7 +5927,6 @@ packages: engines: {node: '>=8'} requiresBuild: true dev: false - optional: true /infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} @@ -5653,7 +5959,6 @@ packages: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true /intl-messageformat@10.5.11: resolution: {integrity: sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==} @@ -5693,19 +5998,25 @@ packages: is-windows: 1.0.2 dev: false + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: false + /is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -5713,12 +6024,10 @@ packages: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - dev: true /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -5726,12 +6035,18 @@ packages: hasown: 2.0.2 dev: true + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - dev: true /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -5744,6 +6059,13 @@ packages: requiresBuild: true dev: false + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: false + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -5763,6 +6085,11 @@ packages: tslib: 2.6.2 dev: false + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: false + /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -5773,7 +6100,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - dev: true /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -5791,7 +6117,6 @@ packages: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true /is-relative@1.0.0: resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} @@ -5800,33 +6125,34 @@ packages: is-unc-path: 1.0.0 dev: false + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: false + /is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 - dev: true /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 - dev: true /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.15 - dev: true /is-unc-path@1.0.0: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} @@ -5841,12 +6167,25 @@ packages: tslib: 2.6.2 dev: false + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: false + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.7 dev: true + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: false + /is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -5863,7 +6202,6 @@ packages: /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -5877,8 +6215,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.0 - '@babel/parser': 7.24.0 + '@babel/core': 7.24.3 + '@babel/parser': 7.24.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -5927,10 +6265,6 @@ packages: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} dev: false - /js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5984,6 +6318,14 @@ packages: /jsonc-parser@3.2.1: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + /jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -6112,6 +6454,7 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false /loglevel@1.9.1: resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} @@ -6162,6 +6505,11 @@ packages: engines: {node: '>=12'} dev: false + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: false + /magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -6207,17 +6555,21 @@ packages: engines: {node: '>=0.10.0'} dev: false - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 + /map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + dev: false /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: false + /memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + dependencies: + map-or-similar: 1.5.0 + dev: false + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false @@ -6267,6 +6619,11 @@ packages: engines: {node: '>=10'} dev: false + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: false + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: false @@ -6368,7 +6725,7 @@ packages: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.4.0 + ufo: 1.5.3 /moment-timezone@0.5.45: resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} @@ -6497,7 +6854,7 @@ packages: npmlog: 6.0.2 rimraf: 3.0.2 semver: 7.6.0 - tar: 6.2.0 + tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -6546,10 +6903,17 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: false + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - dev: true /object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} @@ -6559,43 +6923,42 @@ packages: define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true - /object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: - array.prototype.filter: 1.0.3 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - es-errors: 1.3.0 + es-abstract: 1.23.2 dev: true - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true /on-exit-leak-free@2.1.2: @@ -6799,7 +7162,7 @@ packages: dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 3.0.1 + fast-copy: 3.0.2 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 @@ -6822,7 +7185,7 @@ packages: hasBin: true dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.4.0 + fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 @@ -6844,22 +7207,21 @@ packages: /possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - dev: true - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} hasBin: true dependencies: - detect-libc: 2.0.2 + detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 @@ -6885,6 +7247,15 @@ packages: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + dev: false + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 /prisma@5.8.1: resolution: {integrity: sha512-N6CpjzECnUHZ5beeYpDzkt2rYpEdAeqXX2dweu6BoQaeYkNZrC/WJHM+5MO/uidFHTak8QhkPKBWck1o/4MD4A==} @@ -6960,6 +7331,13 @@ packages: side-channel: 1.0.6 dev: false + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -6968,6 +7346,10 @@ packages: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: false + /ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + dev: false + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -7013,7 +7395,7 @@ packages: '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/table': 3.9.3(react@18.2.0) - '@swc/helpers': 0.5.6 + '@swc/helpers': 0.5.7 client-only: 0.0.1 react: 18.2.0 react-aria: 3.32.1(react-dom@18.2.0)(react@18.2.0) @@ -7081,6 +7463,10 @@ packages: /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} /react-stately@3.30.1(react@18.2.0): resolution: {integrity: sha512-IEhKHMT7wijtczA5vtw/kdq9CZuOIF+ReoSimydTFiABRQxWO9ESAl/fToXOUM9qmCdhdqjGJgMAhqTnmheh8g==} @@ -7157,6 +7543,14 @@ packages: engines: {node: '>= 12.13.0'} dev: false + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: false + /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} dev: false @@ -7169,12 +7563,11 @@ packages: define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: @@ -7435,7 +7828,6 @@ packages: es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -7559,8 +7951,8 @@ packages: atomic-sleep: 1.0.0 dev: false - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} /source-map@0.6.1: @@ -7592,7 +7984,7 @@ packages: bindings: 1.5.0 node-addon-api: 7.1.0 prebuild-install: 7.1.2 - tar: 6.2.0 + tar: 6.2.1 optionalDependencies: node-gyp: 8.4.1 transitivePeerDependencies: @@ -7620,6 +8012,13 @@ packages: /std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.7 + dev: false + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7630,29 +8029,31 @@ packages: strip-ansi: 6.0.1 dev: false - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.2 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 dev: true /string_decoder@1.1.1: @@ -7678,6 +8079,13 @@ packages: engines: {node: '>=4'} dev: true + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: false + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -7715,10 +8123,10 @@ packages: tslib: 2.6.2 dev: false - /tailwind-merge@2.2.1: - resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} + /tailwind-merge@2.2.2: + resolution: {integrity: sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.1 dev: false /tar-fs@2.1.1: @@ -7741,8 +8149,8 @@ packages: readable-stream: 3.6.2 dev: false - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -7753,6 +8161,12 @@ packages: yallist: 4.0.0 dev: false + /telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + dependencies: + memoizerific: 1.11.3 + dev: false + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -7772,9 +8186,9 @@ packages: real-require: 0.2.0 dev: false - /time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: false /tinybench@2.6.0: resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} @@ -7822,6 +8236,11 @@ packages: utf8-byte-length: 1.0.4 dev: false + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: false + /ts-essentials@9.4.1(typescript@4.9.5): resolution: {integrity: sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==} peerDependencies: @@ -7890,6 +8309,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -7930,8 +8354,8 @@ packages: is-typed-array: 1.1.13 dev: true - /typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 @@ -7952,8 +8376,8 @@ packages: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} dev: false - /ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -7988,6 +8412,11 @@ packages: dev: false optional: true + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -8036,6 +8465,16 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + dev: false + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -8075,7 +8514,7 @@ packages: engines: {node: '>= 0.8'} dev: false - /vite-node@0.29.8(@types/node@18.19.24): + /vite-node@0.29.8(@types/node@18.19.26): resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} engines: {node: '>=v14.16.0'} hasBin: true @@ -8085,7 +8524,7 @@ packages: mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.0 - vite: 4.5.2(@types/node@18.19.24) + vite: 4.5.3(@types/node@18.19.26) transitivePeerDependencies: - '@types/node' - less @@ -8097,8 +8536,8 @@ packages: - terser dev: false - /vite-node@0.31.4(@types/node@18.19.24): - resolution: {integrity: sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==} + /vite-node@0.32.4(@types/node@18.19.26): + resolution: {integrity: sha512-L2gIw+dCxO0LK14QnUMoqSYpa9XRGnTTTDjW2h19Mr+GR0EFj4vx52W41gFXfMLqpA00eK4ZjOVYo1Xk//LFEw==} engines: {node: '>=v14.18.0'} hasBin: true dependencies: @@ -8107,7 +8546,7 @@ packages: mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.0 - vite: 4.5.2(@types/node@18.19.24) + vite: 4.5.3(@types/node@18.19.26) transitivePeerDependencies: - '@types/node' - less @@ -8118,8 +8557,8 @@ packages: - supports-color - terser - /vite@4.5.2(@types/node@18.19.24): - resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} + /vite@4.5.3(@types/node@18.19.26): + resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -8146,14 +8585,14 @@ packages: terser: optional: true dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.26 esbuild: 0.18.20 - postcss: 8.4.35 + postcss: 8.4.38 rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 - /vitest-mock-extended@1.3.1(typescript@4.9.5)(vitest@0.31.4): + /vitest-mock-extended@1.3.1(typescript@4.9.5)(vitest@0.32.4): resolution: {integrity: sha512-OpghYjh4BDuQ/Mzs3lFMQ1QRk9D8/2O9T47MLUA5eLn7K4RWIy+MfIivYOWEyxjTENjsBnzgMihDjyNalN/K0Q==} peerDependencies: typescript: 3.x || 4.x || 5.x @@ -8161,11 +8600,11 @@ packages: dependencies: ts-essentials: 9.4.1(typescript@4.9.5) typescript: 4.9.5 - vitest: 0.31.4 + vitest: 0.32.4 dev: true - /vitest@0.31.4: - resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==} + /vitest@0.32.4: + resolution: {integrity: sha512-3czFm8RnrsWwIzVDu/Ca48Y/M+qh3vOnF16czJm98Q/AN1y3B6PBsyV8Re91Ty5s7txKNjEhpgtGPcfdbh2MZg==} engines: {node: '>=v14.18.0'} hasBin: true peerDependencies: @@ -8195,19 +8634,18 @@ packages: webdriverio: optional: true dependencies: - '@types/chai': 4.3.12 + '@types/chai': 4.3.14 '@types/chai-subset': 1.3.5 - '@types/node': 18.19.24 - '@vitest/expect': 0.31.4 - '@vitest/runner': 0.31.4 - '@vitest/snapshot': 0.31.4 - '@vitest/spy': 0.31.4 - '@vitest/utils': 0.31.4 + '@types/node': 18.19.26 + '@vitest/expect': 0.32.4 + '@vitest/runner': 0.32.4 + '@vitest/snapshot': 0.32.4 + '@vitest/spy': 0.32.4 + '@vitest/utils': 0.32.4 acorn: 8.11.3 acorn-walk: 8.3.2 cac: 6.7.14 chai: 4.4.1 - concordance: 5.0.4 debug: 4.3.4 local-pkg: 0.4.3 magic-string: 0.30.8 @@ -8217,8 +8655,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.6.0 tinypool: 0.5.0 - vite: 4.5.2(@types/node@18.19.24) - vite-node: 0.31.4(@types/node@18.19.24) + vite: 4.5.3(@types/node@18.19.26) + vite-node: 0.32.4(@types/node@18.19.26) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8237,10 +8675,6 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -8260,7 +8694,16 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + dev: false /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -8275,7 +8718,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -8307,7 +8749,7 @@ packages: /wkx@0.5.0: resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.26 dev: false /wrap-ansi@6.2.0: From 49761152887bbef04e0529b267eae391c069a406 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 27 Mar 2024 13:28:58 +0100 Subject: [PATCH 27/50] fix: added sales proceeds --- api/prisma/schema.prisma | 1 + api/src/modules/real-world-assets/listener.ts | 4 ++-- api/src/modules/real-world-assets/resolvers.ts | 1 + api/src/modules/real-world-assets/utils.ts | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index ef63ac78..3f015219 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -169,6 +169,7 @@ model RWAPortfolioAsset { ISIN String? CUSIP String? coupon Float? + salesProceeds Float? realizedSurplus Float? balance Float? currency String? diff --git a/api/src/modules/real-world-assets/listener.ts b/api/src/modules/real-world-assets/listener.ts index e4e9fa60..275e71f1 100644 --- a/api/src/modules/real-world-assets/listener.ts +++ b/api/src/modules/real-world-assets/listener.ts @@ -1,7 +1,7 @@ import { Prisma, RWAPortfolio } from "@prisma/client"; import { InternalTransmitterUpdate, OperationUpdate } from "document-drive"; import { AddFileInput, DeleteNodeInput, DocumentDriveDocument, DocumentDriveState, ListenerFilter } from "document-model-libs/document-drive"; -import { AddFeesToGroupTransactionInput, Cash, CreateAccountInput, CreateCashAssetInput, CreateFixedIncomeAssetInput, CreateFixedIncomeTypeInput, CreateGroupTransactionInput, CreateServiceProviderFeeTypeInput, CreateSpvInput, DeleteAccountInput, DeleteCashAssetInput, DeleteFixedIncomeAssetInput, DeleteGroupTransactionInput, DeleteServiceProviderFeeTypeInput, DeleteSpvInput, EditAccountInput, EditCashAssetInput, EditFixedIncomeAssetInput, EditFixedIncomeTypeInput, EditGroupTransactionFeesInput, EditGroupTransactionInput, EditServiceProviderFeeTypeInput, EditSpvInput, FixedIncome, RealWorldAssetsDocument, RealWorldAssetsState, RemoveFeesFromGroupTransactionInput, utils } from "document-model-libs/real-world-assets" +import { AddFeesToGroupTransactionInput, Asset, Cash, CreateAccountInput, CreateCashAssetInput, CreateFixedIncomeAssetInput, CreateFixedIncomeTypeInput, CreateGroupTransactionInput, CreateServiceProviderFeeTypeInput, CreateSpvInput, DeleteAccountInput, DeleteCashAssetInput, DeleteFixedIncomeAssetInput, DeleteGroupTransactionInput, DeleteServiceProviderFeeTypeInput, DeleteSpvInput, EditAccountInput, EditCashAssetInput, EditFixedIncomeAssetInput, EditFixedIncomeTypeInput, EditGroupTransactionFeesInput, EditGroupTransactionInput, EditServiceProviderFeeTypeInput, EditSpvInput, FixedIncome, RealWorldAssetsDocument, RealWorldAssetsState, RemoveFeesFromGroupTransactionInput, utils } from "document-model-libs/real-world-assets" import { getChildLogger } from "../../logger"; const logger = getChildLogger({ msgPrefix: 'RWA Internal Listener' }, { moduleName: "RWA Internal Listener" }); @@ -149,7 +149,7 @@ async function rebuildRwaPortfolio(driveId: string, documentId: string, state: R // create RWAPortfolioAsset await prisma.rWAPortfolioAsset.createMany({ - data: portfolio.map((asset) => ({ + data: portfolio.map((asset: Asset) => ({ ...asset, assetRefId: asset.id, portfolioId: portfolioEntity.id, diff --git a/api/src/modules/real-world-assets/resolvers.ts b/api/src/modules/real-world-assets/resolvers.ts index deb9c684..605de465 100644 --- a/api/src/modules/real-world-assets/resolvers.ts +++ b/api/src/modules/real-world-assets/resolvers.ts @@ -51,6 +51,7 @@ export const FixedIncome = objectType({ t.string("ISIN") t.string("CUSIP") t.float("coupon") + t.float("salesProceeds") } }) export const FixedIncomeType = objectType({ diff --git a/api/src/modules/real-world-assets/utils.ts b/api/src/modules/real-world-assets/utils.ts index d0ed1b9f..6c005df4 100644 --- a/api/src/modules/real-world-assets/utils.ts +++ b/api/src/modules/real-world-assets/utils.ts @@ -66,6 +66,7 @@ export function transformPortfolioToState(portfolios: Prisma.RWAPortfolioGetPayl purchasePrice: asset.purchasePrice, purchaseDate: asset.purchaseDate, name: asset.name, + saleProceeds: asset.salesProceeds, fixedIncomeType: { id: asset.fixedIncomeType?.id, name: asset.fixedIncomeType?.name From 9cfcddca7b761124154d71360a2ed40da3045d08 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 27 Mar 2024 14:21:25 +0100 Subject: [PATCH 28/50] chore: wording --- api/src/modules/real-world-assets/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/modules/real-world-assets/utils.ts b/api/src/modules/real-world-assets/utils.ts index 6c005df4..c9b2f7f2 100644 --- a/api/src/modules/real-world-assets/utils.ts +++ b/api/src/modules/real-world-assets/utils.ts @@ -66,7 +66,7 @@ export function transformPortfolioToState(portfolios: Prisma.RWAPortfolioGetPayl purchasePrice: asset.purchasePrice, purchaseDate: asset.purchaseDate, name: asset.name, - saleProceeds: asset.salesProceeds, + salesProceeds: asset.salesProceeds, fixedIncomeType: { id: asset.fixedIncomeType?.id, name: asset.fixedIncomeType?.name From bea84e85aa75be8bde99dc5bb3d1716358774317 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 28 Mar 2024 12:58:23 +0100 Subject: [PATCH 29/50] fix: name in assets not found --- api/src/modules/real-world-assets/model.ts | 1 - api/src/modules/real-world-assets/resolvers.ts | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/api/src/modules/real-world-assets/model.ts b/api/src/modules/real-world-assets/model.ts index e3d6dd50..2129e6ce 100644 --- a/api/src/modules/real-world-assets/model.ts +++ b/api/src/modules/real-world-assets/model.ts @@ -59,7 +59,6 @@ export function getRWACRUD(prisma: Prisma.TransactionClient) { }) return transformPortfolioToState(portfolios) } catch (e) { - console.error(e) return []; } }, diff --git a/api/src/modules/real-world-assets/resolvers.ts b/api/src/modules/real-world-assets/resolvers.ts index 605de465..8d3631fa 100644 --- a/api/src/modules/real-world-assets/resolvers.ts +++ b/api/src/modules/real-world-assets/resolvers.ts @@ -126,11 +126,11 @@ export const AssetUnion = unionType({ t.members(FixedIncome, Cash) }, resolveType: (asset) => { - if (asset.assetType === "Cash") { - return "Cash"; + if (asset.name) { + return "FixedIncome"; } - return "FixedIncome" + return "Cash" } }); From 96e3c2b0b0fc68107061082558b8e2031171ac84 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 29 Mar 2024 11:35:25 +0100 Subject: [PATCH 30/50] feat: in memory cache for drives and transmitters --- api/src/graphql/generated/drive/nexus.ts | 3 + .../graphql/generated/drive/schema.graphql | 1 + .../modules/document-drive/drive-resolver.ts | 2 +- api/src/modules/document/model.ts | 120 +++++++++++++++--- 4 files changed, 107 insertions(+), 19 deletions(-) diff --git a/api/src/graphql/generated/drive/nexus.ts b/api/src/graphql/generated/drive/nexus.ts index 08ac7be0..16ebeccb 100644 --- a/api/src/graphql/generated/drive/nexus.ts +++ b/api/src/graphql/generated/drive/nexus.ts @@ -281,6 +281,7 @@ export interface NexusGenObjects { purchasePrice: number; // Float! purchaseProceeds: number; // Float! realizedSurplus: number; // Float! + salesProceeds?: number | null; // Float spvId: string; // ID! totalDiscount: number; // Float! } @@ -737,6 +738,7 @@ export interface NexusGenFieldTypes { purchasePrice: number; // Float! purchaseProceeds: number; // Float! realizedSurplus: number; // Float! + salesProceeds: number | null; // Float spvId: string; // ID! totalDiscount: number; // Float! } @@ -1227,6 +1229,7 @@ export interface NexusGenFieldTypeNames { purchasePrice: 'Float' purchaseProceeds: 'Float' realizedSurplus: 'Float' + salesProceeds: 'Float' spvId: 'ID' totalDiscount: 'Float' } diff --git a/api/src/graphql/generated/drive/schema.graphql b/api/src/graphql/generated/drive/schema.graphql index f0b06e4e..f3174d5a 100644 --- a/api/src/graphql/generated/drive/schema.graphql +++ b/api/src/graphql/generated/drive/schema.graphql @@ -209,6 +209,7 @@ type FixedIncome { purchasePrice: Float! purchaseProceeds: Float! realizedSurplus: Float! + salesProceeds: Float spvId: ID! totalDiscount: Float! } diff --git a/api/src/modules/document-drive/drive-resolver.ts b/api/src/modules/document-drive/drive-resolver.ts index 39bb7f5e..5875d728 100644 --- a/api/src/modules/document-drive/drive-resolver.ts +++ b/api/src/modules/document-drive/drive-resolver.ts @@ -231,7 +231,7 @@ export const getDrive = queryField('drive', { resolve: async (_parent, args, ctx) => { try { const drive = await ctx.prisma.document.getDrive(ctx.driveId ?? '1'); - return drive.global; + return drive; } catch (e) { return null; } diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index 58cd6968..b183250a 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -8,17 +8,21 @@ import { PullResponderTransmitter, IReceiver, InternalTransmitter, + + } from 'document-drive'; import { PrismaStorage } from 'document-drive/storage/prisma'; import * as DocumentModelsLibs from 'document-model-libs/document-models'; import { module as DocumentModelLib } from 'document-model/document-model'; -import { DocumentModel, Operation } from 'document-model/document'; +import { DocumentModel, Operation, State } from 'document-model/document'; import { Listener, ListenerFilter, actions, reducer, + DocumentDriveState, + DocumentDriveAction } from 'document-model-libs/document-drive'; @@ -26,12 +30,17 @@ import { init } from './listenerManager'; import { getChildLogger } from '../../logger'; const logger = getChildLogger({ msgPrefix: 'Document Model' }); + export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { const documentModels = [ DocumentModelLib, ...Object.values(DocumentModelsLibs), ] as DocumentModel[]; + let transmitters: Record> = {}; + let lastAcceessedTransmitter: Record> = {}; + let drives: Record = {}; + const driveServer = new DocumentDriveServer( documentModels, new PrismaStorage(prisma as PrismaClient), @@ -42,13 +51,49 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { await init(driveServer, prisma); } + function clearDriveCache() { + drives = {}; + } + + function clearTransmitterCache() { + transmitters = {}; + lastAcceessedTransmitter = {}; + } + + function getTransmitter(driveId: string, transmitterId: string) { + if (!transmitters[driveId]) { + return undefined; + } + const transmitter = transmitters[driveId][transmitterId]; + return transmitter + } + + function setTransmitter(driveId: string, transmitterId: string, transmitter: PullResponderTransmitter) { + if (!transmitters[driveId]) { + transmitters[driveId] = {}; + } + transmitters[driveId][transmitterId] = transmitter; + } + + function updateLastAccessedTransmitter(driveId: string, transmitterId: string) { + if (!lastAcceessedTransmitter[driveId]) { + lastAcceessedTransmitter[driveId] = {}; + } + lastAcceessedTransmitter[driveId][transmitterId] = Date.now(); + } initialize(); + setInterval(() => { + clearDriveCache(); + clearTransmitterCache(); + }, 1000 * 60 * 15); + return { addDrive: async (args: DriveInput) => { try { await driveServer.addDrive(args); await initialize(); + clearDriveCache(); } catch (e) { throw new Error("Couldn't add drive"); } @@ -59,6 +104,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { deleteDrive: async (id: string) => { try { await driveServer.deleteDrive(id); + clearDriveCache(); } catch (e) { throw new Error("Couldn't delete drive"); } @@ -67,16 +113,33 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { }, getDrive: async (id: string) => { try { - const { state } = await driveServer.getDrive(id); - return state; + let drive = drives[id]; + console.log(drive); + if (!drive) { + const { state } = await driveServer.getDrive(id); + drives[id] = state.global; + return state.global; + } else { + return drive; + } + + } catch (e) { throw new Error("Couldn't get drive"); } }, getDrives: async () => { try { - const drives = await driveServer.getDrives(); - return drives; + let driveIds = Object.keys(drives); + if (driveIds.length > 0) { + return driveIds; + } + driveIds = await driveServer.getDrives() + driveIds.forEach((driveId) => { + transmitters[driveId] = {}; + }) + + return driveIds; } catch (e) { throw new Error("Couldn't get drives"); } @@ -84,7 +147,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { pushUpdates: async ( driveId: string, - operations: Operation[], + operations: Operation[], documentId?: string, ) => { if (!documentId) { @@ -111,13 +174,22 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { listenerId: string, since?: string, ): Promise => { - const transmitter = (await driveServer.getTransmitter( - driveId, - listenerId, - )) as PullResponderTransmitter; + + console.log(transmitters) + let transmitter: PullResponderTransmitter | undefined = getTransmitter(driveId, listenerId); if (!transmitter) { - throw new Error(`Transmitter with id ${listenerId} not found`); + transmitter = await driveServer.getTransmitter( + driveId, + listenerId, + ) as PullResponderTransmitter; + + if (!transmitter) { + throw new Error(`Transmitter with id ${listenerId} not found`); + } + setTransmitter(driveId, listenerId, transmitter); + updateLastAccessedTransmitter(driveId, listenerId); } + if (transmitter.getStrands) { const result = await transmitter.getStrands(since || undefined); return result; @@ -131,12 +203,17 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { listenerId: string, revisions: ListenerRevision[], ) => { - const transmitter = (await driveServer.getTransmitter( - driveId, - listenerId, - )) as PullResponderTransmitter; + let transmitter: PullResponderTransmitter | undefined = getTransmitter(driveId, listenerId); if (!transmitter) { - throw new Error(`Transmitter with id ${listenerId} not found`); + transmitter = await driveServer.getTransmitter( + driveId, + listenerId, + ) as PullResponderTransmitter; + if (!transmitter) { + throw new Error(`Transmitter with id ${listenerId} not found`); + } + setTransmitter(driveId, listenerId, transmitter); + updateLastAccessedTransmitter(driveId, listenerId); } const result = await transmitter.processAcknowledge( driveId, @@ -172,7 +249,9 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { let drive = await driveServer.getDrive(driveId); drive = reducer(drive, actions.addListener({ listener })); const operation = drive.operations.local.slice().pop(); - + if (!operation) { + throw new Error("Operation couldnt be applied") + } await driveServer.addDriveOperations(driveId, [operation]); return listener; }, @@ -184,8 +263,13 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { let drive = await driveServer.getDrive(driveId); drive = reducer(drive, actions.removeListener({ listenerId })); const operation = drive.operations.local.slice().pop(); + if (!operation) { + throw new Error("Operation couldnt be applied") + } await driveServer.addDriveOperations(driveId, [operation]); + delete transmitters[driveId][listenerId]; + delete lastAcceessedTransmitter[driveId][listenerId]; return listenerId; }, @@ -202,5 +286,5 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { }; return response; }, - }; + } } From 90a7b31fab0e6daae94fdfed439f686b09a199ff Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 29 Mar 2024 11:42:29 +0100 Subject: [PATCH 31/50] chore: cleanup --- api/src/modules/document/model.ts | 56 +++++++++---------------------- 1 file changed, 16 insertions(+), 40 deletions(-) diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index b183250a..ea37ca22 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -38,7 +38,6 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { ] as DocumentModel[]; let transmitters: Record> = {}; - let lastAcceessedTransmitter: Record> = {}; let drives: Record = {}; const driveServer = new DocumentDriveServer( @@ -57,14 +56,23 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { function clearTransmitterCache() { transmitters = {}; - lastAcceessedTransmitter = {}; } - function getTransmitter(driveId: string, transmitterId: string) { + async function getTransmitter(driveId: string, transmitterId: string) { if (!transmitters[driveId]) { - return undefined; + transmitters[driveId] = {}; + } + + + let transmitter = transmitters[driveId][transmitterId]; + if (!transmitter) { + transmitter = await driveServer.getTransmitter(driveId, transmitterId) as PullResponderTransmitter; + if (!transmitter) { + throw new Error(`Transmitter ${transmitterId} not found`) + } + transmitters[driveId][transmitterId] = transmitter; } - const transmitter = transmitters[driveId][transmitterId]; + return transmitter } @@ -75,12 +83,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { transmitters[driveId][transmitterId] = transmitter; } - function updateLastAccessedTransmitter(driveId: string, transmitterId: string) { - if (!lastAcceessedTransmitter[driveId]) { - lastAcceessedTransmitter[driveId] = {}; - } - lastAcceessedTransmitter[driveId][transmitterId] = Date.now(); - } + initialize(); setInterval(() => { @@ -114,7 +117,6 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { getDrive: async (id: string) => { try { let drive = drives[id]; - console.log(drive); if (!drive) { const { state } = await driveServer.getDrive(id); drives[id] = state.global; @@ -175,21 +177,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { since?: string, ): Promise => { - console.log(transmitters) - let transmitter: PullResponderTransmitter | undefined = getTransmitter(driveId, listenerId); - if (!transmitter) { - transmitter = await driveServer.getTransmitter( - driveId, - listenerId, - ) as PullResponderTransmitter; - - if (!transmitter) { - throw new Error(`Transmitter with id ${listenerId} not found`); - } - setTransmitter(driveId, listenerId, transmitter); - updateLastAccessedTransmitter(driveId, listenerId); - } - + const transmitter = await getTransmitter(driveId, listenerId); if (transmitter.getStrands) { const result = await transmitter.getStrands(since || undefined); return result; @@ -203,18 +191,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { listenerId: string, revisions: ListenerRevision[], ) => { - let transmitter: PullResponderTransmitter | undefined = getTransmitter(driveId, listenerId); - if (!transmitter) { - transmitter = await driveServer.getTransmitter( - driveId, - listenerId, - ) as PullResponderTransmitter; - if (!transmitter) { - throw new Error(`Transmitter with id ${listenerId} not found`); - } - setTransmitter(driveId, listenerId, transmitter); - updateLastAccessedTransmitter(driveId, listenerId); - } + const transmitter = await getTransmitter(driveId, listenerId); const result = await transmitter.processAcknowledge( driveId, listenerId, @@ -269,7 +246,6 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { await driveServer.addDriveOperations(driveId, [operation]); delete transmitters[driveId][listenerId]; - delete lastAcceessedTransmitter[driveId][listenerId]; return listenerId; }, From c0d4b1d7c0a21fceb4408316572fe44c7a4f28a4 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 29 Mar 2024 11:45:00 +0100 Subject: [PATCH 32/50] chore: cleanup --- api/src/modules/document/model.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index ea37ca22..e447e047 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -63,7 +63,6 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { transmitters[driveId] = {}; } - let transmitter = transmitters[driveId][transmitterId]; if (!transmitter) { transmitter = await driveServer.getTransmitter(driveId, transmitterId) as PullResponderTransmitter; From 5f562b28bd3c91021376e308686a043ce5f9afc2 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 29 Mar 2024 11:48:44 +0100 Subject: [PATCH 33/50] chore: removed set transmitter fn --- api/src/modules/document/model.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index e447e047..2c62b832 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -75,14 +75,6 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { return transmitter } - function setTransmitter(driveId: string, transmitterId: string, transmitter: PullResponderTransmitter) { - if (!transmitters[driveId]) { - transmitters[driveId] = {}; - } - transmitters[driveId][transmitterId] = transmitter; - } - - initialize(); setInterval(() => { From 7051545ba7e721bd58b26b6e53da06ca71f8c578 Mon Sep 17 00:00:00 2001 From: acaldas Date: Fri, 29 Mar 2024 14:06:36 +0000 Subject: [PATCH 34/50] feat: log listener operation error --- api/src/modules/document/model.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index 2c62b832..1476ba32 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -220,7 +220,11 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { if (!operation) { throw new Error("Operation couldnt be applied") } - await driveServer.addDriveOperations(driveId, [operation]); + const result = await driveServer.addDriveOperations(driveId, [operation]); + if (result.status !== "SUCCESS") { + throw new Error(`Listener couldn't be registered: ${result.error}`); + } + return listener; }, @@ -235,7 +239,11 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { throw new Error("Operation couldnt be applied") } - await driveServer.addDriveOperations(driveId, [operation]); + const result = await driveServer.addDriveOperations(driveId, [operation]); + if (result.status !== "SUCCESS") { + throw new Error(`Listener couldn't be deleted: ${result.error}`); + } + delete transmitters[driveId][listenerId]; return listenerId; }, From f6dc1041401747d3eb9a03fc3bcbf47272c14be8 Mon Sep 17 00:00:00 2001 From: acaldas Date: Fri, 29 Mar 2024 19:38:25 +0000 Subject: [PATCH 35/50] feat: updated deps and small ts improvements --- api/package.json | 6 +-- api/pnpm-lock.yaml | 35 ++++++++++-------- api/src/graphql/generated/index/nexus.ts | 2 +- .../graphql/generated/index/schema.graphql | 2 +- .../modules/document-drive/drive-resolver.ts | 30 +++++++++------ .../modules/document-drive/drives-resolver.ts | 24 +++++++----- api/src/modules/document/model.ts | 37 +++++++------------ api/src/modules/document/resolvers.ts | 6 ++- api/src/modules/system/challenge/resolvers.ts | 5 ++- api/src/modules/system/core-unit/resolvers.ts | 5 ++- api/src/modules/system/resolvers.ts | 5 ++- api/src/modules/system/session/resolvers.ts | 5 ++- api/tests/documentDrive.test.ts | 2 +- 13 files changed, 89 insertions(+), 75 deletions(-) diff --git a/api/package.json b/api/package.json index 738d0515..364ea8fd 100644 --- a/api/package.json +++ b/api/package.json @@ -21,9 +21,9 @@ "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "document-drive": "1.0.0-alpha.17", - "document-model": "^1.0.32", - "document-model-libs": "^1.15.0", + "document-drive": "1.0.0-alpha.23", + "document-model": "^1.0.35", + "document-model-libs": "^1.17.1", "dotenv": "^16.4.5", "ethers": "^5.7.2", "express": "^4.19.2", diff --git a/api/pnpm-lock.yaml b/api/pnpm-lock.yaml index 0360874a..8237f5ef 100644 --- a/api/pnpm-lock.yaml +++ b/api/pnpm-lock.yaml @@ -24,14 +24,14 @@ dependencies: specifier: ^2.8.5 version: 2.8.5 document-drive: - specifier: 1.0.0-alpha.17 - version: 1.0.0-alpha.17(@prisma/client@5.8.1)(document-model-libs@1.15.0)(document-model@1.0.32)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7) + specifier: 1.0.0-alpha.23 + version: 1.0.0-alpha.23(@prisma/client@5.8.1)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7) document-model: - specifier: ^1.0.32 - version: 1.0.32 + specifier: ^1.0.35 + version: 1.0.35 document-model-libs: - specifier: ^1.15.0 - version: 1.15.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) + specifier: ^1.17.1 + version: 1.17.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -4297,6 +4297,10 @@ packages: tslib: 2.6.2 dev: false + /change-case@5.4.3: + resolution: {integrity: sha512-4cdyvorTy/lViZlVzw2O8/hHCLUuHqp4KpSSP3DlauhFCf3LdnfF+p5s0EAhjKsU7bqrMzu7iQArYfoPiHO2nw==} + dev: false + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -4694,19 +4698,19 @@ packages: esutils: 2.0.3 dev: true - /document-drive@1.0.0-alpha.17(@prisma/client@5.8.1)(document-model-libs@1.15.0)(document-model@1.0.32)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7): - resolution: {integrity: sha512-TCh2Os+ugxza2CbhWB0x5lPVwuQGStp/n5t8Wgq8TDvNJO2pimZSxL+X+kaNYjdGKUXebNcKo4CkzDKEN2OGQQ==} + /document-drive@1.0.0-alpha.23(@prisma/client@5.8.1)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7): + resolution: {integrity: sha512-tGiGBCNCB+sv+P3N4ZoxNi0wa/eJua+WGYsEP5GDMW2WfKKtXdI3XhoenZkAnqlaLcClwE5oe+/ruSQD9w2tBg==} peerDependencies: '@prisma/client': 5.8.1 - document-model: ^1.0.29 + document-model: ^1.0.34 document-model-libs: ^1.1.51 localforage: ^1.10.0 sequelize: ^6.35.2 sqlite3: ^5.1.7 dependencies: '@prisma/client': 5.8.1(prisma@5.8.1) - document-model: 1.0.32 - document-model-libs: 1.15.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) + document-model: 1.0.35 + document-model-libs: 1.17.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) json-stringify-deterministic: 1.0.12 @@ -4719,8 +4723,8 @@ packages: - encoding dev: false - /document-model-libs@1.15.0(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4): - resolution: {integrity: sha512-SIN4bf/3+4el3b22GwQFz5+sKCV+Fl8GdvYzcV7DvqqosUtadSH4d1Vn1mQ+wGdC3iy1fEbfIVbPvCShHlLQdw==} + /document-model-libs@1.17.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4): + resolution: {integrity: sha512-aXf6lkq2ENQl1JA0Tnf5KlrJ4iWMZWEDA7v4e99rCAHtc4XM7gtWj2Fy8T66UiE0tqhxF6Ab52ZyGMbC0Fjf1Q==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 @@ -4750,9 +4754,10 @@ packages: - vitest dev: false - /document-model@1.0.32: - resolution: {integrity: sha512-TLmOm6XGWtp5i8Idu3UDjy5n6vbG7Av2ETqM+8tlY6nA/zUWm6fKesciu9BHGL+kncHRWXcv8cprrYiuoWtmDg==} + /document-model@1.0.35: + resolution: {integrity: sha512-F0hEmnsifjnqeZRydc+AtvOx1BG9ew+o+74MqtT+joeW/9KXpmAf9oIZzA83jswlJbr93tB+iqsORSApARaYTg==} dependencies: + change-case: 5.4.3 immer: 10.0.4 json-stringify-deterministic: 1.0.12 jszip: 3.10.1 diff --git a/api/src/graphql/generated/index/nexus.ts b/api/src/graphql/generated/index/nexus.ts index e199cb6c..bf81eeed 100644 --- a/api/src/graphql/generated/index/nexus.ts +++ b/api/src/graphql/generated/index/nexus.ts @@ -54,7 +54,7 @@ export interface NexusGenInputs { } DocumentDriveStateInput: { // input type icon?: string | null; // String - id: string; // ID! + id?: string | null; // ID name: string; // String! slug?: string | null; // String } diff --git a/api/src/graphql/generated/index/schema.graphql b/api/src/graphql/generated/index/schema.graphql index 4edca808..6c692448 100644 --- a/api/src/graphql/generated/index/schema.graphql +++ b/api/src/graphql/generated/index/schema.graphql @@ -55,7 +55,7 @@ type DocumentDriveState { input DocumentDriveStateInput { icon: String - id: ID! + id: ID name: String! slug: String } diff --git a/api/src/modules/document-drive/drive-resolver.ts b/api/src/modules/document-drive/drive-resolver.ts index 5875d728..46b3ab96 100644 --- a/api/src/modules/document-drive/drive-resolver.ts +++ b/api/src/modules/document-drive/drive-resolver.ts @@ -12,9 +12,11 @@ import { systemType } from '../system'; import { ListenerRevision as IListenerRevision, UpdateStatus as IUpdateStatus, StrandUpdate, } from 'document-drive'; -import { OperationScope } from 'document-model/document'; +import { Operation, OperationScope } from 'document-model/document'; import stringify from 'json-stringify-deterministic'; import { getChildLogger } from '../../logger'; +import { Context } from '../../graphql/server/drive/context'; +import { DocumentDriveAction } from 'document-model-libs/document-drive'; const logger = getChildLogger({ msgPrefix: 'Drive Resolver' }); @@ -178,7 +180,7 @@ export const syncType = objectType({ listenerId: idArg(), since: 'Date', }, - resolve: async (_parent, { listenerId, since }, ctx) => { + resolve: async (_parent, { listenerId, since }, ctx: Context) => { if (!listenerId) throw new Error('Listener ID is required'); try { const result = await ctx.prisma.document.pullStrands( @@ -228,11 +230,12 @@ export const driveSystemQueryField = queryField('system', { export const getDrive = queryField('drive', { type: DocumentDriveState, - resolve: async (_parent, args, ctx) => { + resolve: async (_parent, args, ctx: Context) => { try { const drive = await ctx.prisma.document.getDrive(ctx.driveId ?? '1'); return drive; } catch (e) { + logger.error(e); return null; } }, @@ -243,10 +246,15 @@ export const registerListener = mutationField('registerPullResponderListener', { args: { filter: nonNull(InputListenerFilter), }, - resolve: async (_parent, { filter }, ctx) => { + resolve: async (_parent, { filter }, ctx: Context) => { const result = await ctx.prisma.document.registerPullResponderListener( ctx.driveId ?? '1', - filter, + { + branch: filter.branch?.filter(b => !!b) as string[] ?? [], + documentId: filter.documentId?.filter(b => !!b) as string[] ?? [], + documentType: filter.documentType?.filter(b => !!b) as string[] ?? [], + scope: filter.scope?.filter(b => !!b) as string[] ?? [], + }, ); return result; @@ -259,7 +267,7 @@ export const deleteListener = mutationField('deletePullResponderListener', { args: { filter: nonNull(InputListenerFilter), }, - resolve: async (_parent, { filter }, ctx) => { + resolve: async (_parent, { filter }, ctx: Context) => { const result = await ctx.prisma.document.deletePullResponderListener( ctx.driveId ?? '1', filter, @@ -274,7 +282,7 @@ export const pushUpdates = mutationField('pushUpdates', { args: { strands: list(nonNull(InputStrandUpdate)), }, - resolve: async (_parent, { strands }, ctx) => { + resolve: async (_parent, { strands }, ctx: Context) => { logger.info('pushUpdates') if (!strands || strands?.length === 0) return []; @@ -290,13 +298,13 @@ export const pushUpdates = mutationField('pushUpdates', { const result = await ctx.prisma.document.pushUpdates( s.driveId, - operations, + operations as Operation[], s.documentId ?? undefined, ); if (result.status !== "SUCCESS") logger.error(result.error); - const revision = result.document.operations[s.scope].slice().pop()?.index ?? -1; + const revision = result.document?.operations[s.scope as OperationScope].slice().pop()?.index ?? -1; return { revision, branch: s.branch, @@ -317,7 +325,7 @@ export const acknowledge = mutationField('acknowledge', { listenerId: nonNull('String'), revisions: list(ListenerRevisionInput), }, - resolve: async (_parent, { revisions, listenerId }, ctx) => { + resolve: async (_parent, { revisions, listenerId }, ctx: Context) => { try { if (!listenerId || !revisions) return false; const validEntries: IListenerRevision[] = revisions @@ -332,7 +340,7 @@ export const acknowledge = mutationField('acknowledge', { })); const result = await ctx.prisma.document.processAcknowledge( - ctx.driveId, + ctx.driveId ?? "1", listenerId, validEntries, ); diff --git a/api/src/modules/document-drive/drives-resolver.ts b/api/src/modules/document-drive/drives-resolver.ts index e0b081ab..49da5252 100644 --- a/api/src/modules/document-drive/drives-resolver.ts +++ b/api/src/modules/document-drive/drives-resolver.ts @@ -7,6 +7,8 @@ import { queryField, } from 'nexus'; import { DocumentDriveState } from './drive-resolver'; +import { Context } from '../../graphql/server/drive/context'; +import logger from '../../logger'; export const DocumentDriveLocalState = objectType({ name: 'DocumentDriveLocalState', @@ -26,7 +28,7 @@ export const DocumentDriveLocalStateInput = inputObjectType({ export const DocumentDriveStateInput = inputObjectType({ name: 'DocumentDriveStateInput', definition(t) { - t.nonNull.id('id'); + t.id('id'); t.nonNull.string('name'); t.string('icon'); t.string('slug'); @@ -35,11 +37,12 @@ export const DocumentDriveStateInput = inputObjectType({ export const getDrives = queryField('drives', { type: list('String'), - resolve: async (_parent, args, ctx) => { + resolve: async (_parent, args, ctx: Context) => { try { const drives = await ctx.prisma.document.getDrives(); return drives; } catch (e) { + logger.error(e); throw new Error('Failed to get drives.'); } }, @@ -49,7 +52,7 @@ const addDriveResponseDefinition = objectType({ name: 'AddDriveResponse', definition(t) { t.nonNull.field('global', { - type: DocumentDriveState, + type: DocumentDriveState }); t.nonNull.field('local', { type: DocumentDriveLocalState, @@ -64,12 +67,12 @@ export const addDrive = mutationField('addDrive', { global: nonNull(DocumentDriveStateInput), local: nonNull(DocumentDriveLocalStateInput), }, - resolve: async (_parent, { global, local }, ctx) => { - await ctx; - return ctx.prisma.document.addDrive({ - global: { ...global, nodes: [] }, - local: { ...local, listeners: [], triggers: [] }, + resolve: async (_parent, { global, local }, ctx: Context) => { + const drive = await ctx.prisma.document.addDrive({ + global: { id: global.id, name: global.name, icon: global.icon ?? null, slug: global.slug ?? null }, + local: { availableOffline: local.availableOffline, sharingType: local.sharingType ?? null, listeners: [], triggers: [] }, }); + return drive.state; }, }); @@ -78,10 +81,11 @@ export const deleteDrive = mutationField('deleteDrive', { args: { id: nonNull('String'), }, - resolve: async (_parent, { id }, ctx) => { + resolve: async (_parent, { id }, ctx: Context) => { try { - await ctx.prisma.drive.deleteDrive(id); + await ctx.prisma.document.deleteDrive(id); } catch (e) { + logger.error(e); return false; } diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index 1476ba32..9cdfc404 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -20,7 +20,6 @@ import { Listener, ListenerFilter, actions, - reducer, DocumentDriveState, DocumentDriveAction } from 'document-model-libs/document-drive'; @@ -85,21 +84,21 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { return { addDrive: async (args: DriveInput) => { try { - await driveServer.addDrive(args); + const drive = await driveServer.addDrive(args); await initialize(); clearDriveCache(); + return drive; } catch (e) { + logger.error(e); throw new Error("Couldn't add drive"); } - return { - ...args, - }; }, deleteDrive: async (id: string) => { try { await driveServer.deleteDrive(id); clearDriveCache(); } catch (e) { + logger.error(e); throw new Error("Couldn't delete drive"); } @@ -115,9 +114,8 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { } else { return drive; } - - } catch (e) { + logger.error(e); throw new Error("Couldn't get drive"); } }, @@ -134,6 +132,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { return driveIds; } catch (e) { + logger.error(e); throw new Error("Couldn't get drives"); } }, @@ -214,15 +213,11 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { listenerId: uuid, system: false, }; - let drive = await driveServer.getDrive(driveId); - drive = reducer(drive, actions.addListener({ listener })); - const operation = drive.operations.local.slice().pop(); - if (!operation) { - throw new Error("Operation couldnt be applied") - } - const result = await driveServer.addDriveOperations(driveId, [operation]); + + const result = await driveServer.addDriveAction(driveId, actions.addListener({ listener })); if (result.status !== "SUCCESS") { - throw new Error(`Listener couldn't be registered: ${result.error}`); + result.error && logger.error(result.error); + throw new Error(`Listener couldn't be registered: ${result.error || result.status}`); } return listener; @@ -232,16 +227,10 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { driveId: string, listenerId: string, ) => { - let drive = await driveServer.getDrive(driveId); - drive = reducer(drive, actions.removeListener({ listenerId })); - const operation = drive.operations.local.slice().pop(); - if (!operation) { - throw new Error("Operation couldnt be applied") - } - - const result = await driveServer.addDriveOperations(driveId, [operation]); + const result = await driveServer.addDriveAction(driveId, actions.removeListener({ listenerId })); if (result.status !== "SUCCESS") { - throw new Error(`Listener couldn't be deleted: ${result.error}`); + result.error && logger.error(result.error); + throw new Error(`Listener couldn't be deleted: ${result.error || result.status}`); } delete transmitters[driveId][listenerId]; diff --git a/api/src/modules/document/resolvers.ts b/api/src/modules/document/resolvers.ts index e9473819..1af43e02 100644 --- a/api/src/modules/document/resolvers.ts +++ b/api/src/modules/document/resolvers.ts @@ -1,5 +1,6 @@ import { interfaceType, nonNull, objectType, queryField } from 'nexus'; import { GQLDateBase } from '../system'; +import { Context } from '../../graphql/server/drive/context'; // todo: resolveType should be moved to somewhere else export const operationModelInterface = interfaceType({ @@ -51,7 +52,10 @@ export const documentQuery = queryField('document', { args: { id: nonNull('String'), }, - resolve: async (_root, { id }, ctx) => { + resolve: async (_root, { id }, ctx: Context) => { + if (!ctx.driveId) { + throw new Error("DriveId is not defined") + } const doc = await ctx.prisma.document.getDocument(ctx.driveId, id); return doc; }, diff --git a/api/src/modules/system/challenge/resolvers.ts b/api/src/modules/system/challenge/resolvers.ts index e9c98f72..e0b82bfe 100644 --- a/api/src/modules/system/challenge/resolvers.ts +++ b/api/src/modules/system/challenge/resolvers.ts @@ -1,4 +1,5 @@ import { mutationField, nonNull, objectType } from 'nexus'; +import { Context } from '../../../graphql/server/drive/context'; export const Challenge = objectType({ name: 'Challenge', @@ -14,7 +15,7 @@ export const createChallenge = mutationField('createChallenge', { args: { address: nonNull('String'), }, - resolve: async (_root, args, ctx) => ctx.prisma.challenge.createChallenge(args.address), + resolve: async (_root, args, ctx: Context) => ctx.prisma.challenge.createChallenge(args.address), }); export const solveChallenge = mutationField('solveChallenge', { @@ -23,5 +24,5 @@ export const solveChallenge = mutationField('solveChallenge', { nonce: nonNull('String'), signature: nonNull('String'), }, - resolve: async (_root, args, ctx) => ctx.prisma.challenge.solveChallenge(args.nonce, args.signature), + resolve: async (_root, args, ctx: Context) => ctx.prisma.challenge.solveChallenge(args.nonce, args.signature), }); diff --git a/api/src/modules/system/core-unit/resolvers.ts b/api/src/modules/system/core-unit/resolvers.ts index b05db3a0..4427ba04 100644 --- a/api/src/modules/system/core-unit/resolvers.ts +++ b/api/src/modules/system/core-unit/resolvers.ts @@ -1,6 +1,7 @@ import { stringArg, list, queryField, objectType, } from 'nexus/dist'; +import { Context } from '../../../graphql/server/index/context'; export const CoreUnit = objectType({ name: 'CoreUnit', @@ -18,7 +19,7 @@ export const CoreUnit = objectType({ export const coreUnits = queryField('coreUnits', { type: list('CoreUnit'), - resolve: async (_parent, _args, ctx) => { + resolve: async (_parent, _args, ctx: Context) => { const response = await ctx.prisma.coreUnit.findMany(); return response; }, @@ -27,7 +28,7 @@ export const coreUnits = queryField('coreUnits', { export const coreUnit = queryField('coreUnit', { type: 'CoreUnit', args: { id: stringArg() }, - resolve: async (_parent, { id }, ctx) => { + resolve: async (_parent, { id }, ctx: Context) => { if (!id) { throw new Error('please provide id'); } diff --git a/api/src/modules/system/resolvers.ts b/api/src/modules/system/resolvers.ts index 1851ab66..dbc707e7 100644 --- a/api/src/modules/system/resolvers.ts +++ b/api/src/modules/system/resolvers.ts @@ -4,6 +4,7 @@ import { list, mutationField, nonNull, objectType, queryField, scalarType, stringArg, } from 'nexus'; import logger from '../../logger'; +import { Context } from '../../graphql/server/index/context'; @@ -12,7 +13,7 @@ export const authType = objectType({ definition(t) { t.field('me', { type: 'User', - resolve: async (_, __, ctx) => { + resolve: async (_, __, ctx: Context) => { const { createdBy } = await ctx.getSession(); return ctx.prisma.user.findUnique({ where: { @@ -22,7 +23,7 @@ export const authType = objectType({ }, }); t.field('sessions', { - resolve: async (_, __, ctx) => { + resolve: async (_, __, ctx: Context) => { const { createdBy } = await ctx.getSession(); return ctx.prisma.session.listSessions(createdBy); }, diff --git a/api/src/modules/system/session/resolvers.ts b/api/src/modules/system/session/resolvers.ts index b6f5a441..6a953068 100644 --- a/api/src/modules/system/session/resolvers.ts +++ b/api/src/modules/system/session/resolvers.ts @@ -7,6 +7,7 @@ import { inputObjectType, objectType, } from 'nexus/dist'; +import { Context } from '../../../graphql/server/index/context'; export const Session = objectType({ name: 'Session', @@ -45,7 +46,7 @@ export const revoke = mutationField('revokeSession', { args: { sessionId: nonNull(stringArg()), }, - resolve: async (_parent, { sessionId }, ctx) => { + resolve: async (_parent, { sessionId }, ctx: Context) => { const userId = (await ctx.getSession()).createdBy; return ctx.prisma.session.revoke(sessionId, userId); }, @@ -59,7 +60,7 @@ export const create = mutationField('createSession', { resolve: async ( _parent, { session }, - ctx, + ctx: Context, ) => { const { createdBy } = await ctx.getSession(); return ctx.prisma.session.createCustomSession(createdBy, session, true); diff --git a/api/tests/documentDrive.test.ts b/api/tests/documentDrive.test.ts index badb439d..91db20af 100644 --- a/api/tests/documentDrive.test.ts +++ b/api/tests/documentDrive.test.ts @@ -20,7 +20,7 @@ describe("Document Drive Server", () => { it("it syncs with listener", async () => { // add drive without listener const addDriveResponse = await addDrive(); - expect(addDriveResponse.global.id).not.toBeNull(); + expect(addDriveResponse.global.id).toBe("1"); // add file const pushUpdatesResponse = await addBudgetStatement(); From 9c86c340e172925d787b7e92298dee7f89c72bb2 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 1 Apr 2024 15:39:29 +0200 Subject: [PATCH 36/50] chore: updated document drive deb and prisma schema --- api/package.json | 8 +- api/pnpm-lock.yaml | 388 ++++++++++++++++++++------------------- api/prisma/schema.prisma | 64 ++++--- 3 files changed, 234 insertions(+), 226 deletions(-) diff --git a/api/package.json b/api/package.json index 364ea8fd..1241d8a1 100644 --- a/api/package.json +++ b/api/package.json @@ -16,12 +16,12 @@ }, "dependencies": { "@apollo/server": "^4.10.2", - "@prisma/client": "5.8.1", + "@prisma/client": "^5.11.0", "@types/cookie-parser": "^1.4.7", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "document-drive": "1.0.0-alpha.23", + "document-drive": "1.0.0-alpha.24", "document-model": "^1.0.35", "document-model-libs": "^1.17.1", "dotenv": "^16.4.5", @@ -51,7 +51,7 @@ "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.6", "@types/ms": "^0.7.34", - "@types/node": "^18.19.26", + "@types/node": "^18.19.28", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@vitest/coverage-istanbul": "^0.29.8", @@ -61,7 +61,7 @@ "gql-query-builder": "^3.8.0", "graphql-request": "^5.2.0", "node-fetch": "^3.3.2", - "prisma": "5.8.1", + "prisma": "^5.11.0", "typescript": "^4.9.5", "vitest-mock-extended": "^1.3.1" } diff --git a/api/pnpm-lock.yaml b/api/pnpm-lock.yaml index 8237f5ef..cee00c4c 100644 --- a/api/pnpm-lock.yaml +++ b/api/pnpm-lock.yaml @@ -9,8 +9,8 @@ dependencies: specifier: ^4.10.2 version: 4.10.2(graphql@16.8.1) '@prisma/client': - specifier: 5.8.1 - version: 5.8.1(prisma@5.8.1) + specifier: ^5.11.0 + version: 5.11.0(prisma@5.11.0) '@types/cookie-parser': specifier: ^1.4.7 version: 1.4.7 @@ -24,8 +24,8 @@ dependencies: specifier: ^2.8.5 version: 2.8.5 document-drive: - specifier: 1.0.0-alpha.23 - version: 1.0.0-alpha.23(@prisma/client@5.8.1)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7) + specifier: 1.0.0-alpha.24 + version: 1.0.0-alpha.24(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7) document-model: specifier: ^1.0.35 version: 1.0.35 @@ -82,7 +82,7 @@ dependencies: version: 2.1.4(ethers@5.7.2) vite-node: specifier: ^0.29.8 - version: 0.29.8(@types/node@18.19.26) + version: 0.29.8(@types/node@18.19.28) vitest: specifier: ^0.32.4 version: 0.32.4 @@ -110,8 +110,8 @@ devDependencies: specifier: ^0.7.34 version: 0.7.34 '@types/node': - specifier: ^18.19.26 - version: 18.19.26 + specifier: ^18.19.28 + version: 18.19.28 '@typescript-eslint/eslint-plugin': specifier: ^5.62.0 version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5) @@ -140,8 +140,8 @@ devDependencies: specifier: ^3.3.2 version: 3.3.2 prisma: - specifier: 5.8.1 - version: 5.8.1 + specifier: ^5.11.0 + version: 5.11.0 typescript: specifier: ^4.9.5 version: 4.9.5 @@ -1773,26 +1773,26 @@ packages: /@internationalized/date@3.5.2: resolution: {integrity: sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==} dependencies: - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 dev: false /@internationalized/message@3.1.2: resolution: {integrity: sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==} dependencies: - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 intl-messageformat: 10.5.11 dev: false /@internationalized/number@3.5.1: resolution: {integrity: sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==} dependencies: - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 dev: false /@internationalized/string@3.2.1: resolution: {integrity: sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==} dependencies: - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 dev: false /@istanbuljs/schema@0.1.3: @@ -1881,8 +1881,8 @@ packages: dev: false optional: true - /@prisma/client@5.8.1(prisma@5.8.1): - resolution: {integrity: sha512-xQtMPfbIwLlbm0VVIVQY2yqQVOxPwRQhvIp7Z3m2900g1bu/zRHKhYZJQWELqmjl6d8YwBy0K2NvMqh47v1ubw==} + /@prisma/client@5.11.0(prisma@5.11.0): + resolution: {integrity: sha512-SWshvS5FDXvgJKM/a0y9nDC1rqd7KG0Q6ZVzd+U7ZXK5soe73DJxJJgbNBt2GNXOa+ysWB4suTpdK5zfFPhwiw==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -1891,35 +1891,35 @@ packages: prisma: optional: true dependencies: - prisma: 5.8.1 + prisma: 5.11.0 dev: false - /@prisma/debug@5.8.1: - resolution: {integrity: sha512-tjuw7eA0Us3T42jx9AmAgL58rzwzpFGYc3R7Y4Ip75EBYrKMBA1YihuWMcBC92ILmjlQ/u3p8VxcIE0hr+fZfg==} + /@prisma/debug@5.11.0: + resolution: {integrity: sha512-N6yYr3AbQqaiUg+OgjkdPp3KPW1vMTAgtKX6+BiB/qB2i1TjLYCrweKcUjzOoRM5BriA4idrkTej9A9QqTfl3A==} - /@prisma/engines-version@5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2: - resolution: {integrity: sha512-f5C3JM3l9yhGr3cr4FMqWloFaSCpNpMi58Om22rjD2DOz3owci2mFdFXMgnAGazFPKrCbbEhcxdsRfspEYRoFQ==} + /@prisma/engines-version@5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102: + resolution: {integrity: sha512-WXCuyoymvrS4zLz4wQagSsc3/nE6CHy8znyiMv8RKazKymOMd5o9FP5RGwGHAtgoxd+aB/BWqxuP/Ckfu7/3MA==} - /@prisma/engines@5.8.1: - resolution: {integrity: sha512-TJgYLRrZr56uhqcXO4GmP5be+zjCIHtLDK20Cnfg+o9d905hsN065QOL+3Z0zQAy6YD31Ol4u2kzSfRmbJv/uA==} + /@prisma/engines@5.11.0: + resolution: {integrity: sha512-gbrpQoBTYWXDRqD+iTYMirDlF9MMlQdxskQXbhARhG6A/uFQjB7DZMYocMQLoiZXO/IskfDOZpPoZE8TBQKtEw==} requiresBuild: true dependencies: - '@prisma/debug': 5.8.1 - '@prisma/engines-version': 5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2 - '@prisma/fetch-engine': 5.8.1 - '@prisma/get-platform': 5.8.1 + '@prisma/debug': 5.11.0 + '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 + '@prisma/fetch-engine': 5.11.0 + '@prisma/get-platform': 5.11.0 - /@prisma/fetch-engine@5.8.1: - resolution: {integrity: sha512-+bgjjoSFa6uYEbAPlklfoVSStOEfcpheOjoBoNsNNSQdSzcwE2nM4Q0prun0+P8/0sCHo18JZ9xqa8gObvgOUw==} + /@prisma/fetch-engine@5.11.0: + resolution: {integrity: sha512-994viazmHTJ1ymzvWugXod7dZ42T2ROeFuH6zHPcUfp/69+6cl5r9u3NFb6bW8lLdNjwLYEVPeu3hWzxpZeC0w==} dependencies: - '@prisma/debug': 5.8.1 - '@prisma/engines-version': 5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2 - '@prisma/get-platform': 5.8.1 + '@prisma/debug': 5.11.0 + '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 + '@prisma/get-platform': 5.11.0 - /@prisma/get-platform@5.8.1: - resolution: {integrity: sha512-wnA+6HTFcY+tkykMokix9GiAkaauPC5W/gg0O5JB0J8tCTNWrqpnQ7AsaGRfkYUbeOIioh6woDjQrGTTRf1Zag==} + /@prisma/get-platform@5.11.0: + resolution: {integrity: sha512-rxtHpMLxNTHxqWuGOLzR2QOyQi79rK1u1XYAVLZxDGTLz/A+uoDnjz9veBFlicrpWjwuieM4N6jcnjj/DDoidw==} dependencies: - '@prisma/debug': 5.8.1 + '@prisma/debug': 5.11.0 /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -1974,7 +1974,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/breadcrumbs': 3.7.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -1989,7 +1989,7 @@ packages: '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2008,7 +2008,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/calendar': 3.4.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2028,7 +2028,7 @@ packages: '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2052,7 +2052,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/combobox': 3.10.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2080,7 +2080,7 @@ packages: '@react-types/datepicker': 3.7.2(react@18.2.0) '@react-types/dialog': 3.5.8(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2096,7 +2096,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/dialog': 3.5.8(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2116,7 +2116,7 @@ packages: '@react-stately/dnd': 3.2.8(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2129,7 +2129,7 @@ packages: '@react-aria/interactions': 3.21.1(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 clsx: 2.1.0 react: 18.2.0 dev: false @@ -2143,7 +2143,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/form': 3.0.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2166,7 +2166,7 @@ packages: '@react-types/checkbox': 3.7.1(react@18.2.0) '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2185,7 +2185,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2202,7 +2202,7 @@ packages: '@react-aria/ssr': 3.9.2(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2214,7 +2214,7 @@ packages: '@react-aria/ssr': 3.9.2(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2225,7 +2225,7 @@ packages: dependencies: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2239,7 +2239,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/link': 3.5.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2257,7 +2257,7 @@ packages: '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/listbox': 3.4.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2265,7 +2265,7 @@ packages: /@react-aria/live-announcer@3.3.2: resolution: {integrity: sha512-aOyPcsfyY9tLCBhuUaYCruwcd1IrYLc47Ou+J7wMzjeN9v4lsaEfiN12WFl8pDqOwfy6/7It2wmlm5hOuZY8wQ==} dependencies: - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 dev: false /@react-aria/menu@3.13.1(react-dom@18.2.0)(react@18.2.0): @@ -2286,7 +2286,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/menu': 3.9.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2299,7 +2299,7 @@ packages: '@react-aria/progress': 3.4.11(react@18.2.0) '@react-types/meter': 3.3.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2319,7 +2319,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/numberfield': 3.8.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2340,7 +2340,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/overlays': 3.8.5(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2355,7 +2355,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/progress': 3.5.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2373,7 +2373,7 @@ packages: '@react-stately/radio': 3.10.2(react@18.2.0) '@react-types/radio': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2389,7 +2389,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/searchfield': 3.5.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2412,7 +2412,7 @@ packages: '@react-types/button': 3.9.2(react@18.2.0) '@react-types/select': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2429,7 +2429,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/selection': 3.14.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2441,7 +2441,7 @@ packages: dependencies: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2458,7 +2458,7 @@ packages: '@react-stately/slider': 3.5.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/slider': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2473,7 +2473,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2484,7 +2484,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2496,7 +2496,7 @@ packages: '@react-aria/toggle': 3.10.2(react@18.2.0) '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/switch': 3.5.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2521,7 +2521,7 @@ packages: '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/table': 3.9.3(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2539,7 +2539,7 @@ packages: '@react-stately/tabs': 3.6.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/tabs': 3.3.5(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2559,7 +2559,7 @@ packages: '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/button': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -2577,7 +2577,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/textfield': 3.9.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2591,7 +2591,7 @@ packages: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-stately/toggle': 3.7.2(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2604,7 +2604,7 @@ packages: '@react-aria/i18n': 3.10.2(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2619,7 +2619,7 @@ packages: '@react-stately/tooltip': 3.4.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/tooltip': 3.4.7(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2631,7 +2631,7 @@ packages: '@react-aria/ssr': 3.9.2(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 clsx: 2.1.0 react: 18.2.0 dev: false @@ -2644,7 +2644,7 @@ packages: '@react-aria/interactions': 3.21.1(react@18.2.0) '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2657,7 +2657,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/calendar': 3.4.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2670,7 +2670,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2680,7 +2680,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2697,7 +2697,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/combobox': 3.10.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2707,7 +2707,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2723,7 +2723,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/datepicker': 3.7.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2734,7 +2734,7 @@ packages: dependencies: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2750,7 +2750,7 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2763,7 +2763,7 @@ packages: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2776,7 +2776,7 @@ packages: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2788,7 +2788,7 @@ packages: '@react-stately/overlays': 3.6.5(react@18.2.0) '@react-types/menu': 3.9.7(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2801,7 +2801,7 @@ packages: '@react-stately/form': 3.0.1(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/numberfield': 3.8.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2812,7 +2812,7 @@ packages: dependencies: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/overlays': 3.8.5(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2825,7 +2825,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/radio': 3.7.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2836,7 +2836,7 @@ packages: dependencies: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/searchfield': 3.5.3(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2850,7 +2850,7 @@ packages: '@react-stately/overlays': 3.6.5(react@18.2.0) '@react-types/select': 3.9.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2862,7 +2862,7 @@ packages: '@react-stately/collections': 3.10.5(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2874,7 +2874,7 @@ packages: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/slider': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2891,7 +2891,7 @@ packages: '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/table': 3.9.3(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2903,7 +2903,7 @@ packages: '@react-stately/list': 3.10.3(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/tabs': 3.3.5(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2914,7 +2914,7 @@ packages: dependencies: '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/checkbox': 3.7.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2925,7 +2925,7 @@ packages: dependencies: '@react-stately/overlays': 3.6.5(react@18.2.0) '@react-types/tooltip': 3.4.7(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2938,7 +2938,7 @@ packages: '@react-stately/selection': 3.14.3(react@18.2.0) '@react-stately/utils': 3.9.1(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2947,7 +2947,7 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 dependencies: - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -2958,7 +2958,7 @@ packages: dependencies: '@react-aria/utils': 3.23.2(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 react: 18.2.0 dev: false @@ -3238,24 +3238,24 @@ packages: resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} dev: false - /@storybook/channels@8.0.4: - resolution: {integrity: sha512-haKV+8RbiSzLjicowUfc7h2fTClZHX/nz9SRUecf4IEZUEu2T78OgM/TzqZvL7rA3+/fKqp5iI+3PN3OA75Sdg==} + /@storybook/channels@8.0.5: + resolution: {integrity: sha512-UWzjt4STzBgg28Q6FxqyJWwXLWYM6oSz9gGKMUJbn2vRAlEJaG3XwvpT39YFVDUIuiFSHguV5cisXY5Be4nOZw==} dependencies: - '@storybook/client-logger': 8.0.4 - '@storybook/core-events': 8.0.4 + '@storybook/client-logger': 8.0.5 + '@storybook/core-events': 8.0.5 '@storybook/global': 5.0.0 telejson: 7.2.0 tiny-invariant: 1.3.3 dev: false - /@storybook/client-logger@8.0.4: - resolution: {integrity: sha512-2SeEg3PT/d0l/+EAVtyj9hmMLTyTPp+bRBSzxYouBjtJPM1jrdKpFagj1o3uBRovwWm9SIVX6/ZsoRC33PEV1g==} + /@storybook/client-logger@8.0.5: + resolution: {integrity: sha512-6D7zvPPnLuTVlBNpZSdzEbk5xfWKhEG0gejtPnhjG9R5YzC/dFckdUI0gtvwGWUVMWhL3H/0gjRjhKujUMRY1Q==} dependencies: '@storybook/global': 5.0.0 dev: false - /@storybook/core-events@8.0.4: - resolution: {integrity: sha512-1FgLacIGi9i6/fyxw7ZJDC621RK47IMaA3keH4lc11ASRzCSwJ4YOrXjBFjfPc79EF2BuX72DDJNbhj6ynfF3g==} + /@storybook/core-events@8.0.5: + resolution: {integrity: sha512-26c0m7P7qt9zUKcD1noWLPJmZ+iS6MKXNngUgNBSxTtG20NFV3nxD0/tx9FzNfDVZDF6cHINkWj+FVBAaVuBVQ==} dependencies: ts-dedent: 2.2.0 dev: false @@ -3270,27 +3270,27 @@ packages: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: false - /@storybook/instrumenter@8.0.4: - resolution: {integrity: sha512-lkHv1na12oMTZvuDbzufgqrtFlV1XqdXrAAg7YXZOia/oMz6Z/XMldEqwLPUCLGVodbFJofrpE67Wtw8dNTDQg==} + /@storybook/instrumenter@8.0.5: + resolution: {integrity: sha512-ccGFGSquIPZBcf3dP+I5kwSblAOlQNH7+4vunYJtUrlXN+VROS9LAf87W/btwxQVI1Zj17BUH9CoBrDxWbJ2VA==} dependencies: - '@storybook/channels': 8.0.4 - '@storybook/client-logger': 8.0.4 - '@storybook/core-events': 8.0.4 + '@storybook/channels': 8.0.5 + '@storybook/client-logger': 8.0.5 + '@storybook/core-events': 8.0.5 '@storybook/global': 5.0.0 - '@storybook/preview-api': 8.0.4 + '@storybook/preview-api': 8.0.5 '@vitest/utils': 1.4.0 util: 0.12.5 dev: false - /@storybook/preview-api@8.0.4: - resolution: {integrity: sha512-uZCgZ/7BZkFTNudCBWx3YPFVdReMQSZJj9EfQVhQaPmfGORHGMvZMRsQXl0ONhPy7zDD4rVQxu5dSKWmIiYoWQ==} + /@storybook/preview-api@8.0.5: + resolution: {integrity: sha512-BSDVTR9/X6DHVA4rIhN6d/SB6PiaRdns8ky/TKTzwFEyO3NOASHe8051O+uNtXzgCtMUj/8imNrTdMTYgUm1LA==} dependencies: - '@storybook/channels': 8.0.4 - '@storybook/client-logger': 8.0.4 - '@storybook/core-events': 8.0.4 + '@storybook/channels': 8.0.5 + '@storybook/client-logger': 8.0.5 + '@storybook/core-events': 8.0.5 '@storybook/csf': 0.1.3 '@storybook/global': 5.0.0 - '@storybook/types': 8.0.4 + '@storybook/types': 8.0.5 '@types/qs': 6.9.14 dequal: 2.0.3 lodash: 4.17.21 @@ -3301,13 +3301,13 @@ packages: util-deprecate: 1.0.2 dev: false - /@storybook/test@8.0.4(vitest@0.32.4): - resolution: {integrity: sha512-/uvE8Rtu7tIcuyQBUzKq7uuDCsjmADI18BApLdwo/qthmN8ERDxRSz0Ngj2gvBMQFv99At8ESi/xh6oFGu3rWg==} + /@storybook/test@8.0.5(vitest@0.32.4): + resolution: {integrity: sha512-XpiRLsmZlkjoAGf3d7zcInByR25evYIzm3W4ST8+EPoI4Tcd/U+dGUQ9A6aNUuC6fJQ8Jh0M+EqNAZtcDT8lrA==} dependencies: - '@storybook/client-logger': 8.0.4 - '@storybook/core-events': 8.0.4 - '@storybook/instrumenter': 8.0.4 - '@storybook/preview-api': 8.0.4 + '@storybook/client-logger': 8.0.5 + '@storybook/core-events': 8.0.5 + '@storybook/instrumenter': 8.0.5 + '@storybook/preview-api': 8.0.5 '@testing-library/dom': 9.3.4 '@testing-library/jest-dom': 6.4.2(vitest@0.32.4) '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) @@ -3323,10 +3323,10 @@ packages: - vitest dev: false - /@storybook/types@8.0.4: - resolution: {integrity: sha512-OO7QY+qZFCYkItDUBACtIV32p75O7sNziAiyS1V2Oxgo7Ln7fwZwr3mJcA1ruBed6ZcrW3c87k7Xs40T2zAWcg==} + /@storybook/types@8.0.5: + resolution: {integrity: sha512-lYXwYF9qooQhYJkg3HWr6PD/vnQK+iO8fSKS8jtntwgJUKJvTbGZKAhNnS8WzNEI9jIp5QXFsSA367NjIDPaeQ==} dependencies: - '@storybook/channels': 8.0.4 + '@storybook/channels': 8.0.5 '@types/express': 4.17.21 file-system-cache: 2.3.0 dev: false @@ -3344,8 +3344,8 @@ packages: tslib: 2.6.2 dev: false - /@swc/helpers@0.5.7: - resolution: {integrity: sha512-BVvNZhx362+l2tSwSuyEUV4h7+jk9raNdoTSdLfwTshXJSaGmYKluGRJznziCI3KX02Z19DdsQrdfrpXAU3Hfg==} + /@swc/helpers@0.5.8: + resolution: {integrity: sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg==} dependencies: tslib: 2.6.2 dev: false @@ -3419,14 +3419,14 @@ packages: /@types/bcrypt@5.0.2: resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 dev: true /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.26 + '@types/node': 18.19.28 /@types/chai-subset@1.3.5: resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} @@ -3439,7 +3439,7 @@ packages: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 /@types/cookie-parser@1.4.7: resolution: {integrity: sha512-Fvuyi354Z+uayxzIGCwYTayFKocfV7TuDYZClCdIP9ckhvAu/ixDtCB6qx2TT0FKjPLf1f3P/J1rgf6lPs64mw==} @@ -3450,7 +3450,7 @@ packages: /@types/cors@2.8.17: resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 dev: true /@types/debug@4.1.12: @@ -3466,7 +3466,7 @@ packages: /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 '@types/qs': 6.9.14 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -3493,7 +3493,7 @@ packages: /@types/jsonwebtoken@9.0.6: resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 dev: true /@types/long@4.0.2: @@ -3503,8 +3503,11 @@ packages: /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + /@types/mime@4.0.0: + resolution: {integrity: sha512-5eEkJZ/BLvTE3vXGKkWlyTSUVZuzj23Wj8PoyOq2lt5I3CYbiLBOPb3XmCW6QcuOibIUE6emHXHt9E/F/rCa6w==} + deprecated: This is a stub types definition. mime provides its own type definitions, so you do not need this installed. + dependencies: + mime: 4.0.1 /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -3512,12 +3515,12 @@ packages: /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 form-data: 4.0.0 dev: false - /@types/node@18.19.26: - resolution: {integrity: sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==} + /@types/node@18.19.28: + resolution: {integrity: sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw==} dependencies: undici-types: 5.26.5 @@ -3535,14 +3538,14 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.26 + '@types/node': 18.19.28 /@types/serve-static@1.15.5: resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 18.19.26 + '@types/mime': 4.0.0 + '@types/node': 18.19.28 /@types/validator@13.11.9: resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} @@ -3923,7 +3926,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -3940,7 +3943,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -3952,7 +3955,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: true @@ -3962,7 +3965,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 dev: true @@ -3973,7 +3976,7 @@ packages: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -4126,8 +4129,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.717 + caniuse-lite: 1.0.30001603 + electron-to-chromium: 1.4.722 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -4219,8 +4222,8 @@ packages: engines: {node: '>=6'} dev: false - /caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + /caniuse-lite@1.0.30001603: + resolution: {integrity: sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==} /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -4698,17 +4701,17 @@ packages: esutils: 2.0.3 dev: true - /document-drive@1.0.0-alpha.23(@prisma/client@5.8.1)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.1)(sqlite3@5.1.7): - resolution: {integrity: sha512-tGiGBCNCB+sv+P3N4ZoxNi0wa/eJua+WGYsEP5GDMW2WfKKtXdI3XhoenZkAnqlaLcClwE5oe+/ruSQD9w2tBg==} + /document-drive@1.0.0-alpha.24(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7): + resolution: {integrity: sha512-wYE3+iax4a5WC5neFla/MQ8iBUvMP0grQh3OuOt07kkq4CDrQY5+3fZlIZ5Azq3voC3cF1+XC2XnDpA/vZPqjg==} peerDependencies: - '@prisma/client': 5.8.1 - document-model: ^1.0.34 - document-model-libs: ^1.1.51 + '@prisma/client': 5.11.0 + document-model: ^1.0.35 + document-model-libs: ^1.17.1 localforage: ^1.10.0 sequelize: ^6.35.2 sqlite3: ^5.1.7 dependencies: - '@prisma/client': 5.8.1(prisma@5.8.1) + '@prisma/client': 5.11.0(prisma@5.11.0) document-model: 1.0.35 document-model-libs: 1.17.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) graphql: 16.8.1 @@ -4717,7 +4720,7 @@ packages: localforage: 1.10.0 nanoevents: 9.0.0 sanitize-filename: 1.6.3 - sequelize: 6.37.1(sqlite3@5.1.7) + sequelize: 6.37.2(sqlite3@5.1.7) sqlite3: 5.1.7 transitivePeerDependencies: - encoding @@ -4733,7 +4736,7 @@ packages: '@graphql-codegen/core': 4.0.2(graphql@16.8.1) '@graphql-codegen/typescript': 4.0.6(graphql@16.8.1) '@internationalized/date': 3.5.2 - '@storybook/test': 8.0.4(vitest@0.32.4) + '@storybook/test': 8.0.5(vitest@0.32.4) copy-anything: 3.0.5 date-fns: 3.6.0 deep-object-diff: 1.1.9 @@ -4804,8 +4807,8 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.717: - resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==} + /electron-to-chromium@1.4.722: + resolution: {integrity: sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==} /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -4856,8 +4859,8 @@ packages: dev: false optional: true - /es-abstract@1.23.2: - resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 @@ -5549,7 +5552,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 functions-have-names: 1.2.3 dev: true @@ -6617,7 +6620,6 @@ packages: resolution: {integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==} engines: {node: '>=16'} hasBin: true - dev: false /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} @@ -6804,8 +6806,8 @@ packages: tslib: 2.6.2 dev: false - /node-abi@3.56.0: - resolution: {integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==} + /node-abi@3.57.0: + resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} dependencies: semver: 7.6.0 @@ -6944,7 +6946,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 dev: true @@ -6954,7 +6956,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 dev: true /object.values@1.2.0: @@ -7133,8 +7135,8 @@ packages: /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + /pg-connection-string@2.6.3: + resolution: {integrity: sha512-77FxhhKJQH+xJx6tDqkhhMa0nZvv3U1HYLDQgwZxZafVD583++O5LXn5oo5HaQZ0vXwYcZA1koYAJM3JvD6Gtw==} dev: false /picocolors@1.0.0: @@ -7232,7 +7234,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.56.0 + node-abi: 3.57.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -7262,13 +7264,13 @@ packages: ansi-styles: 5.2.0 react-is: 18.2.0 - /prisma@5.8.1: - resolution: {integrity: sha512-N6CpjzECnUHZ5beeYpDzkt2rYpEdAeqXX2dweu6BoQaeYkNZrC/WJHM+5MO/uidFHTak8QhkPKBWck1o/4MD4A==} + /prisma@5.11.0: + resolution: {integrity: sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.8.1 + '@prisma/engines': 5.11.0 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7400,7 +7402,7 @@ packages: '@react-types/grid': 3.2.4(react@18.2.0) '@react-types/shared': 3.22.1(react@18.2.0) '@react-types/table': 3.9.3(react@18.2.0) - '@swc/helpers': 0.5.7 + '@swc/helpers': 0.5.8 client-only: 0.0.1 react: 18.2.0 react-aria: 3.32.1(react-dom@18.2.0)(react@18.2.0) @@ -7743,8 +7745,8 @@ packages: engines: {node: '>= 10.0.0'} dev: false - /sequelize@6.37.1(sqlite3@5.1.7): - resolution: {integrity: sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==} + /sequelize@6.37.2(sqlite3@5.1.7): + resolution: {integrity: sha512-bnb7swGANONXCTrVyebpOOZssLwQrVkYX2tcC6qOIvH+P+OhsoMBi7c3GXI5bC+Z4b4tOl+kQy6yeqLCZ1YQAQ==} engines: {node: '>=10.0.0'} peerDependencies: ibm_db: '*' @@ -7784,7 +7786,7 @@ packages: lodash: 4.17.21 moment: 2.30.1 moment-timezone: 0.5.45 - pg-connection-string: 2.6.2 + pg-connection-string: 2.6.3 retry-as-promised: 7.0.4 semver: 7.6.0 sequelize-pool: 7.1.0 @@ -8040,7 +8042,7 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.2 + es-abstract: 1.23.3 es-object-atoms: 1.0.0 dev: true @@ -8519,7 +8521,7 @@ packages: engines: {node: '>= 0.8'} dev: false - /vite-node@0.29.8(@types/node@18.19.26): + /vite-node@0.29.8(@types/node@18.19.28): resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} engines: {node: '>=v14.16.0'} hasBin: true @@ -8529,7 +8531,7 @@ packages: mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.0 - vite: 4.5.3(@types/node@18.19.26) + vite: 4.5.3(@types/node@18.19.28) transitivePeerDependencies: - '@types/node' - less @@ -8541,7 +8543,7 @@ packages: - terser dev: false - /vite-node@0.32.4(@types/node@18.19.26): + /vite-node@0.32.4(@types/node@18.19.28): resolution: {integrity: sha512-L2gIw+dCxO0LK14QnUMoqSYpa9XRGnTTTDjW2h19Mr+GR0EFj4vx52W41gFXfMLqpA00eK4ZjOVYo1Xk//LFEw==} engines: {node: '>=v14.18.0'} hasBin: true @@ -8551,7 +8553,7 @@ packages: mlly: 1.6.1 pathe: 1.1.2 picocolors: 1.0.0 - vite: 4.5.3(@types/node@18.19.26) + vite: 4.5.3(@types/node@18.19.28) transitivePeerDependencies: - '@types/node' - less @@ -8562,7 +8564,7 @@ packages: - supports-color - terser - /vite@4.5.3(@types/node@18.19.26): + /vite@4.5.3(@types/node@18.19.28): resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -8590,7 +8592,7 @@ packages: terser: optional: true dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 esbuild: 0.18.20 postcss: 8.4.38 rollup: 3.29.4 @@ -8641,7 +8643,7 @@ packages: dependencies: '@types/chai': 4.3.14 '@types/chai-subset': 1.3.5 - '@types/node': 18.19.26 + '@types/node': 18.19.28 '@vitest/expect': 0.32.4 '@vitest/runner': 0.32.4 '@vitest/snapshot': 0.32.4 @@ -8660,8 +8662,8 @@ packages: strip-literal: 1.3.0 tinybench: 2.6.0 tinypool: 0.5.0 - vite: 4.5.3(@types/node@18.19.26) - vite-node: 0.32.4(@types/node@18.19.26) + vite: 4.5.3(@types/node@18.19.28) + vite-node: 0.32.4(@types/node@18.19.28) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8754,7 +8756,7 @@ packages: /wkx@0.5.0: resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} dependencies: - '@types/node': 18.19.26 + '@types/node': 18.19.28 dev: false /wrap-ansi@6.2.0: diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index 3f015219..8b74bb2e 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -56,41 +56,44 @@ model Document { lastModified DateTime @default(now()) revision Json name String? + operations Operation[] initialState Json // json object with the scope as keys of the root object documentType String syncronizationUnits SyncronizationUnit[] - operations Operation[] @@id([id, driveId]) } model Operation { - id String @id @default(uuid()) - driveId String - - documentId String - scope String - branch String - index Int - skip Int - hash String - timestamp DateTime - input Json - type String - syncId String? - clipboard Boolean? @default(false) - Document Document? @relation(fields: [driveId, documentId], references: [driveId, id], onDelete: Cascade) - attachments Attachment[] + id String @id @default(uuid()) + driveId String + Document Document? @relation(fields: [driveId, documentId], references: [driveId, id], onDelete: Cascade) + documentId String + scope String + branch String + index Int + skip Int + hash String + timestamp DateTime + input Json + type String + attachments Attachment[] + syncId String? + clipboard Boolean? @default(false) + SyncronizationUnit SyncronizationUnit? @relation(fields: [syncId, driveId], references: [id, driveId], onDelete: Cascade) + + @@unique([driveId, documentId, scope, branch, index], name: "unique_operation") } model SyncronizationUnit { id String driveId String documentId String + + Document Document @relation(fields: [documentId, driveId], references: [id, driveId], onDelete: Cascade) scope String branch String - Document Document @relation(fields: [documentId, driveId], references: [id, driveId], onDelete: Cascade) operations Operation[] @@id([id, driveId]) @@ -99,22 +102,25 @@ model SyncronizationUnit { model Attachment { id String @id @default(uuid()) operationId String - mimeType String - data String - filename String - extension String - hash String Operation Operation @relation(fields: [operationId], references: [id], onDelete: Cascade) + + mimeType String + data String + filename String + extension String + hash String } model Listener { - listenerId String @id @default(uuid()) + listenerId String @id @default(uuid()) driveId String - label String? - block Boolean - system Boolean - filter Json - callInfo Json + + label String? + block Boolean + system Boolean + + filter Json + callInfo Json } // RWA Operational Data From 913804e5130a60f9a587d6df990e9d0e1d65124d Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 2 Apr 2024 11:01:34 +0200 Subject: [PATCH 37/50] feat: error logging --- api/package.json | 3 +- api/pnpm-lock.yaml | 19 ++- api/src/errors/BadRequestError.ts | 32 +++++ api/src/errors/CustomError.ts | 17 +++ api/src/errors/DocumentDriveError.ts | 32 +++++ api/src/graphql/server/index.ts | 6 +- api/src/middleware/errors.ts | 15 +++ .../modules/document-drive/drive-resolver.ts | 109 ++++++++++-------- .../modules/document-drive/drives-resolver.ts | 20 ++-- api/src/modules/document/model.ts | 8 +- 10 files changed, 197 insertions(+), 64 deletions(-) create mode 100644 api/src/errors/BadRequestError.ts create mode 100644 api/src/errors/CustomError.ts create mode 100644 api/src/errors/DocumentDriveError.ts create mode 100644 api/src/middleware/errors.ts diff --git a/api/package.json b/api/package.json index 1241d8a1..41f861fc 100644 --- a/api/package.json +++ b/api/package.json @@ -21,12 +21,13 @@ "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "document-drive": "1.0.0-alpha.24", + "document-drive": "1.0.0-alpha.25", "document-model": "^1.0.35", "document-model-libs": "^1.17.1", "dotenv": "^16.4.5", "ethers": "^5.7.2", "express": "^4.19.2", + "express-async-errors": "^3.1.1", "graphql": "^16.8.1", "graphql-middleware": "^6.1.35", "graphql-playground-html": "^1.6.30", diff --git a/api/pnpm-lock.yaml b/api/pnpm-lock.yaml index cee00c4c..6976b9dc 100644 --- a/api/pnpm-lock.yaml +++ b/api/pnpm-lock.yaml @@ -24,8 +24,8 @@ dependencies: specifier: ^2.8.5 version: 2.8.5 document-drive: - specifier: 1.0.0-alpha.24 - version: 1.0.0-alpha.24(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7) + specifier: 1.0.0-alpha.25 + version: 1.0.0-alpha.25(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7) document-model: specifier: ^1.0.35 version: 1.0.35 @@ -41,6 +41,9 @@ dependencies: express: specifier: ^4.19.2 version: 4.19.2 + express-async-errors: + specifier: ^3.1.1 + version: 3.1.1(express@4.19.2) graphql: specifier: ^16.8.1 version: 16.8.1 @@ -4701,8 +4704,8 @@ packages: esutils: 2.0.3 dev: true - /document-drive@1.0.0-alpha.24(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7): - resolution: {integrity: sha512-wYE3+iax4a5WC5neFla/MQ8iBUvMP0grQh3OuOt07kkq4CDrQY5+3fZlIZ5Azq3voC3cF1+XC2XnDpA/vZPqjg==} + /document-drive@1.0.0-alpha.25(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7): + resolution: {integrity: sha512-tM5an9gvPdEYXWU7EVFDgaiBwcNCZxx88uPqwztrCVXijUTG+1qFOWhg7i6MHMsK6+r22ifp6FfvLHNeK1B8Iw==} peerDependencies: '@prisma/client': 5.11.0 document-model: ^1.0.35 @@ -5286,6 +5289,14 @@ packages: engines: {node: '>=6'} dev: false + /express-async-errors@3.1.1(express@4.19.2): + resolution: {integrity: sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==} + peerDependencies: + express: ^4.16.2 + dependencies: + express: 4.19.2 + dev: false + /express@4.19.2: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} diff --git a/api/src/errors/BadRequestError.ts b/api/src/errors/BadRequestError.ts new file mode 100644 index 00000000..30cbe763 --- /dev/null +++ b/api/src/errors/BadRequestError.ts @@ -0,0 +1,32 @@ +import { CustomError } from "./CustomError"; + +export default class BadRequestError extends CustomError { + private static readonly _statusCode = 400; + private readonly _code: number; + private readonly _logging: boolean; + private readonly _context: { [key: string]: any }; + + constructor(params?: {code?: number, message?: string, logging?: boolean, context?: { [key: string]: any }}) { + const { code, message, logging } = params || {}; + + super(message || "Bad request"); + this._code = code || BadRequestError._statusCode; + this._logging = logging || false; + this._context = params?.context || {}; + + // Only because we are extending a built in class + Object.setPrototypeOf(this, BadRequestError.prototype); + } + + get errors() { + return [{ message: this.message, context: this._context }]; + } + + get statusCode() { + return this._code; + } + + get logging() { + return this._logging; + } +} diff --git a/api/src/errors/CustomError.ts b/api/src/errors/CustomError.ts new file mode 100644 index 00000000..06cc00f3 --- /dev/null +++ b/api/src/errors/CustomError.ts @@ -0,0 +1,17 @@ +export type CustomErrorContent = { + message: string, + context?: { [key: string]: any } +}; + +export abstract class CustomError extends Error { + abstract readonly statusCode: number; + abstract readonly errors: CustomErrorContent[]; + abstract readonly logging: boolean; + + constructor(message: string) { + super(message); + + // Only because we are extending a built in class + Object.setPrototypeOf(this, CustomError.prototype); + } +} diff --git a/api/src/errors/DocumentDriveError.ts b/api/src/errors/DocumentDriveError.ts new file mode 100644 index 00000000..cc15e9d2 --- /dev/null +++ b/api/src/errors/DocumentDriveError.ts @@ -0,0 +1,32 @@ +import { CustomError } from "./CustomError"; + +export default class DocumentDriveError extends CustomError { + private static readonly _statusCode = 400; + private readonly _code: number; + private readonly _logging: boolean; + private readonly _context: { [key: string]: any }; + + constructor(params?: { code?: number, message?: string, logging?: boolean, context?: { [key: string]: any } }) { + const { code, message, logging } = params || {}; + + super(message || "Bad request"); + this._code = code || DocumentDriveError._statusCode; + this._logging = logging || false; + this._context = params?.context || {}; + + // Only because we are extending a built in class + Object.setPrototypeOf(this, DocumentDriveError.prototype); + } + + get errors() { + return [{ message: this.message, context: this._context }]; + } + + get statusCode() { + return this._code; + } + + get logging() { + return this._logging; + } +} diff --git a/api/src/graphql/server/index.ts b/api/src/graphql/server/index.ts index 522fde54..2842d47e 100644 --- a/api/src/graphql/server/index.ts +++ b/api/src/graphql/server/index.ts @@ -9,10 +9,11 @@ import cors from 'cors'; import { PORT } from '../../env'; import { schemaWithMiddleware as indexSchema } from './index/schema'; import { schemaWithMiddleware as driveSchema } from './drive/schema'; -import { Context as IndexContext, createContext as createIndexContext } from './index/context'; +import { Context, Context as IndexContext, createContext as createIndexContext } from './index/context'; import { Context as DriveContext, createContext as createDriveContext } from './drive/context'; import { getChildLogger } from '../../logger'; -import { renderPlaygroundPage } from 'graphql-playground-html'; +import "express-async-errors"; +import { errorHandler } from '../../middleware/errors'; const logger = getChildLogger({ msgPrefix: 'SERVER' }); @@ -78,6 +79,7 @@ export const startServer = async ( app.use(basePath, router); const httpServer = createHttpServer(app); + app.use(errorHandler); return httpServer.listen({ port: PORT }, () => { logger.info(`Running on ${PORT}`); }); diff --git a/api/src/middleware/errors.ts b/api/src/middleware/errors.ts new file mode 100644 index 00000000..fb483e22 --- /dev/null +++ b/api/src/middleware/errors.ts @@ -0,0 +1,15 @@ +import { NextFunction, Request, Response } from "express"; +import { getChildLogger } from "../logger"; +import { CustomError } from "../errors/CustomError"; + +const logger = getChildLogger({ msgPrefix: 'Generic Error Handler', }); + +export const errorHandler = (err: Error, req: Request, res: Response, next: NextFunction) => { + err.cause = err.cause || 'Unknown'; + logger.error({ + msg: err.message, + }); + + console.log("TEST TEST TEST") + res.status(500).send({ errors: err.message }); +}; diff --git a/api/src/modules/document-drive/drive-resolver.ts b/api/src/modules/document-drive/drive-resolver.ts index 46b3ab96..717532c2 100644 --- a/api/src/modules/document-drive/drive-resolver.ts +++ b/api/src/modules/document-drive/drive-resolver.ts @@ -17,6 +17,7 @@ import stringify from 'json-stringify-deterministic'; import { getChildLogger } from '../../logger'; import { Context } from '../../graphql/server/drive/context'; import { DocumentDriveAction } from 'document-model-libs/document-drive'; +import DocumentDriveError from '../../errors/DocumentDriveError'; const logger = getChildLogger({ msgPrefix: 'Drive Resolver' }); @@ -234,9 +235,8 @@ export const getDrive = queryField('drive', { try { const drive = await ctx.prisma.document.getDrive(ctx.driveId ?? '1'); return drive; - } catch (e) { - logger.error(e); - return null; + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to get drive", logging: true, context: e }) } }, }); @@ -247,17 +247,23 @@ export const registerListener = mutationField('registerPullResponderListener', { filter: nonNull(InputListenerFilter), }, resolve: async (_parent, { filter }, ctx: Context) => { - const result = await ctx.prisma.document.registerPullResponderListener( - ctx.driveId ?? '1', - { + try { + const result = await ctx.prisma.document.registerPullResponderListener( + ctx.driveId ?? '1', + { branch: filter.branch?.filter(b => !!b) as string[] ?? [], documentId: filter.documentId?.filter(b => !!b) as string[] ?? [], documentType: filter.documentType?.filter(b => !!b) as string[] ?? [], scope: filter.scope?.filter(b => !!b) as string[] ?? [], - }, - ); + }, + ); + + return result; + + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to register listener", logging: true, context: e }) + } - return result; }, }); @@ -268,12 +274,16 @@ export const deleteListener = mutationField('deletePullResponderListener', { filter: nonNull(InputListenerFilter), }, resolve: async (_parent, { filter }, ctx: Context) => { - const result = await ctx.prisma.document.deletePullResponderListener( - ctx.driveId ?? '1', - filter, - ); + try { + const result = await ctx.prisma.document.deletePullResponderListener( + ctx.driveId ?? '1', + filter, + ); - return result; + return result; + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to delete listener", logging: true, context: e }) + } }, }); @@ -286,36 +296,42 @@ export const pushUpdates = mutationField('pushUpdates', { logger.info('pushUpdates') if (!strands || strands?.length === 0) return []; - const listenerRevisions: IListenerRevision[] = await Promise.all(strands.map(async (s) => { - const operations = s.operations?.map((o) => ({ - ...o, - input: JSON.parse(o.input), - skip: o.skip ?? 0, - scope: s.scope as OperationScope, - branch: 'main', - scopes: ['global', 'local'], - })) ?? []; - - const result = await ctx.prisma.document.pushUpdates( - s.driveId, - operations as Operation[], - s.documentId ?? undefined, - ); - - if (result.status !== "SUCCESS") logger.error(result.error); - - const revision = result.document?.operations[s.scope as OperationScope].slice().pop()?.index ?? -1; - return { - revision, - branch: s.branch, - documentId: s.documentId ?? '', - driveId: s.driveId, - scope: s.scope as OperationScope, - status: result.status, - }; - })); - - return listenerRevisions; + try { + const listenerRevisions: IListenerRevision[] = await Promise.all(strands.map(async (s) => { + const operations = s.operations?.map((o) => ({ + ...o, + input: JSON.parse(o.input), + skip: o.skip ?? 0, + scope: s.scope as OperationScope, + branch: 'main', + scopes: ['global', 'local'], + })) ?? []; + + const result = await ctx.prisma.document.pushUpdates( + s.driveId, + operations as Operation[], + s.documentId ?? undefined, + ); + + if (result.status !== "SUCCESS") logger.error(result.error); + + const revision = result.document?.operations[s.scope as OperationScope].slice().pop()?.index ?? -1; + return { + revision, + branch: s.branch, + documentId: s.documentId ?? '', + driveId: s.driveId, + scope: s.scope as OperationScope, + status: result.status, + }; + + })); + + + return listenerRevisions; + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to push updates", logging: true, context: e }) + } }, }); @@ -346,9 +362,8 @@ export const acknowledge = mutationField('acknowledge', { ); return result; - } catch (e) { - logger.error(e) - return false; + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to acknowledge", logging: true, context: e }) } }, }); diff --git a/api/src/modules/document-drive/drives-resolver.ts b/api/src/modules/document-drive/drives-resolver.ts index 49da5252..996d0033 100644 --- a/api/src/modules/document-drive/drives-resolver.ts +++ b/api/src/modules/document-drive/drives-resolver.ts @@ -9,6 +9,7 @@ import { import { DocumentDriveState } from './drive-resolver'; import { Context } from '../../graphql/server/drive/context'; import logger from '../../logger'; +import DocumentDriveError from '../../errors/DocumentDriveError'; export const DocumentDriveLocalState = objectType({ name: 'DocumentDriveLocalState', @@ -68,11 +69,15 @@ export const addDrive = mutationField('addDrive', { local: nonNull(DocumentDriveLocalStateInput), }, resolve: async (_parent, { global, local }, ctx: Context) => { - const drive = await ctx.prisma.document.addDrive({ - global: { id: global.id, name: global.name, icon: global.icon ?? null, slug: global.slug ?? null }, - local: { availableOffline: local.availableOffline, sharingType: local.sharingType ?? null, listeners: [], triggers: [] }, - }); - return drive.state; + try { + const drive = await ctx.prisma.document.addDrive({ + global: { id: global.id, name: global.name, icon: global.icon ?? null, slug: global.slug ?? null }, + local: { availableOffline: local.availableOffline, sharingType: local.sharingType ?? null, listeners: [], triggers: [] }, + }); + return drive.state; + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to add drive", logging: true, context: e }) + } }, }); @@ -84,9 +89,8 @@ export const deleteDrive = mutationField('deleteDrive', { resolve: async (_parent, { id }, ctx: Context) => { try { await ctx.prisma.document.deleteDrive(id); - } catch (e) { - logger.error(e); - return false; + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to delete drive", logging: true, context: e }) } return true; diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index 9cdfc404..2c2a40d7 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -45,8 +45,12 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { ); async function initialize() { - await driveServer.initialize(); - await init(driveServer, prisma); + try { + await driveServer.initialize(); + await init(driveServer, prisma); + } catch (e) { + console.log(e); + } } function clearDriveCache() { From b362cf5b2cc65e96694fc5ea12745ec91b5bc1d4 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 2 Apr 2024 11:02:57 +0200 Subject: [PATCH 38/50] chore: catch drive init exceptions --- api/src/modules/document/model.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index 2c2a40d7..688acf73 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -27,6 +27,7 @@ import { import { init } from './listenerManager'; import { getChildLogger } from '../../logger'; +import DocumentDriveError from '../../errors/DocumentDriveError'; const logger = getChildLogger({ msgPrefix: 'Document Model' }); @@ -48,8 +49,8 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { try { await driveServer.initialize(); await init(driveServer, prisma); - } catch (e) { - console.log(e); + } catch (e: any) { + throw new DocumentDriveError({ code: 500, message: e.message ?? "Failed to initialize drive server", logging: true, context: e }) } } @@ -217,7 +218,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { listenerId: uuid, system: false, }; - + const result = await driveServer.addDriveAction(driveId, actions.addListener({ listener })); if (result.status !== "SUCCESS") { result.error && logger.error(result.error); From 9b1e4377ecc28efba72bf41dc5a7058401c562a9 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 2 Apr 2024 11:10:44 +0200 Subject: [PATCH 39/50] chore: cleanup --- api/src/middleware/errors.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/middleware/errors.ts b/api/src/middleware/errors.ts index fb483e22..f789b493 100644 --- a/api/src/middleware/errors.ts +++ b/api/src/middleware/errors.ts @@ -10,6 +10,5 @@ export const errorHandler = (err: Error, req: Request, res: Response, next: Next msg: err.message, }); - console.log("TEST TEST TEST") res.status(500).send({ errors: err.message }); }; From 2ee3c74eefeb8f4a3a4f7a568db31aaa3c0fd988 Mon Sep 17 00:00:00 2001 From: acaldas Date: Wed, 3 Apr 2024 15:33:30 +0100 Subject: [PATCH 40/50] feat: update deps --- api/package.json | 4 ++-- api/pnpm-lock.yaml | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/api/package.json b/api/package.json index 41f861fc..aba3ac59 100644 --- a/api/package.json +++ b/api/package.json @@ -21,9 +21,9 @@ "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "document-drive": "1.0.0-alpha.25", + "document-drive": "1.0.0-alpha.27", "document-model": "^1.0.35", - "document-model-libs": "^1.17.1", + "document-model-libs": "^1.18.1", "dotenv": "^16.4.5", "ethers": "^5.7.2", "express": "^4.19.2", diff --git a/api/pnpm-lock.yaml b/api/pnpm-lock.yaml index 6976b9dc..ab1b3cf6 100644 --- a/api/pnpm-lock.yaml +++ b/api/pnpm-lock.yaml @@ -24,14 +24,14 @@ dependencies: specifier: ^2.8.5 version: 2.8.5 document-drive: - specifier: 1.0.0-alpha.25 - version: 1.0.0-alpha.25(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7) + specifier: 1.0.0-alpha.27 + version: 1.0.0-alpha.27(@prisma/client@5.11.0)(document-model-libs@1.18.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7) document-model: specifier: ^1.0.35 version: 1.0.35 document-model-libs: - specifier: ^1.17.1 - version: 1.17.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) + specifier: ^1.18.1 + version: 1.18.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -4704,19 +4704,19 @@ packages: esutils: 2.0.3 dev: true - /document-drive@1.0.0-alpha.25(@prisma/client@5.11.0)(document-model-libs@1.17.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7): - resolution: {integrity: sha512-tM5an9gvPdEYXWU7EVFDgaiBwcNCZxx88uPqwztrCVXijUTG+1qFOWhg7i6MHMsK6+r22ifp6FfvLHNeK1B8Iw==} + /document-drive@1.0.0-alpha.27(@prisma/client@5.11.0)(document-model-libs@1.18.1)(document-model@1.0.35)(localforage@1.10.0)(sequelize@6.37.2)(sqlite3@5.1.7): + resolution: {integrity: sha512-XixL8lP4wuvE52yDM++gZgsD01zhf9JZNJ949rs8FcXhkDEM6S2CIWWySzSEK57i892jLYkAq5lVsVhtftn1fQ==} peerDependencies: '@prisma/client': 5.11.0 document-model: ^1.0.35 - document-model-libs: ^1.17.1 + document-model-libs: ^1.18.1 localforage: ^1.10.0 sequelize: ^6.35.2 sqlite3: ^5.1.7 dependencies: '@prisma/client': 5.11.0(prisma@5.11.0) document-model: 1.0.35 - document-model-libs: 1.17.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) + document-model-libs: 1.18.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4) graphql: 16.8.1 graphql-request: 6.1.0(graphql@16.8.1) json-stringify-deterministic: 1.0.12 @@ -4729,8 +4729,8 @@ packages: - encoding dev: false - /document-model-libs@1.17.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4): - resolution: {integrity: sha512-aXf6lkq2ENQl1JA0Tnf5KlrJ4iWMZWEDA7v4e99rCAHtc4XM7gtWj2Fy8T66UiE0tqhxF6Ab52ZyGMbC0Fjf1Q==} + /document-model-libs@1.18.1(graphql@16.8.1)(react-dom@18.2.0)(react@18.2.0)(vitest@0.32.4): + resolution: {integrity: sha512-q/i0+rL2N44bkCF0rLXdbZtjEwtXzpdTa9XYc7TVpENcQ7gT8Tp6e7JJU/cyleGoPxKsLgHakdKCQ5QIxwWd+Q==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 From 877bd5382237de3f197f4fb3a9869c7f70d937e3 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 2 Apr 2024 13:31:32 +0200 Subject: [PATCH 41/50] feat: documents query --- api/src/graphql/generated/drive/nexus.ts | 2 ++ api/src/graphql/generated/drive/schema.graphql | 1 + api/src/modules/document/model.ts | 5 +++++ api/src/modules/document/resolvers.ts | 16 +++++++++++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/api/src/graphql/generated/drive/nexus.ts b/api/src/graphql/generated/drive/nexus.ts index 16ebeccb..9906cadd 100644 --- a/api/src/graphql/generated/drive/nexus.ts +++ b/api/src/graphql/generated/drive/nexus.ts @@ -856,6 +856,7 @@ export interface NexusGenFieldTypes { coreUnit: NexusGenRootTypes['CoreUnit'] | null; // CoreUnit coreUnits: Array | null; // [CoreUnit] document: NexusGenRootTypes['IDocument'] | null; // IDocument + documents: Array | null; // [IDocument] drive: NexusGenRootTypes['DocumentDriveState'] | null; // DocumentDriveState rwaPortfolios: Array | null; // [RealWorldAssetsPortfolio] system: NexusGenRootTypes['SwitchboardDrive'] | null; // SwitchboardDrive @@ -1347,6 +1348,7 @@ export interface NexusGenFieldTypeNames { coreUnit: 'CoreUnit' coreUnits: 'CoreUnit' document: 'IDocument' + documents: 'IDocument' drive: 'DocumentDriveState' rwaPortfolios: 'RealWorldAssetsPortfolio' system: 'SwitchboardDrive' diff --git a/api/src/graphql/generated/drive/schema.graphql b/api/src/graphql/generated/drive/schema.graphql index f3174d5a..3ddf4fa4 100644 --- a/api/src/graphql/generated/drive/schema.graphql +++ b/api/src/graphql/generated/drive/schema.graphql @@ -415,6 +415,7 @@ type Query { coreUnit(id: String): CoreUnit coreUnits: [CoreUnit] document(id: String!): IDocument + documents: [IDocument] drive: DocumentDriveState rwaPortfolios: [RealWorldAssetsPortfolio] system: SwitchboardDrive diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index 688acf73..45b53518 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -255,5 +255,10 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { }; return response; }, + + getDocuments: async (driveId: string) => { + const documents = await driveServer.getDocuments(driveId); + return documents; + } } } diff --git a/api/src/modules/document/resolvers.ts b/api/src/modules/document/resolvers.ts index 1af43e02..b0dd0f67 100644 --- a/api/src/modules/document/resolvers.ts +++ b/api/src/modules/document/resolvers.ts @@ -1,4 +1,4 @@ -import { interfaceType, nonNull, objectType, queryField } from 'nexus'; +import { interfaceType, list, nonNull, objectType, queryField } from 'nexus'; import { GQLDateBase } from '../system'; import { Context } from '../../graphql/server/drive/context'; @@ -60,3 +60,17 @@ export const documentQuery = queryField('document', { return doc; }, }); + +export const documentsQuery = queryField('documents', { + type: list(documentModelInterface), + resolve: async (_root, { id }, ctx: Context) => { + if (!ctx.driveId) { + throw new Error("DriveId is not defined") + } + const docIds = await ctx.prisma.document.getDocuments(ctx.driveId); + const docs = await Promise.all(docIds.map(doc => { + return ctx.prisma.document.getDocument(ctx.driveId!, doc); + })); + return docs; + }, +}); From 4e2ff1598d11e6caceadd79e6a0b7003d2a14c83 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 2 Apr 2024 13:40:07 +0200 Subject: [PATCH 42/50] feat: added query to fetch all documents at once from a drive --- api/src/modules/document/resolvers.ts | 25 +++++++++++++------ .../modules/real-world-assets/resolvers.ts | 11 ++++++-- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/api/src/modules/document/resolvers.ts b/api/src/modules/document/resolvers.ts index b0dd0f67..d21a8d3e 100644 --- a/api/src/modules/document/resolvers.ts +++ b/api/src/modules/document/resolvers.ts @@ -1,6 +1,9 @@ import { interfaceType, list, nonNull, objectType, queryField } from 'nexus'; import { GQLDateBase } from '../system'; import { Context } from '../../graphql/server/drive/context'; +import { getChildLogger } from '../../logger'; + +const logger = getChildLogger({ msgPrefix: 'DOCUMENT RESOLVER' }); // todo: resolveType should be moved to somewhere else export const operationModelInterface = interfaceType({ @@ -56,8 +59,12 @@ export const documentQuery = queryField('document', { if (!ctx.driveId) { throw new Error("DriveId is not defined") } - const doc = await ctx.prisma.document.getDocument(ctx.driveId, id); - return doc; + try { + const doc = await ctx.prisma.document.getDocument(ctx.driveId, id); + return doc; + } catch (e: any) { + logger.error({ msg: e.message }); + } }, }); @@ -67,10 +74,14 @@ export const documentsQuery = queryField('documents', { if (!ctx.driveId) { throw new Error("DriveId is not defined") } - const docIds = await ctx.prisma.document.getDocuments(ctx.driveId); - const docs = await Promise.all(docIds.map(doc => { - return ctx.prisma.document.getDocument(ctx.driveId!, doc); - })); - return docs; + try { + const docIds = await ctx.prisma.document.getDocuments(ctx.driveId); + const docs = await Promise.all(docIds.map(doc => { + return ctx.prisma.document.getDocument(ctx.driveId!, doc); + })); + return docs; + } catch (e: any) { + logger.error({ msg: e.message }); + } }, }); diff --git a/api/src/modules/real-world-assets/resolvers.ts b/api/src/modules/real-world-assets/resolvers.ts index 8d3631fa..d4f4cbb7 100644 --- a/api/src/modules/real-world-assets/resolvers.ts +++ b/api/src/modules/real-world-assets/resolvers.ts @@ -1,6 +1,9 @@ import { enumType, interfaceType, list, objectType, queryField, unionType } from 'nexus'; import { GQLDateBase } from '../system'; import { documentModelInterface } from '../document'; +import { getChildLogger } from '../../logger'; + +const logger = getChildLogger({ msgPrefix: 'REAL WORLD ASSETS RESOLVER' }); export const Account = objectType({ name: "Account", @@ -165,8 +168,12 @@ export const rwaQuery = queryField('rwaPortfolios', { // ), // }, resolve: async (_root, args, ctx) => { - const doc = await ctx.prisma.rWAPortfolio.findRWAPortfolios({ driveId: ctx.driveId }); - return doc; + try { + const doc = await ctx.prisma.rWAPortfolio.findRWAPortfolios({ driveId: ctx.driveId }); + return doc; + } catch (e: any) { + logger.error({ msg: e.message }); + } }, }); From 840ae2b9a8c49b9ce24c8d34a2ce60685adef1cd Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 3 Apr 2024 17:24:09 +0200 Subject: [PATCH 43/50] feat: added sentry node --- api/package.json | 3 + api/pnpm-lock.yaml | 75 +++++++++++++++++++ api/src/app.ts | 31 +++++++- api/src/graphql/server/index.ts | 5 +- api/src/logger.ts | 25 +++++-- api/src/modules/real-world-assets/listener.ts | 15 ++-- 6 files changed, 140 insertions(+), 14 deletions(-) diff --git a/api/package.json b/api/package.json index aba3ac59..4a7ce283 100644 --- a/api/package.json +++ b/api/package.json @@ -17,6 +17,8 @@ "dependencies": { "@apollo/server": "^4.10.2", "@prisma/client": "^5.11.0", + "@sentry/node": "^7.109.0", + "@sentry/profiling-node": "^7.109.0", "@types/cookie-parser": "^1.4.7", "body-parser": "^1.20.2", "cookie-parser": "^1.4.6", @@ -40,6 +42,7 @@ "pino": "^8.19.0", "pino-http": "^8.6.1", "pino-pretty": "^10.3.1", + "pino-sentry-transport": "^1.1.0", "siwe": "^2.1.4", "vite-node": "^0.29.8", "vitest": "^0.32.4", diff --git a/api/pnpm-lock.yaml b/api/pnpm-lock.yaml index ab1b3cf6..bd03e9e4 100644 --- a/api/pnpm-lock.yaml +++ b/api/pnpm-lock.yaml @@ -11,6 +11,12 @@ dependencies: '@prisma/client': specifier: ^5.11.0 version: 5.11.0(prisma@5.11.0) + '@sentry/node': + specifier: ^7.109.0 + version: 7.109.0 + '@sentry/profiling-node': + specifier: ^7.109.0 + version: 7.109.0 '@types/cookie-parser': specifier: ^1.4.7 version: 1.4.7 @@ -80,6 +86,9 @@ dependencies: pino-pretty: specifier: ^10.3.1 version: 10.3.1 + pino-sentry-transport: + specifier: ^1.1.0 + version: 1.1.0(@sentry/node@7.109.0)(pino@8.19.0) siwe: specifier: ^2.1.4 version: 2.1.4(ethers@5.7.2) @@ -3208,6 +3217,55 @@ packages: react: 18.2.0 dev: false + /@sentry-internal/tracing@7.109.0: + resolution: {integrity: sha512-PzK/joC5tCuh2R/PRh+7dp+uuZl7pTsBIjPhVZHMTtb9+ls65WkdZJ1/uKXPouyz8NOo9Xok7aEvEo9seongyw==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 + dev: false + + /@sentry/core@7.109.0: + resolution: {integrity: sha512-xwD4U0IlvvlE/x/g/W1I8b4Cfb16SsCMmiEuBf6XxvAa3OfWBxKoqLifb3GyrbxMC4LbIIZCN/SvLlnGJPgszA==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 + dev: false + + /@sentry/node@7.109.0: + resolution: {integrity: sha512-tqMNAES4X/iBl1eZRCmc29p//0id01FBLEiesNo5nk6ECl6/SaGMFAEwu1gsn90h/Bjgr04slwFOS4cR45V2PQ==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.109.0 + '@sentry/core': 7.109.0 + '@sentry/types': 7.109.0 + '@sentry/utils': 7.109.0 + dev: false + + /@sentry/profiling-node@7.109.0: + resolution: {integrity: sha512-wdDxJ86/A71QTpbbn4LaiB6vmvGd3QEq7UOdZS/y/3SwV66zpkvNB8yPER41BgqDjqcmIY/va9fNi319iTREFw==} + engines: {node: '>=8.0.0'} + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.3 + node-abi: 3.57.0 + dev: false + + /@sentry/types@7.109.0: + resolution: {integrity: sha512-egCBnDv3YpVFoNzRLdP0soVrxVLCQ+rovREKJ1sw3rA2/MFH9WJ+DZZexsX89yeAFzy1IFsCp7/dEqudusml6g==} + engines: {node: '>=8'} + dev: false + + /@sentry/utils@7.109.0: + resolution: {integrity: sha512-3RjxMOLMBwZ5VSiH84+o/3NY2An4Zldjz0EbfEQNRY9yffRiCPJSQiCJID8EoylCFOh/PAhPimBhqbtWJxX6iw==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.109.0 + dev: false + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -6435,6 +6493,10 @@ packages: p-locate: 5.0.0 dev: true + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + /lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} dev: false @@ -7194,6 +7256,19 @@ packages: strip-json-comments: 3.1.1 dev: false + /pino-sentry-transport@1.1.0(@sentry/node@7.109.0)(pino@8.19.0): + resolution: {integrity: sha512-XMipEZ415MORLARR+Az+ZghUD/JRPQRRRH/OG3l5XfTvRLQtSuceHWKdKcw3YSjqTTtlBtqK0pWtXR0vIODyPw==} + engines: {node: '> 14'} + peerDependencies: + '@sentry/node': ^7.0.0 + pino: ^7.0.0 || ^8.0.0 + dependencies: + '@sentry/node': 7.109.0 + lodash.get: 4.4.2 + pino: 8.19.0 + pino-abstract-transport: 1.1.0 + dev: false + /pino-std-serializers@6.2.2: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: false diff --git a/api/src/app.ts b/api/src/app.ts index 17faead3..90c9e628 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -5,6 +5,9 @@ import basePrisma from './database'; import { renderPlaygroundPage, } from 'graphql-playground-html' +import * as Sentry from "@sentry/node"; +import { nodeProfilingIntegration } from "@sentry/profiling-node"; + const logger = getChildLogger({ msgPrefix: 'APP' }); const startupTime = new Date(); @@ -14,7 +17,33 @@ export const createApp = (): { app: Express, router: express.Router } => { const app = express(); const router = express.Router(); - router.get('/healthz', async (_req, res) => { + if (process.env.SENTRY_DSN) { + Sentry.init({ + dsn: process.env.SENTRY_DSN, + integrations: [ + nodeProfilingIntegration(), + // enable Express.js middleware tracing + new Sentry.Integrations.Express({ + // to trace all requests to the default router + app, + // alternatively, you can specify the routes you want to trace: + // router: someRouter, + }), + ], + + // We recommend adjusting this value in production, or using tracesSampler + // for finer control + tracesSampleRate: 1.0, + }); + + // RequestHandler creates a separate execution context, so that all + // transactions/spans/breadcrumbs are isolated across requests + app.use(Sentry.Handlers.requestHandler()); + // TracingHandler creates a trace for every incoming request + app.use(Sentry.Handlers.tracingHandler()); + } + + app.get('/healthz', async (_req, res) => { try { await basePrisma.user.findFirst(); } catch (error: any) { diff --git a/api/src/graphql/server/index.ts b/api/src/graphql/server/index.ts index 2842d47e..e170a2f7 100644 --- a/api/src/graphql/server/index.ts +++ b/api/src/graphql/server/index.ts @@ -14,7 +14,7 @@ import { Context as DriveContext, createContext as createDriveContext } from './ import { getChildLogger } from '../../logger'; import "express-async-errors"; import { errorHandler } from '../../middleware/errors'; - +import * as Sentry from "@sentry/node"; const logger = getChildLogger({ msgPrefix: 'SERVER' }); function loggerPlugin(): ApolloServerPlugin { @@ -80,6 +80,9 @@ export const startServer = async ( const httpServer = createHttpServer(app); app.use(errorHandler); + if (process.env.SENTRY_DSN) { + app.use(Sentry.Handlers.errorHandler()); + } return httpServer.listen({ port: PORT }, () => { logger.info(`Running on ${PORT}`); }); diff --git a/api/src/logger.ts b/api/src/logger.ts index 89fd6ee4..e58a1540 100644 --- a/api/src/logger.ts +++ b/api/src/logger.ts @@ -2,7 +2,7 @@ import path from 'path'; import pino from 'pino'; import pinoHttp from 'pino-http'; import { loggerConfig } from '../logger.config'; - +import { createWriteStream, Sentry } from "pino-sentry"; const { moduleFilter, prefixFilter, logLevel, httpLogLevel, } = loggerConfig; @@ -48,19 +48,30 @@ const doesPassFilters = (config: { bindings: pino.Bindings; }): boolean => FILTERS.every((f) => f(config)); +const transport = process.env.SENTRY_DSN ? { + target: "pino-sentry-transport", + options: { + sentry: { + dsn: process.env.SENTRY_DSN, + // additional options for sentry + }, + withLogRecord: true, // default false - send the log record to sentry as a context.(if its more then 8Kb Sentry will throw an error) + tags: ['id'], // sentry tags to add to the event, uses lodash.get to get the value from the log record + context: ['hostname'], // sentry context to add to the event, uses lodash.get to get the value from the log record, + minLevel: 40, // which level to send to sentry + } +} : { + target: 'pino-pretty', +} export const expressLogger = pinoHttp({ level: httpLogLevel, msgPrefix: formatPrefix('express'), - transport: { - target: 'pino-pretty', - }, + transport, }); const logger = pino({ level: logLevel, - transport: { - target: 'pino-pretty', - }, + transport, }); export const getChildLogger = ( diff --git a/api/src/modules/real-world-assets/listener.ts b/api/src/modules/real-world-assets/listener.ts index 275e71f1..e3eff820 100644 --- a/api/src/modules/real-world-assets/listener.ts +++ b/api/src/modules/real-world-assets/listener.ts @@ -29,13 +29,18 @@ export const listener: IReceiverOptions = { export async function transmit(strands: InternalTransmitterUpdate[], prisma: Prisma.TransactionClient) { // logger.debug(strands); for (const strand of strands) { - - if (strand.documentId === "") { - await handleDriveStrand(strand as InternalTransmitterUpdate, prisma); - } else { - await handleRwaDocumentStrand(strand as InternalTransmitterUpdate, prisma); + try { + if (strand.documentId === "") { + await handleDriveStrand(strand as InternalTransmitterUpdate, prisma); + } else { + await handleRwaDocumentStrand(strand as InternalTransmitterUpdate, prisma); + } + } catch (e) { + logger.error({ msg: "Error processing strand", error: e }); + continue; } } + } async function handleDriveStrand(strand: InternalTransmitterUpdate, prisma: Prisma.TransactionClient) { From 42ce003b5f6323377d6d6b5eabbc3a5d6a7c3226 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 3 Apr 2024 17:25:35 +0200 Subject: [PATCH 44/50] chore: removed comments --- api/src/app.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/api/src/app.ts b/api/src/app.ts index 90c9e628..64db314e 100644 --- a/api/src/app.ts +++ b/api/src/app.ts @@ -22,24 +22,14 @@ export const createApp = (): { app: Express, router: express.Router } => { dsn: process.env.SENTRY_DSN, integrations: [ nodeProfilingIntegration(), - // enable Express.js middleware tracing new Sentry.Integrations.Express({ - // to trace all requests to the default router app, - // alternatively, you can specify the routes you want to trace: - // router: someRouter, }), ], - - // We recommend adjusting this value in production, or using tracesSampler - // for finer control tracesSampleRate: 1.0, }); - // RequestHandler creates a separate execution context, so that all - // transactions/spans/breadcrumbs are isolated across requests app.use(Sentry.Handlers.requestHandler()); - // TracingHandler creates a trace for every incoming request app.use(Sentry.Handlers.tracingHandler()); } From dcafa3a0320a6f54ef4e8c7d836ee7be442d21a5 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 3 Apr 2024 17:55:49 +0200 Subject: [PATCH 45/50] chore: clear cache --- api/src/modules/document/model.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index 45b53518..fbeb23f8 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -112,7 +112,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { getDrive: async (id: string) => { try { let drive = drives[id]; - if (!drive) { + if (drive !== {} as DocumentDriveState) { const { state } = await driveServer.getDrive(id); drives[id] = state.global; return state.global; @@ -162,7 +162,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { documentId, operations, ); - + drives[driveId] = {} as DocumentDriveState; return result; }, From 45fd576db4512e20d2717562941f92a0978f9016 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 3 Apr 2024 18:30:57 +0200 Subject: [PATCH 46/50] fix(apollo): document operations --- api/src/modules/document/model.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/modules/document/model.ts b/api/src/modules/document/model.ts index fbeb23f8..cd877608 100644 --- a/api/src/modules/document/model.ts +++ b/api/src/modules/document/model.ts @@ -252,6 +252,7 @@ export function getDocumentDriveCRUD(prisma: Prisma.TransactionClient) { id: documentId, revision: document.revision.global, state: document.state.global, + operations: document.operations.global, }; return response; }, From 0ba6f6ae64335d044894b20a1b755207b334dc46 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 3 Apr 2024 18:40:37 +0200 Subject: [PATCH 47/50] fix: document operations type --- api/src/graphql/generated/drive/nexus.ts | 82 ++++++++++++------- .../graphql/generated/drive/schema.graphql | 33 +++++--- api/src/modules/document/resolvers.ts | 15 +++- 3 files changed, 83 insertions(+), 47 deletions(-) diff --git a/api/src/graphql/generated/drive/nexus.ts b/api/src/graphql/generated/drive/nexus.ts index 9906cadd..2d2bbda2 100644 --- a/api/src/graphql/generated/drive/nexus.ts +++ b/api/src/graphql/generated/drive/nexus.ts @@ -134,7 +134,7 @@ export interface NexusGenObjects { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['AccountSnapshotState']; // AccountSnapshotState! } @@ -195,7 +195,7 @@ export interface NexusGenObjects { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['BudgetStatementState']; // BudgetStatementState! } @@ -257,9 +257,15 @@ export interface NexusGenObjects { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! } + DefaultOperation: { // root type + hash: string; // String! + index: number; // Int! + timestamp: NexusGenScalars['Date']; // Date! + type: string; // String! + } DocumentDriveState: { // root type icon?: string | null; // String id: string; // ID! @@ -393,7 +399,7 @@ export interface NexusGenObjects { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['RealWorldAssetsState']; // RealWorldAssetsState! } @@ -432,7 +438,7 @@ export interface NexusGenObjects { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['ScopeFrameworkState']; // ScopeFrameworkState! } @@ -562,8 +568,8 @@ export interface NexusGenObjects { export interface NexusGenInterfaces { IDocument: NexusGenRootTypes['AccountSnapshot'] | NexusGenRootTypes['BudgetStatement'] | NexusGenRootTypes['DefaultDocument'] | NexusGenRootTypes['RealWorldAssets'] | NexusGenRootTypes['ScopeFramework']; + IOperation: NexusGenRootTypes['DefaultOperation']; IRealWorldAssetsState: NexusGenRootTypes['RealWorldAssetsPortfolio'] | NexusGenRootTypes['RealWorldAssetsState']; - Operation: any; System: NexusGenRootTypes['SwitchboardDrive'] | NexusGenRootTypes['SwitchboardHost']; } @@ -588,7 +594,7 @@ export interface NexusGenFieldTypes { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['AccountSnapshotState']; // AccountSnapshotState! } @@ -652,7 +658,7 @@ export interface NexusGenFieldTypes { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['BudgetStatementState']; // BudgetStatementState! } @@ -714,9 +720,15 @@ export interface NexusGenFieldTypes { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! } + DefaultOperation: { // field return type + hash: string; // String! + index: number; // Int! + timestamp: NexusGenScalars['Date']; // Date! + type: string; // String! + } DocumentDriveState: { // field return type icon: string | null; // String id: string; // ID! @@ -867,7 +879,7 @@ export interface NexusGenFieldTypes { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['RealWorldAssetsState']; // RealWorldAssetsState! } @@ -906,7 +918,7 @@ export interface NexusGenFieldTypes { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! state: NexusGenRootTypes['ScopeFrameworkState']; // ScopeFrameworkState! } @@ -1045,9 +1057,15 @@ export interface NexusGenFieldTypes { id: string; // String! lastModified: NexusGenScalars['Date']; // Date! name: string; // String! - operations: NexusGenRootTypes['Operation'][]; // [Operation!]! + operations: NexusGenRootTypes['DefaultOperation'][]; // [DefaultOperation!]! revision: number; // Int! } + IOperation: { // field return type + hash: string; // String! + index: number; // Int! + timestamp: NexusGenScalars['Date']; // Date! + type: string; // String! + } IRealWorldAssetsState: { // field return type accounts: NexusGenRootTypes['Account'][]; // [Account!]! fixedIncomeTypes: NexusGenRootTypes['FixedIncomeType'][]; // [FixedIncomeType!]! @@ -1057,12 +1075,6 @@ export interface NexusGenFieldTypes { spvs: NexusGenRootTypes['Spv'][]; // [Spv!]! transactions: NexusGenRootTypes['GroupTransaction'][]; // [GroupTransaction!]! } - Operation: { // field return type - hash: string; // String! - index: number; // Int! - timestamp: NexusGenScalars['Date']; // Date! - type: string; // String! - } System: { // field return type auth: NexusGenRootTypes['Auth'] | null; // Auth } @@ -1080,7 +1092,7 @@ export interface NexusGenFieldTypeNames { id: 'String' lastModified: 'Date' name: 'String' - operations: 'Operation' + operations: 'DefaultOperation' revision: 'Int' state: 'AccountSnapshotState' } @@ -1144,7 +1156,7 @@ export interface NexusGenFieldTypeNames { id: 'String' lastModified: 'Date' name: 'String' - operations: 'Operation' + operations: 'DefaultOperation' revision: 'Int' state: 'BudgetStatementState' } @@ -1206,9 +1218,15 @@ export interface NexusGenFieldTypeNames { id: 'String' lastModified: 'Date' name: 'String' - operations: 'Operation' + operations: 'DefaultOperation' revision: 'Int' } + DefaultOperation: { // field return type name + hash: 'String' + index: 'Int' + timestamp: 'Date' + type: 'String' + } DocumentDriveState: { // field return type name icon: 'String' id: 'ID' @@ -1359,7 +1377,7 @@ export interface NexusGenFieldTypeNames { id: 'String' lastModified: 'Date' name: 'String' - operations: 'Operation' + operations: 'DefaultOperation' revision: 'Int' state: 'RealWorldAssetsState' } @@ -1398,7 +1416,7 @@ export interface NexusGenFieldTypeNames { id: 'String' lastModified: 'Date' name: 'String' - operations: 'Operation' + operations: 'DefaultOperation' revision: 'Int' state: 'ScopeFrameworkState' } @@ -1537,9 +1555,15 @@ export interface NexusGenFieldTypeNames { id: 'String' lastModified: 'Date' name: 'String' - operations: 'Operation' + operations: 'DefaultOperation' revision: 'Int' } + IOperation: { // field return type name + hash: 'String' + index: 'Int' + timestamp: 'Date' + type: 'String' + } IRealWorldAssetsState: { // field return type name accounts: 'Account' fixedIncomeTypes: 'FixedIncomeType' @@ -1549,12 +1573,6 @@ export interface NexusGenFieldTypeNames { spvs: 'Spv' transactions: 'GroupTransaction' } - Operation: { // field return type name - hash: 'String' - index: 'Int' - timestamp: 'Date' - type: 'String' - } System: { // field return type name auth: 'Auth' } @@ -1609,6 +1627,7 @@ export interface NexusGenAbstractTypeMembers { Asset: "Cash" | "FixedIncome" ElementComponents: "ArticleComponent" | "CoreComponent" | "ScopeComponent" | "SectionComponent" | "TypeSpecificationComponent" IDocument: "AccountSnapshot" | "BudgetStatement" | "DefaultDocument" | "RealWorldAssets" | "ScopeFramework" + IOperation: "DefaultOperation" IRealWorldAssetsState: "RealWorldAssetsPortfolio" | "RealWorldAssetsState" System: "SwitchboardDrive" | "SwitchboardHost" } @@ -1617,6 +1636,7 @@ export interface NexusGenTypeInterfaces { AccountSnapshot: "IDocument" BudgetStatement: "IDocument" DefaultDocument: "IDocument" + DefaultOperation: "IOperation" RealWorldAssets: "IDocument" RealWorldAssetsPortfolio: "IRealWorldAssetsState" RealWorldAssetsState: "IRealWorldAssetsState" @@ -1639,7 +1659,7 @@ export type NexusGenUnionNames = keyof NexusGenUnions; export type NexusGenObjectsUsingAbstractStrategyIsTypeOf = never; -export type NexusGenAbstractsUsingStrategyResolveType = "Asset" | "ElementComponents" | "IDocument" | "IRealWorldAssetsState" | "Operation" | "System"; +export type NexusGenAbstractsUsingStrategyResolveType = "Asset" | "ElementComponents" | "IDocument" | "IOperation" | "IRealWorldAssetsState" | "System"; export type NexusGenFeaturesConfig = { abstractTypeStrategies: { diff --git a/api/src/graphql/generated/drive/schema.graphql b/api/src/graphql/generated/drive/schema.graphql index 3ddf4fa4..87319f38 100644 --- a/api/src/graphql/generated/drive/schema.graphql +++ b/api/src/graphql/generated/drive/schema.graphql @@ -14,7 +14,7 @@ type AccountSnapshot implements IDocument { id: String! lastModified: Date! name: String! - operations: [Operation!]! + operations: [DefaultOperation!]! revision: Int! state: AccountSnapshotState! } @@ -100,7 +100,7 @@ type BudgetStatement implements IDocument { id: String! lastModified: Date! name: String! - operations: [Operation!]! + operations: [DefaultOperation!]! revision: Int! state: BudgetStatementState! } @@ -181,10 +181,17 @@ type DefaultDocument implements IDocument { id: String! lastModified: Date! name: String! - operations: [Operation!]! + operations: [DefaultOperation!]! revision: Int! } +type DefaultOperation implements IOperation { + hash: String! + index: Int! + timestamp: Date! + type: String! +} + type DocumentDriveState { icon: String id: ID! @@ -257,10 +264,17 @@ interface IDocument { id: String! lastModified: Date! name: String! - operations: [Operation!]! + operations: [DefaultOperation!]! revision: Int! } +interface IOperation { + hash: String! + index: Int! + timestamp: Date! + type: String! +} + interface IRealWorldAssetsState { accounts: [Account!]! fixedIncomeTypes: [FixedIncomeType!]! @@ -389,13 +403,6 @@ type Node { parentFolder: String } -interface Operation { - hash: String! - index: Int! - timestamp: Date! - type: String! -} - type OperationUpdate { hash: String! index: Int! @@ -427,7 +434,7 @@ type RealWorldAssets implements IDocument { id: String! lastModified: Date! name: String! - operations: [Operation!]! + operations: [DefaultOperation!]! revision: Int! state: RealWorldAssetsState! } @@ -472,7 +479,7 @@ type ScopeFramework implements IDocument { id: String! lastModified: Date! name: String! - operations: [Operation!]! + operations: [DefaultOperation!]! revision: Int! state: ScopeFrameworkState! } diff --git a/api/src/modules/document/resolvers.ts b/api/src/modules/document/resolvers.ts index d21a8d3e..1d25d9f0 100644 --- a/api/src/modules/document/resolvers.ts +++ b/api/src/modules/document/resolvers.ts @@ -7,14 +7,23 @@ const logger = getChildLogger({ msgPrefix: 'DOCUMENT RESOLVER' }); // todo: resolveType should be moved to somewhere else export const operationModelInterface = interfaceType({ - name: 'Operation', + name: 'IOperation', definition(t) { t.nonNull.string('type'); t.nonNull.int('index'); t.nonNull.field('timestamp', { type: GQLDateBase }); t.nonNull.string('hash'); }, - resolveType: (e) => 'Operation', + resolveType: (e) => { + return "DefaultOperation" + }, +}); + +export const operationModel = objectType({ + name: 'DefaultOperation', + definition(t) { + t.implements(operationModelInterface) + }, }); // todo: resolveType should be moved to somewhere else @@ -27,7 +36,7 @@ export const documentModelInterface = interfaceType({ t.nonNull.int('revision'); t.nonNull.field('created', { type: GQLDateBase }); t.nonNull.field('lastModified', { type: GQLDateBase }); - t.nonNull.list.nonNull.field('operations', { type: operationModelInterface }); + t.nonNull.list.nonNull.field('operations', { type: operationModel }); }, resolveType: (e) => { switch (e.documentType) { From 1322e9362e69225e88b597525109670de5d0cc62 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 4 Apr 2024 09:07:10 +0200 Subject: [PATCH 48/50] feat: added makerdao and updated powerhouse deployments pipeline --- .../build-and-deploy-makerdao-prod.yaml | 42 +++++++++++++++++++ .../build-and-deploy-makerdao-staging.yaml | 42 +++++++++++++++++++ ... => build-and-deploy-powerhouse-prod.yaml} | 11 +---- ... build-and-deploy-powerhouse-staging.yaml} | 13 +----- 4 files changed, 87 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/build-and-deploy-makerdao-prod.yaml create mode 100644 .github/workflows/build-and-deploy-makerdao-staging.yaml rename .github/workflows/{build-and-deploy-prod.yaml => build-and-deploy-powerhouse-prod.yaml} (77%) rename .github/workflows/{build-and-deploy-staging.yaml => build-and-deploy-powerhouse-staging.yaml} (72%) diff --git a/.github/workflows/build-and-deploy-makerdao-prod.yaml b/.github/workflows/build-and-deploy-makerdao-prod.yaml new file mode 100644 index 00000000..20ec086c --- /dev/null +++ b/.github/workflows/build-and-deploy-makerdao-prod.yaml @@ -0,0 +1,42 @@ +name: Deploy Switchboard MakerDAO + +on: + push: + branches: [deployments/makerdao] +jobs: + build: + environment: MakerDAO Production + runs-on: ubuntu-latest + steps: + # Check-out your repository. + - name: Checkout + uses: actions/checkout@v2 + + - name: Build, Push and Release API to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_API_NAME }} + dockerfile_directory: ./api + dockerfile_name: Dockerfile + process_type: web + - name: Build, Push and Release Frontend to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_FRONTEND_NAME }} + dockerfile_directory: ./frontend + dockerfile_name: Dockerfile + process_type: web + docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" + - name: Build, Push and Release NGINX to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_NGINX_NAME }} + dockerfile_directory: ./nginx + dockerfile_name: Dockerfile + process_type: web diff --git a/.github/workflows/build-and-deploy-makerdao-staging.yaml b/.github/workflows/build-and-deploy-makerdao-staging.yaml new file mode 100644 index 00000000..d2f0710a --- /dev/null +++ b/.github/workflows/build-and-deploy-makerdao-staging.yaml @@ -0,0 +1,42 @@ +name: Deploy Switchboard MakerDAO Staging + +on: + push: + branches: [deployments/staging/makerdao] +jobs: + build: + environment: MakerDAO Staging + runs-on: ubuntu-latest + steps: + # Check-out your repository. + - name: Checkout + uses: actions/checkout@v2 + + - name: Build, Push and Release API to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_API_NAME }} + dockerfile_directory: ./api + dockerfile_name: Dockerfile + process_type: web + - name: Build, Push and Release Frontend to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_FRONTEND_NAME }} + dockerfile_directory: ./frontend + dockerfile_name: Dockerfile + process_type: web + docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" + - name: Build, Push and Release NGINX to Heroku. # Your custom step name + uses: gonuit/heroku-docker-deploy@v1.3.3 + with: + email: ${{ secrets.HEROKU_EMAIL }} + heroku_api_key: ${{ secrets.HEROKU_API_KEY }} + heroku_app_name: ${{ secrets.HEROKU_NGINX_NAME }} + dockerfile_directory: ./nginx + dockerfile_name: Dockerfile + process_type: web diff --git a/.github/workflows/build-and-deploy-prod.yaml b/.github/workflows/build-and-deploy-powerhouse-prod.yaml similarity index 77% rename from .github/workflows/build-and-deploy-prod.yaml rename to .github/workflows/build-and-deploy-powerhouse-prod.yaml index ee5fc538..646bb891 100644 --- a/.github/workflows/build-and-deploy-prod.yaml +++ b/.github/workflows/build-and-deploy-powerhouse-prod.yaml @@ -1,4 +1,4 @@ -name: Deploy Switchboard Production +name: Deploy Switchboard Powerhouse on: push: @@ -31,15 +31,6 @@ jobs: dockerfile_name: Dockerfile process_type: web docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" - - name: Build, Push and Release Wundergraph to Heroku. # Your custom step name - uses: gonuit/heroku-docker-deploy@v1.3.3 - with: - email: ${{ secrets.HEROKU_EMAIL }} - heroku_api_key: ${{ secrets.HEROKU_API_KEY }} - heroku_app_name: ${{ secrets.HEROKU_WGRAPH_NAME }} - dockerfile_directory: ./wundergraph - dockerfile_name: Dockerfile - process_type: web - name: Build, Push and Release NGINX to Heroku. # Your custom step name uses: gonuit/heroku-docker-deploy@v1.3.3 with: diff --git a/.github/workflows/build-and-deploy-staging.yaml b/.github/workflows/build-and-deploy-powerhouse-staging.yaml similarity index 72% rename from .github/workflows/build-and-deploy-staging.yaml rename to .github/workflows/build-and-deploy-powerhouse-staging.yaml index 0b6f648c..8e46304a 100644 --- a/.github/workflows/build-and-deploy-staging.yaml +++ b/.github/workflows/build-and-deploy-powerhouse-staging.yaml @@ -1,4 +1,4 @@ -name: Deploy Switchboard Staging +name: Deploy Switchboard Powerhouse Staging on: push: @@ -30,16 +30,7 @@ jobs: dockerfile_directory: ./frontend dockerfile_name: Dockerfile process_type: web - docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }} --build-arg BASE_PATH=/makerdao/switchboard" - - name: Build, Push and Release Wundergraph to Heroku. # Your custom step name - uses: gonuit/heroku-docker-deploy@v1.3.3 - with: - email: ${{ secrets.HEROKU_EMAIL }} - heroku_api_key: ${{ secrets.HEROKU_API_KEY }} - heroku_app_name: ${{ secrets.HEROKU_WGRAPH_NAME }} - dockerfile_directory: ./wundergraph - dockerfile_name: Dockerfile - process_type: web + docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" - name: Build, Push and Release NGINX to Heroku. # Your custom step name uses: gonuit/heroku-docker-deploy@v1.3.3 with: From 0b5d19b94d1e7231f15a5dbf9bdc095c5c1d62d1 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 21 Mar 2024 11:55:40 +0100 Subject: [PATCH 49/50] fix: updated docker build arg --- .github/workflows/build-and-deploy-powerhouse-staging.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-deploy-powerhouse-staging.yaml b/.github/workflows/build-and-deploy-powerhouse-staging.yaml index 8e46304a..f138bb44 100644 --- a/.github/workflows/build-and-deploy-powerhouse-staging.yaml +++ b/.github/workflows/build-and-deploy-powerhouse-staging.yaml @@ -30,7 +30,7 @@ jobs: dockerfile_directory: ./frontend dockerfile_name: Dockerfile process_type: web - docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }}" + docker_options: "--build-arg NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST=${{ secrets.NEXT_PUBLIC_SWITCHBOARD_GRAPHQL_HOST }} --build-arg BASE_PATH=/makerdao/switchboard" - name: Build, Push and Release NGINX to Heroku. # Your custom step name uses: gonuit/heroku-docker-deploy@v1.3.3 with: From 9d232003182d37ba7facdd7a14e6d88280f5dca6 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Mar 2024 10:19:58 +0100 Subject: [PATCH 50/50] feat: added express router for base path --- api/src/graphql/server/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/src/graphql/server/index.ts b/api/src/graphql/server/index.ts index e170a2f7..eb8b1a65 100644 --- a/api/src/graphql/server/index.ts +++ b/api/src/graphql/server/index.ts @@ -83,6 +83,10 @@ export const startServer = async ( if (process.env.SENTRY_DSN) { app.use(Sentry.Handlers.errorHandler()); } + const basePath = process.env.BASE_PATH || '/'; + app.use(basePath, router); + + const httpServer = createHttpServer(app); return httpServer.listen({ port: PORT }, () => { logger.info(`Running on ${PORT}`); });