From eb9b8bee400e4bea825483d3cde2bd20f8a97916 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 13 Mar 2024 23:33:03 +0700 Subject: [PATCH 01/41] add node contribution table to link manifest contributors with nodes profiles --- .../migration.sql | 25 +++++++++++++++++++ desci-server/prisma/schema.prisma | 23 ++++++++++++++--- 2 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 desci-server/prisma/migrations/20240313161411_create_node_contribution_table/migration.sql diff --git a/desci-server/prisma/migrations/20240313161411_create_node_contribution_table/migration.sql b/desci-server/prisma/migrations/20240313161411_create_node_contribution_table/migration.sql new file mode 100644 index 000000000..a7501d30d --- /dev/null +++ b/desci-server/prisma/migrations/20240313161411_create_node_contribution_table/migration.sql @@ -0,0 +1,25 @@ +-- CreateTable +CREATE TABLE "NodeContribution" ( + "id" SERIAL NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "contributorId" TEXT NOT NULL, + "nodeId" INTEGER NOT NULL, + "userId" INTEGER, + "verified" BOOLEAN NOT NULL DEFAULT false, + "email" TEXT NOT NULL, + + CONSTRAINT "NodeContribution_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "NodeContribution_contributorId_key" ON "NodeContribution"("contributorId"); + +-- CreateIndex +CREATE UNIQUE INDEX "NodeContribution_contributorId_nodeId_userId_key" ON "NodeContribution"("contributorId", "nodeId", "userId"); + +-- AddForeignKey +ALTER TABLE "NodeContribution" ADD CONSTRAINT "NodeContribution_nodeId_fkey" FOREIGN KEY ("nodeId") REFERENCES "Node"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "NodeContribution" ADD CONSTRAINT "NodeContribution_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index 94542b249..303a19bc0 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -41,6 +41,7 @@ model Node { NodeAttestation NodeAttestation[] NodeThumbnails NodeThumbnails[] PublishTaskQueue PublishTaskQueue[] + NodeContribution NodeContribution[] @@index([ownerId]) @@index([uuid]) @@ -173,7 +174,6 @@ model User { maxDriveStorageLimitGb Int @default(500) userOrganizations UserOrganizations[] UploadJobs UploadJobs[] - // DraftNodeTree DraftNodeTree[] NodeFeedItemEndorsement NodeFeedItemEndorsement[] DesciCommunity DesciCommunity? @relation(fields: [desciCommunityId], references: [id]) desciCommunityId Int? @@ -184,6 +184,7 @@ model User { NodeAttestationReaction NodeAttestationReaction[] ApiKey ApiKey[] PublishTaskQueue PublishTaskQueue[] + NodeContribution NodeContribution[] @@index([orcid]) @@index([walletAddress]) @@ -470,6 +471,22 @@ model NodeThumbnails { @@unique([nodeUuid, componentCid]) } +// The glue between a manifest contributor entry and a nodes profile +model NodeContribution { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + contributorId String @unique + nodeId Int + userId Int? + verified Boolean @default(false) + email String + node Node @relation(fields: [nodeId], references: [id]) + user User? @relation(fields: [userId], references: [id]) + + @@unique([contributorId, nodeId, userId]) +} + model FriendReferral { id Int @id @default(autoincrement()) uuid String @unique @default(uuid()) @@ -756,8 +773,8 @@ model PublishTaskQueue { status PublishTaskQueueStatus createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - node Node @relation(fields: [uuid], references: [uuid]) - user User @relation(fields: [userId], references: [id]) + node Node @relation(fields: [uuid], references: [uuid]) + user User @relation(fields: [userId], references: [id]) } enum CommunityMembershipRole { From aa5e97ac14bfaa8ada980d6d3f7f9dde46070176 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 13 Mar 2024 23:33:46 +0700 Subject: [PATCH 02/41] add contributor route added --- desci-server/src/routes/v1/nodes.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index 555f8f3c7..1f13710cc 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -1,5 +1,6 @@ import { Router } from 'express'; +import { addContributor } from '../../controllers/nodes/contributions/create.js'; import { dispatchDocumentChange, getNodeDocument } from '../../controllers/nodes/documents.js'; import { feed } from '../../controllers/nodes/feed.js'; import { @@ -25,7 +26,7 @@ import { prepublish } from '../../controllers/nodes/prepublish.js'; import { thumbnails } from '../../controllers/nodes/thumbnails.js'; import { versionDetails } from '../../controllers/nodes/versionDetails.js'; import { attachUser } from '../../internal.js'; -import { ensureNodeAccess } from '../../middleware/authorisation.js'; +import { ensureNodeAccess, ensureWriteNodeAccess } from '../../middleware/authorisation.js'; import { ensureUser } from '../../middleware/permissions.js'; const router = Router(); @@ -51,6 +52,7 @@ router.get('/cover/:uuid/:version', [], getCoverImage); router.get('/documents/:uuid', [ensureUser, ensureNodeAccess], getNodeDocument); router.post('/documents/:uuid/actions', [ensureUser, ensureNodeAccess], dispatchDocumentChange); router.get('/thumbnails/:uuid/:manifestCid?', [attachUser], thumbnails); +router.post('/contributions/:uuid', [attachUser, ensureWriteNodeAccess], addContributor); router.delete('/:uuid', [ensureUser], deleteNode); From d6bb7f57f799b9c788731176ae3b50735b001520 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 13 Mar 2024 23:34:16 +0700 Subject: [PATCH 03/41] adjust write access middleware to accept param uuid --- desci-server/src/middleware/authorisation.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/desci-server/src/middleware/authorisation.ts b/desci-server/src/middleware/authorisation.ts index 64006cc0d..a996295fc 100644 --- a/desci-server/src/middleware/authorisation.ts +++ b/desci-server/src/middleware/authorisation.ts @@ -19,7 +19,8 @@ export interface RequestWithNode extends RequestWithUser { export const ensureWriteNodeAccess = async (req: RequestWithUser, res: Response, next: NextFunction) => { // Comes after ensureUser middleware, or if formdata fields are used, it should come after the middleware processing the formdata. const user = req.user; - const { uuid } = req.body; + const uuid = req.body?.uuid || req.query?.uuid || req.params?.uuid; + const logger = parentLogger.child({ module: 'MIDDLEWARE::ensureWriteAccess', user: { id: user.id }, From 1977717b244300d98243babd01fca2aca8b670dc Mon Sep 17 00:00:00 2001 From: kadami Date: Thu, 14 Mar 2024 22:57:22 +0700 Subject: [PATCH 04/41] remove orcid bug --- desci-server/src/controllers/users/updateProfile.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/desci-server/src/controllers/users/updateProfile.ts b/desci-server/src/controllers/users/updateProfile.ts index b8a9beb33..dfb03ce69 100755 --- a/desci-server/src/controllers/users/updateProfile.ts +++ b/desci-server/src/controllers/users/updateProfile.ts @@ -12,7 +12,6 @@ interface ExpectedBody { googleScholarUrl?: string; rorPid?: string[]; organization: Organization[]; - orcid?: string; }; } @@ -38,7 +37,6 @@ export const updateProfile = async (req: Request, res: Response, next: NextFunct const updatedProfile = {} as { name?: string; googleScholarUrl?: string; - orcid?: string; rorPid?: string[]; organization?: string; email?: string; @@ -46,10 +44,6 @@ export const updateProfile = async (req: Request, res: Response, next: NextFunct updatedProfile.name = profile.name; - if (profile?.orcid) { - updatedProfile.orcid = profile.orcid; - } - if (profile?.organization) { const userOrgs = await prisma.userOrganizations.findMany({ where: { userId: user.id } }); const skipped = userOrgs.filter( From b495d6d9a091f7532e87485fcb1a8ae5febfe184 Mon Sep 17 00:00:00 2001 From: kadami Date: Thu, 14 Mar 2024 23:39:02 +0700 Subject: [PATCH 05/41] add contributor to db controller added --- .../controllers/nodes/contributions/create.ts | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 desci-server/src/controllers/nodes/contributions/create.ts diff --git a/desci-server/src/controllers/nodes/contributions/create.ts b/desci-server/src/controllers/nodes/contributions/create.ts new file mode 100644 index 000000000..1530e7c1c --- /dev/null +++ b/desci-server/src/controllers/nodes/contributions/create.ts @@ -0,0 +1,46 @@ +import { Request, Response } from 'express'; + +import { logger as parentLogger } from '../../../logger.js'; +import { contributorService } from '../../../services/Contributors.js'; + +export const addContributor = async (req: Request, res: Response) => { + const node = (req as any).node; + const user = (req as any).user; + + if (!node || !user) + throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); + + const { contributorId } = req.body; + let { email } = req.body; + email = email.toLowerCase(); + + const logger = parentLogger.child({ + module: 'Contributors::createController', + body: req.body, + uuid: node.uuid, + user: (req as any).user, + nodeId: node.id, + }); + + if (!contributorId || !email) { + return res.status(400).json({ error: 'contributorId and email required' }); + } + + // Add contributor to the db + try { + const contributorAdded = await contributorService.addNodeContribution(node, user, contributorId, email); + if (contributorAdded) { + logger.info({ contributorAdded }, 'Contributor added successfully'); + return res.status(200).json({ message: 'Contributor added successfully' }); + } + } catch (e) { + logger.error({ e }, 'Failed to add contributor'); + return res.status(500).json({ error: 'Failed to add contributor' }); + } + + // Future: + // Gen a priv link + // Fire off an email -> make it count as a friend referral + + return res.status(500).json({ error: 'Something went wrong' }); +}; From f269b67527dfdf0f66975f86aa999cd45ff32adf Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 05:10:10 +0700 Subject: [PATCH 06/41] added basic user search endpoint --- desci-server/src/controllers/users/search.ts | 27 ++++++++++++++++++++ desci-server/src/routes/v1/users.ts | 2 ++ 2 files changed, 29 insertions(+) create mode 100644 desci-server/src/controllers/users/search.ts diff --git a/desci-server/src/controllers/users/search.ts b/desci-server/src/controllers/users/search.ts new file mode 100644 index 000000000..da81c85bc --- /dev/null +++ b/desci-server/src/controllers/users/search.ts @@ -0,0 +1,27 @@ +import { Request, Response } from 'express'; + +import { prisma } from '../../client.js'; +import { logger as parentLogger } from '../../logger.js'; + +export const searchProfiles = async (req: Request, res: Response) => { + const { name } = req.query; + const logger = parentLogger.child({ + module: 'Users::searchProfiles', + body: req.body, + name, + }); + + try { + const profiles = await prisma.user.findMany({ where: { name: { startsWith: name as string } } }); + + if (profiles) { + const profilesReturn = profiles.map((profile) => ({ name: profile.name, id: profile.id })); + return res.status(200).json({ profiles: profilesReturn }); + } + } catch (e) { + logger.error({ e }, 'Failed to search for profiles'); + return res.status(500).json({ error: 'Search failed' }); + } + + return res.status(500).json({ error: 'Something went wrong' }); +}; diff --git a/desci-server/src/routes/v1/users.ts b/desci-server/src/routes/v1/users.ts index 0aa5ab0a7..23249badf 100755 --- a/desci-server/src/routes/v1/users.ts +++ b/desci-server/src/routes/v1/users.ts @@ -1,6 +1,7 @@ import { Router } from 'express'; import { list, associateWallet, updateProfile, associateOrcidWallet } from '../../controllers/users/index.js'; +import { searchProfiles } from '../../controllers/users/search.js'; import { usage } from '../../controllers/users/usage.js'; import { ensureAdmin } from '../../middleware/ensureAdmin.js'; import { ensureUser } from '../../middleware/permissions.js'; @@ -12,5 +13,6 @@ router.get('/', [ensureUser, ensureAdmin], list); router.post('/associate', [ensureUser], associateWallet); router.post('/orcid/associate', [ensureUser], associateOrcidWallet); router.patch('/updateProfile', [ensureUser], updateProfile); +router.get('/search', [ensureUser], searchProfiles); export default router; From ffae37fd58a1e6ea39c0a88a68a01def04916328 Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 05:10:53 +0700 Subject: [PATCH 07/41] added endpoint for getting contribution data for a node --- .../contributions/getNodeContributions.ts | 40 +++++++++++++++++++ desci-server/src/routes/v1/nodes.ts | 4 ++ 2 files changed, 44 insertions(+) create mode 100644 desci-server/src/controllers/nodes/contributions/getNodeContributions.ts diff --git a/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts new file mode 100644 index 000000000..765ccdf76 --- /dev/null +++ b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts @@ -0,0 +1,40 @@ +import { Request, Response } from 'express'; + +import { prisma } from '../../../client.js'; +import { logger as parentLogger } from '../../../logger.js'; +import { contributorService } from '../../../services/Contributors.js'; +import { ensureUuidEndsWithDot } from '../../../utils.js'; + +export const getNodeContributions = async (req: Request, res: Response) => { + const { uuid } = req.params; + const { contributorIds } = req.body; + + const logger = parentLogger.child({ + module: 'Contributors::getNodeContributionsController', + body: req.body, + uuid, + }); + + if (!uuid) { + return res.status(400).json({ error: 'uuid required' }); + } + + if (!contributorIds) { + return res.status(400).json({ error: 'contributorIds required' }); + } + + try { + const node = await prisma.node.findUnique({ where: { uuid: ensureUuidEndsWithDot(uuid) } }); + // const nodeContributions = await contributorService.retrieveContributionsForNode(node, contributorIds); + const nodeContributions = await contributorService.retrieveContributionsForNode(node); + if (nodeContributions) { + logger.info({ totalContributions: nodeContributions.length }, 'Contributions retrieved successfully'); + return res.status(200).json({ nodeContributions }); + } + } catch (e) { + logger.error({ e }, 'Failed to retrieve node contributions'); + return res.status(500).json({ error: 'Failed to retrieve node contributions' }); + } + + return res.status(500).json({ error: 'Something went wrong' }); +}; diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index 1f13710cc..b00e20e9b 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -1,6 +1,8 @@ import { Router } from 'express'; import { addContributor } from '../../controllers/nodes/contributions/create.js'; +import { getNodeContributions } from '../../controllers/nodes/contributions/getNodeContributions.js'; +import { getUserContributions } from '../../controllers/nodes/contributions/getUserContributions.js'; import { dispatchDocumentChange, getNodeDocument } from '../../controllers/nodes/documents.js'; import { feed } from '../../controllers/nodes/feed.js'; import { @@ -53,6 +55,8 @@ router.get('/documents/:uuid', [ensureUser, ensureNodeAccess], getNodeDocument); router.post('/documents/:uuid/actions', [ensureUser, ensureNodeAccess], dispatchDocumentChange); router.get('/thumbnails/:uuid/:manifestCid?', [attachUser], thumbnails); router.post('/contributions/:uuid', [attachUser, ensureWriteNodeAccess], addContributor); +router.get('/contributions/user/:userId', [], getUserContributions); +router.get('/contributions/node/:uuid', [], getNodeContributions); router.delete('/:uuid', [ensureUser], deleteNode); From c4429dab303de20c351b6e38ff151d3f0f63ea64 Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 05:11:25 +0700 Subject: [PATCH 08/41] WIP added endpoint for getting a nodes profiles contributions --- .../contributions/getUserContributions.ts | 33 ++++++++++ desci-server/src/services/Contributors.ts | 66 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 desci-server/src/controllers/nodes/contributions/getUserContributions.ts create mode 100644 desci-server/src/services/Contributors.ts diff --git a/desci-server/src/controllers/nodes/contributions/getUserContributions.ts b/desci-server/src/controllers/nodes/contributions/getUserContributions.ts new file mode 100644 index 000000000..a70ec34ff --- /dev/null +++ b/desci-server/src/controllers/nodes/contributions/getUserContributions.ts @@ -0,0 +1,33 @@ +import { Request, Response } from 'express'; + +import { prisma } from '../../../client.js'; +import { logger as parentLogger } from '../../../logger.js'; +import { contributorService } from '../../../services/Contributors.js'; + +export const getUserContributions = async (req: Request, res: Response) => { + const { userId } = req.params; + + const logger = parentLogger.child({ + module: 'Contributors::getUserContributionsController', + body: req.body, + userId, + }); + + if (!userId) { + return res.status(400).json({ error: 'userId required' }); + } + + try { + const user = await prisma.user.findUnique({ where: { id: parseInt(userId) } }); + const userContributions = await contributorService.retrieveContributionsForUser(user); + if (userContributions) { + logger.info({ totalContributions: userContributions.length }, 'Contributions retrieved successfully'); + return res.status(200).json({ userContributions }); + } + } catch (e) { + logger.error({ e }, 'Failed to retrieve user contributions'); + return res.status(500).json({ error: 'Failed to retrieve user contributions' }); + } + + return res.status(500).json({ error: 'Something went wrong' }); +}; diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts new file mode 100644 index 000000000..5f09aa70d --- /dev/null +++ b/desci-server/src/services/Contributors.ts @@ -0,0 +1,66 @@ +import { Node, User } from '@prisma/client'; + +import { prisma } from '../client.js'; +import { logger as parentLogger } from '../logger.js'; +import { getIndexedResearchObjects } from '../theGraph.js'; + +type ContributorId = string; +export type NodeContributorMap = Record; + +export type Contribution = { + nodeUuid: string; + contributorId: string; + verified: boolean; +}; + +class ContributorService { + private logger = parentLogger.child({ module: 'Services::ContributorsService' }); + + async addNodeContribution(node: Node, nodeOwner: User, contributorId: string, email: string) { + // Check if contributor is already registered + const registeredContributor = await prisma.user.findUnique({ where: { email } }); + + const autoVerified = nodeOwner.email === email; + return prisma.nodeContribution.create({ + data: { + contributorId, + email, + verified: autoVerified, + nodeId: node.id, + ...(registeredContributor && { userId: registeredContributor.id }), + }, + }); + } + + // async retrieveContributionsForNode(node: Node, contributorIds: string[]): Promise { + async retrieveContributionsForNode(node: Node): Promise { + const contributions = await prisma.nodeContribution.findMany({ + where: { nodeId: node.id, contributorId: { in: contributorIds }, userId: { not: null } }, + // where: { nodeId: node.id, contributorId: { in: contributorIds }, userId: { not: null } }, + include: { user: true }, + }); + // TODO: Add flag for published/non published, filter out depending on auth + + return contributions.reduce((acc, contributor) => { + acc[contributor.contributorId] = { + name: contributor.user.name, + verified: contributor.verified, + userId: contributor.user.id, + }; + return acc; + }, {}); + } + + async retrieveContributionsForUser(user: User): Promise { + const contributions = await prisma.nodeContribution.findMany({ + where: { userId: user.id }, + include: { node: true }, + }); + const nodeUuids = contributions.map((contribution) => contribution.node.uuid); + const { researchObjects } = await getIndexedResearchObjects(nodeUuids); // <-- Array of research objects, convert .id to b64 to retrieve uuid + debugger; + return []; + } +} + +export const contributorService = new ContributorService(); From 471244ab9bd90fa0a3ffa9f85e7b612b42db0d6a Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 17:57:36 +0700 Subject: [PATCH 09/41] add orcid field to node contributions in db for verification with orcid match --- .../20240315105529_add_orcid_to_contributions/migration.sql | 2 ++ desci-server/prisma/schema.prisma | 1 + 2 files changed, 3 insertions(+) create mode 100644 desci-server/prisma/migrations/20240315105529_add_orcid_to_contributions/migration.sql diff --git a/desci-server/prisma/migrations/20240315105529_add_orcid_to_contributions/migration.sql b/desci-server/prisma/migrations/20240315105529_add_orcid_to_contributions/migration.sql new file mode 100644 index 000000000..eca2c85f5 --- /dev/null +++ b/desci-server/prisma/migrations/20240315105529_add_orcid_to_contributions/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "NodeContribution" ADD COLUMN "orcid" TEXT; diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index 303a19bc0..75db07d74 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -481,6 +481,7 @@ model NodeContribution { userId Int? verified Boolean @default(false) email String + orcid String? node Node @relation(fields: [nodeId], references: [id]) user User? @relation(fields: [userId], references: [id]) From c2d443406b7aae4e52091178dc1e7ede8421244a Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 18:08:28 +0700 Subject: [PATCH 10/41] add orcid to contrib flow --- .../src/controllers/nodes/contributions/create.ts | 5 +++-- desci-server/src/services/Contributors.ts | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/desci-server/src/controllers/nodes/contributions/create.ts b/desci-server/src/controllers/nodes/contributions/create.ts index 1530e7c1c..a9777231e 100644 --- a/desci-server/src/controllers/nodes/contributions/create.ts +++ b/desci-server/src/controllers/nodes/contributions/create.ts @@ -10,7 +10,7 @@ export const addContributor = async (req: Request, res: Response) => { if (!node || !user) throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); - const { contributorId } = req.body; + const { contributorId, orcid } = req.body; let { email } = req.body; email = email.toLowerCase(); @@ -20,6 +20,7 @@ export const addContributor = async (req: Request, res: Response) => { uuid: node.uuid, user: (req as any).user, nodeId: node.id, + orcid, }); if (!contributorId || !email) { @@ -28,7 +29,7 @@ export const addContributor = async (req: Request, res: Response) => { // Add contributor to the db try { - const contributorAdded = await contributorService.addNodeContribution(node, user, contributorId, email); + const contributorAdded = await contributorService.addNodeContribution(node, user, contributorId, email, orcid); if (contributorAdded) { logger.info({ contributorAdded }, 'Contributor added successfully'); return res.status(200).json({ message: 'Contributor added successfully' }); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 5f09aa70d..b40c4e48e 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -16,11 +16,12 @@ export type Contribution = { class ContributorService { private logger = parentLogger.child({ module: 'Services::ContributorsService' }); - async addNodeContribution(node: Node, nodeOwner: User, contributorId: string, email: string) { + async addNodeContribution(node: Node, nodeOwner: User, contributorId: string, email: string, orcid?: string) { // Check if contributor is already registered const registeredContributor = await prisma.user.findUnique({ where: { email } }); - - const autoVerified = nodeOwner.email === email; + const userHasOrcidValidated = nodeOwner.orcid !== undefined && nodeOwner.orcid !== null; + const contributionOrcidMatchesUser = userHasOrcidValidated && orcid === nodeOwner.orcid; + const autoVerified = nodeOwner.email === email || contributionOrcidMatchesUser; return prisma.nodeContribution.create({ data: { contributorId, @@ -35,7 +36,7 @@ class ContributorService { // async retrieveContributionsForNode(node: Node, contributorIds: string[]): Promise { async retrieveContributionsForNode(node: Node): Promise { const contributions = await prisma.nodeContribution.findMany({ - where: { nodeId: node.id, contributorId: { in: contributorIds }, userId: { not: null } }, + where: { nodeId: node.id, userId: { not: null } }, // where: { nodeId: node.id, contributorId: { in: contributorIds }, userId: { not: null } }, include: { user: true }, }); From 7e9c6dcf26eee4316aca361744be2e6c12aa2eca Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 18:50:12 +0700 Subject: [PATCH 11/41] add verification to contributor service --- desci-server/src/services/Contributors.ts | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index b40c4e48e..1bf44d440 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -1,4 +1,6 @@ -import { Node, User } from '@prisma/client'; +import { error } from 'console'; + +import { Node, NodeContribution, User } from '@prisma/client'; import { prisma } from '../client.js'; import { logger as parentLogger } from '../logger.js'; @@ -62,6 +64,27 @@ class ContributorService { debugger; return []; } + + async verifyContribution(user: User, contributorId: string): Promise { + if (!contributorId) throw Error('contributorId required'); + const contribution = await prisma.nodeContribution.findUnique({ where: { contributorId } }); + if (!contribution) throw Error('Invalid contributorId'); + + const userHasOrcidValidated = user.orcid !== undefined && user.orcid !== null; + + const contributionOrcidMatchesUser = userHasOrcidValidated && contribution.orcid === user.orcid; + const contributorEmailMatchesUser = user.email === contribution.email; + const verified = contributorEmailMatchesUser || contributionOrcidMatchesUser; + if (verified) { + const updated = await prisma.nodeContribution.update({ + where: { id: contribution.id }, + data: { verified: true }, + }); + if (updated) return true; + } + + return false; + } } export const contributorService = new ContributorService(); From 7c8e60be2b0dce291aaa153b89b75d311486d20c Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 19:10:33 +0700 Subject: [PATCH 12/41] add verification endpoint --- .../controllers/nodes/contributions/verify.ts | 36 +++++++++++++++++++ desci-server/src/routes/v1/nodes.ts | 4 ++- desci-server/src/services/Contributors.ts | 3 ++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 desci-server/src/controllers/nodes/contributions/verify.ts diff --git a/desci-server/src/controllers/nodes/contributions/verify.ts b/desci-server/src/controllers/nodes/contributions/verify.ts new file mode 100644 index 000000000..65cfdddcb --- /dev/null +++ b/desci-server/src/controllers/nodes/contributions/verify.ts @@ -0,0 +1,36 @@ +import { Request, Response } from 'express'; + +import { logger as parentLogger } from '../../../logger.js'; +import { contributorService } from '../../../services/Contributors.js'; + +export const verifyContribution = async (req: Request, res: Response) => { + const user = (req as any).user; + + if (!user) throw Error('Middleware not properly setup for verifyContribution controller, requires req.user'); + + const { contributorId } = req.body; + + const logger = parentLogger.child({ + module: 'Contributors::verifyContributionController', + body: req.body, + user: (req as any).user, + contributorId, + }); + + if (!contributorId) { + return res.status(400).json({ error: 'contributorId is required' }); + } + + try { + const verified = await contributorService.verifyContribution(user, contributorId); + if (verified) { + logger.info('Contribution verified successfully'); + return res.status(200).json({ message: 'Contribution verified successfully' }); + } + } catch (e) { + logger.error({ e }, 'Failed to verify contributor'); + return res.status(500).json({ error: 'Failed to verify contribution' }); + } + + return res.status(500).json({ error: 'Something went wrong' }); +}; diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index b00e20e9b..29d57d620 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -3,6 +3,7 @@ import { Router } from 'express'; import { addContributor } from '../../controllers/nodes/contributions/create.js'; import { getNodeContributions } from '../../controllers/nodes/contributions/getNodeContributions.js'; import { getUserContributions } from '../../controllers/nodes/contributions/getUserContributions.js'; +import { verifyContribution } from '../../controllers/nodes/contributions/verify.js'; import { dispatchDocumentChange, getNodeDocument } from '../../controllers/nodes/documents.js'; import { feed } from '../../controllers/nodes/feed.js'; import { @@ -54,9 +55,10 @@ router.get('/cover/:uuid/:version', [], getCoverImage); router.get('/documents/:uuid', [ensureUser, ensureNodeAccess], getNodeDocument); router.post('/documents/:uuid/actions', [ensureUser, ensureNodeAccess], dispatchDocumentChange); router.get('/thumbnails/:uuid/:manifestCid?', [attachUser], thumbnails); -router.post('/contributions/:uuid', [attachUser, ensureWriteNodeAccess], addContributor); +router.post('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], addContributor); router.get('/contributions/user/:userId', [], getUserContributions); router.get('/contributions/node/:uuid', [], getNodeContributions); +router.patch('/contributions/verify', [ensureUser], verifyContribution); router.delete('/:uuid', [ensureUser], deleteNode); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 1bf44d440..9c33a6014 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -70,6 +70,9 @@ class ContributorService { const contribution = await prisma.nodeContribution.findUnique({ where: { contributorId } }); if (!contribution) throw Error('Invalid contributorId'); + const contributionPointsToUser = contribution.email === user.email || contribution.orcid === user.orcid; + if (!contributionPointsToUser) throw Error('Unauthorized to verify contribution'); + const userHasOrcidValidated = user.orcid !== undefined && user.orcid !== null; const contributionOrcidMatchesUser = userHasOrcidValidated && contribution.orcid === user.orcid; From d36040471074f022117323f26a5da450a2fb165d Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 19:25:56 +0700 Subject: [PATCH 13/41] modify adding contributors to allow adding through uid --- desci-server/src/controllers/users/search.ts | 2 ++ desci-server/src/services/Contributors.ts | 28 +++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/desci-server/src/controllers/users/search.ts b/desci-server/src/controllers/users/search.ts index da81c85bc..5c662ff74 100644 --- a/desci-server/src/controllers/users/search.ts +++ b/desci-server/src/controllers/users/search.ts @@ -11,6 +11,8 @@ export const searchProfiles = async (req: Request, res: Response) => { name, }); + if (name.toString().length < 2) return res.status(400).json({ error: 'Name query must be at least 2 characters' }); + try { const profiles = await prisma.user.findMany({ where: { name: { startsWith: name as string } } }); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 9c33a6014..577279aa0 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -15,15 +15,37 @@ export type Contribution = { verified: boolean; }; +export type AddNodeContributionParams = { + node: Node; + nodeOwner: User; + contributorId: string; + email?: string; + orcid?: string; + userId?: number; +}; + class ContributorService { private logger = parentLogger.child({ module: 'Services::ContributorsService' }); - async addNodeContribution(node: Node, nodeOwner: User, contributorId: string, email: string, orcid?: string) { + async addNodeContribution({ + node, + nodeOwner, + contributorId, + email, + orcid, + userId, + }: AddNodeContributionParams): Promise { // Check if contributor is already registered - const registeredContributor = await prisma.user.findUnique({ where: { email } }); + let registeredContributor; + if (email) registeredContributor = await prisma.user.findUnique({ where: { email } }); + if (orcid) registeredContributor = await prisma.user.findUnique({ where: { orcid } }); + if (userId !== undefined || userId !== null) + registeredContributor = await prisma.user.findUnique({ where: { id: userId } }); + const userHasOrcidValidated = nodeOwner.orcid !== undefined && nodeOwner.orcid !== null; const contributionOrcidMatchesUser = userHasOrcidValidated && orcid === nodeOwner.orcid; - const autoVerified = nodeOwner.email === email || contributionOrcidMatchesUser; + const userIsOwner = userId === nodeOwner.id; + const autoVerified = nodeOwner.email === email || contributionOrcidMatchesUser || userIsOwner; return prisma.nodeContribution.create({ data: { contributorId, From 09c0d97902b23b7fe24b3b0cdb49fe3981cd9f78 Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 19:46:20 +0700 Subject: [PATCH 14/41] modify search logic, startsWith -> include, apply minimum query limit --- desci-server/src/controllers/users/search.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desci-server/src/controllers/users/search.ts b/desci-server/src/controllers/users/search.ts index 5c662ff74..896a88785 100644 --- a/desci-server/src/controllers/users/search.ts +++ b/desci-server/src/controllers/users/search.ts @@ -14,7 +14,7 @@ export const searchProfiles = async (req: Request, res: Response) => { if (name.toString().length < 2) return res.status(400).json({ error: 'Name query must be at least 2 characters' }); try { - const profiles = await prisma.user.findMany({ where: { name: { startsWith: name as string } } }); + const profiles = await prisma.user.findMany({ where: { name: { contains: name as string, mode: 'insensitive' } } }); if (profiles) { const profilesReturn = profiles.map((profile) => ({ name: profile.name, id: profile.id })); From bd496738c1465882dd3fd87ce46ff71030b5bcd6 Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 19:46:46 +0700 Subject: [PATCH 15/41] modify add contribution logic, allow adding via userId, orcid, email, make email optional --- .../migration.sql | 2 ++ desci-server/prisma/schema.prisma | 2 +- .../controllers/nodes/contributions/create.ts | 22 ++++++++++++++----- desci-server/src/services/nodeManager.ts | 1 - 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 desci-server/prisma/migrations/20240315124454_email_optional_node_contributions/migration.sql diff --git a/desci-server/prisma/migrations/20240315124454_email_optional_node_contributions/migration.sql b/desci-server/prisma/migrations/20240315124454_email_optional_node_contributions/migration.sql new file mode 100644 index 000000000..968e7d1e9 --- /dev/null +++ b/desci-server/prisma/migrations/20240315124454_email_optional_node_contributions/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "NodeContribution" ALTER COLUMN "email" DROP NOT NULL; diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index 75db07d74..b28cad425 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -480,7 +480,7 @@ model NodeContribution { nodeId Int userId Int? verified Boolean @default(false) - email String + email String? orcid String? node Node @relation(fields: [nodeId], references: [id]) user User? @relation(fields: [userId], references: [id]) diff --git a/desci-server/src/controllers/nodes/contributions/create.ts b/desci-server/src/controllers/nodes/contributions/create.ts index a9777231e..365be8178 100644 --- a/desci-server/src/controllers/nodes/contributions/create.ts +++ b/desci-server/src/controllers/nodes/contributions/create.ts @@ -10,9 +10,9 @@ export const addContributor = async (req: Request, res: Response) => { if (!node || !user) throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); - const { contributorId, orcid } = req.body; + const { contributorId, orcid, userId } = req.body; let { email } = req.body; - email = email.toLowerCase(); + if (email) email = email.toLowerCase(); const logger = parentLogger.child({ module: 'Contributors::createController', @@ -23,13 +23,23 @@ export const addContributor = async (req: Request, res: Response) => { orcid, }); - if (!contributorId || !email) { - return res.status(400).json({ error: 'contributorId and email required' }); + if (!contributorId) { + return res.status(400).json({ error: 'contributorId required' }); } - + if (!userId && !email && !orcid) { + return res.status(400).json({ error: 'userId, Email or Orcid required' }); + } + // debugger; // Add contributor to the db try { - const contributorAdded = await contributorService.addNodeContribution(node, user, contributorId, email, orcid); + const contributorAdded = await contributorService.addNodeContribution({ + node, + nodeOwner: user, + contributorId, + email, + orcid, + userId, + }); if (contributorAdded) { logger.info({ contributorAdded }, 'Contributor added successfully'); return res.status(200).json({ message: 'Contributor added successfully' }); diff --git a/desci-server/src/services/nodeManager.ts b/desci-server/src/services/nodeManager.ts index 4a83f629f..c6b1913f6 100644 --- a/desci-server/src/services/nodeManager.ts +++ b/desci-server/src/services/nodeManager.ts @@ -72,7 +72,6 @@ export const createPublicDataRefs = async ( userId: number | undefined, versionId: number | undefined, ) => { - debugger; const dataWithVersions = data.map((d) => ({ ...d, versionId })); const publicDataRefRes = await prisma.publicDataReference.createMany({ data: dataWithVersions, From 5ef986d16864ddbf4c865926b8318bcc4263d97c Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 19:54:58 +0700 Subject: [PATCH 16/41] finish up get contributions for user logic --- desci-server/src/services/Contributors.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 577279aa0..3864a1bf6 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -5,6 +5,7 @@ import { Node, NodeContribution, User } from '@prisma/client'; import { prisma } from '../client.js'; import { logger as parentLogger } from '../logger.js'; import { getIndexedResearchObjects } from '../theGraph.js'; +import { hexToCid } from '../utils.js'; type ContributorId = string; export type NodeContributorMap = Record; @@ -76,15 +77,23 @@ class ContributorService { }, {}); } - async retrieveContributionsForUser(user: User): Promise { + async retrieveContributionsForUser(user: User): Promise<{ uuid: string; manifestCid: string }[]> { const contributions = await prisma.nodeContribution.findMany({ where: { userId: user.id }, include: { node: true }, }); const nodeUuids = contributions.map((contribution) => contribution.node.uuid); const { researchObjects } = await getIndexedResearchObjects(nodeUuids); // <-- Array of research objects, convert .id to b64 to retrieve uuid - debugger; - return []; + const NodesWithManifestCids = researchObjects.map((ro) => { + // convert hex string to integer + const nodeUuidInt = Buffer.from(ro.id.substring(2), 'hex'); + // convert integer to hex + const nodeUuid = nodeUuidInt.toString('base64url'); + + return { uuid: nodeUuid, manifestCid: hexToCid(ro.recentCid) }; + }); + // debugger; + return NodesWithManifestCids || []; } async verifyContribution(user: User, contributorId: string): Promise { From 2096eeb40eea624b0d3de8053e83428b444a02f4 Mon Sep 17 00:00:00 2001 From: kadami Date: Fri, 15 Mar 2024 21:23:18 +0700 Subject: [PATCH 17/41] fix verify logic to also work for userIds --- desci-server/src/middleware/permissions.ts | 1 - desci-server/src/services/Contributors.ts | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/desci-server/src/middleware/permissions.ts b/desci-server/src/middleware/permissions.ts index 0872a52a4..8f006516a 100644 --- a/desci-server/src/middleware/permissions.ts +++ b/desci-server/src/middleware/permissions.ts @@ -13,7 +13,6 @@ export enum AuthMethods { } export const ensureUser = async (req: ExpressRequest, res: Response, next: NextFunction) => { - // debugger; const token = await extractAuthToken(req); const apiKey = await extractApiKey(req); const authTokenRetrieval = await extractUserFromToken(token); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 3864a1bf6..1619ada78 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -108,7 +108,8 @@ class ContributorService { const contributionOrcidMatchesUser = userHasOrcidValidated && contribution.orcid === user.orcid; const contributorEmailMatchesUser = user.email === contribution.email; - const verified = contributorEmailMatchesUser || contributionOrcidMatchesUser; + const contributionUserIdMatchesUser = user.id === contribution.userId; + const verified = contributorEmailMatchesUser || contributionOrcidMatchesUser || contributionUserIdMatchesUser; if (verified) { const updated = await prisma.nodeContribution.update({ where: { id: contribution.id }, From eeed856167ee1f5848cb775ccd33455259831bdf Mon Sep 17 00:00:00 2001 From: kadami Date: Sat, 16 Mar 2024 02:30:44 +0700 Subject: [PATCH 18/41] add ability to update contributor if unverified, add update endpoint, add remove logic --- .../controllers/nodes/contributions/create.ts | 1 - .../controllers/nodes/contributions/update.ts | 60 +++++++++++++++++ desci-server/src/routes/v1/nodes.ts | 2 + desci-server/src/services/Contributors.ts | 66 +++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 desci-server/src/controllers/nodes/contributions/update.ts diff --git a/desci-server/src/controllers/nodes/contributions/create.ts b/desci-server/src/controllers/nodes/contributions/create.ts index 365be8178..cba769236 100644 --- a/desci-server/src/controllers/nodes/contributions/create.ts +++ b/desci-server/src/controllers/nodes/contributions/create.ts @@ -20,7 +20,6 @@ export const addContributor = async (req: Request, res: Response) => { uuid: node.uuid, user: (req as any).user, nodeId: node.id, - orcid, }); if (!contributorId) { diff --git a/desci-server/src/controllers/nodes/contributions/update.ts b/desci-server/src/controllers/nodes/contributions/update.ts new file mode 100644 index 000000000..a1de409f3 --- /dev/null +++ b/desci-server/src/controllers/nodes/contributions/update.ts @@ -0,0 +1,60 @@ +import { Request, Response } from 'express'; + +import { logger as parentLogger } from '../../../logger.js'; +import { contributorService } from '../../../services/Contributors.js'; + +export const updateContributor = async (req: Request, res: Response) => { + const node = (req as any).node; + const user = (req as any).user; + + if (!node || !user) + throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); + + const { contributorId, orcid, userId } = req.body; + let { email } = req.body; + if (email) email = email.toLowerCase(); + + const logger = parentLogger.child({ + module: 'Contributors::updateContributorController', + body: req.body, + uuid: node.uuid, + user: (req as any).user, + nodeId: node.id, + }); + + if (!contributorId) { + return res.status(400).json({ error: 'contributorId required' }); + } + if (!userId && !email && !orcid) { + return res.status(400).json({ error: 'userId, Email or Orcid required' }); + } + + const contribution = await contributorService.getContributionById(contributorId); + const currentEmail = contribution?.email; + + // Add contributor to the db + try { + const contributorUpdated = await contributorService.updateNodeContribution({ + node, + nodeOwner: user, + contributorId, + email, + orcid, + userId, + }); + if (contributorUpdated) { + logger.info({ contributorUpdated }, 'Contributor updated successfully'); + // Future: + if (currentEmail !== email) { + // If email was changed, send a new email. + // Fire off an email -> make it count as a friend referral + } + return res.status(200).json({ message: 'Contributor updated successfully' }); + } + } catch (e) { + logger.error({ e }, 'Failed to update contributor'); + return res.status(500).json({ error: 'Failed to update contributor' }); + } + + return res.status(500).json({ error: 'Something went wrong' }); +}; diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index 29d57d620..130645950 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -31,6 +31,7 @@ import { versionDetails } from '../../controllers/nodes/versionDetails.js'; import { attachUser } from '../../internal.js'; import { ensureNodeAccess, ensureWriteNodeAccess } from '../../middleware/authorisation.js'; import { ensureUser } from '../../middleware/permissions.js'; +import { updateContributor } from '../../controllers/nodes/contributions/update.js'; const router = Router(); @@ -56,6 +57,7 @@ router.get('/documents/:uuid', [ensureUser, ensureNodeAccess], getNodeDocument); router.post('/documents/:uuid/actions', [ensureUser, ensureNodeAccess], dispatchDocumentChange); router.get('/thumbnails/:uuid/:manifestCid?', [attachUser], thumbnails); router.post('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], addContributor); +router.patch('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], updateContributor); router.get('/contributions/user/:userId', [], getUserContributions); router.get('/contributions/node/:uuid', [], getNodeContributions); router.patch('/contributions/verify', [ensureUser], verifyContribution); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 1619ada78..041e944f2 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -51,6 +51,7 @@ class ContributorService { data: { contributorId, email, + orcid, verified: autoVerified, nodeId: node.id, ...(registeredContributor && { userId: registeredContributor.id }), @@ -58,6 +59,67 @@ class ContributorService { }); } + /** + * For changing the contributions email/orcid/userId, can only be done if the contribution is not yet verified. + */ + async updateNodeContribution({ + node, + nodeOwner, + contributorId, + email, + orcid, + userId, + }: AddNodeContributionParams): Promise { + // Check if contribution is already verified + let registeredContributor; + if (email) registeredContributor = await prisma.user.findUnique({ where: { email } }); + if (orcid) registeredContributor = await prisma.user.findUnique({ where: { orcid } }); + if (userId !== undefined || userId !== null) + registeredContributor = await prisma.user.findUnique({ where: { id: userId } }); + + const existingContribution = await prisma.nodeContribution.findFirst({ + where: { contributorId, nodeId: node.id }, + }); + if (!existingContribution) throw Error('Contribution not found'); + // Don't allow updating if already verified + if (existingContribution.verified) throw Error('Contributor already verified'); + + const userHasOrcidValidated = nodeOwner.orcid !== undefined && nodeOwner.orcid !== null; + const contributionOrcidMatchesUser = userHasOrcidValidated && orcid === nodeOwner.orcid; + const userIsOwner = userId === nodeOwner.id; + const autoVerified = nodeOwner.email === email || contributionOrcidMatchesUser || userIsOwner; + + // Revoke priv share link for old email + + return prisma.nodeContribution.update({ + where: { + id: existingContribution.id, + }, + data: { + email, + orcid, + nodeId: node.id, + verified: autoVerified, + ...(registeredContributor && { userId: registeredContributor.id }), + }, + }); + } + + async removeContributor(contributorId: string, nodeId: number): Promise { + const contribution = await prisma.nodeContribution.findFirst({ where: { contributorId, nodeId } }); + if (!contribution) throw Error('Contribution not found'); + + // Revoke priv share link + + const removed = await prisma.nodeContribution.delete({ + where: { id: contribution.id }, + }); + + if (removed) return true; + + return false; + } + // async retrieveContributionsForNode(node: Node, contributorIds: string[]): Promise { async retrieveContributionsForNode(node: Node): Promise { const contributions = await prisma.nodeContribution.findMany({ @@ -120,6 +182,10 @@ class ContributorService { return false; } + + async getContributionById(contributorId: string): Promise { + return prisma.nodeContribution.findUnique({ where: { contributorId } }); + } } export const contributorService = new ContributorService(); From 699264852952978080cee22c102a99ed2524db30 Mon Sep 17 00:00:00 2001 From: kadami Date: Sat, 16 Mar 2024 02:35:43 +0700 Subject: [PATCH 19/41] add delete contributor endpoint --- .../controllers/nodes/contributions/delete.ts | 40 +++++++++++++++++++ .../controllers/nodes/contributions/update.ts | 2 +- desci-server/src/routes/v1/nodes.ts | 4 +- 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 desci-server/src/controllers/nodes/contributions/delete.ts diff --git a/desci-server/src/controllers/nodes/contributions/delete.ts b/desci-server/src/controllers/nodes/contributions/delete.ts new file mode 100644 index 000000000..e7856a33e --- /dev/null +++ b/desci-server/src/controllers/nodes/contributions/delete.ts @@ -0,0 +1,40 @@ +import { Request, Response } from 'express'; + +import { logger as parentLogger } from '../../../logger.js'; +import { contributorService } from '../../../services/Contributors.js'; + +export const deleteContributor = async (req: Request, res: Response) => { + const node = (req as any).node; + const user = (req as any).user; + + if (!node || !user) + throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); + + const { contributorId } = req.body; + + const logger = parentLogger.child({ + module: 'Contributors::deleteContributorController', + body: req.body, + uuid: node.uuid, + user: (req as any).user, + nodeId: node.id, + }); + + if (!contributorId) { + return res.status(400).json({ error: 'contributorId required' }); + } + + // Remove contributor entry from the db + try { + const contributorRemoved = await contributorService.removeContributor(contributorId, node.id); + if (contributorRemoved) { + logger.info('Contributor deleted successfully'); + return res.status(200).json({ message: 'Contributor deleted successfully' }); + } + } catch (e) { + logger.error({ e }, 'Failed to delete contributor'); + return res.status(500).json({ error: 'Failed to delete contributor' }); + } + + return res.status(500).json({ error: 'Something went wrong' }); +}; diff --git a/desci-server/src/controllers/nodes/contributions/update.ts b/desci-server/src/controllers/nodes/contributions/update.ts index a1de409f3..565c8cb10 100644 --- a/desci-server/src/controllers/nodes/contributions/update.ts +++ b/desci-server/src/controllers/nodes/contributions/update.ts @@ -32,7 +32,7 @@ export const updateContributor = async (req: Request, res: Response) => { const contribution = await contributorService.getContributionById(contributorId); const currentEmail = contribution?.email; - // Add contributor to the db + // Update contributor in the db try { const contributorUpdated = await contributorService.updateNodeContribution({ node, diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index 130645950..5f378d83f 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -3,6 +3,7 @@ import { Router } from 'express'; import { addContributor } from '../../controllers/nodes/contributions/create.js'; import { getNodeContributions } from '../../controllers/nodes/contributions/getNodeContributions.js'; import { getUserContributions } from '../../controllers/nodes/contributions/getUserContributions.js'; +import { updateContributor } from '../../controllers/nodes/contributions/update.js'; import { verifyContribution } from '../../controllers/nodes/contributions/verify.js'; import { dispatchDocumentChange, getNodeDocument } from '../../controllers/nodes/documents.js'; import { feed } from '../../controllers/nodes/feed.js'; @@ -31,7 +32,7 @@ import { versionDetails } from '../../controllers/nodes/versionDetails.js'; import { attachUser } from '../../internal.js'; import { ensureNodeAccess, ensureWriteNodeAccess } from '../../middleware/authorisation.js'; import { ensureUser } from '../../middleware/permissions.js'; -import { updateContributor } from '../../controllers/nodes/contributions/update.js'; +import { deleteContributor } from '../../controllers/nodes/contributions/delete.js'; const router = Router(); @@ -58,6 +59,7 @@ router.post('/documents/:uuid/actions', [ensureUser, ensureNodeAccess], dispatch router.get('/thumbnails/:uuid/:manifestCid?', [attachUser], thumbnails); router.post('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], addContributor); router.patch('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], updateContributor); +router.delete('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], deleteContributor); router.get('/contributions/user/:userId', [], getUserContributions); router.get('/contributions/node/:uuid', [], getNodeContributions); router.patch('/contributions/verify', [ensureUser], verifyContribution); From 74641f3d57bb58fcd7e523ee466f849c713dc609 Mon Sep 17 00:00:00 2001 From: kadami Date: Sat, 16 Mar 2024 02:44:03 +0700 Subject: [PATCH 20/41] save --- desci-server/src/routes/v1/nodes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index 5f378d83f..48ed28e1c 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -1,6 +1,7 @@ import { Router } from 'express'; import { addContributor } from '../../controllers/nodes/contributions/create.js'; +import { deleteContributor } from '../../controllers/nodes/contributions/delete.js'; import { getNodeContributions } from '../../controllers/nodes/contributions/getNodeContributions.js'; import { getUserContributions } from '../../controllers/nodes/contributions/getUserContributions.js'; import { updateContributor } from '../../controllers/nodes/contributions/update.js'; @@ -32,7 +33,6 @@ import { versionDetails } from '../../controllers/nodes/versionDetails.js'; import { attachUser } from '../../internal.js'; import { ensureNodeAccess, ensureWriteNodeAccess } from '../../middleware/authorisation.js'; import { ensureUser } from '../../middleware/permissions.js'; -import { deleteContributor } from '../../controllers/nodes/contributions/delete.js'; const router = Router(); From 9934213ea3aa3a2575ec34b239f337802fdb6f77 Mon Sep 17 00:00:00 2001 From: kadami Date: Mon, 18 Mar 2024 23:47:57 +0700 Subject: [PATCH 21/41] use soft delete to preserve verifications post deletion --- .../migration.sql | 3 +++ desci-server/prisma/schema.prisma | 16 +++++++++------- desci-server/src/services/Contributors.ts | 8 ++++++-- 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 desci-server/prisma/migrations/20240318164046_soft_delete_contributors/migration.sql diff --git a/desci-server/prisma/migrations/20240318164046_soft_delete_contributors/migration.sql b/desci-server/prisma/migrations/20240318164046_soft_delete_contributors/migration.sql new file mode 100644 index 000000000..b18784507 --- /dev/null +++ b/desci-server/prisma/migrations/20240318164046_soft_delete_contributors/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "NodeContribution" ADD COLUMN "deleted" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "deletedAt" TIMESTAMP(3); diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index b28cad425..b59e1581c 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -473,17 +473,19 @@ model NodeThumbnails { // The glue between a manifest contributor entry and a nodes profile model NodeContribution { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - contributorId String @unique + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + contributorId String @unique nodeId Int userId Int? - verified Boolean @default(false) + verified Boolean @default(false) email String? orcid String? - node Node @relation(fields: [nodeId], references: [id]) - user User? @relation(fields: [userId], references: [id]) + deleted Boolean @default(false) + deletedAt DateTime? + node Node @relation(fields: [nodeId], references: [id]) + user User? @relation(fields: [userId], references: [id]) @@unique([contributorId, nodeId, userId]) } diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 041e944f2..95f329f76 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -6,6 +6,7 @@ import { prisma } from '../client.js'; import { logger as parentLogger } from '../logger.js'; import { getIndexedResearchObjects } from '../theGraph.js'; import { hexToCid } from '../utils.js'; +import { register } from 'module'; type ContributorId = string; export type NodeContributorMap = Record; @@ -111,8 +112,9 @@ class ContributorService { // Revoke priv share link - const removed = await prisma.nodeContribution.delete({ + const removed = await prisma.nodeContribution.update({ where: { id: contribution.id }, + data: { deleted: true, deletedAt: new Date() }, }); if (removed) return true; @@ -134,6 +136,8 @@ class ContributorService { name: contributor.user.name, verified: contributor.verified, userId: contributor.user.id, + deleted: contributor.deleted, + deletedAt: contributor.deletedAt, }; return acc; }, {}); @@ -145,7 +149,7 @@ class ContributorService { include: { node: true }, }); const nodeUuids = contributions.map((contribution) => contribution.node.uuid); - const { researchObjects } = await getIndexedResearchObjects(nodeUuids); // <-- Array of research objects, convert .id to b64 to retrieve uuid + const { researchObjects } = await getIndexedResearchObjects(nodeUuids); const NodesWithManifestCids = researchObjects.map((ro) => { // convert hex string to integer const nodeUuidInt = Buffer.from(ro.id.substring(2), 'hex'); From 2a183bcb02b81453bda9d44f68bac16b7be6eaf2 Mon Sep 17 00:00:00 2001 From: kadami Date: Tue, 19 Mar 2024 03:14:29 +0700 Subject: [PATCH 22/41] remove singleton constraint on priv share codes for nodes --- .../migration.sql | 8 ++++++++ desci-server/prisma/schema.prisma | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 desci-server/prisma/migrations/20240318200900_enable_multiple_private_share_codes/migration.sql diff --git a/desci-server/prisma/migrations/20240318200900_enable_multiple_private_share_codes/migration.sql b/desci-server/prisma/migrations/20240318200900_enable_multiple_private_share_codes/migration.sql new file mode 100644 index 000000000..76fc3238c --- /dev/null +++ b/desci-server/prisma/migrations/20240318200900_enable_multiple_private_share_codes/migration.sql @@ -0,0 +1,8 @@ +-- DropIndex +DROP INDEX "PrivateShare_nodeUUID_key"; + +-- AlterTable +ALTER TABLE "PrivateShare" ADD COLUMN "memo" TEXT; + +-- CreateIndex +CREATE INDEX "PrivateShare_nodeUUID_idx" ON "PrivateShare"("nodeUUID"); diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index b59e1581c..ead6f6ddd 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -21,7 +21,6 @@ model Node { ownerId Int uuid String? @unique @default(uuid()) manifestDocumentId String @default("") - privateShare PrivateShare? owner User @relation(fields: [ownerId], references: [id]) authorInvites AuthorInvite[] transactions ChainTransaction[] @@ -42,6 +41,7 @@ model Node { NodeThumbnails NodeThumbnails[] PublishTaskQueue PublishTaskQueue[] NodeContribution NodeContribution[] + PrivateShare PrivateShare[] @@index([ownerId]) @@index([uuid]) @@ -441,11 +441,13 @@ model PublicDataReferenceOnIpfsMirror { model PrivateShare { id Int @id @default(autoincrement()) shareId String @unique - nodeUUID String @unique + nodeUUID String + memo String? node Node @relation(fields: [nodeUUID], references: [uuid]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + @@index([nodeUUID]) @@index([shareId]) } From 67ea3cc406f4677a1a8225de01c96bc286253614 Mon Sep 17 00:00:00 2001 From: kadami Date: Tue, 19 Mar 2024 03:15:32 +0700 Subject: [PATCH 23/41] modify priv share controllers to function with multiple codes generatable --- desci-server/src/controllers/nodes/share.ts | 26 ++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/desci-server/src/controllers/nodes/share.ts b/desci-server/src/controllers/nodes/share.ts index 8601a0e1d..12bfa7d51 100644 --- a/desci-server/src/controllers/nodes/share.ts +++ b/desci-server/src/controllers/nodes/share.ts @@ -25,7 +25,12 @@ export const createPrivateShare = async (req: Request, res: Response, next: Next const shareUUID = new ShortUniqueId.default({ length: 10 }); const shareId = shareUUID() as string; - let privateShare = await prisma.privateShare.findFirst({ where: { nodeUUID: ensureUuidEndsWithDot(uuid) } }); + let privateShare = await prisma.privateShare.findFirst({ + where: { + nodeUUID: ensureUuidEndsWithDot(uuid), + OR: [{ memo: null }, { memo: '' }], + }, + }); if (privateShare) { res.send({ ok: true, shareId: privateShare.shareId }); @@ -54,7 +59,12 @@ export const getPrivateShare = async (req: Request, res: Response, next: NextFun throw new Error('Node not found'); } - const privateShare = await prisma.privateShare.findFirst({ where: { nodeUUID: ensureUuidEndsWithDot(uuid) } }); + const privateShare = await prisma.privateShare.findFirst({ + where: { + nodeUUID: ensureUuidEndsWithDot(uuid), + OR: [{ memo: null }, { memo: '' }], + }, + }); if (!privateShare) { throw new Error('Private share link does not exists.'); @@ -98,7 +108,17 @@ export const revokePrivateShare = async (req: Request, res: Response, next: Next throw new Error('Node not found'); } - await prisma.privateShare.delete({ where: { nodeUUID: ensureUuidEndsWithDot(uuid) } }); + const privateShare = await prisma.privateShare.findFirst({ + where: { + nodeUUID: ensureUuidEndsWithDot(uuid), + OR: [{ memo: null }, { memo: '' }], + }, + }); + + if (privateShare) + await prisma.privateShare.delete({ + where: { id: privateShare.id }, + }); res.send({ ok: true }); } catch (e) { From 1efac17430f7f18f2f3443f83e3ed99b898c3591 Mon Sep 17 00:00:00 2001 From: kadami Date: Tue, 19 Mar 2024 03:37:41 +0700 Subject: [PATCH 24/41] add and integrate priv share logic for contributor actions, create/del --- .../controllers/nodes/contributions/create.ts | 16 ++++---- desci-server/src/services/Contributors.ts | 40 ++++++++++++++++++- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/desci-server/src/controllers/nodes/contributions/create.ts b/desci-server/src/controllers/nodes/contributions/create.ts index cba769236..bbee95972 100644 --- a/desci-server/src/controllers/nodes/contributions/create.ts +++ b/desci-server/src/controllers/nodes/contributions/create.ts @@ -39,18 +39,20 @@ export const addContributor = async (req: Request, res: Response) => { orcid, userId, }); - if (contributorAdded) { - logger.info({ contributorAdded }, 'Contributor added successfully'); - return res.status(200).json({ message: 'Contributor added successfully' }); + if (!contributorAdded) throw Error('Failed to add contributor'); + if (user.id !== contributorAdded.userId) { + // Generate a share code for the contributor if it's the node owner themselves + const shareCode = await contributorService.generatePrivShareCodeForContribution(contributorAdded, node); + + // Future: + // Fire off an email -> make it count as a friend referral } + logger.info({ contributorAdded }, 'Contributor added successfully'); + return res.status(200).json({ message: 'Contributor added successfully' }); } catch (e) { logger.error({ e }, 'Failed to add contributor'); return res.status(500).json({ error: 'Failed to add contributor' }); } - // Future: - // Gen a priv link - // Fire off an email -> make it count as a friend referral - return res.status(500).json({ error: 'Something went wrong' }); }; diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 95f329f76..6322062d6 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -6,7 +6,7 @@ import { prisma } from '../client.js'; import { logger as parentLogger } from '../logger.js'; import { getIndexedResearchObjects } from '../theGraph.js'; import { hexToCid } from '../utils.js'; -import { register } from 'module'; +import ShortUniqueId from 'short-unique-id'; type ContributorId = string; export type NodeContributorMap = Record; @@ -26,6 +26,8 @@ export type AddNodeContributionParams = { userId?: number; }; +const PRIV_SHARE_CONTRIBUTION_PREFIX = 'C-'; + class ContributorService { private logger = parentLogger.child({ module: 'Services::ContributorsService' }); @@ -107,7 +109,10 @@ class ContributorService { } async removeContributor(contributorId: string, nodeId: number): Promise { - const contribution = await prisma.nodeContribution.findFirst({ where: { contributorId, nodeId } }); + const contribution = await prisma.nodeContribution.findFirst({ + where: { contributorId, nodeId }, + include: { node: true }, + }); if (!contribution) throw Error('Contribution not found'); // Revoke priv share link @@ -117,6 +122,8 @@ class ContributorService { data: { deleted: true, deletedAt: new Date() }, }); + this.removePrivShareCodeForContribution(removed, contribution.node); + if (removed) return true; return false; @@ -187,6 +194,35 @@ class ContributorService { return false; } + async generatePrivShareCodeForContribution(contribution: NodeContribution, node: Node): Promise { + if (!contribution.email) return null; + const privShare = await prisma.privateShare.findFirst({ + where: { nodeUUID: node.uuid, memo: PRIV_SHARE_CONTRIBUTION_PREFIX + contribution.email }, + }); + + if (privShare) return privShare.shareId; + + const shareCode = new ShortUniqueId.default({ length: 10 }); + const newPrivShare = await prisma.privateShare.create({ + data: { + nodeUUID: node.uuid, + shareId: shareCode as unknown as string, + memo: PRIV_SHARE_CONTRIBUTION_PREFIX + contribution.email, + }, + }); + + return newPrivShare.shareId; + } + + async removePrivShareCodeForContribution(contribution: NodeContribution, node: Node): Promise { + if (!contribution.email) return; + const privShare = await prisma.privateShare.findFirst({ + where: { nodeUUID: node.uuid, memo: PRIV_SHARE_CONTRIBUTION_PREFIX + contribution.email }, + }); + + if (privShare) await prisma.privateShare.delete({ where: { id: privShare.id } }); + } + async getContributionById(contributorId: string): Promise { return prisma.nodeContribution.findUnique({ where: { contributorId } }); } From c58a5f09d91dbbbf716f24f7702f35662b11b0b4 Mon Sep 17 00:00:00 2001 From: kadami Date: Tue, 19 Mar 2024 03:43:42 +0700 Subject: [PATCH 25/41] regen new code on contributor email update, disable code for prev email --- .../controllers/nodes/contributions/update.ts | 2 ++ desci-server/src/services/Contributors.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/desci-server/src/controllers/nodes/contributions/update.ts b/desci-server/src/controllers/nodes/contributions/update.ts index 565c8cb10..bf0d2dcb8 100644 --- a/desci-server/src/controllers/nodes/contributions/update.ts +++ b/desci-server/src/controllers/nodes/contributions/update.ts @@ -47,6 +47,8 @@ export const updateContributor = async (req: Request, res: Response) => { // Future: if (currentEmail !== email) { // If email was changed, send a new email. + + const shareCode = await contributorService.generatePrivShareCodeForContribution(contributorUpdated, node); // Fire off an email -> make it count as a friend referral } return res.status(200).json({ message: 'Contributor updated successfully' }); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 6322062d6..f05c9c405 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -84,6 +84,12 @@ class ContributorService { where: { contributorId, nodeId: node.id }, }); if (!existingContribution) throw Error('Contribution not found'); + const currentContributorEmail = existingContribution.email; + if (currentContributorEmail !== email) { + // Revoke priv share link for old email + this.removePrivShareCodeForContribution(existingContribution, node); + } + // Don't allow updating if already verified if (existingContribution.verified) throw Error('Contributor already verified'); @@ -223,6 +229,16 @@ class ContributorService { if (privShare) await prisma.privateShare.delete({ where: { id: privShare.id } }); } + async getShareCodeForContribution(contribution: NodeContribution, node: Node): Promise { + if (!contribution.email) return null; + const privShare = await prisma.privateShare.findFirst({ + where: { nodeUUID: node.uuid, memo: PRIV_SHARE_CONTRIBUTION_PREFIX + contribution.email }, + }); + + if (privShare) return privShare.shareId; + return null; + } + async getContributionById(contributorId: string): Promise { return prisma.nodeContribution.findUnique({ where: { contributorId } }); } From 3a3abd60e04ce1b3e91b4ddffafee852a4fb0cac Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 00:00:41 +0700 Subject: [PATCH 26/41] bump node ver to 18.17.0 for dep --- .nvmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nvmrc b/.nvmrc index 3c79f30ec..39d00c051 100755 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.16.0 \ No newline at end of file +18.17.0 \ No newline at end of file From 378698e27d11c1cf7d3ec38f91b0195421fba12a Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 00:00:56 +0700 Subject: [PATCH 27/41] setup react email + templates --- desci-server/package.json | 5 +- .../src/templates/emails/BaseProvider.tsx | 22 + .../templates/emails/ContributorInviteNew.tsx | 128 + .../src/templates/emails/MainLayout.tsx | 55 + .../src/templates/emails/static/labs.svg | 1 + desci-server/tsconfig.json | 15 +- desci-server/yarn.lock | 2193 ++++++++++++++++- 7 files changed, 2367 insertions(+), 52 deletions(-) create mode 100644 desci-server/src/templates/emails/BaseProvider.tsx create mode 100644 desci-server/src/templates/emails/ContributorInviteNew.tsx create mode 100644 desci-server/src/templates/emails/MainLayout.tsx create mode 100644 desci-server/src/templates/emails/static/labs.svg diff --git a/desci-server/package.json b/desci-server/package.json index 92f1e56d6..e4f3d62df 100755 --- a/desci-server/package.json +++ b/desci-server/package.json @@ -45,7 +45,8 @@ "docker:test": "CI=true docker-compose --file ../docker-compose.test.yml --compatibility up --exit-code-from nodes_backend_test", "docker:stage": "docker-compose --file docker-compose.yml --file docker-compose.stage.yml --compatibility up --build", "docker:prod": "../dockerProd.sh", - "podman:dev": "podman-compose --file docker-compose.yml --file docker-compose.dev.yml up --build" + "podman:dev": "podman-compose --file docker-compose.yml --file docker-compose.dev.yml up --build", + "email-dev": "email dev --dir ./src/templates/emails --port 3777" }, "dependencies": { "@automerge/automerge": "2.1.10", @@ -59,6 +60,7 @@ "@penseapp/discord-notification": "^2.0.9", "@prisma/client": "4.2.1", "@quixo3/prisma-session-store": "^3.1.0", + "@react-email/components": "0.0.15", "@sendgrid/mail": "^7.7.0", "@sentry/node": "^7.12.0", "@sentry/tracing": "^7.12.0", @@ -104,6 +106,7 @@ "pino-pretty": "^10.0.0", "prisma": "4.2.1", "promise-parallel-throttle": "^3.3.0", + "react-email": "2.1.0", "redis": "^4.6.7", "reflect-metadata": "^0.1.13", "rimraf": "^5.0.1", diff --git a/desci-server/src/templates/emails/BaseProvider.tsx b/desci-server/src/templates/emails/BaseProvider.tsx new file mode 100644 index 000000000..cbedb1859 --- /dev/null +++ b/desci-server/src/templates/emails/BaseProvider.tsx @@ -0,0 +1,22 @@ +import { Tailwind } from '@react-email/components'; +import React from 'react'; + +const BaseProvider = ({ children }: { children: JSX.Element }) => { + return ( + + {children} + + ); +}; + +export default BaseProvider; diff --git a/desci-server/src/templates/emails/ContributorInviteNew.tsx b/desci-server/src/templates/emails/ContributorInviteNew.tsx new file mode 100644 index 000000000..e752ff279 --- /dev/null +++ b/desci-server/src/templates/emails/ContributorInviteNew.tsx @@ -0,0 +1,128 @@ +import { + Body, + Container, + Column, + Head, + Heading, + Html, + Img, + Link, + Preview, + Row, + Section, + Text, +} from '@react-email/components'; +import * as React from 'react'; + +import MainLayout from './MainLayout.js'; + +interface ContributorInviteEmailProps { + inviter: string; + nodeUuid: string; + contributorId: string; + privShareCode: string; +} + +export const ContributorInviteNew = ({ + inviter, + nodeUuid, + privShareCode, + contributorId, +}: ContributorInviteEmailProps) => ( + + + + Confirm your contribution + + + You've been invited as a contributor! + + {inviter} has added you as a contributor to their node. Confirm your contribution to ensure + you're credited for your work. + + + + If you didn't request this email, there's nothing to worry about, you can safely ignore it. + + + + + +); + +export default ContributorInviteNew; + +const footerText = { + fontSize: '12px', + color: '#b7b7b7', + lineHeight: '15px', + textAlign: 'left' as const, + marginBottom: '50px', +}; + +const footerLink = { + color: '#b7b7b7', + textDecoration: 'underline', +}; + +const footerLogos = { + marginBottom: '32px', + paddingLeft: '8px', + paddingRight: '8px', + width: '100%', +}; + +const socialMediaIcon = { + display: 'inline', + marginLeft: '32px', +}; + +const main = { + backgroundColor: '#ffffff', + margin: '0 auto', + fontFamily: + "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", +}; + +const container = { + margin: '0 auto', + padding: '0px 20px', +}; + +const logoContainer = { + marginTop: '32px', +}; + +const h1 = { + color: '#1d1c1d', + fontSize: '36px', + fontWeight: '700', + margin: '30px 0', + padding: '0', + lineHeight: '42px', +}; + +const heroText = { + fontSize: '20px', + lineHeight: '28px', + marginBottom: '30px', +}; + +const codeBox = { + background: 'rgb(245, 244, 245)', + borderRadius: '4px', + marginBottom: '30px', + padding: '40px 10px', +}; + +const confirmationCodeText = { + fontSize: '30px', + textAlign: 'center' as const, + verticalAlign: 'middle', +}; + +const text = { + color: '#000', + fontSize: '14px', + lineHeight: '24px', +}; diff --git a/desci-server/src/templates/emails/MainLayout.tsx b/desci-server/src/templates/emails/MainLayout.tsx new file mode 100644 index 000000000..48277b207 --- /dev/null +++ b/desci-server/src/templates/emails/MainLayout.tsx @@ -0,0 +1,55 @@ +import { url } from 'inspector'; + +import { + Body, + Container, + Column, + Head, + Heading, + Html, + Img, + Link, + Preview, + Row, + Section, + Text, +} from '@react-email/components'; +import React from 'react'; + +import BaseProvider from './BaseProvider.js'; + +export const emailAssetsBaseUrl = 'https://ipfs.desci.com/ipfs'; +const cubertBkg = 'bafkreih6yx7ywj7trvpp45vergrnytad7ezsku75tefyro4qrrcfrrmrt4'; +const labsLogo = 'bafkreifvb7tleo5jaidjjf6lfjxb5bpjbs2nswp47bi7zh3hxbpc6fjyf4'; + +const MainLayout = ({ children }: { children: JSX.Element }) => { + return ( + + + + + {/* desci-background */} +
+ Desci Labs +
+ {children} +
+
+ +
+ ); +}; + +export default MainLayout; diff --git a/desci-server/src/templates/emails/static/labs.svg b/desci-server/src/templates/emails/static/labs.svg new file mode 100644 index 000000000..94b1409ac --- /dev/null +++ b/desci-server/src/templates/emails/static/labs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/desci-server/tsconfig.json b/desci-server/tsconfig.json index dc3a54fd7..6b32eb774 100755 --- a/desci-server/tsconfig.json +++ b/desci-server/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "nodenext", - + /** * Implied by "module: nodenext": * "moduleResolution": "nodenext", @@ -12,10 +12,7 @@ // Recommended by docs, but a lot of errors // "verbatimModuleSyntax": true, - "lib": [ - "esnext", - "dom" - ], + "lib": ["esnext", "dom"], "outDir": "./dist", "removeComments": true, "emitDecoratorMetadata": true, @@ -31,13 +28,9 @@ // Overrides a built-in Response type "express": ["./src/types/express"] }, + "jsx": "react" }, - "include": [ - "./src/**/*.tsx", - "./src/**/*.ts", - "./src/**/*.cjs", - "src/utils/dagConcat.ts" - ], + "include": ["./src/**/*.tsx", "./src/**/*.ts", "./src/**/*.cjs", "src/utils/dagConcat.ts"], "exclude": ["test/**/*.ts"], "compileOnSave": true } diff --git a/desci-server/yarn.lock b/desci-server/yarn.lock index 0bf5834b9..b6f95cfd1 100755 --- a/desci-server/yarn.lock +++ b/desci-server/yarn.lock @@ -35,6 +35,11 @@ uuid "^8.3.2" xml2js "^0.4.23" +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -838,6 +843,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/runtime@^7.13.10", "@babel/runtime@^7.23.5": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.21.0": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" @@ -1159,6 +1171,18 @@ ky-universal "^0.11.0" undici "^5.21.2" +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + "@endemolshinegroup/cosmiconfig-typescript-loader@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@endemolshinegroup%2fcosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" @@ -1169,6 +1193,121 @@ ts-node "^9" tslib "^2" +"@esbuild/aix-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" + integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g== + +"@esbuild/android-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220" + integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q== + +"@esbuild/android-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c" + integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw== + +"@esbuild/android-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2" + integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg== + +"@esbuild/darwin-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" + integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== + +"@esbuild/darwin-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e" + integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g== + +"@esbuild/freebsd-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a" + integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA== + +"@esbuild/freebsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2" + integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw== + +"@esbuild/linux-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545" + integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg== + +"@esbuild/linux-arm@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3" + integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q== + +"@esbuild/linux-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4" + integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA== + +"@esbuild/linux-loong64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121" + integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg== + +"@esbuild/linux-mips64el@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9" + integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg== + +"@esbuild/linux-ppc64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912" + integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA== + +"@esbuild/linux-riscv64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916" + integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ== + +"@esbuild/linux-s390x@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8" + integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q== + +"@esbuild/linux-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766" + integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA== + +"@esbuild/netbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d" + integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ== + +"@esbuild/openbsd-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2" + integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw== + +"@esbuild/sunos-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767" + integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ== + +"@esbuild/win32-arm64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee" + integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ== + +"@esbuild/win32-ia32@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c" + integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg== + +"@esbuild/win32-x64@0.19.11": + version "0.19.11" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04" + integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw== + "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1537,6 +1676,33 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" +"@floating-ui/core@^1.0.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/dom@^1.6.1": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" + integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== + dependencies: + "@floating-ui/core" "^1.0.0" + "@floating-ui/utils" "^0.2.0" + +"@floating-ui/react-dom@^2.0.0": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.8.tgz#afc24f9756d1b433e1fe0d047c24bd4d9cefaa5d" + integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== + dependencies: + "@floating-ui/dom" "^1.6.1" + +"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + "@gitcoinco/passport-sdk-reader@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@gitcoinco/passport-sdk-reader/-/passport-sdk-reader-0.1.4.tgz#875ee9cc421c6f93e97fcba6d530b5c1882ce71f" @@ -1955,21 +2121,53 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.0.3": version "3.0.7" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.13" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -1978,6 +2176,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" @@ -2518,6 +2724,56 @@ multiformats "^9.5.4" murmurhash3js-revisited "^3.0.0" +"@next/env@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" + integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== + +"@next/swc-darwin-arm64@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" + integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== + +"@next/swc-darwin-x64@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" + integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== + +"@next/swc-linux-arm64-gnu@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" + integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== + +"@next/swc-linux-arm64-musl@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" + integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== + +"@next/swc-linux-x64-gnu@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581" + integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== + +"@next/swc-linux-x64-musl@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf" + integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== + +"@next/swc-win32-arm64-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" + integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== + +"@next/swc-win32-ia32-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" + integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== + +"@next/swc-win32-x64-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" + integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== + "@noble/ed25519@^1.6.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.0.tgz#583ac38340a479314b9e348d4572101ed9492f9d" @@ -2554,6 +2810,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@one-ini/wasm@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323" + integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== + "@opentelemetry/api-logs@0.39.1": version "0.39.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.39.1.tgz#3ea1e9dda11c35f993cb60dc5e52780b8175e702" @@ -3708,6 +3969,441 @@ ts-dedent "^2.2.0" type-fest "^2.5.2" +"@radix-ui/colors@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-1.0.1.tgz#e9703d6e1b6f3ace1855e5d784353327a548042c" + integrity sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg== + +"@radix-ui/primitive@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" + integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-arrow@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" + integrity sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-collapsible@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz#df0e22e7a025439f13f62d4e4a9e92c4a0df5b81" + integrity sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-collection@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.3.tgz#9595a66e09026187524a36c6e7e9c7d286469159" + integrity sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-compose-refs@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" + integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" + integrity sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-direction@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" + integrity sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dismissable-layer@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz#883a48f5f938fa679427aa17fcba70c5494c6978" + integrity sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-escape-keydown" "1.0.3" + +"@radix-ui/react-focus-guards@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" + integrity sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-scope@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz#9c2e8d4ed1189a1d419ee61edd5c1828726472f9" + integrity sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-id@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" + integrity sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-popover@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.6.tgz#19bb81e7450482c625b8cd05bf4dcd1d2cd91a8b" + integrity sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popper@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" + integrity sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-rect" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-portal@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" + integrity sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-presence@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" + integrity sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-primitive@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" + integrity sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-roving-focus@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974" + integrity sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-slot@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" + integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + +"@radix-ui/react-toggle-group@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz#f5b5c8c477831b013bec3580c55e20a68179d6ec" + integrity sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-toggle" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-toggle@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz#aecb2945630d1dc5c512997556c57aba894e539e" + integrity sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-tooltip@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz#87a7786cd9f2b4de957ac645afae1575339c58b0" + integrity sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + +"@radix-ui/react-use-callback-ref@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" + integrity sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-controllable-state@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz#ecd2ced34e6330caf89a82854aa2f77e07440286" + integrity sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-escape-keydown@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" + integrity sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-layout-effect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" + integrity sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" + integrity sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-use-size@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" + integrity sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-visually-hidden@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" + integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" + integrity sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@react-email/body@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/body/-/body-0.0.7.tgz#f2ac3cef62c6ef5805f77e3cc3f907af3ff1e718" + integrity sha512-vjJ5P1MUNWV0KNivaEWA6MGj/I3c764qQJMsKjCHlW6mkFJ4SXbm2OlQFtKAb++Bj8LDqBlnE6oW77bWcMc0NA== + +"@react-email/button@0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@react-email/button/-/button-0.0.14.tgz#1508a38655697db7eddd678432255c5e99eb9b61" + integrity sha512-SMk40moGcAvkHIALX4XercQlK0PNeeEIam6OXHw68ea9WtzzqVwiK4pzLY0iiMI9B4xWHcaS2lCPf3cKbQBf1Q== + +"@react-email/code-block@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@react-email/code-block/-/code-block-0.0.3.tgz#91b0c41729cdebade392c130382bf21f40898f30" + integrity sha512-nxhl7WjjM2cOYtl0boBZfSObTrUCz2LbarcMyHkTVAsA9rbjbtWAQF7jmlefXJusk3Uol5l2c8hTh2lHLlHTRQ== + dependencies: + prismjs "1.29.0" + +"@react-email/code-inline@0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@react-email/code-inline/-/code-inline-0.0.1.tgz#b6d826630757ce2b4bcf66595daa4b29e72b3384" + integrity sha512-SeZKTB9Q4+TUafzeUm/8tGK3dFgywUHb1od/BrAiJCo/im65aT+oJfggJLjK2jCdSsus8odcK2kReeM3/FCNTQ== + +"@react-email/column@0.0.9": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@react-email/column/-/column-0.0.9.tgz#3107f50216c0cfed0a42b0386e3ccfdac0ec12e6" + integrity sha512-1ekqNBgmbS6m97/sUFOnVvQtLYljUWamw8Y44VId95v6SjiJ4ca+hMcdOteHWBH67xkRofEOWTvqDRea5SBV8w== + +"@react-email/components@0.0.15": + version "0.0.15" + resolved "https://registry.yarnpkg.com/@react-email/components/-/components-0.0.15.tgz#40157e541b057d96111b92adf505dbd636aa511e" + integrity sha512-jXfKiuyi94JBYfPVptEUwF57nRCvhEZIfyl2LqbL53fKsMrGlcjlN921iNnx1z41GAJOqZ8LPogeix3Iid23zw== + dependencies: + "@react-email/body" "0.0.7" + "@react-email/button" "0.0.14" + "@react-email/code-block" "0.0.3" + "@react-email/code-inline" "0.0.1" + "@react-email/column" "0.0.9" + "@react-email/container" "0.0.11" + "@react-email/font" "0.0.5" + "@react-email/head" "0.0.7" + "@react-email/heading" "0.0.11" + "@react-email/hr" "0.0.7" + "@react-email/html" "0.0.7" + "@react-email/img" "0.0.7" + "@react-email/link" "0.0.7" + "@react-email/markdown" "0.0.8" + "@react-email/preview" "0.0.8" + "@react-email/render" "0.0.12" + "@react-email/row" "0.0.7" + "@react-email/section" "0.0.11" + "@react-email/tailwind" "0.0.14" + "@react-email/text" "0.0.7" + +"@react-email/container@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@react-email/container/-/container-0.0.11.tgz#821d1546aaeb59765095d90de82ef5c8b92d9d6f" + integrity sha512-jzl/EHs0ClXIRFamfH+NR/cqv4GsJJscqRhdYtnWYuRAsWpKBM1muycrrPqIVhWvWi6sFHInWTt07jX+bDc3SQ== + +"@react-email/font@0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@react-email/font/-/font-0.0.5.tgz#8f991776bf2a56cc4ba23d1240ef418ac210768a" + integrity sha512-if/qKYmH3rJ2egQJoKbV8SfKCPavu+ikUq/naT/UkCr8Q0lkk309tRA0x7fXG/WeIrmcipjMzFRGTm2TxTecDw== + +"@react-email/head@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/head/-/head-0.0.7.tgz#94c9ef200467899503c903e13d0da94b6e10a8dc" + integrity sha512-IcXL4jc0H1qzAXJCD9ajcRFBQdbUHkjKJyiUeogpaYSVZSq6cVDWQuGaI23TA9k+pI2TFeQimogUFb3Kgeeudw== + +"@react-email/heading@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@react-email/heading/-/heading-0.0.11.tgz#1a9ae35fd5644948594474f1a1668ad9d3f68036" + integrity sha512-EF5ZtRCxhHPw3m+8iibKKg0RAvAeHj1AP68sjU7s6+J+kvRgllr/E972Wi5Y8UvcIGossCvpX1WrSMDzeB4puA== + dependencies: + "@radix-ui/react-slot" "1.0.2" + +"@react-email/hr@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/hr/-/hr-0.0.7.tgz#ba32b8f06c969fc1ac360987e5fba0dbc2af1f45" + integrity sha512-8suK0M/deXHt0DBSeKhSC4bnCBCBm37xk6KJh9M0/FIKlvdltQBem52YUiuqVl1XLB87Y6v6tvspn3SZ9fuxEA== + +"@react-email/html@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/html/-/html-0.0.7.tgz#de9b758924d37f09801623782715359fea1d9db1" + integrity sha512-oy7OoRtoOKApVI/5Lz1OZptMKmMYJu9Xn6+lOmdBQchAuSdQtWJqxhrSj/iI/mm8HZWo6MZEQ6SFpfOuf8/P6Q== + +"@react-email/img@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/img/-/img-0.0.7.tgz#ad6bc3c22546c917add035faa3ebdecb2a6568c8" + integrity sha512-up9tM2/dJ24u/CFjcvioKbyGuPw1yeJg605QA7VkrygEhd0CoQEjjgumfugpJ+VJgIt4ZjT9xMVCK5QWTIWoaA== + +"@react-email/link@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/link/-/link-0.0.7.tgz#7670b5be4430f173a467423a5c79c2d0e261b70b" + integrity sha512-hXPChT3ZMyKnUSA60BLEMD2maEgyB2A37yg5bASbLMrXmsExHi6/IS1h2XiUPLDK4KqH5KFaFxi2cdNo1JOKwA== + +"@react-email/markdown@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@react-email/markdown/-/markdown-0.0.8.tgz#4dc912c6213555dcf995ae135abe3975a7e59c31" + integrity sha512-x/2iTWskE0XoM13Rx80ckwbWaWdS6koYvxW6PHkOJ/k88NPnDIm+TaYvvg2DYSFJAUI0gK/LmIwenbebgNDS+w== + dependencies: + md-to-react-email "4.1.0" + +"@react-email/preview@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@react-email/preview/-/preview-0.0.8.tgz#f09ca0525e49494450255abbd3a025df310a7bd3" + integrity sha512-Jm0KUYBZQd2w0s2QRMQy0zfHdo3Ns+9bYSE1OybjknlvhANirjuZw9E5KfWgdzO7PyrRtB1OBOQD8//Obc4uIQ== + +"@react-email/render@0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@react-email/render/-/render-0.0.12.tgz#66c3217ad2018545da2ba0537d8cfd32316e3da4" + integrity sha512-S8WRv/PqECEi6x0QJBj0asnAb5GFtJaHlnByxLETLkgJjc76cxMYDH4r9wdbuJ4sjkcbpwP3LPnVzwS+aIjT7g== + dependencies: + html-to-text "9.0.5" + js-beautify "^1.14.11" + react "18.2.0" + react-dom "18.2.0" + +"@react-email/row@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/row/-/row-0.0.7.tgz#a5d2653d7f3c443654e477b42641de62362304c3" + integrity sha512-h7pwrLVGk5CIx7Ai/oPxBgCCAGY7BEpCUQ7FCzi4+eThcs5IdjSwDPefLEkwaFS8KZc56UNwTAH92kNq5B7blg== + +"@react-email/section@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@react-email/section/-/section-0.0.11.tgz#a20b8f8176eeed8cc455aed65e3a49fceb9a6f2f" + integrity sha512-3bZ/DuvX1julATI7oqYza6pOtWZgLJDBaa62LFFEvYjisyN+k6lrP2KOucPsDKu2DOkUzlQgK0FOm6VQJX+C0w== + +"@react-email/tailwind@0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@react-email/tailwind/-/tailwind-0.0.14.tgz#e4cccbf898c388970b6affe37e44a70be3d06f5e" + integrity sha512-SRRcm08zxrAR5XozaW0X+GAJlTJITakZe0UXBiFZDlSDBLwFMxjaGuQwccqNF0LxDnxmduxYB71mzEAqecgTZg== + dependencies: + react "18.2.0" + +"@react-email/text@0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@react-email/text/-/text-0.0.7.tgz#5e0a93cb52c943ada389161220c6d31b55d4a28f" + integrity sha512-eHCx0mdllGcgK9X7wiLKjNZCBRfxRVNjD3NNYRmOc3Icbl8M9JHriJIfxBuGCmGg2UAORK5P3KmaLQ8b99/pbA== + "@redis/bloom@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" @@ -3742,6 +4438,14 @@ resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.4.tgz#af85eb080f6934580e4d3b58046026b6c2b18717" integrity sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng== +"@selderee/plugin-htmlparser2@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== + dependencies: + domhandler "^5.0.3" + selderee "^0.11.0" + "@sendgrid/client@^7.7.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@sendgrid/client/-/client-7.7.0.tgz#f8f67abd604205a0d0b1af091b61517ef465fdbf" @@ -4450,56 +5154,125 @@ slash "3.0.0" source-map "^0.7.3" +"@swc/core-darwin-arm64@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.101.tgz#9ffdc0e77c31b20877fa7405c82905e0c76738d0" + integrity sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ== + "@swc/core-darwin-arm64@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.66.tgz#b34a396479ca8fc82876d6dfb28c78a51010e6ce" integrity sha512-UijJsvuLy73vxeVYEy7urIHksXS+3BdvJ9s9AY+bRMSQW483NO7RLp8g4FdTyJbRaN0BH15SQnY0dcjQBkVuHw== +"@swc/core-darwin-x64@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.101.tgz#e50130e21e3cfd3029fd6cea43e8309b58ad9fa6" + integrity sha512-B085j8XOx73Fg15KsHvzYWG262bRweGr3JooO1aW5ec5pYbz5Ew9VS5JKYS03w2UBSxf2maWdbPz2UFAxg0whw== + "@swc/core-darwin-x64@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.66.tgz#b778e434d29652eae6da6ee7ed335605f7cfd866" integrity sha512-xGsHKvViQnwTNLF30Y/5OqWdnN6RsiyUI8awZXfz1sHcXCEaLe+v+WLQ+/E8sgw0YUkYVHzzfV/sAN2CezJK5Q== +"@swc/core-linux-arm-gnueabihf@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.101.tgz#8cd36328e794b3c42b6c8e578bb1f42e59ba0231" + integrity sha512-9xLKRb6zSzRGPqdz52Hy5GuB1lSjmLqa0lST6MTFads3apmx4Vgs8Y5NuGhx/h2I8QM4jXdLbpqQlifpzTlSSw== + "@swc/core-linux-arm-gnueabihf@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.66.tgz#a7ab556dc9fc770069fea292ff5551161df83a70" integrity sha512-gNbLcSIV2pq90BkMSpzvK4xPXOl8GEF3YR4NaqF0CYSzQsVXXTTqMuX/r26xNYudBKzH0345S1MpoRk2qricnA== +"@swc/core-linux-arm64-gnu@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.101.tgz#d15e3885eb13a1512ba62f00ce4f5bb19f710a0c" + integrity sha512-oE+r1lo7g/vs96Weh2R5l971dt+ZLuhaUX+n3BfDdPxNHfObXgKMjO7E+QS5RbGjv/AwiPCxQmbdCp/xN5ICJA== + "@swc/core-linux-arm64-gnu@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.66.tgz#00591f5fd0d9f1d1ed565329936451eb6d0d5433" integrity sha512-cJSQ0oplyWbJqy4rzVcnBYLAi6z1QT3QCcR7iAey0aAmCvfRBZJfXlyjggMjn4iosuadkauwCZR1xYNhBDRn7w== +"@swc/core-linux-arm64-musl@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.101.tgz#851d4cc1079b091fee36f5f64335232210749d7a" + integrity sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g== + "@swc/core-linux-arm64-musl@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.66.tgz#dd8e5e7b1154b5a42a32d57914e0de2cef6686ff" integrity sha512-GDQZpcB9aGxG9PTA2shdIkoMZlGK5omJ8NR49uoBTtLBVYiGeXAwV0U1Uaw8kXEZj9i7wZDkvjzjSaNH3evRsg== +"@swc/core-linux-x64-gnu@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.101.tgz#3a2a7c584db2e05a798e28361440424914563fa3" + integrity sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg== + "@swc/core-linux-x64-gnu@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.66.tgz#35de4b88e3f256e7923503a8031569c733859b68" integrity sha512-lg8E4O/Pd9KfK0lajdinVMuGME8dSv7V9arhEpmlfGE2eXSDCWqDn5Htk5QVBstt9lt1lsRhWHJ/YYc2eQY30Q== +"@swc/core-linux-x64-musl@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.101.tgz#45d1d53945994f08e93703b8de24ccac88538d0c" + integrity sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw== + "@swc/core-linux-x64-musl@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.66.tgz#623de62c638a31cda5d44014b981290e3f79f6de" integrity sha512-lo8ZcAO/zL2pZWH+LZIyge8u2MklaeuT6+FpVVpBFktMVdYXbaVtzpvWbgRFBZHvL3SRDF+u8jxjtkXhvGUpTw== +"@swc/core-win32-arm64-msvc@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.101.tgz#b2610b8354e5fbca7cc5be3f728e61b046227fa8" + integrity sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ== + "@swc/core-win32-arm64-msvc@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.66.tgz#49a432f43a314666e681a98801d7b2d303e5ef75" integrity sha512-cQoVwBuJY5WkHbfpCOlndNwYr1ZThatRjQQvKy540NUIeAEk9Fa6ozlDBtU75UdaWKtUG6YQ/bWz+KTemheVxw== +"@swc/core-win32-ia32-msvc@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.101.tgz#c919175bb4cd5e9fcfa56fbd3708167c1d445c68" + integrity sha512-onO5KvICRVlu2xmr4//V2je9O2XgS1SGKpbX206KmmjcJhXN5EYLSxW9qgg+kgV5mip+sKTHTAu7IkzkAtElYA== + "@swc/core-win32-ia32-msvc@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.66.tgz#80c8af627b46de67fbac05908025e764194669ad" integrity sha512-y/FrAIINK4UBeUQQknGlWXEyjo+MBvjF7WkUf2KP7sNr9EHHy8+dXohAGd5Anz0eJrqOM1ZXR/GEjxRp7bGQ1Q== +"@swc/core-win32-x64-msvc@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.101.tgz#17743fe425caffc596fde5965c9c4cf9a48aa26a" + integrity sha512-T3GeJtNQV00YmiVw/88/nxJ/H43CJvFnpvBHCVn17xbahiVUOPOduh3rc9LgAkKiNt/aV8vU3OJR+6PhfMR7UQ== + "@swc/core-win32-x64-msvc@1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.66.tgz#7984da6bf1f1a5410c2e6514dc2814abb2e6c91a" integrity sha512-yI64ACzS14qFLrfyO12qW+f/UROTotzDeEbuyJAaPD2IZexoT1cICznI3sBmIfrSt33mVuW8eF5m3AG/NUImzw== +"@swc/core@1.3.101": + version "1.3.101" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.101.tgz#4e8f1583094a73c410e48a0bebdeccdc6c66d4a5" + integrity sha512-w5aQ9qYsd/IYmXADAnkXPGDMTqkQalIi+kfFf/MHRKTpaOL7DHjMXwPp/n8hJ0qNjRvchzmPtOqtPBiER50d8A== + dependencies: + "@swc/counter" "^0.1.1" + "@swc/types" "^0.1.5" + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.101" + "@swc/core-darwin-x64" "1.3.101" + "@swc/core-linux-arm-gnueabihf" "1.3.101" + "@swc/core-linux-arm64-gnu" "1.3.101" + "@swc/core-linux-arm64-musl" "1.3.101" + "@swc/core-linux-x64-gnu" "1.3.101" + "@swc/core-linux-x64-musl" "1.3.101" + "@swc/core-win32-arm64-msvc" "1.3.101" + "@swc/core-win32-ia32-msvc" "1.3.101" + "@swc/core-win32-x64-msvc" "1.3.101" + "@swc/core@^1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.66.tgz#d07e4c9cd49205881171ee1ffd04f824ecea2f25" @@ -4516,6 +5289,18 @@ "@swc/core-win32-ia32-msvc" "1.3.66" "@swc/core-win32-x64-msvc" "1.3.66" +"@swc/counter@^0.1.1", "@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== + dependencies: + tslib "^2.4.0" + "@swc/register@^0.1.10": version "0.1.10" resolved "https://registry.yarnpkg.com/@swc/register/-/register-0.1.10.tgz#74a20b7559669e03479b05e9e5c6d1524d4d92a2" @@ -4525,6 +5310,13 @@ pirates "^4.0.1" source-map-support "^0.5.13" +"@swc/types@^0.1.5": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.6.tgz#2f13f748995b247d146de2784d3eb7195410faba" + integrity sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/wasm@^1.3.66": version "1.3.66" resolved "https://registry.yarnpkg.com/@swc/wasm/-/wasm-1.3.66.tgz#65caba266539de18570c680a6e3b1b87a3455348" @@ -4692,6 +5484,27 @@ dependencies: "@types/ms" "*" +"@types/eslint-scope@^3.7.3": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.56.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.6.tgz#d5dc16cac025d313ee101108ba5714ea10eb3ed0" + integrity sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/express-serve-static-core@^4.17.18": version "4.17.29" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" @@ -4794,7 +5607,7 @@ dependencies: "@types/node" "*" -"@types/json-schema@^7.0.12": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -5019,6 +5832,16 @@ pg-protocol "*" pg-types "^2.2.0" +"@types/prismjs@^1.26.0": + version "1.26.3" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.3.tgz#47fe8e784c2dee24fe636cab82e090d3da9b7dec" + integrity sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw== + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -5029,6 +5852,22 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/react-dom@^18.2.0": + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.0": + version "18.2.67" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.67.tgz#96b7af0b5e79c756f4bdd981de2ca28472c858e5" + integrity sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -5046,6 +5885,11 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + "@types/semver@^7.5.0": version "7.5.6" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" @@ -5104,6 +5948,15 @@ resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.3.tgz#3193c0a3c03a7d1189016c62b4fba4b149ef5e33" integrity sha512-DNviAE5OUcZ5s+XEQHRhERLg8fOp8gSgvyJ4aaFASx5wwaObm+PBwTIMXiOFm1QrSee5oYwEAYb7LMzX2O88gA== +"@types/webpack@5.28.5": + version "5.28.5" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.5.tgz#0e9d9a15efa09bbda2cef41356ca4ac2031ea9a2" + integrity sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw== + dependencies: + "@types/node" "*" + tapable "^2.2.0" + webpack "^5" + "@types/ws@^8.5.10": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -5208,6 +6061,137 @@ resolved "https://registry.yarnpkg.com/@vascosantos/moving-average/-/moving-average-1.1.0.tgz#8d5793b09b2d6021ba5e620c6a0f876c20db7eaa" integrity sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w== +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -5221,6 +6205,11 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -5263,6 +6252,11 @@ accepts@~1.3.4, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -5283,6 +6277,11 @@ acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.7.1, acorn@^8.8.2: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" @@ -5310,7 +6309,12 @@ aggregate-error@^3.0.0, aggregate-error@^3.1.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5382,6 +6386,11 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -5401,6 +6410,11 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + any-signal@^2.1.0, any-signal@^2.1.1, any-signal@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" @@ -5498,7 +6512,7 @@ are-we-there-yet@^2.0.0: delegates "^1.0.0" readable-stream "^3.6.0" -arg@5.0.2: +arg@5.0.2, arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== @@ -5520,6 +6534,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-hidden@^1.1.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954" + integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + dependencies: + tslib "^2.0.0" + array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -5705,6 +6726,18 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== +autoprefixer@10.4.14: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -5950,6 +6983,11 @@ blockstore-datastore-adapter@^2.0.2: it-pushable "^1.4.2" multiformats "^9.1.0" +bluebird@^3.4.6: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.0.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -6064,6 +7102,16 @@ browserslist@^4.20.2: node-releases "^2.0.5" picocolors "^1.0.0" +browserslist@^4.21.10, browserslist@^4.21.5: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + bs58@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" @@ -6144,7 +7192,7 @@ bundle-name@^3.0.0: dependencies: run-applescript "^5.0.0" -busboy@^1.0.0, busboy@^1.6.0: +busboy@1.6.0, busboy@^1.0.0, busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== @@ -6229,6 +7277,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -6258,6 +7311,11 @@ caniuse-lite@^1.0.30001349: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz#95c5efdb64148bb4870771749b9a619304755ce5" integrity sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg== +caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587: + version "1.0.30001599" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" + integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== + canonicalize@^1.0.1: version "1.0.8" resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" @@ -6330,6 +7388,17 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -6390,6 +7459,11 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + ci-info@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" @@ -6429,6 +7503,11 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-spinner@^0.2.5: + version "0.2.10" + resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47" + integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q== + cli-spinners@^2.5.0: version "2.9.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" @@ -6447,6 +7526,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + cliui@^3.0.3: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -6502,6 +7586,16 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clsx@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + cluster-key-slot@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" @@ -6542,7 +7636,6 @@ color-support@^1.1.2: integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colorette@^1.4.0: - name colors version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -6569,11 +7662,26 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.15.0: +commander@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.15.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commander@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -6662,6 +7770,14 @@ concurrently@^8.2.0: tree-kill "^1.2.2" yargs "^17.7.2" +config-chain@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -6854,6 +7970,16 @@ crypto@^1.0.1: resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + cuid@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/cuid/-/cuid-2.1.8.tgz#cbb88f954171e0d5747606c0139fb65c5101eac0" @@ -7020,6 +8146,11 @@ dateformat@^4.6.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== +debounce@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-2.0.0.tgz#b2f914518a1481466f4edaee0b063e4d473ad549" + integrity sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -7027,7 +8158,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -7088,6 +8219,11 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + default-browser-id@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" @@ -7244,6 +8380,11 @@ detect-libc@^2.0.0: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -7257,6 +8398,11 @@ dezalgo@^1.0.4: asap "^2.0.0" wrappy "1" +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -7328,10 +8474,40 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" @@ -7392,6 +8568,16 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: dependencies: safe-buffer "^5.0.1" +editorconfig@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3" + integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== + dependencies: + "@one-ini/wasm" "0.1.1" + commander "^10.0.0" + minimatch "9.0.1" + semver "^7.5.3" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -7409,6 +8595,11 @@ electron-to-chromium@^1.4.147: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.158.tgz#abbdaaf64676bfa4bc0307522125db34424a0ada" integrity sha512-gppO3/+Y6sP432HtvwvuU8S+YYYLH4PmAYvQwqUtt9HDOmEsBwQfLnK9T8+1NIKwAS1BEygIjTaATC4H5EzvxQ== +electron-to-chromium@^1.4.668: + version "1.4.710" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.710.tgz#d0ec4ea8a97df4c5eaeb8c69d45bf81f248b3855" + integrity sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA== + elliptic@6.5.4, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -7472,11 +8663,27 @@ engine.io-client@~6.2.1: ws "~8.2.3" xmlhttprequest-ssl "~2.0.0" +engine.io-client@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" + integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + engine.io-parser@~5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + engine.io@~6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" @@ -7493,6 +8700,30 @@ engine.io@~6.2.0: engine.io-parser "~5.0.3" ws "~8.2.3" +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + +enhanced-resolve@^5.15.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -7500,6 +8731,11 @@ enquirer@^2.3.5, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-paths@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -7623,6 +8859,11 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-module-lexer@^1.2.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.4.2.tgz#ba1a62255ff9b41023aaf9bd08c016a5f1a3fef3" + integrity sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw== + es-set-tostringtag@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" @@ -7658,6 +8899,35 @@ es6-promisify@^6.1.1: resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== +esbuild@0.19.11: + version "0.19.11" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" + integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.11" + "@esbuild/android-arm" "0.19.11" + "@esbuild/android-arm64" "0.19.11" + "@esbuild/android-x64" "0.19.11" + "@esbuild/darwin-arm64" "0.19.11" + "@esbuild/darwin-x64" "0.19.11" + "@esbuild/freebsd-arm64" "0.19.11" + "@esbuild/freebsd-x64" "0.19.11" + "@esbuild/linux-arm" "0.19.11" + "@esbuild/linux-arm64" "0.19.11" + "@esbuild/linux-ia32" "0.19.11" + "@esbuild/linux-loong64" "0.19.11" + "@esbuild/linux-mips64el" "0.19.11" + "@esbuild/linux-ppc64" "0.19.11" + "@esbuild/linux-riscv64" "0.19.11" + "@esbuild/linux-s390x" "0.19.11" + "@esbuild/linux-x64" "0.19.11" + "@esbuild/netbsd-x64" "0.19.11" + "@esbuild/openbsd-x64" "0.19.11" + "@esbuild/sunos-x64" "0.19.11" + "@esbuild/win32-arm64" "0.19.11" + "@esbuild/win32-ia32" "0.19.11" + "@esbuild/win32-x64" "0.19.11" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -7673,7 +8943,7 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -7683,11 +8953,23 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== +eslint-config-prettier@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f" + integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== + eslint-config-prettier@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== +eslint-config-turbo@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/eslint-config-turbo/-/eslint-config-turbo-1.10.12.tgz#5868252d6833dd2b5cab4414751ed31ebe2177c3" + integrity sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA== + dependencies: + eslint-plugin-turbo "1.10.12" + eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" @@ -7740,7 +9022,14 @@ eslint-plugin-prettier@^5.0.1: prettier-linter-helpers "^1.0.0" synckit "^0.8.5" -eslint-scope@^5.1.1: +eslint-plugin-turbo@1.10.12: + version "1.10.12" + resolved "https://registry.yarnpkg.com/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.12.tgz#3f95884faf35b56e0855d939585fa6cd457bb128" + integrity sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw== + dependencies: + dotenv "16.0.3" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -7925,7 +9214,7 @@ events@1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== -events@3.3.0, events@^3.3.0: +events@3.3.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -8418,6 +9707,20 @@ fp-ts@2.13.1: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.13.1.tgz#1bf2b24136cca154846af16752dc29e8fa506f2a" integrity sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ== +fraction.js@^4.2.0: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +framer-motion@10.17.4: + version "10.17.4" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-10.17.4.tgz#e5a739791239ffbed52e0aea39c4ff93ed61a233" + integrity sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ== + dependencies: + tslib "^2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + freeport-promise@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/freeport-promise/-/freeport-promise-2.0.0.tgz#11e4f81e24d680b88a20c15b2103551f4b6663d8" @@ -8659,6 +9962,11 @@ get-iterator@^2.0.0: resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-2.0.0.tgz#c9ac9f8002e5d8d6b4dc9dae07c30945022a58c1" integrity sha512-BDJawD5PU2gZv6Vlp8O28H4GnZcsr3h9gZUvnAP5xXP3WOy/QAoOsyMepSkw21jur+4t5Vppde72ChjhTIzxzg== +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -8724,6 +10032,29 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@10.3.4: + version "10.3.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" + integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" @@ -8759,7 +10090,18 @@ glob@^10.2.5: minipass "^5.0.0 || ^6.0.2" path-scurry "^1.7.0" -glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^10.3.10, glob@^10.3.3: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -8913,6 +10255,11 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.2.11, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -8964,6 +10311,13 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -9136,6 +10490,27 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-to-text@9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== + dependencies: + "@selderee/plugin-htmlparser2" "^0.11.0" + deepmerge "^4.3.1" + dom-serializer "^2.0.0" + htmlparser2 "^8.0.2" + selderee "^0.11.0" + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-cache-semantics@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -9436,6 +10811,18 @@ internal-slot@^1.0.5: hasown "^2.0.0" side-channel "^1.0.4" +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -11081,6 +12468,15 @@ jackspeak@^2.0.3: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jaeger-client@^3.15.0: version "3.19.0" resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.19.0.tgz#9b5bd818ebd24e818616ee0f5cffe1722a53ae6e" @@ -11092,6 +12488,20 @@ jaeger-client@^3.15.0: uuid "^8.3.2" xorshift "^1.1.1" +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + jmespath@0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" @@ -11113,12 +12523,28 @@ joycon@^3.1.1: resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== +js-beautify@^1.14.11: + version "1.15.1" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.15.1.tgz#4695afb508c324e1084ee0b952a102023fc65b64" + integrity sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA== + dependencies: + config-chain "^1.1.13" + editorconfig "^1.0.4" + glob "^10.3.3" + js-cookie "^3.0.5" + nopt "^7.2.0" + +js-cookie@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" + integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== + js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -11165,7 +12591,7 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -11420,6 +12846,11 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +leac@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== + level-codec@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-10.0.0.tgz#f9e892770532c6cdcc83529546730791b0c62c12" @@ -11882,6 +13313,16 @@ libp2p@^0.37.1: wherearewe "^1.0.0" xsalsa20 "^1.1.0" +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -11921,6 +13362,11 @@ listr2@^3.12.2: through "^2.3.8" wrap-ansi "^7.0.0" +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -12088,6 +13534,13 @@ longest@^2.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== +loose-envify@^1.0.0, loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + loupe@^2.3.1: version "2.3.4" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" @@ -12120,6 +13573,11 @@ lru-cache@^9.1.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" @@ -12166,6 +13624,18 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +marked@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/marked/-/marked-7.0.4.tgz#e2558ee2d535b9df6a27c6e282dc603a18388a6d" + integrity sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ== + +md-to-react-email@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/md-to-react-email/-/md-to-react-email-4.1.0.tgz#173b6ddac14ceac8f1674272d881f3f4c59d8ea3" + integrity sha512-aQvj4dCuy0wmBVvSB377qTErlpjN5Pl61+5v+B8Z76KoxOgKhbzvK3qnO94eOsuGSWwI+9n4zb3xD3/MypxM4w== + dependencies: + marked "7.0.4" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -12178,6 +13648,23 @@ menoetius@0.0.2: dependencies: prom-client "^11.5.3" +meow@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" + meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -12240,7 +13727,7 @@ mime-db@1.52.0, mime-db@1.x.x, mime-db@^1.28.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@2.1.35, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -12304,6 +13791,13 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@9.0.1, minimatch@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" + integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -12325,13 +13819,6 @@ minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" - integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== - dependencies: - brace-expansion "^2.0.1" - minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -12375,6 +13862,11 @@ minipass@^3.3.5: resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -12636,6 +14128,15 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nan@^2.13.2, nan@^2.14.2: version "2.16.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" @@ -12651,6 +14152,11 @@ nanoid@^3.0.2, nanoid@^3.1.20, nanoid@^3.1.23: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + nanoid@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.0.tgz#6e144dee117609232c3f415c34b0e550e64999a5" @@ -12698,6 +14204,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + netmask@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" @@ -12708,6 +14219,29 @@ new-github-issue-url@0.2.1: resolved "https://registry.yarnpkg.com/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz#e17be1f665a92de465926603e44b9f8685630c1d" integrity sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA== +next@14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69" + integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== + dependencies: + "@next/env" "14.1.0" + "@swc/helpers" "0.5.2" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + graceful-fs "^4.2.11" + postcss "8.4.31" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "14.1.0" + "@next/swc-darwin-x64" "14.1.0" + "@next/swc-linux-arm64-gnu" "14.1.0" + "@next/swc-linux-arm64-musl" "14.1.0" + "@next/swc-linux-x64-gnu" "14.1.0" + "@next/swc-linux-x64-musl" "14.1.0" + "@next/swc-win32-arm64-msvc" "14.1.0" + "@next/swc-win32-ia32-msvc" "14.1.0" + "@next/swc-win32-x64-msvc" "14.1.0" + nise@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" @@ -12799,6 +14333,11 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + node-releases@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" @@ -12835,6 +14374,13 @@ nopt@^5.0.0: dependencies: abbrev "1" +nopt@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" + integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== + dependencies: + abbrev "^2.0.0" + nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -12862,11 +14408,16 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-path@^3.0.0, normalize-path@~3.0.0: +normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" @@ -12946,11 +14497,16 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" @@ -13403,6 +14959,14 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== +parseley@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== + dependencies: + leac "^0.6.0" + peberminta "^0.9.0" + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -13438,6 +15002,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry@^1.7.0: version "1.9.2" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" @@ -13468,6 +15040,11 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== +peberminta@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== + peek-readable@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" @@ -13534,7 +15111,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.2.0: +pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -13618,6 +15195,77 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@^6.0.11: + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@8.4.35: + version "8.4.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" + integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.4.23: + version "8.4.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.36.tgz#dba513c3c3733c44e0288a712894f8910bbaabc6" + integrity sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.1.0" + postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" @@ -13669,6 +15317,14 @@ pretty-quick@^3.1.1: mri "^1.1.5" multimatch "^4.0.0" +prism-react-renderer@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.1.0.tgz#a2f418451647412ea73d18cfe363fea20e419f9d" + integrity sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^1.2.1" + prisma-dbml-generator@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/prisma-dbml-generator/-/prisma-dbml-generator-0.10.0.tgz#3a48e83fbda49306fb4ca919e89141b3063cd0d6" @@ -13684,6 +15340,11 @@ prisma@4.2.1: dependencies: "@prisma/engines" "4.2.1" +prismjs@1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + private-ip@^2.1.0, private-ip@^2.1.1: version "2.3.3" resolved "https://registry.yarnpkg.com/private-ip/-/private-ip-2.3.3.tgz#1e80ff8443e5ac78f555631aec3ea6ff027fa6aa" @@ -13785,6 +15446,11 @@ proper-lockfile@^4.0.0, proper-lockfile@^4.1.1: retry "^0.12.0" signal-exit "^3.0.2" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + protobufjs@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.1.1.tgz#0117befb4b0f5a49d028e93f2ca62c3c1f5e7c65" @@ -14047,6 +15713,62 @@ rdf-canonize@^3.4.0: dependencies: setimmediate "^1.0.5" +react-dom@18.2.0, react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-email@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-email/-/react-email-2.1.0.tgz#872a96b0f69568b9daa4bd077c220730fa647c20" + integrity sha512-fTt85ca1phsBu57iy32wn4LTR37rOzDZoY2AOWVq3JQYVwk6GlBdUuQWif2cudkwWINL9COf9kRMS4/QWtKtAQ== + dependencies: + "@radix-ui/colors" "1.0.1" + "@radix-ui/react-collapsible" "1.0.3" + "@radix-ui/react-popover" "1.0.6" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-toggle-group" "1.0.4" + "@radix-ui/react-tooltip" "1.0.6" + "@react-email/components" "0.0.15" + "@react-email/render" "0.0.12" + "@swc/core" "1.3.101" + "@types/react" "^18.2.0" + "@types/react-dom" "^18.2.0" + "@types/webpack" "5.28.5" + autoprefixer "10.4.14" + chalk "4.1.2" + chokidar "3.5.3" + clsx "2.1.0" + commander "11.1.0" + debounce "2.0.0" + esbuild "0.19.11" + eslint-config-prettier "9.0.0" + eslint-config-turbo "1.10.12" + framer-motion "10.17.4" + glob "10.3.4" + log-symbols "4.1.0" + mime-types "2.1.35" + next "14.1.0" + normalize-path "3.0.0" + ora "5.4.1" + postcss "8.4.35" + prism-react-renderer "2.1.0" + react "^18.2.0" + react-dom "^18.2.0" + shelljs "0.8.5" + socket.io "4.7.3" + socket.io-client "4.7.3" + sonner "1.3.1" + source-map-js "1.0.2" + stacktrace-parser "0.1.10" + tailwind-merge "2.2.0" + tailwindcss "3.4.0" + tree-cli "0.6.7" + typescript "5.1.6" + react-native-fetch-api@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-2.0.0.tgz#c4af188b4fce3f3eaf1f1ff4e61dae1a00d4ffa0" @@ -14054,6 +15776,48 @@ react-native-fetch-api@^2.0.0: dependencies: p-defer "^3.0.0" +react-remove-scroll-bar@^2.3.3: + version "2.3.6" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react@18.2.0, react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + read-pkg-up@7.0.1, read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -14167,6 +15931,13 @@ receptacle@^1.3.2: dependencies: ms "^2.1.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -14197,6 +15968,11 @@ regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -14344,7 +16120,7 @@ resolve@^1.0.0, resolve@^1.10.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.22.4: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -14537,11 +16313,27 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + schema-dts@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/schema-dts/-/schema-dts-1.1.2.tgz#82ccf71b5dcb80065a1cc5941888507a4ce1e44b" integrity sha512-MpNwH0dZJHinVxk9bT8XUdjKTxMYrA5bLtrrGmFA6PTLwlOKnhi67XoRd6/ty+Djt6ZC0slR57qFhZDNMI6DhQ== +schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + scrypt-js@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" @@ -14561,6 +16353,13 @@ secure-json-parse@^2.4.0: resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== +selderee@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== + dependencies: + parseley "^0.12.0" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -14621,6 +16420,13 @@ semver@^7.3.8: dependencies: lru-cache "^6.0.0" +semver@^7.5.3: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -14659,6 +16465,13 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + serve-static@1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" @@ -14759,6 +16572,15 @@ shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +shelljs@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shimmer@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" @@ -14866,6 +16688,24 @@ socket.io-adapter@~2.4.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== +socket.io-adapter@~2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006" + integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg== + dependencies: + debug "~4.3.4" + ws "~8.11.0" + +socket.io-client@4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.3.tgz#b49e006fc1ccaea65229a4b435c083b10439ecc4" + integrity sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + socket.io-client@^4.1.2: version "4.5.1" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.5.1.tgz#cab8da71976a300d3090414e28c2203a47884d84" @@ -14893,6 +16733,27 @@ socket.io-parser@~4.2.0: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.3.tgz#a0f1a4511eb23fe182ae3a018875a31501be3ffc" + integrity sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + socket.io@^4.1.2: version "4.5.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029" @@ -14912,6 +16773,11 @@ sonic-boom@^3.0.0, sonic-boom@^3.1.0: dependencies: atomic-sleep "^1.0.0" +sonner@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.3.1.tgz#64aa2971d1110b6fe349f961d148c933f38ee9fa" + integrity sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA== + sort-keys-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" @@ -14933,7 +16799,17 @@ sort-keys@^4.0.0, sort-keys@^4.2.0: dependencies: is-plain-obj "^2.0.0" -source-map-support@^0.5.12, source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.6: +source-map-js@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-js@^1.0.2, source-map-js@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.1.0.tgz#9e7d5cb46f0689fb6691b30f226937558d0fa94b" + integrity sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw== + +source-map-support@^0.5.12, source-map-support@^0.5.13, source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -15041,6 +16917,13 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stacktrace-parser@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -15102,8 +16985,16 @@ string-to-stream@^1.1.0: inherits "^2.0.1" readable-stream "^2.1.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15211,8 +17102,14 @@ stringify-object@3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15312,6 +17209,26 @@ strtok3@^7.0.0-alpha.9: "@tokenizer/token" "^0.3.0" peek-readable "^5.0.0" +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + super-regex@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/super-regex/-/super-regex-0.2.0.tgz#dc1e071e55cdcf56930eb6271f73653a655b2642" @@ -15345,13 +17262,18 @@ supertest@^6.3.3: methods "^1.1.2" superagent "^8.0.5" -supports-color@8.1.1, supports-color@^8.1.1: +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -15398,6 +17320,46 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" +tailwind-merge@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.0.tgz#b6bb1c63ef26283c9e6675ba237df83bbd554688" + integrity sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ== + dependencies: + "@babel/runtime" "^7.23.5" + +tailwindcss@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.0.tgz#045a9c474e6885ebd0436354e611a76af1c76839" + integrity sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.19.1" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + tar-stream@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -15484,6 +17446,27 @@ terminal-link@2.1.1: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + +terser@^5.26.0: + version "5.29.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.2.tgz#c17d573ce1da1b30f21a877bffd5655dd86fdb35" + integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -15503,6 +17486,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + thread-stream@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.3.0.tgz#4fc07fb39eff32ae7bad803cb7dd9598349fed33" @@ -15647,6 +17644,18 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tree-cli@0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/tree-cli/-/tree-cli-0.6.7.tgz#7a0c2e9cbe6958178848114024c6512f5996c872" + integrity sha512-jfnB5YKY6Glf6bsFmQ9W97TtkPVLnHsjOR6ZdRf4zhyFRQeLheasvzE5XBJI2Hxt7ZyMyIbXUV7E2YPZbixgtA== + dependencies: + bluebird "^3.4.6" + chalk "^1.1.3" + cli-spinner "^0.2.5" + lodash.includes "^4.3.0" + meow "^7.1.1" + object-assign "^4.1.0" + tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -15681,6 +17690,11 @@ ts-dedent@^2.2.0: resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + ts-mocha@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-9.0.2.tgz#c1ef0248874d04a0f26dd9bd8d88e617a8d82ab1" @@ -15834,7 +17848,7 @@ tslib@^2, tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^2.3.1, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -15870,6 +17884,11 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" @@ -15895,6 +17914,11 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -15964,6 +17988,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typescript@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + typescript@^4.4.3, typescript@^4.6.4: version "4.7.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" @@ -16080,6 +18109,14 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -16121,12 +18158,27 @@ ursa-optional@^0.10.1: bindings "^1.5.0" nan "^2.14.2" +use-callback-ref@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.1.tgz#9be64c3902cbd72b07fe55e56408ae3a26036fd0" + integrity sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -16222,6 +18274,14 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +watchpack@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -16239,6 +18299,41 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5: + version "5.90.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.90.3.tgz#37b8f74d3ded061ba789bb22b31e82eed75bd9ac" + integrity sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -16329,8 +18424,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16356,6 +18450,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -16405,6 +18508,11 @@ ws@^8.7.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.1.tgz#271ba33a45ca0cc477940f7f200cd7fba7ee1997" integrity sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ== +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + ws@~8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" @@ -16496,12 +18604,17 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.3.4: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^18.1.2: +yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== From 7cb565cca6d27c861fd2e7253b7697f25ffae62f Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 03:59:56 +0700 Subject: [PATCH 28/41] setup base template to use for emails --- .../src/templates/emails/BaseProvider.tsx | 3 +- .../src/templates/emails/MainLayout.tsx | 84 ++++++++++++++----- 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/desci-server/src/templates/emails/BaseProvider.tsx b/desci-server/src/templates/emails/BaseProvider.tsx index cbedb1859..747bb1c69 100644 --- a/desci-server/src/templates/emails/BaseProvider.tsx +++ b/desci-server/src/templates/emails/BaseProvider.tsx @@ -8,7 +8,8 @@ const BaseProvider = ({ children }: { children: JSX.Element }) => { theme: { extend: { colors: { - primary: '#77dde4', + primary: '#28aac4;', + 'primary-hover': '#77dde4', }, }, }, diff --git a/desci-server/src/templates/emails/MainLayout.tsx b/desci-server/src/templates/emails/MainLayout.tsx index 48277b207..63dd64f5e 100644 --- a/desci-server/src/templates/emails/MainLayout.tsx +++ b/desci-server/src/templates/emails/MainLayout.tsx @@ -13,6 +13,7 @@ import { Row, Section, Text, + Font, } from '@react-email/components'; import React from 'react'; @@ -25,29 +26,68 @@ const labsLogo = 'bafkreifvb7tleo5jaidjjf6lfjxb5bpjbs2nswp47bi7zh3hxbpc6fjyf4'; const MainLayout = ({ children }: { children: JSX.Element }) => { return ( - - - - {/* desci-background */} -
- Desci Labs -
- {children} + + + + + + + +
+ Desci Labs +
+
{children}
+ + If you didn't request this email, there's nothing to worry about, you can safely ignore it. + + + + + Desci Labs + + + + + Docs + +    |    + + Twitter + +    |    + + Youtube + + + + ©2024 Desci Nodes +
-
- + +
); }; From 5ec9e8cd179ee77eb402b8479b2d0dd24c5f6ee4 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 04:00:35 +0700 Subject: [PATCH 29/41] add email template for inviting contributions for registered and new users --- .../templates/emails/ContributorInvite.tsx | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 desci-server/src/templates/emails/ContributorInvite.tsx diff --git a/desci-server/src/templates/emails/ContributorInvite.tsx b/desci-server/src/templates/emails/ContributorInvite.tsx new file mode 100644 index 000000000..068eb8d81 --- /dev/null +++ b/desci-server/src/templates/emails/ContributorInvite.tsx @@ -0,0 +1,112 @@ +import { + Body, + Container, + Column, + Head, + Heading, + Html, + Preview, + Row, + Text, + Button, + Section, +} from '@react-email/components'; +import * as React from 'react'; + +import MainLayout from './MainLayout.js'; + +interface ContributorInviteEmailProps { + inviter: string; + nodeUuid: string; + contributorId: string; + privShareCode: string; + newUser?: boolean; +} + +const NEW_USER_TEXT = `Sign up on Desci Nodes to confirm your contribution to ensure you're credited for your work.`; +const EXISTING_USER_TEXT = `Confirm your contribution to ensure +you're credited for your work.`; + +export const ContributorInviteNew = ({ + inviter, + nodeUuid, + privShareCode, + contributorId, + newUser, +}: ContributorInviteEmailProps) => { + if (nodeUuid.endsWith('.') || nodeUuid.endsWith('=')) nodeUuid = nodeUuid.slice(0, -1); + const privShareUrl = `https://nodes.desci.com/node/${nodeUuid}?shareId=${privShareCode}`; + const contributorUrl = `https://nodes.desci.com/node/${nodeUuid}/contributors/${contributorId}?shareId=${privShareCode}`; + return ( + + + + Confirm your contribution + + + + You've been invited as a contributor! + + + {inviter} has added you as a contributor to their node.{' '} + {newUser ? NEW_USER_TEXT : EXISTING_USER_TEXT} + + +
+ + +
+
+ + +
+ ); +}; + +export default ContributorInviteNew; + +const main = { + backgroundColor: '#ffffff', + margin: '0 auto', + fontFamily: + "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", +}; + +const container = { + margin: '0 auto', + padding: '0px 20px', +}; + +const h1 = { + color: '#ffffff', + fontSize: '30px', + fontWeight: '700', + margin: '30px 0', + padding: '0', + lineHeight: '42px', +}; + +const heroText = { + fontSize: '20px', + lineHeight: '28px', + marginBottom: '30px', +}; From 2702deb6903e9972ced941be94f8e14242500663 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 04:00:53 +0700 Subject: [PATCH 30/41] add template for magic code email --- desci-server/src/services/Contributors.ts | 2 +- .../templates/emails/ContributorInviteNew.tsx | 128 ------------------ .../src/templates/emails/MagicCode.tsx | 62 +++++++++ 3 files changed, 63 insertions(+), 129 deletions(-) delete mode 100644 desci-server/src/templates/emails/ContributorInviteNew.tsx create mode 100644 desci-server/src/templates/emails/MagicCode.tsx diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index f05c9c405..6c4d744bf 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -1,12 +1,12 @@ import { error } from 'console'; import { Node, NodeContribution, User } from '@prisma/client'; +import ShortUniqueId from 'short-unique-id'; import { prisma } from '../client.js'; import { logger as parentLogger } from '../logger.js'; import { getIndexedResearchObjects } from '../theGraph.js'; import { hexToCid } from '../utils.js'; -import ShortUniqueId from 'short-unique-id'; type ContributorId = string; export type NodeContributorMap = Record; diff --git a/desci-server/src/templates/emails/ContributorInviteNew.tsx b/desci-server/src/templates/emails/ContributorInviteNew.tsx deleted file mode 100644 index e752ff279..000000000 --- a/desci-server/src/templates/emails/ContributorInviteNew.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import { - Body, - Container, - Column, - Head, - Heading, - Html, - Img, - Link, - Preview, - Row, - Section, - Text, -} from '@react-email/components'; -import * as React from 'react'; - -import MainLayout from './MainLayout.js'; - -interface ContributorInviteEmailProps { - inviter: string; - nodeUuid: string; - contributorId: string; - privShareCode: string; -} - -export const ContributorInviteNew = ({ - inviter, - nodeUuid, - privShareCode, - contributorId, -}: ContributorInviteEmailProps) => ( - - - - Confirm your contribution - - - You've been invited as a contributor! - - {inviter} has added you as a contributor to their node. Confirm your contribution to ensure - you're credited for your work. - - - - If you didn't request this email, there's nothing to worry about, you can safely ignore it. - - - - - -); - -export default ContributorInviteNew; - -const footerText = { - fontSize: '12px', - color: '#b7b7b7', - lineHeight: '15px', - textAlign: 'left' as const, - marginBottom: '50px', -}; - -const footerLink = { - color: '#b7b7b7', - textDecoration: 'underline', -}; - -const footerLogos = { - marginBottom: '32px', - paddingLeft: '8px', - paddingRight: '8px', - width: '100%', -}; - -const socialMediaIcon = { - display: 'inline', - marginLeft: '32px', -}; - -const main = { - backgroundColor: '#ffffff', - margin: '0 auto', - fontFamily: - "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", -}; - -const container = { - margin: '0 auto', - padding: '0px 20px', -}; - -const logoContainer = { - marginTop: '32px', -}; - -const h1 = { - color: '#1d1c1d', - fontSize: '36px', - fontWeight: '700', - margin: '30px 0', - padding: '0', - lineHeight: '42px', -}; - -const heroText = { - fontSize: '20px', - lineHeight: '28px', - marginBottom: '30px', -}; - -const codeBox = { - background: 'rgb(245, 244, 245)', - borderRadius: '4px', - marginBottom: '30px', - padding: '40px 10px', -}; - -const confirmationCodeText = { - fontSize: '30px', - textAlign: 'center' as const, - verticalAlign: 'middle', -}; - -const text = { - color: '#000', - fontSize: '14px', - lineHeight: '24px', -}; diff --git a/desci-server/src/templates/emails/MagicCode.tsx b/desci-server/src/templates/emails/MagicCode.tsx new file mode 100644 index 000000000..124f0fe42 --- /dev/null +++ b/desci-server/src/templates/emails/MagicCode.tsx @@ -0,0 +1,62 @@ +import { + Body, + Container, + Column, + Head, + Heading, + Html, + Preview, + Row, + Text, + Button, + Section, +} from '@react-email/components'; +import * as React from 'react'; + +import MainLayout from './MainLayout.js'; + +interface MagicCodeEmailProps { + magicCode: string; +} + +export const MagicCodeEmail = ({ magicCode }: MagicCodeEmailProps) => ( + + + + Confirm your contribution + + + + Your magic code is ready! + +
+ {magicCode} +
+
+ + +
+); + +export default MagicCodeEmail; + +const main = { + backgroundColor: '#ffffff', + margin: '0 auto', + fontFamily: + "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", +}; + +const container = { + margin: '0 auto', + padding: '0px 20px', +}; + +const h1 = { + color: '#ffffff', + fontSize: '30px', + fontWeight: '700', + margin: '30px 0', + padding: '0', + lineHeight: '42px', +}; From 69a40e73827c716b6a473b89ed7ff8e1cda5a191 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 04:09:33 +0700 Subject: [PATCH 31/41] replace existing code email with new one --- desci-server/src/services/auth.ts | 8 +++----- desci-server/src/templates/emails/MagicCode.tsx | 2 ++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/desci-server/src/services/auth.ts b/desci-server/src/services/auth.ts index 0a5b2a3ab..34d1334b2 100644 --- a/desci-server/src/services/auth.ts +++ b/desci-server/src/services/auth.ts @@ -6,6 +6,7 @@ import AWS from 'aws-sdk'; import { prisma as client } from '../client.js'; import { logger as parentLogger } from '../logger.js'; +import { MagicCodeEmailHtml } from '../templates/emails/MagicCode.js'; import createRandomCode from '../utils/createRandomCode.js'; import { hideEmail } from '../utils.js'; @@ -127,6 +128,7 @@ const sendMagicLinkEmail = async (email: string, ip?: string) => { const url = `${env.DAPP_URL}/web/login?e=${email}&c=${token}`; const goodIp = ip?.length > 0 && ip !== '::1' && ip !== '127.0.0.1' && ip !== 'localhost'; + const emailHtml = MagicCodeEmailHtml({ magicCode: token }); const msg = { to: email, // Change to your recipient from: 'no-reply@desci.com', // Change to your verified sender @@ -136,11 +138,7 @@ const sendMagicLinkEmail = async (email: string, ip?: string) => { ? `\n\n (sent from ip: ${ip} -- if you weren't logging in, please forward this email to info@desci.com)` : '' }`, - html: `Welcome to DeSci Nodes, to access your account use the following code

Login Now

Verification Code: ${token}${ - goodIp - ? `

sent from ip address: ${ip} if you weren't logging in, please forward this email to info@desci.com` - : '' - }`, + html: emailHtml, }; const params = { diff --git a/desci-server/src/templates/emails/MagicCode.tsx b/desci-server/src/templates/emails/MagicCode.tsx index 124f0fe42..ab6b1be89 100644 --- a/desci-server/src/templates/emails/MagicCode.tsx +++ b/desci-server/src/templates/emails/MagicCode.tsx @@ -10,6 +10,7 @@ import { Text, Button, Section, + render, } from '@react-email/components'; import * as React from 'react'; @@ -39,6 +40,7 @@ export const MagicCodeEmail = ({ magicCode }: MagicCodeEmailProps) => ( ); export default MagicCodeEmail; +export const MagicCodeEmailHtml = ({ magicCode }: MagicCodeEmailProps) => render(MagicCodeEmail({ magicCode })); const main = { backgroundColor: '#ffffff', From 45f510982360d3ca2729c07e71aeb9cc1ca3cc18 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 04:19:58 +0700 Subject: [PATCH 32/41] fire off emails for creating/updating contributors --- .../controllers/nodes/contributions/create.ts | 26 ++++++++++++++++--- .../controllers/nodes/contributions/update.ts | 23 +++++++++++++++- .../templates/emails/ContributorInvite.tsx | 14 ++++++++-- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/desci-server/src/controllers/nodes/contributions/create.ts b/desci-server/src/controllers/nodes/contributions/create.ts index bbee95972..fab5a09fa 100644 --- a/desci-server/src/controllers/nodes/contributions/create.ts +++ b/desci-server/src/controllers/nodes/contributions/create.ts @@ -1,7 +1,11 @@ +import sgMail from '@sendgrid/mail'; import { Request, Response } from 'express'; import { logger as parentLogger } from '../../../logger.js'; import { contributorService } from '../../../services/Contributors.js'; +import { ContributorInviteEmailHtml } from '../../../templates/emails/ContributorInvite.js'; + +sgMail.setApiKey(process.env.SENDGRID_API_KEY); export const addContributor = async (req: Request, res: Response) => { const node = (req as any).node; @@ -40,12 +44,28 @@ export const addContributor = async (req: Request, res: Response) => { userId, }); if (!contributorAdded) throw Error('Failed to add contributor'); - if (user.id !== contributorAdded.userId) { + if (user.id !== contributorAdded.userId && contributorAdded.email) { // Generate a share code for the contributor if it's the node owner themselves const shareCode = await contributorService.generatePrivShareCodeForContribution(contributorAdded, node); - // Future: - // Fire off an email -> make it count as a friend referral + // Future: make it count as a friend referral + const emailHtml = ContributorInviteEmailHtml({ + inviter: user.name, + nodeUuid: node.uuid, + privShareCode: shareCode, + contributorId: contributorAdded.contributorId, + newUser: contributorAdded.userId !== undefined, + }); + const emailMsg = { + to: email, + from: 'no-reply@desci.com', + subject: `[nodes.desci.com] ${user.name} has added you as a contributor to their research node.`, + text: `You've been added as a contributor to ${node.title}. Confirm your contribution to ensure you're credited for your work. + Your private share code: ${shareCode}`, + html: emailHtml, + }; + + sgMail.send(emailMsg); } logger.info({ contributorAdded }, 'Contributor added successfully'); return res.status(200).json({ message: 'Contributor added successfully' }); diff --git a/desci-server/src/controllers/nodes/contributions/update.ts b/desci-server/src/controllers/nodes/contributions/update.ts index bf0d2dcb8..e0c450a88 100644 --- a/desci-server/src/controllers/nodes/contributions/update.ts +++ b/desci-server/src/controllers/nodes/contributions/update.ts @@ -1,7 +1,11 @@ +import sgMail from '@sendgrid/mail'; import { Request, Response } from 'express'; import { logger as parentLogger } from '../../../logger.js'; import { contributorService } from '../../../services/Contributors.js'; +import { ContributorInviteEmailHtml } from '../../../templates/emails/ContributorInvite.js'; + +sgMail.setApiKey(process.env.SENDGRID_API_KEY); export const updateContributor = async (req: Request, res: Response) => { const node = (req as any).node; @@ -45,11 +49,28 @@ export const updateContributor = async (req: Request, res: Response) => { if (contributorUpdated) { logger.info({ contributorUpdated }, 'Contributor updated successfully'); // Future: - if (currentEmail !== email) { + if (currentEmail !== email && email !== user.email) { // If email was changed, send a new email. const shareCode = await contributorService.generatePrivShareCodeForContribution(contributorUpdated, node); // Fire off an email -> make it count as a friend referral + const emailHtml = ContributorInviteEmailHtml({ + inviter: user.name, + nodeUuid: node.uuid, + privShareCode: shareCode, + contributorId: contributorUpdated.contributorId, + newUser: contributorUpdated.userId !== undefined, + }); + const emailMsg = { + to: email, + from: 'no-reply@desci.com', + subject: `[nodes.desci.com] ${user.name} has added you as a contributor to their research node.`, + text: `You've been added as a contributor to ${node.title}. Confirm your contribution to ensure you're credited for your work. + Your private share code: ${shareCode}`, + html: emailHtml, + }; + + sgMail.send(emailMsg); } return res.status(200).json({ message: 'Contributor updated successfully' }); } diff --git a/desci-server/src/templates/emails/ContributorInvite.tsx b/desci-server/src/templates/emails/ContributorInvite.tsx index 068eb8d81..5d09aeb71 100644 --- a/desci-server/src/templates/emails/ContributorInvite.tsx +++ b/desci-server/src/templates/emails/ContributorInvite.tsx @@ -10,6 +10,7 @@ import { Text, Button, Section, + render, } from '@react-email/components'; import * as React from 'react'; @@ -27,7 +28,7 @@ const NEW_USER_TEXT = `Sign up on Desci Nodes to confirm your contribution to en const EXISTING_USER_TEXT = `Confirm your contribution to ensure you're credited for your work.`; -export const ContributorInviteNew = ({ +export const ContributorInvite = ({ inviter, nodeUuid, privShareCode, @@ -82,7 +83,16 @@ export const ContributorInviteNew = ({ ); }; -export default ContributorInviteNew; +export default ContributorInvite; + +export const ContributorInviteEmailHtml = ({ + inviter, + nodeUuid, + privShareCode, + contributorId, + newUser, +}: ContributorInviteEmailProps) => + render(ContributorInvite({ inviter, nodeUuid, privShareCode, contributorId, newUser })); const main = { backgroundColor: '#ffffff', From 03076855fa4d8a85b3208c0b69f647956b86310c Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 04:27:23 +0700 Subject: [PATCH 33/41] add render util to prevent issues in email template viewer --- .../src/templates/emails/ContributorInvite.tsx | 13 ++----------- desci-server/src/templates/emails/MagicCode.tsx | 3 +-- .../src/templates/emails/utils/emailRenderer.tsx | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 desci-server/src/templates/emails/utils/emailRenderer.tsx diff --git a/desci-server/src/templates/emails/ContributorInvite.tsx b/desci-server/src/templates/emails/ContributorInvite.tsx index 5d09aeb71..04d26d27c 100644 --- a/desci-server/src/templates/emails/ContributorInvite.tsx +++ b/desci-server/src/templates/emails/ContributorInvite.tsx @@ -16,7 +16,7 @@ import * as React from 'react'; import MainLayout from './MainLayout.js'; -interface ContributorInviteEmailProps { +export interface ContributorInviteEmailProps { inviter: string; nodeUuid: string; contributorId: string; @@ -35,7 +35,7 @@ export const ContributorInvite = ({ contributorId, newUser, }: ContributorInviteEmailProps) => { - if (nodeUuid.endsWith('.') || nodeUuid.endsWith('=')) nodeUuid = nodeUuid.slice(0, -1); + if (nodeUuid?.endsWith('.') || nodeUuid?.endsWith('=')) nodeUuid = nodeUuid.slice(0, -1); const privShareUrl = `https://nodes.desci.com/node/${nodeUuid}?shareId=${privShareCode}`; const contributorUrl = `https://nodes.desci.com/node/${nodeUuid}/contributors/${contributorId}?shareId=${privShareCode}`; return ( @@ -85,15 +85,6 @@ export const ContributorInvite = ({ export default ContributorInvite; -export const ContributorInviteEmailHtml = ({ - inviter, - nodeUuid, - privShareCode, - contributorId, - newUser, -}: ContributorInviteEmailProps) => - render(ContributorInvite({ inviter, nodeUuid, privShareCode, contributorId, newUser })); - const main = { backgroundColor: '#ffffff', margin: '0 auto', diff --git a/desci-server/src/templates/emails/MagicCode.tsx b/desci-server/src/templates/emails/MagicCode.tsx index ab6b1be89..fc65e00e5 100644 --- a/desci-server/src/templates/emails/MagicCode.tsx +++ b/desci-server/src/templates/emails/MagicCode.tsx @@ -16,7 +16,7 @@ import * as React from 'react'; import MainLayout from './MainLayout.js'; -interface MagicCodeEmailProps { +export interface MagicCodeEmailProps { magicCode: string; } @@ -40,7 +40,6 @@ export const MagicCodeEmail = ({ magicCode }: MagicCodeEmailProps) => ( ); export default MagicCodeEmail; -export const MagicCodeEmailHtml = ({ magicCode }: MagicCodeEmailProps) => render(MagicCodeEmail({ magicCode })); const main = { backgroundColor: '#ffffff', diff --git a/desci-server/src/templates/emails/utils/emailRenderer.tsx b/desci-server/src/templates/emails/utils/emailRenderer.tsx new file mode 100644 index 000000000..575861038 --- /dev/null +++ b/desci-server/src/templates/emails/utils/emailRenderer.tsx @@ -0,0 +1,15 @@ +import { render } from '@react-email/components'; + +import ContributorInvite, { ContributorInviteEmailProps } from '../ContributorInvite.js'; +import MagicCodeEmail, { MagicCodeEmailProps } from '../MagicCode.js'; + +export const ContributorInviteEmailHtml = ({ + inviter, + nodeUuid, + privShareCode, + contributorId, + newUser, +}: ContributorInviteEmailProps) => + render(ContributorInvite({ inviter, nodeUuid, privShareCode, contributorId, newUser })); + +export const MagicCodeEmailHtml = ({ magicCode }: MagicCodeEmailProps) => render(MagicCodeEmail({ magicCode })); From 51b2de060239d94ffa614801ed910404373ee7be Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 23:23:27 +0700 Subject: [PATCH 34/41] fix get contributions for node endpoint --- .../contributions/getNodeContributions.ts | 30 +++++++++++++++---- desci-server/src/services/Contributors.ts | 20 ++++++------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts index 765ccdf76..924c12cb7 100644 --- a/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts +++ b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts @@ -2,10 +2,28 @@ import { Request, Response } from 'express'; import { prisma } from '../../../client.js'; import { logger as parentLogger } from '../../../logger.js'; -import { contributorService } from '../../../services/Contributors.js'; +import { NodeContributorMap, contributorService } from '../../../services/Contributors.js'; import { ensureUuidEndsWithDot } from '../../../utils.js'; -export const getNodeContributions = async (req: Request, res: Response) => { +export type GetNodeContributionsReqBody = { + contributorIds: string[]; +}; + +export type GetNodeContributionsRequest = Request; + +export type GetNodeContributionsResBody = + | { + ok: boolean; + nodeContributions: NodeContributorMap; + } + | { + error: string; + }; + +export const getNodeContributions = async ( + req: GetNodeContributionsRequest, + res: Response, +) => { const { uuid } = req.params; const { contributorIds } = req.body; @@ -25,11 +43,13 @@ export const getNodeContributions = async (req: Request, res: Response) => { try { const node = await prisma.node.findUnique({ where: { uuid: ensureUuidEndsWithDot(uuid) } }); - // const nodeContributions = await contributorService.retrieveContributionsForNode(node, contributorIds); - const nodeContributions = await contributorService.retrieveContributionsForNode(node); + const nodeContributions: NodeContributorMap = await contributorService.retrieveContributionsForNode( + node, + contributorIds, + ); if (nodeContributions) { logger.info({ totalContributions: nodeContributions.length }, 'Contributions retrieved successfully'); - return res.status(200).json({ nodeContributions }); + return res.status(200).json({ ok: true, nodeContributions }); } } catch (e) { logger.error({ e }, 'Failed to retrieve node contributions'); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 6c4d744bf..9718be4ab 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -1,5 +1,3 @@ -import { error } from 'console'; - import { Node, NodeContribution, User } from '@prisma/client'; import ShortUniqueId from 'short-unique-id'; @@ -9,7 +7,10 @@ import { getIndexedResearchObjects } from '../theGraph.js'; import { hexToCid } from '../utils.js'; type ContributorId = string; -export type NodeContributorMap = Record; +export type NodeContributorMap = Record< + ContributorId, + { name: string | undefined; verified: boolean; userId: number; deleted: boolean; deletedAt: string } +>; export type Contribution = { nodeUuid: string; @@ -135,20 +136,17 @@ class ContributorService { return false; } - // async retrieveContributionsForNode(node: Node, contributorIds: string[]): Promise { - async retrieveContributionsForNode(node: Node): Promise { + async retrieveContributionsForNode(node: Node, contributorIds: string[]): Promise { const contributions = await prisma.nodeContribution.findMany({ - where: { nodeId: node.id, userId: { not: null } }, - // where: { nodeId: node.id, contributorId: { in: contributorIds }, userId: { not: null } }, + where: { nodeId: node.id, contributorId: { in: contributorIds } }, include: { user: true }, }); - // TODO: Add flag for published/non published, filter out depending on auth return contributions.reduce((acc, contributor) => { acc[contributor.contributorId] = { - name: contributor.user.name, - verified: contributor.verified, - userId: contributor.user.id, + name: contributor.user?.name, + verified: !!contributor.verified, + userId: contributor.user?.id, deleted: contributor.deleted, deletedAt: contributor.deletedAt, }; From 70bba5d3193b4a592b1e2417494872fce103be7a Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 23:23:57 +0700 Subject: [PATCH 35/41] bump container nvm to 18.17.0 for dep --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a86fc21f1..1815a9e74 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16.20.0-bookworm +FROM node:18.17.0-bookworm VOLUME /root/.yarn From ba3e042fcda5f408efb78ec9537b39011ec6a799 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 23:41:49 +0700 Subject: [PATCH 36/41] type everything --- .../controllers/nodes/contributions/create.ts | 35 +++++++++++++++---- .../controllers/nodes/contributions/delete.ts | 27 +++++++++++--- .../contributions/getUserContributions.ts | 24 +++++++++++-- .../controllers/nodes/contributions/update.ts | 32 ++++++++++++++--- .../controllers/nodes/contributions/verify.ts | 26 ++++++++++++-- desci-server/src/services/Contributors.ts | 5 ++- desci-server/src/services/auth.ts | 2 +- .../src/templates/emails/MagicCode.tsx | 2 +- 8 files changed, 129 insertions(+), 24 deletions(-) diff --git a/desci-server/src/controllers/nodes/contributions/create.ts b/desci-server/src/controllers/nodes/contributions/create.ts index fab5a09fa..db13f7e80 100644 --- a/desci-server/src/controllers/nodes/contributions/create.ts +++ b/desci-server/src/controllers/nodes/contributions/create.ts @@ -1,15 +1,37 @@ +import { Node, User } from '@prisma/client'; import sgMail from '@sendgrid/mail'; import { Request, Response } from 'express'; import { logger as parentLogger } from '../../../logger.js'; import { contributorService } from '../../../services/Contributors.js'; -import { ContributorInviteEmailHtml } from '../../../templates/emails/ContributorInvite.js'; +import { ContributorInviteEmailHtml } from '../../../templates/emails/utils/emailRenderer.js'; sgMail.setApiKey(process.env.SENDGRID_API_KEY); -export const addContributor = async (req: Request, res: Response) => { - const node = (req as any).node; - const user = (req as any).user; +export type AddContributorReqBody = { + contributorId: string; + email?: string; + orcid?: string; + userId?: number; +}; + +export type AddContributorRequest = Request & { + user: User; // added by auth middleware + node: Node; // added by ensureWriteAccess middleware +}; + +export type AddContributorResBody = + | { + ok: boolean; + message: string; + } + | { + error: string; + }; + +export const addContributor = async (req: AddContributorRequest, res: Response) => { + const node = req.node; + const user = req.user; if (!node || !user) throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); @@ -17,12 +39,11 @@ export const addContributor = async (req: Request, res: Response) => { const { contributorId, orcid, userId } = req.body; let { email } = req.body; if (email) email = email.toLowerCase(); - const logger = parentLogger.child({ module: 'Contributors::createController', body: req.body, uuid: node.uuid, - user: (req as any).user, + user: req.user, nodeId: node.id, }); @@ -68,7 +89,7 @@ export const addContributor = async (req: Request, res: Response) => { sgMail.send(emailMsg); } logger.info({ contributorAdded }, 'Contributor added successfully'); - return res.status(200).json({ message: 'Contributor added successfully' }); + return res.status(200).json({ ok: true, message: 'Contributor added successfully' }); } catch (e) { logger.error({ e }, 'Failed to add contributor'); return res.status(500).json({ error: 'Failed to add contributor' }); diff --git a/desci-server/src/controllers/nodes/contributions/delete.ts b/desci-server/src/controllers/nodes/contributions/delete.ts index e7856a33e..0664362b8 100644 --- a/desci-server/src/controllers/nodes/contributions/delete.ts +++ b/desci-server/src/controllers/nodes/contributions/delete.ts @@ -1,11 +1,30 @@ +import { Node, User } from '@prisma/client'; import { Request, Response } from 'express'; import { logger as parentLogger } from '../../../logger.js'; import { contributorService } from '../../../services/Contributors.js'; -export const deleteContributor = async (req: Request, res: Response) => { - const node = (req as any).node; - const user = (req as any).user; +export type DeleteContributorReqBody = { + contributorId: string; +}; + +export type DeleteContributorRequest = Request & { + user: User; // added by auth middleware + node: Node; // added by ensureWriteAccess middleware +}; + +export type DeleteContributorResBody = + | { + ok: boolean; + message: string; + } + | { + error: string; + }; + +export const deleteContributor = async (req: DeleteContributorRequest, res: Response) => { + const node = req.node; + const user = req.user; if (!node || !user) throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); @@ -29,7 +48,7 @@ export const deleteContributor = async (req: Request, res: Response) => { const contributorRemoved = await contributorService.removeContributor(contributorId, node.id); if (contributorRemoved) { logger.info('Contributor deleted successfully'); - return res.status(200).json({ message: 'Contributor deleted successfully' }); + return res.status(200).json({ ok: true, message: 'Contributor deleted successfully' }); } } catch (e) { logger.error({ e }, 'Failed to delete contributor'); diff --git a/desci-server/src/controllers/nodes/contributions/getUserContributions.ts b/desci-server/src/controllers/nodes/contributions/getUserContributions.ts index a70ec34ff..dd4e79822 100644 --- a/desci-server/src/controllers/nodes/contributions/getUserContributions.ts +++ b/desci-server/src/controllers/nodes/contributions/getUserContributions.ts @@ -2,9 +2,27 @@ import { Request, Response } from 'express'; import { prisma } from '../../../client.js'; import { logger as parentLogger } from '../../../logger.js'; -import { contributorService } from '../../../services/Contributors.js'; +import { UserContribution, contributorService } from '../../../services/Contributors.js'; -export const getUserContributions = async (req: Request, res: Response) => { +export type GetUserContributionsReqBody = { + contributorIds: string[]; +}; + +export type GetUserContributionsRequest = Request; + +export type GetUserContributionsResBody = + | { + ok: boolean; + userContributions: UserContribution[]; + } + | { + error: string; + }; + +export const getUserContributions = async ( + req: GetUserContributionsRequest, + res: Response, +) => { const { userId } = req.params; const logger = parentLogger.child({ @@ -22,7 +40,7 @@ export const getUserContributions = async (req: Request, res: Response) => { const userContributions = await contributorService.retrieveContributionsForUser(user); if (userContributions) { logger.info({ totalContributions: userContributions.length }, 'Contributions retrieved successfully'); - return res.status(200).json({ userContributions }); + return res.status(200).json({ ok: true, userContributions }); } } catch (e) { logger.error({ e }, 'Failed to retrieve user contributions'); diff --git a/desci-server/src/controllers/nodes/contributions/update.ts b/desci-server/src/controllers/nodes/contributions/update.ts index e0c450a88..843efee6f 100644 --- a/desci-server/src/controllers/nodes/contributions/update.ts +++ b/desci-server/src/controllers/nodes/contributions/update.ts @@ -1,15 +1,37 @@ +import { Node, User } from '@prisma/client'; import sgMail from '@sendgrid/mail'; import { Request, Response } from 'express'; import { logger as parentLogger } from '../../../logger.js'; import { contributorService } from '../../../services/Contributors.js'; -import { ContributorInviteEmailHtml } from '../../../templates/emails/ContributorInvite.js'; +import { ContributorInviteEmailHtml } from '../../../templates/emails/utils/emailRenderer.js'; sgMail.setApiKey(process.env.SENDGRID_API_KEY); -export const updateContributor = async (req: Request, res: Response) => { - const node = (req as any).node; - const user = (req as any).user; +export type UpdateContributorReqBody = { + contributorId: string; + email?: string; + orcid?: string; + userId?: number; +}; + +export type UpdateContributorRequest = Request & { + user: User; // added by auth middleware + node: Node; // added by ensureWriteAccess middleware +}; + +export type UpdateContributorResBody = + | { + ok: boolean; + message: string; + } + | { + error: string; + }; + +export const updateContributor = async (req: UpdateContributorRequest, res: Response) => { + const node = req.node; + const user = req.user; if (!node || !user) throw Error('Middleware not properly setup for addContributor controller, requires req.node and req.user'); @@ -72,7 +94,7 @@ export const updateContributor = async (req: Request, res: Response) => { sgMail.send(emailMsg); } - return res.status(200).json({ message: 'Contributor updated successfully' }); + return res.status(200).json({ ok: true, message: 'Contributor updated successfully' }); } } catch (e) { logger.error({ e }, 'Failed to update contributor'); diff --git a/desci-server/src/controllers/nodes/contributions/verify.ts b/desci-server/src/controllers/nodes/contributions/verify.ts index 65cfdddcb..b05d20d7d 100644 --- a/desci-server/src/controllers/nodes/contributions/verify.ts +++ b/desci-server/src/controllers/nodes/contributions/verify.ts @@ -1,9 +1,31 @@ +import { Node, User } from '@prisma/client'; import { Request, Response } from 'express'; import { logger as parentLogger } from '../../../logger.js'; import { contributorService } from '../../../services/Contributors.js'; -export const verifyContribution = async (req: Request, res: Response) => { +export type VerifyContributionReqBody = { + contributorId: string; + email?: string; + orcid?: string; + userId?: number; +}; + +export type VerifyContributionRequest = Request & { + user: User; // added by auth middleware + node: Node; // added by ensureWriteAccess middleware +}; + +export type VerifyContributionResBody = + | { + ok: boolean; + message: string; + } + | { + error: string; + }; + +export const verifyContribution = async (req: VerifyContributionRequest, res: Response) => { const user = (req as any).user; if (!user) throw Error('Middleware not properly setup for verifyContribution controller, requires req.user'); @@ -25,7 +47,7 @@ export const verifyContribution = async (req: Request, res: Response) => { const verified = await contributorService.verifyContribution(user, contributorId); if (verified) { logger.info('Contribution verified successfully'); - return res.status(200).json({ message: 'Contribution verified successfully' }); + return res.status(200).json({ ok: true, message: 'Contribution verified successfully' }); } } catch (e) { logger.error({ e }, 'Failed to verify contributor'); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 9718be4ab..35d8f8939 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -12,6 +12,8 @@ export type NodeContributorMap = Record< { name: string | undefined; verified: boolean; userId: number; deleted: boolean; deletedAt: string } >; +export type UserContribution = { uuid: string; manifestCid: string }; + export type Contribution = { nodeUuid: string; contributorId: string; @@ -154,12 +156,13 @@ class ContributorService { }, {}); } - async retrieveContributionsForUser(user: User): Promise<{ uuid: string; manifestCid: string }[]> { + async retrieveContributionsForUser(user: User): Promise { const contributions = await prisma.nodeContribution.findMany({ where: { userId: user.id }, include: { node: true }, }); const nodeUuids = contributions.map((contribution) => contribution.node.uuid); + // Filter out for published works const { researchObjects } = await getIndexedResearchObjects(nodeUuids); const NodesWithManifestCids = researchObjects.map((ro) => { // convert hex string to integer diff --git a/desci-server/src/services/auth.ts b/desci-server/src/services/auth.ts index 34d1334b2..9191d5413 100644 --- a/desci-server/src/services/auth.ts +++ b/desci-server/src/services/auth.ts @@ -6,7 +6,7 @@ import AWS from 'aws-sdk'; import { prisma as client } from '../client.js'; import { logger as parentLogger } from '../logger.js'; -import { MagicCodeEmailHtml } from '../templates/emails/MagicCode.js'; +import { MagicCodeEmailHtml } from '../templates/emails/utils/emailRenderer.js'; import createRandomCode from '../utils/createRandomCode.js'; import { hideEmail } from '../utils.js'; diff --git a/desci-server/src/templates/emails/MagicCode.tsx b/desci-server/src/templates/emails/MagicCode.tsx index fc65e00e5..e5cbd40d4 100644 --- a/desci-server/src/templates/emails/MagicCode.tsx +++ b/desci-server/src/templates/emails/MagicCode.tsx @@ -31,7 +31,7 @@ export const MagicCodeEmail = ({ magicCode }: MagicCodeEmailProps) => ( Your magic code is ready!
- {magicCode} + {magicCode}420420
From 33a4fdc836dccfcad916129058519e795a3a1939 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 23:43:24 +0700 Subject: [PATCH 37/41] fix --- desci-server/src/controllers/nodes/contributions/verify.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/desci-server/src/controllers/nodes/contributions/verify.ts b/desci-server/src/controllers/nodes/contributions/verify.ts index b05d20d7d..8d6ad523f 100644 --- a/desci-server/src/controllers/nodes/contributions/verify.ts +++ b/desci-server/src/controllers/nodes/contributions/verify.ts @@ -6,14 +6,10 @@ import { contributorService } from '../../../services/Contributors.js'; export type VerifyContributionReqBody = { contributorId: string; - email?: string; - orcid?: string; - userId?: number; }; export type VerifyContributionRequest = Request & { user: User; // added by auth middleware - node: Node; // added by ensureWriteAccess middleware }; export type VerifyContributionResBody = From d154ff382ca31cebd7bede459de3b4bd0bf02e04 Mon Sep 17 00:00:00 2001 From: kadami Date: Wed, 20 Mar 2024 23:44:32 +0700 Subject: [PATCH 38/41] more type fix --- .../src/controllers/nodes/contributions/getNodeContributions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts index 924c12cb7..f62bf3244 100644 --- a/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts +++ b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts @@ -9,7 +9,7 @@ export type GetNodeContributionsReqBody = { contributorIds: string[]; }; -export type GetNodeContributionsRequest = Request; +export type GetNodeContributionsRequest = Request<{ uuid: string }, never, GetNodeContributionsReqBody>; export type GetNodeContributionsResBody = | { From 60f54cf893f27848eb9957d15f1bc44a475b6e5a Mon Sep 17 00:00:00 2001 From: kadami Date: Thu, 21 Mar 2024 02:28:48 +0700 Subject: [PATCH 39/41] added authed variation of getNodeContributions endpoint to view/prefill previous emails entered --- .../contributions/getNodeContributions.ts | 17 +++++++------ desci-server/src/routes/v1/nodes.ts | 2 +- desci-server/src/services/Contributors.ts | 25 +++++++++++++++---- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts index f62bf3244..54b7b8b56 100644 --- a/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts +++ b/desci-server/src/controllers/nodes/contributions/getNodeContributions.ts @@ -1,20 +1,23 @@ +import { User } from '@prisma/client'; import { Request, Response } from 'express'; import { prisma } from '../../../client.js'; import { logger as parentLogger } from '../../../logger.js'; -import { NodeContributorMap, contributorService } from '../../../services/Contributors.js'; +import { NodeContributorAuthed, NodeContributorMap, contributorService } from '../../../services/Contributors.js'; import { ensureUuidEndsWithDot } from '../../../utils.js'; export type GetNodeContributionsReqBody = { contributorIds: string[]; }; -export type GetNodeContributionsRequest = Request<{ uuid: string }, never, GetNodeContributionsReqBody>; +export type GetNodeContributionsRequest = Request<{ uuid: string }, never, GetNodeContributionsReqBody> & { + user?: User; // Added by the attachUser middleware +}; export type GetNodeContributionsResBody = | { ok: boolean; - nodeContributions: NodeContributorMap; + nodeContributions: NodeContributorMap | NodeContributorAuthed; } | { error: string; @@ -24,6 +27,7 @@ export const getNodeContributions = async ( req: GetNodeContributionsRequest, res: Response, ) => { + const user = req.user; const { uuid } = req.params; const { contributorIds } = req.body; @@ -43,10 +47,9 @@ export const getNodeContributions = async ( try { const node = await prisma.node.findUnique({ where: { uuid: ensureUuidEndsWithDot(uuid) } }); - const nodeContributions: NodeContributorMap = await contributorService.retrieveContributionsForNode( - node, - contributorIds, - ); + const authedMode = !!user && user.id === node?.ownerId; + const nodeContributions: NodeContributorMap | NodeContributorAuthed = + await contributorService.retrieveContributionsForNode(node, contributorIds, authedMode); if (nodeContributions) { logger.info({ totalContributions: nodeContributions.length }, 'Contributions retrieved successfully'); return res.status(200).json({ ok: true, nodeContributions }); diff --git a/desci-server/src/routes/v1/nodes.ts b/desci-server/src/routes/v1/nodes.ts index 48ed28e1c..3da390b1c 100755 --- a/desci-server/src/routes/v1/nodes.ts +++ b/desci-server/src/routes/v1/nodes.ts @@ -61,7 +61,7 @@ router.post('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], addCont router.patch('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], updateContributor); router.delete('/contributions/:uuid', [ensureUser, ensureWriteNodeAccess], deleteContributor); router.get('/contributions/user/:userId', [], getUserContributions); -router.get('/contributions/node/:uuid', [], getNodeContributions); +router.get('/contributions/node/:uuid', [attachUser], getNodeContributions); router.patch('/contributions/verify', [ensureUser], verifyContribution); router.delete('/:uuid', [ensureUser], deleteNode); diff --git a/desci-server/src/services/Contributors.ts b/desci-server/src/services/Contributors.ts index 35d8f8939..25dd6a380 100644 --- a/desci-server/src/services/Contributors.ts +++ b/desci-server/src/services/Contributors.ts @@ -7,10 +7,20 @@ import { getIndexedResearchObjects } from '../theGraph.js'; import { hexToCid } from '../utils.js'; type ContributorId = string; -export type NodeContributorMap = Record< - ContributorId, - { name: string | undefined; verified: boolean; userId: number; deleted: boolean; deletedAt: string } ->; + +export type NodeContributorMap = Record; +export type NodeContributorMapAuthed = Record; +export interface NodeContributor { + name: string | undefined; + verified: boolean; + userId: number; + deleted: boolean; + deletedAt: string; +} +export interface NodeContributorAuthed extends NodeContributor { + email?: string; + orcid?: string; +} export type UserContribution = { uuid: string; manifestCid: string }; @@ -138,7 +148,11 @@ class ContributorService { return false; } - async retrieveContributionsForNode(node: Node, contributorIds: string[]): Promise { + async retrieveContributionsForNode( + node: Node, + contributorIds: string[], + authedMode = false, + ): Promise { const contributions = await prisma.nodeContribution.findMany({ where: { nodeId: node.id, contributorId: { in: contributorIds } }, include: { user: true }, @@ -151,6 +165,7 @@ class ContributorService { userId: contributor.user?.id, deleted: contributor.deleted, deletedAt: contributor.deletedAt, + ...(authedMode && { email: contributor.email, orcid: contributor.orcid }), }; return acc; }, {}); From 53d37941ac9daf0e5459a95970e59a7955d150a1 Mon Sep 17 00:00:00 2001 From: kadami Date: Thu, 21 Mar 2024 02:37:51 +0700 Subject: [PATCH 40/41] add denied state to node contributions --- .../migration.sql | 2 ++ desci-server/prisma/schema.prisma | 1 + 2 files changed, 3 insertions(+) create mode 100644 desci-server/prisma/migrations/20240320193439_add_denied_state_to_node_contributions/migration.sql diff --git a/desci-server/prisma/migrations/20240320193439_add_denied_state_to_node_contributions/migration.sql b/desci-server/prisma/migrations/20240320193439_add_denied_state_to_node_contributions/migration.sql new file mode 100644 index 000000000..d0a87691d --- /dev/null +++ b/desci-server/prisma/migrations/20240320193439_add_denied_state_to_node_contributions/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "NodeContribution" ADD COLUMN "denied" BOOLEAN NOT NULL DEFAULT false; diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index ead6f6ddd..1c4186246 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -482,6 +482,7 @@ model NodeContribution { nodeId Int userId Int? verified Boolean @default(false) + denied Boolean @default(false) email String? orcid String? deleted Boolean @default(false) From 64afd0df959bcd412ae931cde7b036b85679264d Mon Sep 17 00:00:00 2001 From: kadami Date: Thu, 21 Mar 2024 02:48:57 +0700 Subject: [PATCH 41/41] bump node version in github action flows --- .github/workflows/build-and-test.yaml | 2 +- .github/workflows/build-server.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index b29626fa5..db887c2e6 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -39,7 +39,7 @@ jobs: # Examples: uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 18 - name: Set up docker-compose run: | diff --git a/.github/workflows/build-server.yaml b/.github/workflows/build-server.yaml index 3145a3cf7..0f8bd658f 100644 --- a/.github/workflows/build-server.yaml +++ b/.github/workflows/build-server.yaml @@ -42,7 +42,7 @@ jobs: # Examples: uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 18 - name: Set up docker-compose run: |