From b840fe3168afcb7a5f5591a1b1057eeec5232ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikko=20Pyykk=C3=B6?= Date: Thu, 25 May 2023 12:02:47 +0300 Subject: [PATCH] Chore: upgrade prisma (#1190) * upgrade Prisma to v4; use nexus-plugin-prisma fork; rename db relations and indexes according to Prisma default convention; fix Nexus scalar typings * add explicit uuid casts to * remove old prisma patches --- backend/api/routes/completions.ts | 30 +- backend/api/routes/progress.ts | 151 +- backend/api/routes/storedData.ts | 39 +- backend/bin/fetchUserAppDatum.ts | 4 +- backend/bin/importOrganizations.ts | 11 +- .../EmailTemplater/templates/CourseStats.ts | 10 +- .../common/__test__/userFunctions.test.ts | 58 +- .../userCourseProgress/BAI/completion.ts | 21 +- .../common/userCourseProgress/BAI/progress.ts | 11 +- .../generateUserCourseProgress.ts | 4 +- .../common/userCourseProgress/interfaces.ts | 24 +- .../common/userCourseProgress/saveToDB.ts | 7 +- .../bin/kafkaConsumer/common/userFunctions.ts | 61 +- .../userPoints/exerciseCompletionFunctions.ts | 64 +- backend/bin/linkopingStatsEmailer.ts | 2 +- backend/bin/pragueStatsEmailer.ts | 2 +- backend/bin/seedPoints.ts | 2 +- backend/bin/sendAiStatistics.ts | 65 +- backend/graphql/Completion/model.ts | 11 +- backend/graphql/Completion/mutations.ts | 27 +- backend/graphql/Completion/queries.ts | 12 +- backend/graphql/Course/model.ts | 3 +- backend/graphql/Course/mutations.ts | 13 +- backend/graphql/StudyModule/model.ts | 33 +- backend/graphql/Tag.ts | 6 +- backend/graphql/User/model.ts | 92 +- backend/graphql/UserCourseProgress.ts | 15 +- backend/graphql/UserCourseServiceProgress.ts | 4 +- backend/graphql/UserCourseSetting.ts | 72 +- backend/graphql/UserCourseSummary.ts | 84 +- .../20230522102035_rename-foreign-keys.ts | 337 ++ .../20230522111132_rename-indexes.ts | 266 ++ ...0230522121925_rename-unique-constraints.ts | 103 + ...e-email-template-remove-duplicate-index.ts | 11 + .../20230522123809_rename-primary-keys.ts | 23 + ...er-table-email-delivery-add-primary-key.ts | 15 + ...4_alter-table-course-to-tag-add-b-index.ts | 12 + backend/package-lock.json | 3443 +++++++++++++++-- backend/package.json | 8 +- backend/patches/@prisma+client+2.23.0.patch | 40 - ...e8cba3daf12d456d911d72b6e9418681b28b.patch | 12 - backend/patches/prisma+2.23.0.patch | 60 - backend/prisma/schema.prisma | 833 ++-- backend/schema.ts | 42 +- backend/tests/data/fixtures.ts | 4 +- backend/types/GraphQLScalars.d.ts | 11 + 46 files changed, 4884 insertions(+), 1274 deletions(-) create mode 100644 backend/migrations/20230522102035_rename-foreign-keys.ts create mode 100644 backend/migrations/20230522111132_rename-indexes.ts create mode 100644 backend/migrations/20230522121925_rename-unique-constraints.ts create mode 100644 backend/migrations/20230522122836_alter-table-email-template-remove-duplicate-index.ts create mode 100644 backend/migrations/20230522123809_rename-primary-keys.ts create mode 100644 backend/migrations/20230522124532_alter-table-email-delivery-add-primary-key.ts create mode 100644 backend/migrations/20230522133214_alter-table-course-to-tag-add-b-index.ts delete mode 100644 backend/patches/@prisma+client+2.23.0.patch delete mode 100644 backend/patches/@prisma+engines+2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.patch delete mode 100644 backend/patches/prisma+2.23.0.patch create mode 100644 backend/types/GraphQLScalars.d.ts diff --git a/backend/api/routes/completions.ts b/backend/api/routes/completions.ts index b83b5ae83..08ab332fc 100644 --- a/backend/api/routes/completions.ts +++ b/backend/api/routes/completions.ts @@ -254,20 +254,22 @@ export class CompletionController extends Controller { user: User, ): Promise => { return ( - await this.ctx.prisma.user - .findUnique({ - where: { - id: user.id, - }, - }) - .completions({ - where: { - course_id: course.completions_handled_by_id ?? course.id, - }, - orderBy: { created_at: "asc" }, - take: 1, - }) - )?.[0] + ( + await this.ctx.prisma.user + .findUnique({ + where: { + id: user.id, + }, + }) + .completions({ + where: { + course_id: course.completions_handled_by_id ?? course.id, + }, + orderBy: { created_at: "asc" }, + take: 1, + }) + )?.[0] ?? null + ) } recheckCompletion = async ( diff --git a/backend/api/routes/progress.ts b/backend/api/routes/progress.ts index 7cd8735e8..d4f56933d 100644 --- a/backend/api/routes/progress.ts +++ b/backend/api/routes/progress.ts @@ -311,37 +311,39 @@ export class ProgressController extends Controller { } logger.info("Querying existing progresses and completions") - const beforeParentProgresses = await prisma.course - .findUnique({ - where: { - id: BAIParentCourse, - }, - }) - .user_course_progresses({ - distinct: ["user_id"], - orderBy: { - created_at: "asc", - }, - include: { - user: true, - }, - }) + const beforeParentProgresses = + (await prisma.course + .findUnique({ + where: { + id: BAIParentCourse, + }, + }) + .user_course_progresses({ + distinct: ["user_id"], + orderBy: { + created_at: "asc", + }, + include: { + user: true, + }, + })) ?? [] - const beforeCompletions = await prisma.course - .findUnique({ - where: { - id: BAIParentCourse, - }, - }) - .completions({ - distinct: ["user_id"], - orderBy: { - created_at: "asc", - }, - include: { - user: true, - }, - }) + const beforeCompletions = + (await prisma.course + .findUnique({ + where: { + id: BAIParentCourse, + }, + }) + .completions({ + distinct: ["user_id"], + orderBy: { + created_at: "asc", + }, + include: { + user: true, + }, + })) ?? [] const getUsers = (arr: Array) => arr?.map((e) => e.user).filter(notEmpty) ?? [] @@ -418,19 +420,20 @@ export class ProgressController extends Controller { advancedBAICourse, ]) { logger.info(`Handling ${course.slug}`) - const userCourseProgresses = await prisma.course - .findUnique({ - where: { - id: course.id, - }, - }) - .user_course_progresses({ - distinct: ["user_id"], - orderBy: { created_at: "asc" }, - include: { - user: true, - }, - }) + const userCourseProgresses = + (await prisma.course + .findUnique({ + where: { + id: course.id, + }, + }) + .user_course_progresses({ + distinct: ["user_id"], + orderBy: { created_at: "asc" }, + include: { + user: true, + }, + })) ?? [] if (userCourseProgresses.length) { logger.info( @@ -479,37 +482,39 @@ export class ProgressController extends Controller { } logger.info("Querying updated progresses and completions") - const afterParentProgresses = await prisma.course - .findUnique({ - where: { - id: BAIParentCourse, - }, - }) - .user_course_progresses({ - distinct: ["user_id"], - orderBy: { - created_at: "asc", - }, - include: { - user: true, - }, - }) + const afterParentProgresses = + (await prisma.course + .findUnique({ + where: { + id: BAIParentCourse, + }, + }) + .user_course_progresses({ + distinct: ["user_id"], + orderBy: { + created_at: "asc", + }, + include: { + user: true, + }, + })) ?? [] - const afterCompletions = await prisma.course - .findUnique({ - where: { - id: BAIParentCourse, - }, - }) - .completions({ - distinct: ["user_id"], - orderBy: { - created_at: "asc", - }, - include: { - user: true, - }, - }) + const afterCompletions = + (await prisma.course + .findUnique({ + where: { + id: BAIParentCourse, + }, + }) + .completions({ + distinct: ["user_id"], + orderBy: { + created_at: "asc", + }, + include: { + user: true, + }, + })) ?? [] const result = { progresses: { diff --git a/backend/api/routes/storedData.ts b/backend/api/routes/storedData.ts index 54dd4605d..cbc45179f 100644 --- a/backend/api/routes/storedData.ts +++ b/backend/api/routes/storedData.ts @@ -38,9 +38,9 @@ export class StoredDataController extends Controller { try { const existingStoredData = await prisma.storedData.findUnique({ where: { - user_id_course_id: { - user_id: user.id, + course_id_user_id: { course_id: course.id, + user_id: user.id, }, }, }) @@ -59,9 +59,9 @@ export class StoredDataController extends Controller { await prisma.storedData.update({ where: { - user_id_course_id: { - user_id: user.id, + course_id_user_id: { course_id: course.id, + user_id: user.id, }, }, data: { @@ -98,25 +98,26 @@ export class StoredDataController extends Controller { return ownershipResult.error } - const storedData = await prisma.course - .findUnique({ - where: { id: course.id }, - }) - .stored_data({ - include: { - user: { - include: { - completions: { - where: { - course_id: course.completions_handled_by_id ?? course.id, + const storedData = + (await prisma.course + .findUnique({ + where: { id: course.id }, + }) + .stored_data({ + include: { + user: { + include: { + completions: { + where: { + course_id: course.completions_handled_by_id ?? course.id, + }, + orderBy: { created_at: "asc" }, + take: 1, }, - orderBy: { created_at: "asc" }, - take: 1, }, }, }, - }, - }) + })) ?? [] const mappedStoredData = storedData.map((data) => ({ user: omit(data.user, "completions"), diff --git a/backend/bin/fetchUserAppDatum.ts b/backend/bin/fetchUserAppDatum.ts index 30ebe8d0a..197e7c6c2 100644 --- a/backend/bin/fetchUserAppDatum.ts +++ b/backend/bin/fetchUserAppDatum.ts @@ -1,6 +1,6 @@ import { DateTime } from "luxon" -import { Course, PrismaClient, UserCourseSetting } from "@prisma/client" +import { Course, Prisma, PrismaClient, UserCourseSetting } from "@prisma/client" import { CONFIG_NAME } from "../config" import { UserInfo } from "../domain/UserInfo" @@ -212,7 +212,7 @@ const saveCourseVariant = async (p: any) => { } const saveOther = async (p: any) => { - const other: any = old.other ?? {} + const other = (old.other as Prisma.JsonObject) ?? {} if (p.value == "t") { p.value = true } else if (p.value == "f") { diff --git a/backend/bin/importOrganizations.ts b/backend/bin/importOrganizations.ts index 36bfdc67f..1f0c5ca4e 100644 --- a/backend/bin/importOrganizations.ts +++ b/backend/bin/importOrganizations.ts @@ -71,11 +71,12 @@ const upsertOrganization = async (org: OrganizationInfo) => { information: org.information, organization: { connect: { id: organization.id } }, } - const organizationTranslations = await prisma.organization - .findUnique({ where: { id: organization.id } }) - .organization_translations({ - where: { language: translationDetails.language }, - }) + const organizationTranslations = + (await prisma.organization + .findUnique({ where: { id: organization.id } }) + .organization_translations({ + where: { language: translationDetails.language }, + })) ?? [] const organizationTranslationId = organizationTranslations.length ? organizationTranslations[0].id : null diff --git a/backend/bin/kafkaConsumer/common/EmailTemplater/templates/CourseStats.ts b/backend/bin/kafkaConsumer/common/EmailTemplater/templates/CourseStats.ts index 864dad377..7508f97cd 100644 --- a/backend/bin/kafkaConsumer/common/EmailTemplater/templates/CourseStats.ts +++ b/backend/bin/kafkaConsumer/common/EmailTemplater/templates/CourseStats.ts @@ -24,7 +24,7 @@ export class StartedCourseCount extends Template { const conditions = [ Prisma.sql`course_id = ${ course.inherit_settings_from_id ?? course.id - }`, + }::uuid`, ] if (courseInstanceLanguage) { conditions.push(Prisma.sql`language = ${courseInstanceLanguage}`) @@ -74,7 +74,7 @@ export class CompletedCourseCount extends Template { const conditions = [ Prisma.sql`course_id = ${ course.completions_handled_by_id ?? course.id - }`, + }::uuid`, ] if (completionLanguage) { conditions.push( @@ -124,7 +124,7 @@ export class AtLeastOneExerciseCount extends Template { COUNT(DISTINCT user_id) FROM exercise_completion ec JOIN exercise e ON ec.exercise_id = e.id - WHERE course_id = ${course.id} + WHERE course_id = ${course.id}::uuid AND attempted = true; ` )?.[0]?.count @@ -173,7 +173,7 @@ export class AtLeastOneExerciseButNotCompletedEmails extends Template { const conditions = [ Prisma.sql`course_id = ${ course.completions_handled_by_id ?? course.id - }`, + }::uuid`, Prisma.sql`user_id IS NOT NULL`, ] if (completionLanguage) { @@ -191,7 +191,7 @@ export class AtLeastOneExerciseButNotCompletedEmails extends Template { JOIN exercise e ON ec.exercise_id = e.id JOIN "user" u ON ec.user_id = u.id WHERE - e.course_id = ${course.id} + e.course_id = ${course.id}::uuid AND ec.attempted = true AND diff --git a/backend/bin/kafkaConsumer/common/__test__/userFunctions.test.ts b/backend/bin/kafkaConsumer/common/__test__/userFunctions.test.ts index 8e0ad5d9b..06b002325 100644 --- a/backend/bin/kafkaConsumer/common/__test__/userFunctions.test.ts +++ b/backend/bin/kafkaConsumer/common/__test__/userFunctions.test.ts @@ -625,20 +625,21 @@ describe("exercise completion utilities", () => { describe("pruneDuplicateExerciseCompletions", () => { it("should prune duplicates", async () => { - const before = await ctx.prisma.user - .findUnique({ - where: { - id: USER_ID_1, - }, - }) - .exercise_completions({ - where: { - exercise: { course_id: "00000000-0000-0000-0000-000000000667" }, - }, - orderBy: { - exercise_id: "asc", - }, - }) + const before = + (await ctx.prisma.user + .findUnique({ + where: { + id: USER_ID_1, + }, + }) + .exercise_completions({ + where: { + exercise: { course_id: "00000000-0000-0000-0000-000000000667" }, + }, + orderBy: { + exercise_id: "asc", + }, + })) ?? [] const result = ( await pruneDuplicateExerciseCompletions({ @@ -657,20 +658,21 @@ describe("exercise completion utilities", () => { expect(result).toEqual(expect.arrayContaining(expectedPruned)) - const after = await ctx.prisma.user - .findUnique({ - where: { - id: USER_ID_1, - }, - }) - .exercise_completions({ - where: { - exercise: { course_id: "00000000-0000-0000-0000-000000000667" }, - }, - orderBy: { - exercise_id: "asc", - }, - }) + const after = + (await ctx.prisma.user + .findUnique({ + where: { + id: USER_ID_1, + }, + }) + .exercise_completions({ + where: { + exercise: { course_id: "00000000-0000-0000-0000-000000000667" }, + }, + orderBy: { + exercise_id: "asc", + }, + })) ?? [] expect(before.length - after.length).toEqual(result.length) diff --git a/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/completion.ts b/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/completion.ts index 66fa0373f..ff7622c1f 100644 --- a/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/completion.ts +++ b/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/completion.ts @@ -58,16 +58,17 @@ export const checkBAICompletion = async ({ // even though the handler is in this case the completion handler course. // Add a separate progress_handled_by, even though that would only apply here // as the tiers have their own progress? - const existingProgresses = await prisma.course - .findUnique({ - where: { id: handler?.id ?? course.id }, - }) - .user_course_progresses({ - where: { - user_id: user.id, - }, - orderBy: { created_at: "asc" }, - }) + const existingProgresses = + (await prisma.course + .findUnique({ + where: { id: handler?.id ?? course.id }, + }) + .user_course_progresses({ + where: { + user_id: user.id, + }, + orderBy: { created_at: "asc" }, + })) ?? [] if (existingProgresses.length < 1) { logger.info("No existing progress found, creating new...") diff --git a/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/progress.ts b/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/progress.ts index 804d3d9f2..606ad74c6 100644 --- a/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/progress.ts +++ b/backend/bin/kafkaConsumer/common/userCourseProgress/BAI/progress.ts @@ -10,6 +10,8 @@ import { } from "../../../../../config/courseConfig" import { ExerciseCompletionPart, + ProgressExtra, + ServiceProgressPartType, TierInfo, TierProgressGroup, TierProgressMap, @@ -180,15 +182,18 @@ export const getProgress = ({ projectCompletion, highestTier, totalExerciseCompletions, -}: GetProgressArgs) => { +}: GetProgressArgs): { + progress: Array + extra: ProgressExtra +} => { // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing const pointsProgress = (n_points || 0) / (max_points || 1) const newProgress = { progress: [ { group: "total", - max_points, - n_points, + max_points: max_points || 0, + n_points: n_points || 0, progress: isNaN(pointsProgress) ? 0 : pointsProgress, }, ], diff --git a/backend/bin/kafkaConsumer/common/userCourseProgress/generateUserCourseProgress.ts b/backend/bin/kafkaConsumer/common/userCourseProgress/generateUserCourseProgress.ts index 3533da003..5a6472f8c 100644 --- a/backend/bin/kafkaConsumer/common/userCourseProgress/generateUserCourseProgress.ts +++ b/backend/bin/kafkaConsumer/common/userCourseProgress/generateUserCourseProgress.ts @@ -1,4 +1,4 @@ -import { Course, User, UserCourseProgress } from "@prisma/client" +import { Course, Prisma, User, UserCourseProgress } from "@prisma/client" import { BAItiers } from "../../../../config/courseConfig" import { BaseContext } from "../../../../context" @@ -58,7 +58,7 @@ export const generateUserCourseProgress = async ({ return context.prisma.userCourseProgress.update({ where: { id: userCourseProgress.id }, data: { - progress: combined.progress as any, // errors unless typed as any + progress: combined.progress ?? Prisma.JsonNull, // errors unless typed as any max_points: { set: combined.total_max_points }, n_points: { set: combined.total_n_points }, }, diff --git a/backend/bin/kafkaConsumer/common/userCourseProgress/interfaces.ts b/backend/bin/kafkaConsumer/common/userCourseProgress/interfaces.ts index f5202a2b0..b0f2a3d93 100644 --- a/backend/bin/kafkaConsumer/common/userCourseProgress/interfaces.ts +++ b/backend/bin/kafkaConsumer/common/userCourseProgress/interfaces.ts @@ -1,4 +1,6 @@ -export interface Message { +import { Prisma } from "@prisma/client" + +export interface Message extends Prisma.JsonObject { timestamp: string user_id: number course_id: string @@ -7,14 +9,14 @@ export interface Message { message_format_version: number } -export interface PointsByGroup { +export interface PointsByGroup extends Prisma.JsonObject { group: string max_points: number n_points: number progress: number } -export interface ServiceProgressPartType { +export interface ServiceProgressPartType extends Prisma.JsonObject { max_points: number n_points: number group: string @@ -23,7 +25,7 @@ export interface ServiceProgressPartType { export type ServiceProgressType = Array -export interface TierProgress { +export interface TierProgress extends Prisma.JsonObject { tier: number n_points: number max_points: number @@ -40,8 +42,8 @@ export interface TotalProgress { total_max_points: number } -export type TierProgressMap = { - [Tier in string]: TierProgress +export interface TierProgressMap extends Prisma.JsonObject { + [Tier: string]: TierProgress } export interface ExerciseCompletionPart { @@ -52,16 +54,14 @@ export interface ExerciseCompletionPart { custom_id?: string } -export type TierInfo = Record< - string, - { +export interface TierInfo extends Prisma.JsonObject { + [Tier: string]: { hasTier: boolean missingFromTier: number exerciseCompletions: number } -> - -export type ProgressExtra = { +} +export interface ProgressExtra extends Prisma.JsonObject { tiers: TierInfo exercises: TierProgressMap projectCompletion: boolean diff --git a/backend/bin/kafkaConsumer/common/userCourseProgress/saveToDB.ts b/backend/bin/kafkaConsumer/common/userCourseProgress/saveToDB.ts index fca84ee00..f6b241777 100644 --- a/backend/bin/kafkaConsumer/common/userCourseProgress/saveToDB.ts +++ b/backend/bin/kafkaConsumer/common/userCourseProgress/saveToDB.ts @@ -1,6 +1,7 @@ import { DateTime } from "luxon" import { + Prisma, User, UserCourseProgress, UserCourseServiceProgress, @@ -77,7 +78,7 @@ export const saveToDatabase = async ( connect: { id: message.course_id }, }, user: { connect: { id: user.id } }, - progress: message.progress as any, // type error without any + progress: message.progress ?? Prisma.JsonNull, // type error without any }, }) } else if (userCourseProgresses.length > 1) { @@ -122,7 +123,7 @@ export const saveToDatabase = async ( id: userCourseServiceProgress.id, }, data: { - progress: message.progress as any, // type error without any + progress: message.progress ?? Prisma.JsonNull, // type error without any timestamp: { set: timestamp.toJSDate() }, }, }) @@ -136,7 +137,7 @@ export const saveToDatabase = async ( service: { connect: { id: message.service_id }, }, - progress: message.progress as any, // type error without any + progress: message.progress ?? Prisma.JsonNull, // type error without any user_course_progress: { connect: { id: userCourseProgress.id }, }, diff --git a/backend/bin/kafkaConsumer/common/userFunctions.ts b/backend/bin/kafkaConsumer/common/userFunctions.ts index be52b47bf..8b33349a6 100644 --- a/backend/bin/kafkaConsumer/common/userFunctions.ts +++ b/backend/bin/kafkaConsumer/common/userFunctions.ts @@ -35,15 +35,16 @@ export const getCombinedUserCourseProgress = async ({ course, context: { prisma }, }: GetCombinedUserCourseProgressArgs): Promise => { - const userCourseServiceProgresses = await prisma.user - .findUnique({ where: { id: user.id } }) - .user_course_service_progresses({ - where: { - course_id: course.id, - }, - distinct: ["course_id", "service_id"], - orderBy: { created_at: "asc" }, - }) + const userCourseServiceProgresses = + (await prisma.user + .findUnique({ where: { id: user.id } }) + .user_course_service_progresses({ + where: { + course_id: course.id, + }, + distinct: ["course_id", "service_id"], + orderBy: { created_at: "asc" }, + })) ?? [] /* * Get rid of everything we dont neeed. After this the array looks like this: @@ -334,20 +335,21 @@ export const createCompletion = async ({ const handlerCourse = handler ?? course - const completions = await prisma.user - .findUnique({ - where: { - id: user.id, - }, - }) - .completions({ - where: { - course_id: handlerCourse.id, - }, - orderBy: { - created_at: "asc", - }, - }) + const completions = + (await prisma.user + .findUnique({ + where: { + id: user.id, + }, + }) + .completions({ + where: { + course_id: handlerCourse.id, + }, + orderBy: { + created_at: "asc", + }, + })) ?? [] if (completions.length < 1) { logger.info("No existing completion found, creating new...") @@ -406,17 +408,12 @@ export const createCompletion = async ({ const eligible_for_ects = tier === 1 ? false : handlerCourse.automatic_completions_eligible_for_ects try { - const updated = await prisma.$queryRaw( - ` + const updated = await prisma.$queryRaw>` UPDATE completion - SET tier=$1, eligible_for_ects=$2, updated_at=now() - WHERE id=$3 AND COALESCE(tier, 0) < $1 - RETURNING tier;`, - tier, - eligible_for_ects, - completions[0].id, - ) + SET tier=${tier}, eligible_for_ects=${eligible_for_ects}, updated_at=now() + WHERE id=${completions[0].id}::uuid AND COALESCE(tier, 0) < ${tier} + RETURNING tier;` if (updated.length > 0) { logger.info("Existing completion found, updated tier") } diff --git a/backend/bin/kafkaConsumer/common/userPoints/exerciseCompletionFunctions.ts b/backend/bin/kafkaConsumer/common/userPoints/exerciseCompletionFunctions.ts index 25cfd004e..aa2e86831 100644 --- a/backend/bin/kafkaConsumer/common/userPoints/exerciseCompletionFunctions.ts +++ b/backend/bin/kafkaConsumer/common/userPoints/exerciseCompletionFunctions.ts @@ -55,21 +55,22 @@ export const getExerciseAndCompletions = async < } logger.info("Getting the exercise completion") - const exerciseCompletions = await prisma.user - .findUnique({ - where: { - upstream_id: Number(message.user_id), - }, - }) - .exercise_completions({ - where: { - exercise_id: exercise.id, - }, - orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], - include: { - exercise_completion_required_actions: true, - }, - }) + const exerciseCompletions = + (await prisma.user + .findUnique({ + where: { + upstream_id: Number(message.user_id), + }, + }) + .exercise_completions({ + where: { + exercise_id: exercise.id, + }, + orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], + include: { + exercise_completion_required_actions: true, + }, + })) ?? [] return ok([exercise, exerciseCompletions] as const) } @@ -134,22 +135,23 @@ export const getCreatedAndUpdatedExerciseCompletions = async < const exerciseIds = existingExercises.map((e) => e.id) logger.info("Getting the exercise completions") - const exerciseCompletions = await prisma.user - .findUnique({ - where: { - upstream_id: Number(message.user_id), - }, - }) - .exercise_completions({ - where: { - exercise_id: { in: exerciseIds }, - }, - distinct: ["exercise_id"], - orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], - include: { - exercise_completion_required_actions: true, - }, - }) + const exerciseCompletions = + (await prisma.user + .findUnique({ + where: { + upstream_id: Number(message.user_id), + }, + }) + .exercise_completions({ + where: { + exercise_id: { in: exerciseIds }, + }, + distinct: ["exercise_id"], + orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], + include: { + exercise_completion_required_actions: true, + }, + })) ?? [] const existingCompletedExercises = exerciseCompletions.map( (ec) => ec.exercise_id, diff --git a/backend/bin/linkopingStatsEmailer.ts b/backend/bin/linkopingStatsEmailer.ts index 25a279231..183c980de 100644 --- a/backend/bin/linkopingStatsEmailer.ts +++ b/backend/bin/linkopingStatsEmailer.ts @@ -23,7 +23,7 @@ const linkopingStatsEmailer = async () => { WHERE u.email ILIKE '%liu.se' AND ucs.other ->> 'ects_consent_sweden' = 'true' AND ucs.other ->> 'bai_completion' = 'true' - AND c.course_id = '49cbadd8-be32-454f-9b7d-e84d52100b74' + AND c.course_id = '49cbadd8-be32-454f-9b7d-e84d52100b74'::uuid AND ucs.country = 'Sweden' ORDER BY c.completion_date; ` diff --git a/backend/bin/pragueStatsEmailer.ts b/backend/bin/pragueStatsEmailer.ts index 5b7bc8ec7..a16402574 100644 --- a/backend/bin/pragueStatsEmailer.ts +++ b/backend/bin/pragueStatsEmailer.ts @@ -20,7 +20,7 @@ const pragueStatsEmailer = async () => { FROM "user" u JOIN completion co on u.id = co.user_id JOIN user_course_setting ucs on u.id = ucs.user_id and co.course_id = ucs.course_id - WHERE co.course_id = '49cbadd8-be32-454f-9b7d-e84d52100b74' + WHERE co.course_id = '49cbadd8-be32-454f-9b7d-e84d52100b74'::uuid AND ucs.other->>'bai_completion' = 'true' AND u.email ILIKE '%@vse.cz' GROUP BY co.tier, u.email, co.completion_date diff --git a/backend/bin/seedPoints.ts b/backend/bin/seedPoints.ts index 3e7d87722..456d78ade 100644 --- a/backend/bin/seedPoints.ts +++ b/backend/bin/seedPoints.ts @@ -152,7 +152,7 @@ const addUserCourseSettingses = async (courseId: string) => { research: true, marketing: false, course_variant: null, - other: null, + other: Prisma.JsonNull, } return prisma.userCourseSetting.create({ data: ucs }) }), diff --git a/backend/bin/sendAiStatistics.ts b/backend/bin/sendAiStatistics.ts index 810220e08..64a0d9170 100644 --- a/backend/bin/sendAiStatistics.ts +++ b/backend/bin/sendAiStatistics.ts @@ -21,37 +21,40 @@ const data = { text: "" } const getDataByLanguage = async (langInfo: LanguageInfo) => { const { language, completion_language, country, langName } = langInfo - const totalByLang = await prisma.course - .findUnique({ - where: { slug: "elements-of-ai" }, - }) - .user_course_settings({ - where: { - language: language, - }, - distinct: ["user_id"], - }) - const completionsByLang = await prisma.course - .findUnique({ - where: { slug: "elements-of-ai" }, - }) - .completions({ - where: { - completion_language, - }, - distinct: ["user_id"], - }) - const englishInLang = await prisma.course - .findUnique({ - where: { slug: "elements-of-ai" }, - }) - .user_course_settings({ - where: { - country, - language: "en", - }, - distinct: ["user_id"], - }) + const totalByLang = + (await prisma.course + .findUnique({ + where: { slug: "elements-of-ai" }, + }) + .user_course_settings({ + where: { + language: language, + }, + distinct: ["user_id"], + })) ?? [] + const completionsByLang = + (await prisma.course + .findUnique({ + where: { slug: "elements-of-ai" }, + }) + .completions({ + where: { + completion_language, + }, + distinct: ["user_id"], + })) ?? [] + const englishInLang = + (await prisma.course + .findUnique({ + where: { slug: "elements-of-ai" }, + }) + .user_course_settings({ + where: { + country, + language: "en", + }, + distinct: ["user_id"], + })) ?? [] const now = new Date() return `\`\`\`Stats ${now.getDate()}.${ diff --git a/backend/graphql/Completion/model.ts b/backend/graphql/Completion/model.ts index 742e3c229..7bde78d69 100644 --- a/backend/graphql/Completion/model.ts +++ b/backend/graphql/Completion/model.ts @@ -77,11 +77,12 @@ export const Completion = objectType({ t.nonNull.field("registered", { type: "Boolean", resolve: async (parent, _, ctx) => { - const registered = await ctx.prisma.completion - .findUnique({ - where: { id: parent.id }, - }) - .completions_registered() + const registered = + (await ctx.prisma.completion + .findUnique({ + where: { id: parent.id }, + }) + .completions_registered()) ?? [] return registered.length > 0 }, diff --git a/backend/graphql/Completion/mutations.ts b/backend/graphql/Completion/mutations.ts index ba8151bba..20cfe1d6a 100644 --- a/backend/graphql/Completion/mutations.ts +++ b/backend/graphql/Completion/mutations.ts @@ -193,19 +193,20 @@ export const CompletionMutations = extendType({ .filter((key) => key !== "null") // find users with completions - const completions = await ctx.prisma.course - .findUnique({ - where: { - id: course.completions_handled_by_id ?? course.id, - }, - }) - .completions({ - where: { - user_id: { in: userIds }, - }, - distinct: ["user_id", "course_id"], - orderBy: { created_at: "asc" }, - }) + const completions = + (await ctx.prisma.course + .findUnique({ + where: { + id: course.completions_handled_by_id ?? course.id, + }, + }) + .completions({ + where: { + user_id: { in: userIds }, + }, + distinct: ["user_id", "course_id"], + orderBy: { created_at: "asc" }, + })) ?? [] // filter users without completions const userIdsWithoutCompletions = difference( diff --git a/backend/graphql/Completion/queries.ts b/backend/graphql/Completion/queries.ts index e5c9d9c8f..427d3f0da 100644 --- a/backend/graphql/Completion/queries.ts +++ b/backend/graphql/Completion/queries.ts @@ -101,12 +101,14 @@ export const CompletionQueries = extendType({ } return findManyCursorConnection( - (args) => - ctx.prisma.course + async (args) => { + const res = await ctx.prisma.course .findUnique({ where: { id: course.completions_handled_by_id ?? course.id }, }) - .completions(merge(baseArgs, args)), + .completions(merge(baseArgs, args)) + return res ?? [] + }, async () => { // TODO/FIXME: kludge as there is no distinct in prisma "count" or other aggregates // ctx.prisma.completion.count(baseArgs as any), // not really same type, so force it @@ -138,14 +140,14 @@ export const CompletionQueries = extendType({ )*/ return ( - await ctx.prisma.course + (await ctx.prisma.course .findUnique({ where: { id: course.completions_handled_by_id ?? course.id }, }) .completions({ ...baseArgs, select: { id: true }, - }) + })) ?? [] ).length }, { first, last, before, after }, diff --git a/backend/graphql/Course/model.ts b/backend/graphql/Course/model.ts index 52fc613b3..b1af45d0f 100644 --- a/backend/graphql/Course/model.ts +++ b/backend/graphql/Course/model.ts @@ -59,6 +59,7 @@ export const Course = objectType({ t.model.upcoming_active_link() t.model.tier() t.model.handles_completions_for() + t.model.handles_settings_for() t.model.course_stats_email_id() t.model.course_stats_email() t.model.language() @@ -179,7 +180,7 @@ export const Course = objectType({ } } if (!includeHidden) { - tagsWhere.OR = [{ hidden: false }, { hidden: null }] + tagsWhere.OR = [{ hidden: false }, { hidden: { not: true } }] } const res = await ctx.prisma.course.findUnique({ diff --git a/backend/graphql/Course/mutations.ts b/backend/graphql/Course/mutations.ts index 02ae9b5b9..c77b0abba 100644 --- a/backend/graphql/Course/mutations.ts +++ b/backend/graphql/Course/mutations.ts @@ -41,7 +41,6 @@ export const CourseMutations = extendType({ const { // slug, course_translations, - open_university_registration_links, course_variants, course_aliases, study_modules, @@ -64,6 +63,12 @@ export const CourseMutations = extendType({ tags = uniqBy((tags ?? []).concat({ id: language }), "id") } + const open_university_registration_links = + course.open_university_registration_links?.map((link) => ({ + ...link, + tiers: link.tiers ?? Prisma.JsonNull, + })) ?? undefined + const newCourse = await ctx.prisma.course.create({ data: { ...omit(course, [ @@ -203,7 +208,7 @@ export const CourseMutations = extendType({ } const studyModuleMutation: - | Prisma.StudyModuleUpdateManyWithoutCoursesInput + | Prisma.StudyModuleUpdateManyWithoutCoursesNestedInput | undefined = getStudyModuleMutation(existingCourse, study_modules) const inheritMutation = connectOrDisconnect( inherit_settings_from, @@ -326,7 +331,7 @@ function getTagMutation( | NexusGenInputs["CourseUpsertArg"] )["tags"] | null, -): Prisma.TagUpdateManyWithoutCoursesInput | undefined { +): Prisma.TagUpdateManyWithoutCoursesNestedInput | undefined { const languageTags = (tags ?? []).filter((tag) => tag.types?.includes("language"), ) @@ -373,7 +378,7 @@ function getStudyModuleMutation< | NexusGenInputs["CourseUpsertArg"] )["study_modules"] | null, -): Prisma.StudyModuleUpdateManyWithoutCoursesInput | undefined { +): Prisma.StudyModuleUpdateManyWithoutCoursesNestedInput | undefined { if (!study_modules) { return } diff --git a/backend/graphql/StudyModule/model.ts b/backend/graphql/StudyModule/model.ts index 9690f4879..895664e18 100644 --- a/backend/graphql/StudyModule/model.ts +++ b/backend/graphql/StudyModule/model.ts @@ -30,24 +30,25 @@ export const StudyModule = objectType({ const courses: (Course & { course_translations?: CourseTranslation[] - })[] = await ctx.prisma.studyModule - .findUnique({ - where: { id: parent.id }, - }) - .courses({ - orderBy: filterNull(orderBy) ?? undefined, - ...(language - ? { - include: { - course_translations: { - where: { - language, + })[] = + (await ctx.prisma.studyModule + .findUnique({ + where: { id: parent.id }, + }) + .courses({ + orderBy: filterNull(orderBy) ?? undefined, + ...(language + ? { + include: { + course_translations: { + where: { + language, + }, }, }, - }, - } - : {}), - }) + } + : {}), + })) ?? [] const values = courses.map((course) => ({ ...omit(course, "course_translations"), diff --git a/backend/graphql/Tag.ts b/backend/graphql/Tag.ts index 1e0de8245..72be65af5 100644 --- a/backend/graphql/Tag.ts +++ b/backend/graphql/Tag.ts @@ -183,7 +183,7 @@ export const TagQueries = extendType({ const res = await ctx.prisma.tag.findMany({ where: { ...(!includeHidden && { - OR: [{ hidden: false }, { hidden: null }], + OR: [{ hidden: false }, { hidden: { not: true } }], }), ...(!includeWithNoCourses && { courses: { @@ -249,7 +249,7 @@ export const TagMutations = extendType({ return ctx.prisma.tag.create({ data: { id: _id, - hidden, + hidden: hidden ?? false, ...(translations && { tag_translations: { create: translations, @@ -340,7 +340,7 @@ export const TagMutations = extendType({ } } if (!isNotNullOrUndefined(hidden)) { - data.hidden = { set: hidden } + data.hidden = { set: hidden ?? undefined } } if (Object.keys(data).length === 0) { diff --git a/backend/graphql/User/model.ts b/backend/graphql/User/model.ts index 9329f94c9..50ab30ada 100644 --- a/backend/graphql/User/model.ts +++ b/backend/graphql/User/model.ts @@ -206,16 +206,17 @@ export const User = objectType({ t.list.nonNull.field("progresses", { type: "Progress", resolve: async (parent, _, ctx) => { - const progressCourses = await ctx.prisma.user - .findUnique({ - where: { id: parent.id }, - }) - .user_course_progresses({ - distinct: ["course_id"], - select: { - course: true, - }, - }) + const progressCourses = + (await ctx.prisma.user + .findUnique({ + where: { id: parent.id }, + }) + .user_course_progresses({ + distinct: ["course_id"], + select: { + course: true, + }, + })) ?? [] return progressCourses .map((pr) => pr.course) @@ -273,7 +274,7 @@ export const User = objectType({ take: 1, }) - return progresses?.[0] + return progresses?.[0] ?? null }, }) @@ -312,41 +313,44 @@ export const User = objectType({ } if (course_id) { - const data = await ctx.prisma.course - .findUnique({ - where: { id: course_id }, - }) - .exercises({ - where: exerciseWhere, - select: { - exercise_completions: { - where: { - user_id: parent.id, - ...exerciseCompletionWhere, + const data = + (await ctx.prisma.course + .findUnique({ + where: { id: course_id }, + }) + .exercises({ + where: exerciseWhere, + select: { + exercise_completions: { + where: { + user_id: parent.id, + ...exerciseCompletionWhere, + }, + orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], + take: 1, }, - orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], - take: 1, }, - }, - }) + })) ?? [] return data?.flatMap((d) => d.exercise_completions).filter(notEmpty) } // TODO/FIXME: testing if ^ removes some joins; need to update queries that use it - return ctx.prisma.user - .findUnique({ - where: { id: parent.id }, - }) - .exercise_completions({ - where: { - ...(exerciseWhere && { - exercise: exerciseWhere, - }), - ...exerciseCompletionWhere, - }, - distinct: "exercise_id", - orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], - }) + return ( + ctx.prisma.user + .findUnique({ + where: { id: parent.id }, + }) + .exercise_completions({ + where: { + ...(exerciseWhere && { + exercise: exerciseWhere, + }), + ...exerciseCompletionWhere, + }, + distinct: "exercise_id", + orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], + }) ?? [] + ) }, }) @@ -419,7 +423,7 @@ export const User = objectType({ select distinct(e.course_id) as course_id from exercise_completion ec join exercise e on ec.exercise_id = e.id - where ec.user_id = ${id} + where ec.user_id = ${id}::uuid and ec.attempted = true ` @@ -433,7 +437,7 @@ export const User = objectType({ select distinct(e.course_id) as course_id, ec.timestamp from exercise_completion ec join exercise e on ec.exercise_id = e.id - where ec.user_id = ${id} + where ec.user_id = ${id}::uuid and ec.attempted = true ${activityDateClause} ) as sub @@ -444,7 +448,7 @@ export const User = objectType({ // not very optimal, as the exercise completions will be queried twice if that field is selected const startedCourses = await ctx.prisma.$queryRaw< Array - >(Prisma.sql` + >` select c.id as course_id, inherit_settings_from_id, @@ -460,7 +464,7 @@ export const User = objectType({ where c.id in ( ${subquery} ) - `) + ` // divide courses into three groups: // - not handled diff --git a/backend/graphql/UserCourseProgress.ts b/backend/graphql/UserCourseProgress.ts index 65956f46a..746b2037a 100644 --- a/backend/graphql/UserCourseProgress.ts +++ b/backend/graphql/UserCourseProgress.ts @@ -113,7 +113,7 @@ export const UserCourseProgress = objectType({ }, }) - return settings?.[0] + return settings?.[0] ?? null }, }) @@ -131,7 +131,7 @@ export const UserCourseProgress = objectType({ completed: boolean | null attempted: boolean | null }> - >(Prisma.sql` + >` select e.id as exercise_id, ecs.id as exercise_completion_id, completed, @@ -146,13 +146,13 @@ export const UserCourseProgress = objectType({ ) as row from exercise_completion ec join exercise e on ec.exercise_id = e.id - where ec.user_id = ${user_id} - and e.course_id = ${course_id} + where ec.user_id = ${user_id}::uuid + and e.course_id = ${course_id}::uuid ) ecs on ecs.exercise_id = e.id and row = 1 - where e.course_id = ${course_id} + where e.course_id = ${course_id}::uuid and e.deleted <> true and e.max_points > 0 - `) + ` const completedExerciseCount = exercises.filter( (e) => e.exercise_completion_id && e.completed, @@ -160,6 +160,7 @@ export const UserCourseProgress = objectType({ const attemptedExerciseCount = exercises.filter( (e) => e.exercise_completion_id && e.attempted, ).length + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing const totalProgress = (n_points || 0) / (max_points || 1) const exerciseProgress = @@ -377,7 +378,7 @@ export const UserCourseProgressMutations = extendType({ data: { user: { connect: { id: user_id } }, course: { connect: { id: course_id } }, - progress, + progress: progress ?? Prisma.JsonNull, extra, max_points, n_points, diff --git a/backend/graphql/UserCourseServiceProgress.ts b/backend/graphql/UserCourseServiceProgress.ts index 92722d83e..89147cb9c 100644 --- a/backend/graphql/UserCourseServiceProgress.ts +++ b/backend/graphql/UserCourseServiceProgress.ts @@ -93,7 +93,7 @@ export const UserCourseServiceProgressQueries = extendType({ orderBy: { created_at: "asc" }, }) - return progresses?.[0] + return progresses?.[0] ?? null }, }) @@ -159,7 +159,7 @@ export const UserCourseServiceProgressMutations = extendType({ course: { connect: { id: course_id }, }, - progress: progress, + progress, service: { connect: { id: service_id }, }, diff --git a/backend/graphql/UserCourseSetting.ts b/backend/graphql/UserCourseSetting.ts index a4e8efd6f..b54c2c5fb 100644 --- a/backend/graphql/UserCourseSetting.ts +++ b/backend/graphql/UserCourseSetting.ts @@ -122,7 +122,7 @@ export const UserCourseSettingQueries = extendType({ return (await ctx.prisma.$queryRaw(countQueryString))?.[0].count ?? 0*/ return ( - await ctx.prisma.course + (await ctx.prisma.course .findUnique({ where: { id: course?.inherit_settings_from_id ?? course_id }, }) @@ -134,7 +134,7 @@ export const UserCourseSettingQueries = extendType({ select: { id: true, }, - }) + })) ?? [] ).length } @@ -156,7 +156,7 @@ export const UserCourseSettingQueries = extendType({ return (await ctx.prisma.$queryRaw(countQueryString))?.[0].count ?? 0*/ if (user_id) { return ( - await ctx.prisma.user + (await ctx.prisma.user .findUnique({ where: { id: user_id }, }) @@ -165,7 +165,7 @@ export const UserCourseSettingQueries = extendType({ select: { id: true, }, - }) + })) ?? [] ).length } @@ -232,41 +232,45 @@ export const UserCourseSettingQueries = extendType({ }) return findManyCursorConnection( - (connectionArgs) => { + async (connectionArgs) => { if (course_id) { - return ctx.prisma.course - .findUnique({ + return ( + (await ctx.prisma.course + .findUnique({ + where: { + id: course_id, + }, + }) + .user_course_settings({ + where: { + user: { + AND: userConditions, + }, + }, + distinct: ["user_id", "course_id"], + ...connectionArgs, + })) ?? [] + ) + } + + return ( + (await ctx.prisma.user + .findFirst({ + // could be findUnique if userSearch not specified where: { - id: course_id, + id: user_id ?? undefined, + upstream_id: user_upstream_id ?? undefined, + ...(userSearch ? { user: userSearch } : {}), }, }) .user_course_settings({ where: { - user: { - AND: userConditions, - }, + course_id, }, distinct: ["user_id", "course_id"], ...connectionArgs, - }) - } - - return ctx.prisma.user - .findFirst({ - // could be findUnique if userSearch not specified - where: { - id: user_id ?? undefined, - upstream_id: user_upstream_id ?? undefined, - ...(userSearch ? { user: userSearch } : {}), - }, - }) - .user_course_settings({ - where: { - course_id, - }, - distinct: ["user_id", "course_id"], - ...connectionArgs, - }) + })) ?? [] + ) }, async () => { // TODO/FIXME: kludge because prisma "count" doesn't have distinct @@ -323,7 +327,7 @@ export const UserCourseSettingQueries = extendType({ })*/ if (course_id) { return ( - await ctx.prisma.course + (await ctx.prisma.course .findUnique({ where: { id: course_id, @@ -337,12 +341,12 @@ export const UserCourseSettingQueries = extendType({ }, distinct: ["user_id", "course_id"], select: { id: true }, - }) + })) ?? [] ).length } return ( - await ctx.prisma.user + (await ctx.prisma.user .findFirst({ // could be findUnique if userSearch not specified where: { @@ -356,7 +360,7 @@ export const UserCourseSettingQueries = extendType({ course_id, }, distinct: ["user_id", "course_id"], - }) + })) ?? [] ).length }, pick(args, ["first", "last", "before", "after"]), diff --git a/backend/graphql/UserCourseSummary.ts b/backend/graphql/UserCourseSummary.ts index 4d16605df..63826c9a6 100644 --- a/backend/graphql/UserCourseSummary.ts +++ b/backend/graphql/UserCourseSummary.ts @@ -21,9 +21,8 @@ export const UserCourseSummary = objectType({ t.nonNull.field("course", { type: "Course", resolve: async ({ course_id }, _, ctx) => { - return ctx.prisma.course.findUnique({ + return ctx.prisma.course.findUniqueOrThrow({ where: { id: course_id }, - rejectOnNotFound: true, }) }, }) @@ -56,21 +55,23 @@ export const UserCourseSummary = objectType({ ? includeNoPointsAwarded : include_no_points_awarded_exercises - return ctx.prisma.course - .findUnique({ - where: { id: course_id }, - }) - .exercises({ - where: { - ...(!noPoints && { - max_points: { gt: 0 }, - }), - ...(!deleted && { - // same here: { deleted: { not: true } } will skip null - OR: [{ deleted: false }, { deleted: null }], - }), - }, - }) + return ( + (await ctx.prisma.course + .findUnique({ + where: { id: course_id }, + }) + .exercises({ + where: { + ...(!noPoints && { + max_points: { gt: 0 }, + }), + ...(!deleted && { + // same here: { deleted: { not: true } } will skip null + OR: [{ deleted: false }, { deleted: null }], + }), + }, + })) ?? [] + ) }, }) @@ -97,7 +98,7 @@ export const UserCourseSummary = objectType({ take: 1, }) - return completions?.[0] + return completions?.[0] ?? null }, }) @@ -116,7 +117,7 @@ export const UserCourseSummary = objectType({ take: 1, }) - return progresses?.[0] + return progresses?.[0] ?? null }, }) @@ -167,30 +168,31 @@ export const UserCourseSummary = objectType({ const noPoints = notEmpty(includeNoPointsAwarded) ? includeNoPointsAwarded : include_no_points_awarded_exercises - const data = await ctx.prisma.course - .findUnique({ - where: { id: course_id }, - }) - .exercises({ - where: { - ...(!noPoints && { - max_points: { gt: 0 }, - }), - ...(!deleted && { - // same here: { deleted: { not: true } } will skip null - OR: [{ deleted: false }, { deleted: null }], - }), - }, - select: { - exercise_completions: { - where: { - user_id, + const data = + (await ctx.prisma.course + .findUnique({ + where: { id: course_id }, + }) + .exercises({ + where: { + ...(!noPoints && { + max_points: { gt: 0 }, + }), + ...(!deleted && { + // same here: { deleted: { not: true } } will skip null + OR: [{ deleted: false }, { deleted: null }], + }), + }, + select: { + exercise_completions: { + where: { + user_id, + }, + orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], + take: 1, }, - orderBy: [{ timestamp: "desc" }, { updated_at: "desc" }], - take: 1, }, - }, - }) + })) ?? [] return data?.flatMap((d) => d.exercise_completions).filter(notEmpty) // TODO/FIXME: testing if this actually removes any extra joins diff --git a/backend/migrations/20230522102035_rename-foreign-keys.ts b/backend/migrations/20230522102035_rename-foreign-keys.ts new file mode 100644 index 000000000..34597e7d6 --- /dev/null +++ b/backend/migrations/20230522102035_rename-foreign-keys.ts @@ -0,0 +1,337 @@ +import { Knex } from "knex" + +export async function up(knex: Knex): Promise { + await knex.raw(` + ALTER TABLE "ab_enrollment" + RENAME CONSTRAINT "ab_enrollment_ab_study" TO "ab_enrollment_ab_study_id_fkey"; + ALTER TABLE "ab_enrollment" + RENAME CONSTRAINT "ab_enrollment_user" TO "ab_enrollment_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "completion" + RENAME CONSTRAINT "completion_course_fkey" TO "completion_course_id_fkey"; + ALTER TABLE "completion" + RENAME CONSTRAINT "completion_user_fkey" TO "completion_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_completion_fkey" TO "completion_registered_completion_id_fkey"; + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_user_fkey" TO "completion_registered_user_id_fkey"; + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_course_fkey" TO "completion_registered_course_id_fkey"; + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_organization_fkey" TO "completion_registered_organization_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "course" + RENAME CONSTRAINT "course_completion_email_fkey" TO "course_completion_email_id_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_completions_handled_by_fkey" TO "course_completions_handled_by_id_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_inherit_settings_from_fkey" TO "course_inherit_settings_from_id_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_owner_organization_fkey" TO "course_owner_organization_id_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_photo_fkey" TO "course_photo_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "course_alias" + RENAME CONSTRAINT "course_alias_course_fkey" TO "course_alias_course_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "course_organization" + RENAME CONSTRAINT "course_organization_course_fkey" TO "course_organization_course_id_fkey"; + ALTER TABLE "course_organization" + RENAME CONSTRAINT "course_organization_organization_fkey" TO "course_organization_organization_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "course_translation" + RENAME CONSTRAINT "course_translation_course_fkey" TO "course_translation_course_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "course_variant" + RENAME CONSTRAINT "course_variant_course_fkey" TO "course_variant_course_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "email_delivery" + RENAME CONSTRAINT "email_delivery_email_template_fkey" TO "email_delivery_email_template_id_fkey"; + ALTER TABLE "email_delivery" + RENAME CONSTRAINT "email_delivery_user_fkey" TO "email_delivery_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "email_template" + RENAME CONSTRAINT "course_threshold_email_fkey" TO "email_template_triggered_automatically_by_course_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "exercise" + RENAME CONSTRAINT "exercise_course_fkey" TO "exercise_course_id_fkey"; + ALTER TABLE "exercise" + RENAME CONSTRAINT "exercise_service_fkey" TO "exercise_service_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "exercise_completion" + RENAME CONSTRAINT "exercise_completion_exercise_fkey" TO "exercise_completion_exercise_id_fkey"; + ALTER TABLE "exercise_completion" + RENAME CONSTRAINT "exercise_completion_user_fkey" TO "exercise_completion_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "exercise_completion_required_actions" + RENAME CONSTRAINT "exercise_completion_required_actions_exercise_completion_fkey" TO "exercise_completion_required_actions_exercise_completion_i_fkey"; + `) + await knex.raw(` + ALTER TABLE "open_university_registration_link" + RENAME CONSTRAINT "open_university_registration_link_course_fkey" TO "open_university_registration_link_course_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "organization" + RENAME CONSTRAINT "organization_creator_fkey" TO "organization_creator_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "organization_translation" + RENAME CONSTRAINT "organization_translation_organization_fkey" TO "organization_translation_organization_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "stored_data" + RENAME CONSTRAINT "stored_data" TO "stored_data_user_id_fkey"; + ALTER TABLE "stored_data" + RENAME CONSTRAINT "stored_data_course" TO "stored_data_course_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "study_module_translation" + RENAME CONSTRAINT "study_module_translation_study_module_fkey" TO "study_module_translation_study_module_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "user_course_progress" + RENAME CONSTRAINT "user_course_progress_course_fkey" TO "user_course_progress_course_id_fkey"; + ALTER TABLE "user_course_progress" + RENAME CONSTRAINT "user_course_progress_user_fkey" TO "user_course_progress_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_course_fkey" TO "user_course_service_progress_course_id_fkey"; + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_user_fkey" TO "user_course_service_progress_user_id_fkey"; + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_service_fkey" TO "user_course_service_progress_service_id_fkey"; + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_user_course_progress_fkey" TO "user_course_service_progress_user_course_progress_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "user_course_setting" + RENAME CONSTRAINT "UserCourseSettings_course_fkey" TO "user_course_setting_course_id_fkey"; + ALTER TABLE "user_course_setting" + RENAME CONSTRAINT "UserCourseSettings_user_fkey" TO "user_course_setting_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "user_course_settings_visibility" + RENAME CONSTRAINT "user_course_settings_visibility_course_fkey" TO "user_course_settings_visibility_course_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "user_organization" + RENAME CONSTRAINT "user_organization_organization_fkey" TO "user_organization_organization_id_fkey"; + ALTER TABLE "user_organization" + RENAME CONSTRAINT "user_organization_user_fkey" TO "user_organization_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "verified_user" + RENAME CONSTRAINT "verified_user_user_fkey" TO "verified_user_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "course_ownership" + RENAME CONSTRAINT "course_ownership_course" TO "course_ownership_course_id_fkey"; + ALTER TABLE "course_ownership" + RENAME CONSTRAINT "course_ownership_user" TO "course_ownership_user_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "course_stats_subscription" + RENAME CONSTRAINT "course_stats_subscription_user" TO "course_stats_subscription_user_id_fkey"; + ALTER TABLE "course_stats_subscription" + RENAME CONSTRAINT "course_stats_subscription_email_template" TO "course_stats_subscription_email_template_id_fkey"; + `) + await knex.raw(` + ALTER TABLE "tag_translation" + RENAME CONSTRAINT "tag_translation_tag_fkey" TO "tag_translation_tag_id_fkey"; + `) +} + +export async function down(knex: Knex): Promise { + await knex.raw(` + ALTER TABLE "ab_enrollment" + RENAME CONSTRAINT "ab_enrollment_ab_study_id_fkey" TO "ab_enrollment_ab_study"; + ALTER TABLE "ab_enrollment" + RENAME CONSTRAINT "ab_enrollment_user_id_fkey" TO "ab_enrollment_user"; +`) + + await knex.raw(` + ALTER TABLE "completion" + RENAME CONSTRAINT "completion_course_id_fkey" TO "completion_course_fkey"; + ALTER TABLE "completion" + RENAME CONSTRAINT "completion_user_id_fkey" TO "completion_user_fkey"; +`) + + await knex.raw(` + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_completion_id_fkey" TO "completion_registered_completion_fkey"; + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_user_id_fkey" TO "completion_registered_user_fkey"; + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_course_id_fkey" TO "completion_registered_course_fkey"; + ALTER TABLE "completion_registered" + RENAME CONSTRAINT "completion_registered_organization_id_fkey" TO "completion_registered_organization_fkey"; +`) + + await knex.raw(` + ALTER TABLE "course" + RENAME CONSTRAINT "course_completion_email_id_fkey" TO "course_completion_email_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_completions_handled_by_id_fkey" TO "course_completions_handled_by_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_inherit_settings_from_id_fkey" TO "course_inherit_settings_from_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_owner_organization_id_fkey" TO "course_owner_organization_fkey"; + ALTER TABLE "course" + RENAME CONSTRAINT "course_photo_id_fkey" TO "course_photo_fkey"; +`) + + await knex.raw(` + ALTER TABLE "course_alias" + RENAME CONSTRAINT "course_alias_course_id_fkey" TO "course_alias_course_fkey"; +`) + + await knex.raw(` + ALTER TABLE "course_organization" + RENAME CONSTRAINT "course_organization_course_id_fkey" TO "course_organization_course_fkey"; + ALTER TABLE "course_organization" + RENAME CONSTRAINT "course_organization_organization_id_fkey" TO "course_organization_organization_fkey"; +`) + + await knex.raw(` + ALTER TABLE "course_translation" + RENAME CONSTRAINT "course_translation_course_id_fkey" TO "course_translation_course_fkey"; +`) + + await knex.raw(` + ALTER TABLE "course_variant" + RENAME CONSTRAINT "course_variant_course_id_fkey" TO "course_variant_course_fkey"; +`) + + await knex.raw(` + ALTER TABLE "email_delivery" + RENAME CONSTRAINT "email_delivery_email_template_id_fkey" TO "email_delivery_email_template_fkey"; + ALTER TABLE "email_delivery" + RENAME CONSTRAINT "email_delivery_user_id_fkey" TO "email_delivery_user_fkey"; +`) + + await knex.raw(` + ALTER TABLE "email_template" + RENAME CONSTRAINT "email_template_triggered_automatically_by_course_id_fkey" TO "course_threshold_email_fkey"; +`) + + await knex.raw(` + ALTER TABLE "exercise" + RENAME CONSTRAINT "exercise_course_id_fkey" TO "exercise_course_fkey"; + ALTER TABLE "exercise" + RENAME CONSTRAINT "exercise_service_id_fkey" TO "exercise_service_fkey"; +`) + + await knex.raw(` + ALTER TABLE "exercise_completion" + RENAME CONSTRAINT "exercise_completion_exercise_id_fkey" TO "exercise_completion_exercise_fkey"; + ALTER TABLE "exercise_completion" + RENAME CONSTRAINT "exercise_completion_user_id_fkey" TO "exercise_completion_user_fkey"; +`) + + await knex.raw(` + ALTER TABLE "exercise_completion_required_actions" + RENAME CONSTRAINT "exercise_completion_required_actions_exercise_completion_i_fkey" TO "exercise_completion_required_actions_exercise_completion_fkey"; +`) + + await knex.raw(` + ALTER TABLE "open_university_registration_link" + RENAME CONSTRAINT "open_university_registration_link_course_id_fkey" TO "open_university_registration_link_course_fkey"; +`) + + await knex.raw(` + ALTER TABLE "organization" + RENAME CONSTRAINT "organization_creator_id_fkey" TO "organization_creator_fkey"; +`) + + await knex.raw(` + ALTER TABLE "organization_translation" + RENAME CONSTRAINT "organization_translation_organization_id_fkey" TO "organization_translation_organization_fkey"; +`) + + await knex.raw(` + ALTER TABLE "stored_data" + RENAME CONSTRAINT "stored_data_user_id_fkey" TO "stored_data"; + ALTER TABLE "stored_data" + RENAME CONSTRAINT "stored_data_course_id_fkey" TO "stored_data_course"; +`) + + await knex.raw(` + ALTER TABLE "study_module_translation" + RENAME CONSTRAINT "study_module_translation_study_module_id_fkey" TO "study_module_translation_study_module_fkey"; +`) + + await knex.raw(` + ALTER TABLE "user_course_progress" + RENAME CONSTRAINT "user_course_progress_course_id_fkey" TO "user_course_progress_course_fkey"; + ALTER TABLE "user_course_progress" + RENAME CONSTRAINT "user_course_progress_user_id_fkey" TO "user_course_progress_user_fkey"; +`) + + await knex.raw(` + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_course_id_fkey" TO "user_course_service_progress_course_fkey"; + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_user_id_fkey" TO "user_course_service_progress_user_fkey"; + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_service_id_fkey" TO "user_course_service_progress_service_fkey"; + ALTER TABLE "user_course_service_progress" + RENAME CONSTRAINT "user_course_service_progress_user_course_progress_id_fkey" TO "user_course_service_progress_user_course_progress_fkey"; +`) + + await knex.raw(` + ALTER TABLE "user_course_setting" + RENAME CONSTRAINT "user_course_setting_course_id_fkey" TO "UserCourseSettings_course_fkey"; + ALTER TABLE "user_course_setting" + RENAME CONSTRAINT "user_course_setting_user_id_fkey" TO "UserCourseSettings_user_fkey"; +`) + + await knex.raw(` + ALTER TABLE "user_course_settings_visibility" + RENAME CONSTRAINT "user_course_settings_visibility_course_id_fkey" TO "user_course_settings_visibility_course_fkey"; +`) + + await knex.raw(` + ALTER TABLE "user_organization" + RENAME CONSTRAINT "user_organization_organization_id_fkey" TO "user_organization_organization_fkey"; + ALTER TABLE "user_organization" + RENAME CONSTRAINT "user_organization_user_id_fkey" TO "user_organization_user_fkey"; +`) + + await knex.raw(` + ALTER TABLE "verified_user" + RENAME CONSTRAINT "verified_user_user_id_fkey" TO "verified_user_user_fkey"; +`) + + await knex.raw(` + ALTER TABLE "course_ownership" + RENAME CONSTRAINT "course_ownership_course_id_fkey" TO "course_ownership_course"; + ALTER TABLE "course_ownership" + RENAME CONSTRAINT "course_ownership_user_id_fkey" TO "course_ownership_user"; +`) + + await knex.raw(` + ALTER TABLE "course_stats_subscription" + RENAME CONSTRAINT "course_stats_subscription_user_id_fkey" TO "course_stats_subscription_user"; + ALTER TABLE "course_stats_subscription" + RENAME CONSTRAINT "course_stats_subscription_email_template_id_fkey" TO "course_stats_subscription_email_template"; +`) + + await knex.raw(` + ALTER TABLE "tag_translation" + RENAME CONSTRAINT "tag_translation_tag_id_fkey" TO "tag_translation_tag_fkey"; +`) +} diff --git a/backend/migrations/20230522111132_rename-indexes.ts b/backend/migrations/20230522111132_rename-indexes.ts new file mode 100644 index 000000000..25dcae335 --- /dev/null +++ b/backend/migrations/20230522111132_rename-indexes.ts @@ -0,0 +1,266 @@ +import { Knex } from "knex" + +export async function up(knex: Knex): Promise { + await knex.raw(` + ALTER INDEX "ab_enrollment.ab_study_id_index" + RENAME TO "ab_enrollment_ab_study_id_idx"; + `) + await knex.raw(` + ALTER INDEX "completion.completion_language_index" + RENAME TO "completion_completion_language_idx"; + ALTER INDEX "completion.course_id_user_id_ordered_index" + RENAME TO "completion_course_id_user_id_created_at_idx"; + ALTER INDEX "completion.user_id_course_id_ordered_index" + RENAME TO "completion_user_id_course_id_created_at_idx"; + `) + await knex.raw(` + ALTER INDEX "completion_registered.completion_id_index" + RENAME TO "completion_registered_completion_id_idx"; + ALTER INDEX "completion_registered.course_id_index" + RENAME TO "completion_registered_course_id_idx"; + ALTER INDEX "completion_registered.organization_id_index" + RENAME TO "completion_registered_organization_id_idx"; + ALTER INDEX "completion_registered.user_id_course_id_index" + RENAME TO "completion_registered_user_id_course_id_idx"; + `) + await knex.raw(` + ALTER INDEX "course.completion_email_id_index" + RENAME TO "course_completion_email_id_idx"; + ALTER INDEX "course.completions_handled_by_index" + RENAME TO "course_completions_handled_by_id_idx"; + ALTER INDEX "course.status_index" + RENAME TO "course_status_idx"; + `) + await knex.raw(` + ALTER INDEX "course_alias.course_id" + RENAME TO "course_alias_course_id_idx"; + `) + await knex.raw(` + ALTER INDEX "course_translation.course_id_language_index" + RENAME TO "course_translation_course_id_language_idx"; + ALTER INDEX "course_translation.name_index" + RENAME TO "course_translation_name_idx"; + `) + await knex.raw(` + ALTER INDEX "course_variant.course_id" + RENAME TO "course_variant_course_id_idx"; + ALTER INDEX "course_variant.slug" + RENAME TO "course_variant_slug_idx"; + `) + await knex.raw(` + ALTER INDEX "email_delivery.email_template_id_index" + RENAME TO "email_delivery_email_template_id_idx"; + ALTER INDEX "email_delivery.user_id_email_template_id" + RENAME TO "email_delivery_user_id_email_template_id_idx"; + `) + await knex.raw(` + ALTER INDEX "email_template.triggered_automatically_template_type_index" + RENAME TO "email_template_triggered_automatically_by_course_id_templat_idx"; + `) + await knex.raw(` + ALTER INDEX "exercise.course_id_service_id_custom_id_index" + RENAME TO "exercise_course_id_service_id_custom_id_idx"; + ALTER INDEX "exercise.custom_id_index" + RENAME TO "exercise_custom_id_idx"; + ALTER INDEX "exercise.service_id_index" + RENAME TO "exercise_service_id_idx"; + `) + await knex.raw(` + ALTER INDEX "exercise_completion.user_id_exercise_id_ordered_index" + RENAME TO "exercise_completion_user_id_exercise_id_timestamp_updated_a_idx"; + `) + await knex.raw(` + ALTER INDEX "open_university_registration_link.course_id_index" + RENAME TO "open_university_registration_link_course_id_idx"; + `) + await knex.raw(` + ALTER INDEX "organization.creator_id_index" + RENAME TO "organization_creator_id_idx"; + `) + await knex.raw(` + ALTER INDEX "organization_translation.organization_id_index" + RENAME TO "organization_translation_organization_id_idx"; + `) + await knex.raw(` + ALTER INDEX "stored_data.user_id_index" + RENAME TO "stored_data_user_id_idx"; + `) + await knex.raw(` + ALTER INDEX "study_module_translation.study_module_id_language_index" + RENAME TO "study_module_translation_study_module_id_language_idx"; + `) + await knex.raw(` + ALTER INDEX "user.trgm_email_index" + RENAME TO "user_email_idx"; + ALTER INDEX "user.trgm_first_name_last_name_index" + RENAME TO "user_first_name_last_name_idx"; + ALTER INDEX "user.trgm_last_name_index" + RENAME TO "user_last_name_idx"; + `) + await knex.raw(` + ALTER INDEX "user_course_progress.course_id_user_id" + RENAME TO "user_course_progress_course_id_user_id_idx"; + ALTER INDEX "user_course_progress.user_id_index" + RENAME TO "user_course_progress_user_id_idx"; + `) + await knex.raw(` + ALTER INDEX "user_course_service_progress.course_id_index" + RENAME TO "user_course_service_progress_course_id_idx"; + ALTER INDEX "user_course_service_progress.service_id_course_id_user_id" + RENAME TO "user_course_service_progress_service_id_course_id_user_id_idx"; + ALTER INDEX "user_course_service_progress.user_id_index" + RENAME TO "user_course_service_progress_user_id_idx"; + `) + await knex.raw(` + ALTER INDEX "user_course_setting.country_index" + RENAME TO "user_course_setting_country_idx"; + ALTER INDEX "user_course_setting.course_user_ordered_index" + RENAME TO "user_course_setting_course_id_user_id_created_at_idx"; + ALTER INDEX "user_course_setting.language_index" + RENAME TO "user_course_setting_language_idx"; + ALTER INDEX "user_course_setting.user_id" + RENAME TO "user_course_setting_user_id_idx"; + `) +} + +export async function down(knex: Knex): Promise { + await knex.raw(` + ALTER INDEX "ab_enrollment_ab_study_id_idx" + RENAME TO "ab_enrollment.ab_study_id_index"; +`) + + await knex.raw(` + ALTER INDEX "completion_completion_language_idx" + RENAME TO "completion.completion_language_index"; + ALTER INDEX "completion_course_id_user_id_created_at_idx" + RENAME TO "completion.course_id_user_id_ordered_index"; + ALTER INDEX "completion_user_id_course_id_created_at_idx" + RENAME TO "completion.user_id_course_id_ordered_index"; +`) + + await knex.raw(` + ALTER INDEX "completion_registered_completion_id_idx" + RENAME TO "completion_registered.completion_id_index"; + ALTER INDEX "completion_registered_course_id_idx" + RENAME TO "completion_registered.course_id_index"; + ALTER INDEX "completion_registered_organization_id_idx" + RENAME TO "completion_registered.organization_id_index"; + ALTER INDEX "completion_registered_user_id_course_id_idx" + RENAME TO "completion_registered.user_id_course_id_index"; +`) + + await knex.raw(` + ALTER INDEX "course_completion_email_id_idx" + RENAME TO "course.completion_email_id_index"; + ALTER INDEX "course_completions_handled_by_id_idx" + RENAME TO "course.completions_handled_by_index"; + ALTER INDEX "course_status_idx" + RENAME TO "course.status_index"; +`) + + await knex.raw(` + ALTER INDEX "course_alias_course_id_idx" + RENAME TO "course_alias.course_id"; +`) + + await knex.raw(` + ALTER INDEX "course_translation_course_id_language_idx" + RENAME TO "course_translation.course_id_language_index"; + ALTER INDEX "course_translation_name_idx" + RENAME TO "course_translation.name_index"; +`) + + await knex.raw(` + ALTER INDEX "course_variant_course_id_idx" + RENAME TO "course_variant.course_id"; + ALTER INDEX "course_variant_slug_idx" + RENAME TO "course_variant.slug"; +`) + + await knex.raw(` + ALTER INDEX "email_delivery_email_template_id_idx" + RENAME TO "email_delivery.email_template_id_index"; + ALTER INDEX "email_delivery_user_id_email_template_id_idx" + RENAME TO "email_delivery.user_id_email_template_id"; +`) + + await knex.raw(` + ALTER INDEX "email_template_triggered_automatically_by_course_id_templat_idx" + RENAME TO "email_template.triggered_automatically_template_type_index"; +`) + + await knex.raw(` + ALTER INDEX "exercise_course_id_service_id_custom_id_idx" + RENAME TO "exercise.course_id_service_id_custom_id_index"; + ALTER INDEX "exercise_custom_id_idx" + RENAME TO "exercise.custom_id_index"; + ALTER INDEX "exercise_service_id_idx" + RENAME TO "exercise.service_id_index"; +`) + + await knex.raw(` + ALTER INDEX "exercise_completion_user_id_exercise_id_timestamp_updated_a_idx" + RENAME TO "exercise_completion.user_id_exercise_id_ordered_index"; +`) + + await knex.raw(` + ALTER INDEX "open_university_registration_link_course_id_idx" + RENAME TO "open_university_registration_link.course_id_index"; +`) + + await knex.raw(` + ALTER INDEX "organization_creator_id_idx" + RENAME TO "organization.creator_id_index"; +`) + + await knex.raw(` + ALTER INDEX "organization_translation_organization_id_idx" + RENAME TO "organization_translation.organization_id_index"; +`) + + await knex.raw(` + ALTER INDEX "stored_data_user_id_idx" + RENAME TO "stored_data.user_id_index"; +`) + + await knex.raw(` + ALTER INDEX "study_module_translation_study_module_id_language_idx" + RENAME TO "study_module_translation.study_module_id_language_index"; +`) + + await knex.raw(` + ALTER INDEX "user_email_idx" + RENAME TO "user.trgm_email_index"; + ALTER INDEX "user_first_name_last_name_idx" + RENAME TO "user.trgm_first_name_last_name_index"; + ALTER INDEX "user_last_name_idx" + RENAME TO "user.trgm_last_name_index"; +`) + + await knex.raw(` + ALTER INDEX "user_course_progress_course_id_user_id_idx" + RENAME TO "user_course_progress.course_id_user_id"; + ALTER INDEX "user_course_progress_user_id_idx" + RENAME TO "user_course_progress.user_id_index"; +`) + + await knex.raw(` + ALTER INDEX "user_course_service_progress_course_id_idx" + RENAME TO "user_course_service_progress.course_id_index"; + ALTER INDEX "user_course_service_progress_service_id_course_id_user_id_idx" + RENAME TO "user_course_service_progress.service_id_course_id_user_id"; + ALTER INDEX "user_course_service_progress_user_id_idx" + RENAME TO "user_course_service_progress.user_id_index"; +`) + + await knex.raw(` + ALTER INDEX "user_course_setting_country_idx" + RENAME TO "user_course_setting.country_index"; + ALTER INDEX "user_course_setting_course_id_user_id_created_at_idx" + RENAME TO "user_course_setting.course_user_ordered_index"; + ALTER INDEX "user_course_setting_language_idx" + RENAME TO "user_course_setting.language_index"; + ALTER INDEX "user_course_setting_user_id_idx" + RENAME TO "user_course_setting.user_id"; +`) +} diff --git a/backend/migrations/20230522121925_rename-unique-constraints.ts b/backend/migrations/20230522121925_rename-unique-constraints.ts new file mode 100644 index 000000000..c25e508c1 --- /dev/null +++ b/backend/migrations/20230522121925_rename-unique-constraints.ts @@ -0,0 +1,103 @@ +import { Knex } from "knex" + +export async function up(knex: Knex): Promise { + await knex.raw(` + ALTER INDEX "ab_enrollment.user_id_ab_study_id._UNIQUE" + RENAME TO "ab_enrollment_user_id_ab_study_id_key"; + `) + await knex.raw(` + ALTER INDEX "ab_studies.name._UNIQUE" + RENAME TO "ab_study_name_key"; + `) + await knex.raw(` + ALTER INDEX "course.slug._UNIQUE" + RENAME TO "course_slug_key"; + `) + await knex.raw(` + ALTER INDEX "course_alias.course_code._UNIQUE" + RENAME TO "course_alias_course_code_key"; + `) + await knex.raw(` + ALTER INDEX "organization.slug._UNIQUE" + RENAME TO "organization_slug_key"; + ALTER INDEX "organization.secret_key._UNIQUE" + RENAME TO "organization_secret_key_key"; + `) + await knex.raw(` + ALTER INDEX "study_module.slug._UNIQUE" + RENAME TO "study_module_slug_key"; + `) + await knex.raw(` + ALTER INDEX "user.upstream_id._UNIQUE" + RENAME TO "user_upstream_id_key"; + ALTER INDEX "user.username._UNIQUE" + RENAME TO "user_username_key"; + `) + await knex.raw(` + ALTER INDEX "course_ownership.user_id_course_id._UNIQUE" + RENAME TO "course_ownership_user_id_course_id_key"; + `) + await knex.raw(` + ALTER INDEX "course_stats_subscription.user_id_email_template_id._UNIQUE" + RENAME TO "course_stats_subscription_user_id_email_template_id_key"; + `) + await knex.raw(` + ALTER INDEX "tag_translation.name_language._UNIQUE" + RENAME TO "tag_translation_name_language_key"; + `) + await knex.raw(` + ALTER INDEX "UserAppDatumConfig.name._UNIQUE" + RENAME TO "user_app_datum_config_name_key"; + `) +} + +export async function down(knex: Knex): Promise { + await knex.raw(` + ALTER INDEX "ab_enrollment_user_id_ab_study_id_key" + RENAME TO "ab_enrollment.user_id_ab_study_id._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "ab_study_name_key" + RENAME TO "ab_studies.name._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "course_slug_key" + RENAME TO "course.slug._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "course_alias_course_code_key" + RENAME TO "course_alias.course_code._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "organization_slug_key" + RENAME TO "organization.slug._UNIQUE"; + ALTER INDEX "organization_secret_key_key" + RENAME TO "organization.secret_key._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "study_module_slug_key" + RENAME TO "study_module.slug._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "user_upstream_id_key" + RENAME TO "user.upstream_id._UNIQUE"; + ALTER INDEX "user_username_key" + RENAME TO "user.username._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "course_ownership_user_id_course_id_key" + RENAME TO "course_ownership.user_id_course_id._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "course_stats_subscription_user_id_email_template_id_key" + RENAME TO "course_stats_subscription.user_id_email_template_id._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "tag_translation_name_language_key" + RENAME TO "tag_translation.name_language._UNIQUE"; + `) + await knex.raw(` + ALTER INDEX "user_app_datum_config_name_key" + RENAME TO "UserAppDatumConfig.name._UNIQUE"; + `) +} diff --git a/backend/migrations/20230522122836_alter-table-email-template-remove-duplicate-index.ts b/backend/migrations/20230522122836_alter-table-email-template-remove-duplicate-index.ts new file mode 100644 index 000000000..b30af120c --- /dev/null +++ b/backend/migrations/20230522122836_alter-table-email-template-remove-duplicate-index.ts @@ -0,0 +1,11 @@ +import { Knex } from "knex" + +export async function up(knex: Knex): Promise { + await knex.raw(` + DROP INDEX IF EXISTS "email_template.triggered_automatically_template_type_index"; + `) +} + +export async function down(_knex: Knex): Promise { + // do nothing +} diff --git a/backend/migrations/20230522123809_rename-primary-keys.ts b/backend/migrations/20230522123809_rename-primary-keys.ts new file mode 100644 index 000000000..295cd694e --- /dev/null +++ b/backend/migrations/20230522123809_rename-primary-keys.ts @@ -0,0 +1,23 @@ +import { Knex } from "knex" + +export async function up(knex: Knex): Promise { + await knex.raw(` + ALTER INDEX "UserAppDatumConfig_pkey" + RENAME TO "user_app_datum_config_pkey"; + `) + await knex.raw(` + ALTER INDEX "UserCourseSettings_pkey" + RENAME TO "user_course_setting_pkey"; + `) +} + +export async function down(knex: Knex): Promise { + await knex.raw(` + ALTER INDEX "user_app_datum_config_pkey" + RENAME TO "UserAppDatumConfig_pkey"; + `) + await knex.raw(` + ALTER INDEX "user_course_setting_pkey" + RENAME TO "UserCourseSettings_pkey"; + `) +} diff --git a/backend/migrations/20230522124532_alter-table-email-delivery-add-primary-key.ts b/backend/migrations/20230522124532_alter-table-email-delivery-add-primary-key.ts new file mode 100644 index 000000000..0d85d5c6b --- /dev/null +++ b/backend/migrations/20230522124532_alter-table-email-delivery-add-primary-key.ts @@ -0,0 +1,15 @@ +import { Knex } from "knex" + +export async function up(knex: Knex): Promise { + await knex.raw(` + ALTER TABLE "email_delivery" + ADD CONSTRAINT "email_delivery_pkey" PRIMARY KEY (id); + `) +} + +export async function down(knex: Knex): Promise { + await knex.raw(` + ALTER TABLE "email_delivery" + DROP CONSTRAINT "email_delivery_pkey"; + `) +} diff --git a/backend/migrations/20230522133214_alter-table-course-to-tag-add-b-index.ts b/backend/migrations/20230522133214_alter-table-course-to-tag-add-b-index.ts new file mode 100644 index 000000000..e53d97f1b --- /dev/null +++ b/backend/migrations/20230522133214_alter-table-course-to-tag-add-b-index.ts @@ -0,0 +1,12 @@ +import { Knex } from "knex" + +export async function up(knex: Knex): Promise { + await knex.raw(` + CREATE INDEX "_CourseToTag_B_index" + ON "_CourseToTag" ("B"); + `) +} + +export async function down(_knex: Knex): Promise { + // do nothing +} diff --git a/backend/package-lock.json b/backend/package-lock.json index 94487cb90..f1246525e 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -14,7 +14,8 @@ "@devoxa/prisma-relay-cursor-connection": "^2.2.2", "@google-cloud/storage": "^6.10.0", "@graphql-tools/schema": "^9.0.19", - "@prisma/client": "2.23.0", + "@morgothulhu/nexus-plugin-prisma": "^0.43.13", + "@prisma/client": "^4.13.0", "@sentry/integrations": "^6.19.7", "@sentry/node": "^6.19.7", "axios": "^1.4.0", @@ -39,13 +40,13 @@ "morgan": "^1.10.0", "newrelic": "^9.15.0", "nexus": "^1.3.0", - "nexus-plugin-prisma": "^0.35.0", "node-rdkafka": "^2.16.0", "nodemailer": "^6.9.1", "patch-package": "^7.0.0", "pg": "^8.10.0", "pg-query-stream": "^4.4.0", - "prisma": "^2.23.0", + "prisma": "^4.13.0", + "prisma-graphql-type-decimal": "^3.0.0", "redis": "^4.6.6", "sharp": "^0.32.1", "shortid": "^2.2.16", @@ -93,7 +94,6 @@ "nanoid": "^3.3.2", "nock": "^13.3.1", "prettier": "^2.8.8", - "prisma": "2.23.0", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", @@ -372,7 +372,6 @@ "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -769,7 +768,6 @@ "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -816,7 +814,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -830,7 +827,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -842,7 +838,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -856,7 +851,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -865,7 +859,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -874,7 +867,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2737,6 +2729,63 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@morgothulhu/nexus-plugin-prisma": { + "version": "0.43.13", + "resolved": "https://registry.npmjs.org/@morgothulhu/nexus-plugin-prisma/-/nexus-plugin-prisma-0.43.13.tgz", + "integrity": "sha512-m/HXlAzvg/+886ijAykm3cWcuAa63lvtWLJU8PW/umecgvMcpRTpMXsfYFCRF3THVSIvvwpDBmi8bSXfrmuRTA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/internals": "4.13.0", + "camelcase": "^6.3.0", + "endent": "2.1.0", + "escape-string-regexp": "^4.0.0", + "fs-jetpack": "5.1.0", + "lodash": "4.17.21", + "pluralize": "8.0.0", + "semver": "7.3.8" + }, + "peerDependencies": { + "@prisma/client": "4.13.0", + "graphql": "16.6.0", + "nexus": "1.3.0" + } + }, + "node_modules/@morgothulhu/nexus-plugin-prisma/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@morgothulhu/nexus-plugin-prisma/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@morgothulhu/nexus-plugin-prisma/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@newrelic/aws-sdk": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-5.0.2.tgz", @@ -2786,16 +2835,109 @@ "newrelic": ">=6.11.0" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.13.0.tgz", + "integrity": "sha512-2dBX3Sj99H96uwJKvc2w9NOiNgbvAO6mOFJFramNkKfS9O4Um+VWgpnlAazoYjT6kUJ1MP70KQ5ngD4ed+4NUw==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.13.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.5.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.13.0.tgz", + "integrity": "sha512-euqjOkiN6xhjE//0vQYGvbStxoD/WWQRhDiO0OTLlnLBO9Yw2Gd/VoSx2H+svsebjzYk5OxLuREBmcdw6rbUNg==", + "dependencies": { + "@opentelemetry/core": "1.13.0", + "@opentelemetry/semantic-conventions": "1.13.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.5.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.13.0.tgz", + "integrity": "sha512-moTiQtc0uPR1hQLt6gLDJH9IIkeBhgRb71OKjNHZPE1VF45fHtD6nBDi5J/DkTHTwYP5X3kBJLa3xN7ub6J4eg==", + "dependencies": { + "@opentelemetry/core": "1.13.0", + "@opentelemetry/resources": "1.13.0", + "@opentelemetry/semantic-conventions": "1.13.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.5.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.13.0.tgz", + "integrity": "sha512-LMGqfSZkaMQXqewO0o1wvWr/2fQdCh4a3Sqlxka/UsJCe0cfLulh6x2aqnKLnsrSGiCq5rSCwvINd152i0nCqw==", + "engines": { + "node": ">=14" + } + }, "node_modules/@prisma/client": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.23.0.tgz", - "integrity": "sha512-xsHdo3+wIH0hJVGfKHYTEKtifStjKH0b5t8t7hV32Fypq6+3uxhAi3F25yxuI4XSHXg21nb7Ha82lNwU/0TERA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.13.0.tgz", + "integrity": "sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b" + "@prisma/engines-version": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a" }, "engines": { - "node": ">=10.16" + "node": ">=14.17" }, "peerDependencies": { "prisma": "*" @@ -2806,17 +2948,352 @@ } } }, + "node_modules/@prisma/debug": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.13.0.tgz", + "integrity": "sha512-JrltTewF/paRb5mcM5OvcEi9DtdX0sINOAswruxKQrwOLA7Phqb52OfY38MIzGrsrJ8iUGVqQ5bpYZYpxOGCsQ==", + "dependencies": { + "@types/debug": "4.1.7", + "debug": "4.3.4", + "strip-ansi": "6.0.1" + } + }, + "node_modules/@prisma/engine-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/engine-core/-/engine-core-4.13.0.tgz", + "integrity": "sha512-D+jooGRXKAZcsBanhvFhqXMvNEiNaP+OaOvFOM/eKQQXM0FwtKc27l7mQFv4dd/zOufr5T+fJyrTTQhWyV8oFg==", + "dependencies": { + "@opentelemetry/api": "^1.3.0", + "@opentelemetry/sdk-trace-base": "^1.8.0", + "@prisma/debug": "4.13.0", + "@prisma/engines": "4.13.0", + "@prisma/generator-helper": "4.13.0", + "@prisma/get-platform": "4.13.0", + "chalk": "4.1.2", + "execa": "5.1.1", + "get-stream": "6.0.1", + "indent-string": "4.0.0", + "new-github-issue-url": "0.2.1", + "p-retry": "4.6.2", + "strip-ansi": "6.0.1", + "ts-pattern": "4.2.2", + "undici": "5.21.0" + } + }, + "node_modules/@prisma/engine-core/node_modules/ts-pattern": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.2.tgz", + "integrity": "sha512-qzJMo2pbkUJWusRH5o8xR+xogn6RmvViyUgwBFTtRENLse470clCGjHDf6haWGZ1AOmk8XkEohUoBW8Uut6Scg==" + }, "node_modules/@prisma/engines": { - "version": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.tgz", - "integrity": "sha512-Tgk3kggO5B9IT6mimJAw6HSxbFoDAuDKL3sHHSS41EnQm76j/nf4uhGZFPzOQwZWOLeT5ZLO2khr4/FCA9Nkhw==", - "devOptional": true, + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.13.0.tgz", + "integrity": "sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==", "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.tgz", - "integrity": "sha512-VNgnOe+oPQKmy3HOtWi/Q1fvcKZUQkf1OfTD1pzrLBx9tJPejyxt1Mq54L+OOAuYvfrua6bmfojFVLh7uXuWVw==" + "version": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a.tgz", + "integrity": "sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==" + }, + "node_modules/@prisma/fetch-engine": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.13.0.tgz", + "integrity": "sha512-khMMm3I8nMUgwd7DoM1wBFjMKn/Z5PZF27EMQGPtquM1nRt601blJbep0qodXR7oHioQolCK8gfbw5Hfdml1mg==", + "dependencies": { + "@prisma/debug": "4.13.0", + "@prisma/get-platform": "4.13.0", + "chalk": "4.1.2", + "execa": "5.1.1", + "find-cache-dir": "3.3.2", + "fs-extra": "11.1.1", + "hasha": "5.2.2", + "http-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", + "node-fetch": "2.6.9", + "p-filter": "2.1.0", + "p-map": "4.0.0", + "p-retry": "4.6.2", + "progress": "2.0.3", + "rimraf": "3.0.2", + "temp-dir": "2.0.0", + "tempy": "1.0.1" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@prisma/fetch-engine/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@prisma/generator-helper": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.13.0.tgz", + "integrity": "sha512-Zx9rtbsEIU/9DKnGRvmjLdyeyhzeeXNFp1alkRh1w//rQ5jTcobiay/jU4Qo+EQOs2bnWEfUeiBoOjfaysdLNg==", + "dependencies": { + "@prisma/debug": "4.13.0", + "@types/cross-spawn": "6.0.2", + "chalk": "4.1.2", + "cross-spawn": "7.0.3" + } + }, + "node_modules/@prisma/get-platform": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.13.0.tgz", + "integrity": "sha512-HWBgQNpRi1qEXj24w/qsWCpTW4vKP2/pdiYTyl2SSEVoK4o5izHUt0PQzNl5St5CGr4SDcSyi0C3fXINd46c6A==", + "dependencies": { + "@prisma/debug": "4.13.0", + "chalk": "4.1.2", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "fs-jetpack": "5.1.0", + "replace-string": "3.1.0", + "strip-ansi": "6.0.1", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "ts-pattern": "4.2.2" + } + }, + "node_modules/@prisma/get-platform/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/get-platform/node_modules/ts-pattern": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.2.tgz", + "integrity": "sha512-qzJMo2pbkUJWusRH5o8xR+xogn6RmvViyUgwBFTtRENLse470clCGjHDf6haWGZ1AOmk8XkEohUoBW8Uut6Scg==" + }, + "node_modules/@prisma/internals": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.13.0.tgz", + "integrity": "sha512-TxdTQFJO0zMCx0Tgb6UZt3WsVt+etvtWx+LaSWf4Pk1ECGte5w+9iiuypwjiLortSn7qm6n5KVWTXFOnnZr4Ww==", + "dependencies": { + "@prisma/debug": "4.13.0", + "@prisma/engine-core": "4.13.0", + "@prisma/engines": "4.13.0", + "@prisma/fetch-engine": "4.13.0", + "@prisma/generator-helper": "4.13.0", + "@prisma/get-platform": "4.13.0", + "@prisma/ni": "4.13.0", + "@prisma/prisma-fmt-wasm": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", + "archiver": "5.3.1", + "arg": "5.0.2", + "chalk": "4.1.2", + "checkpoint-client": "1.1.23", + "cli-truncate": "2.1.0", + "dotenv": "16.0.3", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "find-up": "5.0.0", + "fp-ts": "2.13.1", + "fs-extra": "11.1.1", + "fs-jetpack": "5.1.0", + "global-dirs": "3.0.1", + "globby": "11.1.0", + "has-yarn": "2.1.0", + "is-windows": "^1.0.2", + "is-wsl": "^2.2.0", + "new-github-issue-url": "0.2.1", + "node-fetch": "2.6.9", + "npm-packlist": "5.1.3", + "open": "7", + "ora": "5.4.1", + "p-map": "4.0.0", + "prompts": "2.4.2", + "read-pkg-up": "7.0.1", + "replace-string": "3.1.0", + "resolve": "1.22.1", + "string-width": "4.2.3", + "strip-ansi": "6.0.1", + "strip-indent": "3.0.0", + "temp-dir": "2.0.0", + "temp-write": "4.0.0", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "tmp": "0.2.1", + "ts-pattern": "^4.0.1" + } + }, + "node_modules/@prisma/internals/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/@prisma/internals/node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@prisma/internals/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@prisma/internals/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@prisma/internals/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/internals/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@prisma/internals/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@prisma/ni": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/ni/-/ni-4.13.0.tgz", + "integrity": "sha512-FN1wV1I61P6WndheLpja5oQuzIW2WkYqFViPL5GS5dhrpsO69SlyOnAsxpfCKUa5HhXINi7fowgdcngK1QDW9w==" + }, + "node_modules/@prisma/prisma-fmt-wasm": { + "version": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", + "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a.tgz", + "integrity": "sha512-kEYSUa3XT1Oiu/MbdUkyjfVtAOQmZz69KGKFH/GWoQNLvkscrqy4J4XewEY80BrVuyC3vbV7un4kea0xklWhpA==" }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", @@ -3207,6 +3684,22 @@ "@types/node": "*" } }, + "node_modules/@types/cross-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", + "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", @@ -3387,6 +3880,11 @@ "@types/node": "*" } }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "node_modules/@types/node": { "version": "18.16.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", @@ -3410,6 +3908,11 @@ "@types/node": "*" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -3426,6 +3929,11 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "node_modules/@types/serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", @@ -3564,11 +4072,22 @@ "node": ">= 6.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -3614,8 +4133,59 @@ "node": ">= 8" } }, - "node_modules/arg": { - "version": "4.1.3", + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/arg": { + "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true @@ -3634,6 +4204,14 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", @@ -3642,6 +4220,14 @@ "node": ">=8" } }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -4039,6 +4625,14 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -4166,6 +4760,33 @@ "node": ">=10" } }, + "node_modules/checkpoint-client": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.23.tgz", + "integrity": "sha512-NrGvMiH1fUcZwrYc0Z+YTn7q9ysV0kPgVyDKZ5jrfIerFJuSllvyGsY7bHeQSEiljaIaUP1Q/xutZ8q1s7PGzg==", + "dependencies": { + "ci-info": "3.3.0", + "env-paths": "2.2.1", + "fast-write-atomic": "0.2.1", + "make-dir": "3.1.0", + "ms": "2.1.3", + "node-fetch": "2.6.7", + "uuid": "8.3.2" + } + }, + "node_modules/checkpoint-client/node_modules/ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + }, + "node_modules/checkpoint-client/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -4206,6 +4827,51 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -4216,6 +4882,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", @@ -4320,6 +4994,25 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/compressible": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", @@ -4517,6 +5210,11 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -4529,6 +5227,29 @@ "node": ">= 0.10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -4574,6 +5295,14 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -4652,6 +5381,52 @@ "node": ">=0.10.0" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4723,6 +5498,17 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", @@ -4854,11 +5640,18 @@ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -4909,7 +5702,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -4964,7 +5756,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -5189,6 +5980,21 @@ "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-parse": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", @@ -5205,6 +6011,19 @@ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" }, + "node_modules/fast-write-atomic": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz", + "integrity": "sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -5276,11 +6095,26 @@ "node": ">= 0.8" } }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -5293,7 +6127,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -5354,6 +6187,11 @@ "node": ">= 0.6" } }, + "node_modules/fp-ts": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.13.1.tgz", + "integrity": "sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ==" + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -5390,12 +6228,30 @@ } }, "node_modules/fs-jetpack": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-4.3.1.tgz", - "integrity": "sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", + "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", "dependencies": { - "minimatch": "^3.0.2", - "rimraf": "^2.6.3" + "minimatch": "^5.1.0" + } + }, + "node_modules/fs-jetpack/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/fs-jetpack/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/fs.realpath": { @@ -5510,7 +6366,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -5551,7 +6406,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5559,6 +6413,28 @@ "node": ">= 6" } }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -5568,6 +6444,25 @@ "node": ">=4" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/google-auth-library": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.6.0.tgz", @@ -5753,6 +6648,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, "node_modules/helmet": { "version": "6.1.5", "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.1.5.tgz", @@ -5761,6 +6687,11 @@ "node": ">=14.0.0" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5796,9 +6727,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -5811,7 +6742,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "engines": { "node": ">=10.17.0" } @@ -5846,15 +6776,53 @@ } ] }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -5879,6 +6847,14 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5917,8 +6893,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -5933,9 +6908,9 @@ } }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -5961,7 +6936,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5987,7 +6961,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5995,6 +6968,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6003,6 +6984,22 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -6016,6 +7013,25 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -6027,6 +7043,11 @@ "node": ">=8" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6757,8 +7778,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -6796,8 +7816,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -6881,7 +7900,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, "engines": { "node": ">=6" } @@ -6941,6 +7959,31 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6961,8 +8004,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/localforage": { "version": "1.10.0", @@ -7045,6 +8087,26 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7056,6 +8118,26 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/logform": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", @@ -7113,7 +8195,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -7128,7 +8209,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -7164,8 +8244,15 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } }, "node_modules/methods": { "version": "1.1.2", @@ -7232,7 +8319,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -7248,6 +8334,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -7350,6 +8444,14 @@ "node": ">= 0.6" } }, + "node_modules/new-github-issue-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", + "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==", + "engines": { + "node": ">=10" + } + }, "node_modules/newrelic": { "version": "9.15.0", "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-9.15.0.tgz", @@ -7398,50 +8500,6 @@ "graphql": "15.x || 16.x" } }, - "node_modules/nexus-plugin-prisma": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/nexus-plugin-prisma/-/nexus-plugin-prisma-0.35.0.tgz", - "integrity": "sha512-zZh96Ol6eqDGGd2caZLayjDW5ruUxNdoglyAMa/bOTBfnxu1Keb9kOyD+n7zVV+Mot8t0GRvWS4XilXoKZF/Tg==", - "hasInstallScript": true, - "dependencies": { - "camelcase": "^6.2.0", - "endent": "^2.0.1", - "fs-jetpack": "^4.1.0", - "lodash": "^4.17.20", - "pluralize": "^8.0.0", - "semver": "^7.3.4" - }, - "peerDependencies": { - "@prisma/client": "2.23.x", - "graphql": "^15.3.0", - "nexus": "^1.0.0" - } - }, - "node_modules/nexus-plugin-prisma/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nexus-plugin-prisma/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/nexus/node_modules/iterall": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", @@ -7516,25 +8574,6 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -7599,20 +8638,102 @@ "node": ">=6.0.0" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/npm-bundled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-packlist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -7688,7 +8809,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -7714,6 +8834,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -7722,6 +8864,25 @@ "node": ">=0.10.0" } }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7740,7 +8901,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -7752,7 +8912,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -7763,11 +8922,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -7781,7 +8965,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -7843,7 +9026,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -7874,8 +9056,16 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "node_modules/pg": { - "version": "8.10.0", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pg": { + "version": "8.10.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", "dependencies": { @@ -7997,7 +9187,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -8115,27 +9304,47 @@ } }, "node_modules/prisma": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-2.23.0.tgz", - "integrity": "sha512-3c/lmDy8nsPcEsfCufvCTJUEuwmAcTPbeGg9fL1qjlvS314duLUA/k2nm3n1rq4ImKqzeC5uaKfvI2IoAfwrJA==", - "devOptional": true, + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.13.0.tgz", + "integrity": "sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==", "hasInstallScript": true, "dependencies": { - "@prisma/engines": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b" + "@prisma/engines": "4.13.0" }, "bin": { "prisma": "build/index.js", "prisma2": "build/index.js" }, "engines": { - "node": ">=10.4" + "node": ">=14.17" + } + }, + "node_modules/prisma-graphql-type-decimal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prisma-graphql-type-decimal/-/prisma-graphql-type-decimal-3.0.0.tgz", + "integrity": "sha512-jrALv8ShVZoBBNyIOBCxwRoLM/DAOSD/OBKTWeJa9UigQXUTZniNXvLd4fLXwm+3v00A7cOZ1fFh3b74Ndgxhw==", + "peerDependencies": { + "@prisma/client": ">=4.12 <=5", + "graphql": "16" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" } }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -8242,6 +9451,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -8292,6 +9520,52 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -8305,6 +9579,33 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -8411,6 +9712,17 @@ "jsesc": "bin/jsesc" } }, + "node_modules/replace-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", + "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8420,12 +9732,16 @@ } }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8460,6 +9776,18 @@ "node": ">=10" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -8480,6 +9808,15 @@ "node": ">=12" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -8491,6 +9828,28 @@ "rimraf": "bin.js" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", @@ -8707,8 +10066,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-concat": { "version": "1.0.1", @@ -8769,14 +10127,25 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "engines": { "node": ">=8" } @@ -8805,6 +10174,34 @@ "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==" }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "node_modules/split2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", @@ -8943,11 +10340,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -8975,6 +10382,40 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -9024,6 +10465,90 @@ "node": ">=12" } }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-write": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz", + "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", + "dependencies": { + "graceful-fs": "^4.1.15", + "is-stream": "^2.0.0", + "make-dir": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-write/node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/temp-write/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9122,6 +10647,11 @@ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -9288,6 +10818,11 @@ "node": ">=0.4.0" } }, + "node_modules/ts-pattern": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", + "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" + }, "node_modules/tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -9343,7 +10878,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -9389,6 +10923,36 @@ "node": ">=12.20" } }, + "node_modules/undici": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", + "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/undici/node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/undici/node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/unfetch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz", @@ -9434,6 +10998,17 @@ "node": ">=4" } }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -9526,6 +11101,15 @@ "node": ">=10.12.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -9543,6 +11127,19 @@ "makeerror": "1.0.12" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "node_modules/websocket": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", @@ -9580,6 +11177,15 @@ "node": ">=12" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9804,6 +11410,19 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } } }, "dependencies": { @@ -10007,7 +11626,6 @@ "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, "requires": { "@babel/highlight": "^7.18.6" } @@ -10309,8 +11927,7 @@ "@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { "version": "7.21.0", @@ -10345,7 +11962,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -10356,7 +11972,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -10365,7 +11980,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -10376,7 +11990,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -10384,14 +11997,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -11722,6 +13333,41 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@morgothulhu/nexus-plugin-prisma": { + "version": "0.43.13", + "resolved": "https://registry.npmjs.org/@morgothulhu/nexus-plugin-prisma/-/nexus-plugin-prisma-0.43.13.tgz", + "integrity": "sha512-m/HXlAzvg/+886ijAykm3cWcuAa63lvtWLJU8PW/umecgvMcpRTpMXsfYFCRF3THVSIvvwpDBmi8bSXfrmuRTA==", + "requires": { + "@prisma/internals": "4.13.0", + "camelcase": "^6.3.0", + "endent": "2.1.0", + "escape-string-regexp": "^4.0.0", + "fs-jetpack": "5.1.0", + "lodash": "4.17.21", + "pluralize": "8.0.0", + "semver": "7.3.8" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@newrelic/aws-sdk": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-5.0.2.tgz", @@ -11751,24 +13397,351 @@ "integrity": "sha512-5nClQp9ACd4BvLusAgFHjjKLDgAaC+dKmIsRNOPC82LOLFaoOgxxtbecnDIJ0NWCKQS+WOdmXdgYutwH+e5dsA==", "requires": {} }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" + }, + "@opentelemetry/core": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.13.0.tgz", + "integrity": "sha512-2dBX3Sj99H96uwJKvc2w9NOiNgbvAO6mOFJFramNkKfS9O4Um+VWgpnlAazoYjT6kUJ1MP70KQ5ngD4ed+4NUw==", + "requires": { + "@opentelemetry/semantic-conventions": "1.13.0" + } + }, + "@opentelemetry/resources": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.13.0.tgz", + "integrity": "sha512-euqjOkiN6xhjE//0vQYGvbStxoD/WWQRhDiO0OTLlnLBO9Yw2Gd/VoSx2H+svsebjzYk5OxLuREBmcdw6rbUNg==", + "requires": { + "@opentelemetry/core": "1.13.0", + "@opentelemetry/semantic-conventions": "1.13.0" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.13.0.tgz", + "integrity": "sha512-moTiQtc0uPR1hQLt6gLDJH9IIkeBhgRb71OKjNHZPE1VF45fHtD6nBDi5J/DkTHTwYP5X3kBJLa3xN7ub6J4eg==", + "requires": { + "@opentelemetry/core": "1.13.0", + "@opentelemetry/resources": "1.13.0", + "@opentelemetry/semantic-conventions": "1.13.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.13.0.tgz", + "integrity": "sha512-LMGqfSZkaMQXqewO0o1wvWr/2fQdCh4a3Sqlxka/UsJCe0cfLulh6x2aqnKLnsrSGiCq5rSCwvINd152i0nCqw==" + }, "@prisma/client": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.23.0.tgz", - "integrity": "sha512-xsHdo3+wIH0hJVGfKHYTEKtifStjKH0b5t8t7hV32Fypq6+3uxhAi3F25yxuI4XSHXg21nb7Ha82lNwU/0TERA==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.13.0.tgz", + "integrity": "sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==", + "requires": { + "@prisma/engines-version": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a" + } + }, + "@prisma/debug": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.13.0.tgz", + "integrity": "sha512-JrltTewF/paRb5mcM5OvcEi9DtdX0sINOAswruxKQrwOLA7Phqb52OfY38MIzGrsrJ8iUGVqQ5bpYZYpxOGCsQ==", "requires": { - "@prisma/engines-version": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b" + "@types/debug": "4.1.7", + "debug": "4.3.4", + "strip-ansi": "6.0.1" + } + }, + "@prisma/engine-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/engine-core/-/engine-core-4.13.0.tgz", + "integrity": "sha512-D+jooGRXKAZcsBanhvFhqXMvNEiNaP+OaOvFOM/eKQQXM0FwtKc27l7mQFv4dd/zOufr5T+fJyrTTQhWyV8oFg==", + "requires": { + "@opentelemetry/api": "^1.3.0", + "@opentelemetry/sdk-trace-base": "^1.8.0", + "@prisma/debug": "4.13.0", + "@prisma/engines": "4.13.0", + "@prisma/generator-helper": "4.13.0", + "@prisma/get-platform": "4.13.0", + "chalk": "4.1.2", + "execa": "5.1.1", + "get-stream": "6.0.1", + "indent-string": "4.0.0", + "new-github-issue-url": "0.2.1", + "p-retry": "4.6.2", + "strip-ansi": "6.0.1", + "ts-pattern": "4.2.2", + "undici": "5.21.0" + }, + "dependencies": { + "ts-pattern": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.2.tgz", + "integrity": "sha512-qzJMo2pbkUJWusRH5o8xR+xogn6RmvViyUgwBFTtRENLse470clCGjHDf6haWGZ1AOmk8XkEohUoBW8Uut6Scg==" + } + } + }, + "@prisma/engines": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.13.0.tgz", + "integrity": "sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==" + }, + "@prisma/engines-version": { + "version": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a.tgz", + "integrity": "sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==" + }, + "@prisma/fetch-engine": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.13.0.tgz", + "integrity": "sha512-khMMm3I8nMUgwd7DoM1wBFjMKn/Z5PZF27EMQGPtquM1nRt601blJbep0qodXR7oHioQolCK8gfbw5Hfdml1mg==", + "requires": { + "@prisma/debug": "4.13.0", + "@prisma/get-platform": "4.13.0", + "chalk": "4.1.2", + "execa": "5.1.1", + "find-cache-dir": "3.3.2", + "fs-extra": "11.1.1", + "hasha": "5.2.2", + "http-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", + "node-fetch": "2.6.9", + "p-filter": "2.1.0", + "p-map": "4.0.0", + "p-retry": "4.6.2", + "progress": "2.0.3", + "rimraf": "3.0.2", + "temp-dir": "2.0.0", + "tempy": "1.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@prisma/generator-helper": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.13.0.tgz", + "integrity": "sha512-Zx9rtbsEIU/9DKnGRvmjLdyeyhzeeXNFp1alkRh1w//rQ5jTcobiay/jU4Qo+EQOs2bnWEfUeiBoOjfaysdLNg==", + "requires": { + "@prisma/debug": "4.13.0", + "@types/cross-spawn": "6.0.2", + "chalk": "4.1.2", + "cross-spawn": "7.0.3" + } + }, + "@prisma/get-platform": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.13.0.tgz", + "integrity": "sha512-HWBgQNpRi1qEXj24w/qsWCpTW4vKP2/pdiYTyl2SSEVoK4o5izHUt0PQzNl5St5CGr4SDcSyi0C3fXINd46c6A==", + "requires": { + "@prisma/debug": "4.13.0", + "chalk": "4.1.2", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "fs-jetpack": "5.1.0", + "replace-string": "3.1.0", + "strip-ansi": "6.0.1", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "ts-pattern": "4.2.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "ts-pattern": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.2.2.tgz", + "integrity": "sha512-qzJMo2pbkUJWusRH5o8xR+xogn6RmvViyUgwBFTtRENLse470clCGjHDf6haWGZ1AOmk8XkEohUoBW8Uut6Scg==" + } + } + }, + "@prisma/internals": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.13.0.tgz", + "integrity": "sha512-TxdTQFJO0zMCx0Tgb6UZt3WsVt+etvtWx+LaSWf4Pk1ECGte5w+9iiuypwjiLortSn7qm6n5KVWTXFOnnZr4Ww==", + "requires": { + "@prisma/debug": "4.13.0", + "@prisma/engine-core": "4.13.0", + "@prisma/engines": "4.13.0", + "@prisma/fetch-engine": "4.13.0", + "@prisma/generator-helper": "4.13.0", + "@prisma/get-platform": "4.13.0", + "@prisma/ni": "4.13.0", + "@prisma/prisma-fmt-wasm": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", + "archiver": "5.3.1", + "arg": "5.0.2", + "chalk": "4.1.2", + "checkpoint-client": "1.1.23", + "cli-truncate": "2.1.0", + "dotenv": "16.0.3", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "find-up": "5.0.0", + "fp-ts": "2.13.1", + "fs-extra": "11.1.1", + "fs-jetpack": "5.1.0", + "global-dirs": "3.0.1", + "globby": "11.1.0", + "has-yarn": "2.1.0", + "is-windows": "^1.0.2", + "is-wsl": "^2.2.0", + "new-github-issue-url": "0.2.1", + "node-fetch": "2.6.9", + "npm-packlist": "5.1.3", + "open": "7", + "ora": "5.4.1", + "p-map": "4.0.0", + "prompts": "2.4.2", + "read-pkg-up": "7.0.1", + "replace-string": "3.1.0", + "resolve": "1.22.1", + "string-width": "4.2.3", + "strip-ansi": "6.0.1", + "strip-indent": "3.0.0", + "temp-dir": "2.0.0", + "temp-write": "4.0.0", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "tmp": "0.2.1", + "ts-pattern": "^4.0.1" + }, + "dependencies": { + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + } } }, - "@prisma/engines": { - "version": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.tgz", - "integrity": "sha512-Tgk3kggO5B9IT6mimJAw6HSxbFoDAuDKL3sHHSS41EnQm76j/nf4uhGZFPzOQwZWOLeT5ZLO2khr4/FCA9Nkhw==", - "devOptional": true + "@prisma/ni": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@prisma/ni/-/ni-4.13.0.tgz", + "integrity": "sha512-FN1wV1I61P6WndheLpja5oQuzIW2WkYqFViPL5GS5dhrpsO69SlyOnAsxpfCKUa5HhXINi7fowgdcngK1QDW9w==" }, - "@prisma/engines-version": { - "version": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.tgz", - "integrity": "sha512-VNgnOe+oPQKmy3HOtWi/Q1fvcKZUQkf1OfTD1pzrLBx9tJPejyxt1Mq54L+OOAuYvfrua6bmfojFVLh7uXuWVw==" + "@prisma/prisma-fmt-wasm": { + "version": "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a", + "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a.tgz", + "integrity": "sha512-kEYSUa3XT1Oiu/MbdUkyjfVtAOQmZz69KGKFH/GWoQNLvkscrqy4J4XewEY80BrVuyC3vbV7un4kea0xklWhpA==" }, "@protobufjs/aspromise": { "version": "1.1.2", @@ -12134,6 +14107,22 @@ "@types/node": "*" } }, + "@types/cross-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", + "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "requires": { + "@types/ms": "*" + } + }, "@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", @@ -12313,6 +14302,11 @@ "@types/node": "*" } }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "@types/node": { "version": "18.16.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", @@ -12336,6 +14330,11 @@ "@types/node": "*" } }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, "@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -12352,6 +14351,11 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "@types/serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", @@ -12474,11 +14478,19 @@ "debug": "4" } }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "requires": { "type-fest": "^0.21.3" } @@ -12506,6 +14518,53 @@ "picomatch": "^2.0.4" } }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -12526,11 +14585,21 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, "arrify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, "async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", @@ -12826,6 +14895,11 @@ "ieee754": "^1.1.13" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -12914,6 +14988,32 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "checkpoint-client": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.23.tgz", + "integrity": "sha512-NrGvMiH1fUcZwrYc0Z+YTn7q9ysV0kPgVyDKZ5jrfIerFJuSllvyGsY7bHeQSEiljaIaUP1Q/xutZ8q1s7PGzg==", + "requires": { + "ci-info": "3.3.0", + "env-paths": "2.2.1", + "fast-write-atomic": "0.2.1", + "make-dir": "3.1.0", + "ms": "2.1.3", + "node-fetch": "2.6.7", + "uuid": "8.3.2" + }, + "dependencies": { + "ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, "chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -12946,6 +15046,33 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==" + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -12956,6 +15083,11 @@ "wrap-ansi": "^7.0.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + }, "cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", @@ -13048,6 +15180,22 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==" }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, "compressible": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", @@ -13196,6 +15344,11 @@ "browserslist": "^4.21.4" } }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -13205,6 +15358,20 @@ "vary": "^1" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -13238,6 +15405,11 @@ "which": "^2.0.1" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -13291,6 +15463,39 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "requires": { + "clone": "^1.0.2" + } + }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -13337,6 +15542,14 @@ "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, "dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", @@ -13455,11 +15668,15 @@ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -13506,8 +15723,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "esm": { "version": "3.2.25", @@ -13540,7 +15756,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -13715,6 +15930,18 @@ "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", "dev": true }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-parse": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", @@ -13731,6 +15958,19 @@ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" }, + "fast-write-atomic": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz", + "integrity": "sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==" + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -13795,11 +16035,20 @@ } } }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -13809,7 +16058,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -13849,6 +16097,11 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, + "fp-ts": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.13.1.tgz", + "integrity": "sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ==" + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -13876,12 +16129,29 @@ } }, "fs-jetpack": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-4.3.1.tgz", - "integrity": "sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", + "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", "requires": { - "minimatch": "^3.0.2", - "rimraf": "^2.6.3" + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "fs.realpath": { @@ -13961,8 +16231,7 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "getopts": { "version": "2.3.0", @@ -13991,17 +16260,44 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "requires": { + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, "google-auth-library": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.6.0.tgz", @@ -14130,11 +16426,37 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, "helmet": { "version": "6.1.5", "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.1.5.tgz", "integrity": "sha512-UgAvdoG0BhF9vcCh/j0bWtElo2ZHHk6OzC98NLCM6zK03DEVSM0vUAtT7iR+oTo2Mi6sGelAH3tL6B/uUWxV4g==" }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -14164,9 +16486,9 @@ } }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { "agent-base": "6", "debug": "4" @@ -14175,8 +16497,7 @@ "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "iconv-lite": { "version": "0.4.24", @@ -14191,6 +16512,37 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -14212,6 +16564,11 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -14244,8 +16601,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-binary-path": { "version": "2.1.0", @@ -14257,9 +16613,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "requires": { "has": "^1.0.3" } @@ -14272,8 +16628,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -14290,16 +16645,30 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -14310,6 +16679,16 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -14318,6 +16697,11 @@ "is-docker": "^2.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -14887,8 +17271,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.1", @@ -14917,8 +17300,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-stringify-safe": { "version": "5.0.1", @@ -14984,8 +17366,7 @@ "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "knex": { "version": "2.4.2", @@ -15013,6 +17394,30 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -15030,8 +17435,7 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "localforage": { "version": "1.10.0", @@ -15092,6 +17496,26 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -15103,6 +17527,20 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, "logform": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", @@ -15147,7 +17585,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" }, @@ -15155,8 +17592,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -15188,8 +17624,12 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", @@ -15231,14 +17671,18 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -15322,6 +17766,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "new-github-issue-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", + "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==" + }, "newrelic": { "version": "9.15.0", "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-9.15.0.tgz", @@ -15365,34 +17814,6 @@ } } }, - "nexus-plugin-prisma": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/nexus-plugin-prisma/-/nexus-plugin-prisma-0.35.0.tgz", - "integrity": "sha512-zZh96Ol6eqDGGd2caZLayjDW5ruUxNdoglyAMa/bOTBfnxu1Keb9kOyD+n7zVV+Mot8t0GRvWS4XilXoKZF/Tg==", - "requires": { - "camelcase": "^6.2.0", - "endent": "^2.0.1", - "fs-jetpack": "^4.1.0", - "lodash": "^4.17.20", - "pluralize": "^8.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "nock": { "version": "13.3.1", "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.1.tgz", @@ -15439,27 +17860,6 @@ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } } }, "node-forge": { @@ -15513,17 +17913,80 @@ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==" }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npm-bundled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "requires": { + "npm-normalize-package-bin": "^2.0.0" + } + }, + "npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==" + }, + "npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "requires": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "requires": { "path-key": "^3.0.0" } @@ -15581,7 +18044,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -15595,11 +18057,42 @@ "is-wsl": "^2.1.1" } }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -15612,7 +18105,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" }, @@ -15621,18 +18113,33 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } } } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "packet-reader": { "version": "1.0.0", @@ -15643,7 +18150,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -15687,8 +18193,7 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -15710,6 +18215,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, "pg": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", @@ -15800,7 +18310,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "requires": { "find-up": "^4.0.0" } @@ -15878,19 +18387,33 @@ } }, "prisma": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-2.23.0.tgz", - "integrity": "sha512-3c/lmDy8nsPcEsfCufvCTJUEuwmAcTPbeGg9fL1qjlvS314duLUA/k2nm3n1rq4ImKqzeC5uaKfvI2IoAfwrJA==", - "devOptional": true, + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.13.0.tgz", + "integrity": "sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==", "requires": { - "@prisma/engines": "2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b" + "@prisma/engines": "4.13.0" } }, + "prisma-graphql-type-decimal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prisma-graphql-type-decimal/-/prisma-graphql-type-decimal-3.0.0.tgz", + "integrity": "sha512-jrALv8ShVZoBBNyIOBCxwRoLM/DAOSD/OBKTWeJa9UigQXUTZniNXvLd4fLXwm+3v00A7cOZ1fFh3b74Ndgxhw==", + "requires": {} + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -15970,6 +18493,11 @@ "side-channel": "^1.0.4" } }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -16010,6 +18538,41 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -16020,6 +18583,32 @@ "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -16110,18 +18699,24 @@ } } }, + "replace-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", + "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -16144,6 +18739,15 @@ "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -16158,6 +18762,11 @@ "extend": "^3.0.2" } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -16166,6 +18775,14 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rxjs": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", @@ -16344,8 +18961,7 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simple-concat": { "version": "1.0.1", @@ -16380,14 +18996,22 @@ "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } }, "source-map": { "version": "0.6.1", @@ -16410,6 +19034,34 @@ "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==" }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "split2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", @@ -16516,8 +19168,15 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } }, "strip-json-comments": { "version": "2.0.1", @@ -16537,6 +19196,30 @@ "has-flag": "^4.0.0" } }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -16577,6 +19260,63 @@ "uuid": "^9.0.0" } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "temp-write": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz", + "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", + "requires": { + "graceful-fs": "^4.1.15", + "is-stream": "^2.0.0", + "make-dir": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "requires": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -16657,6 +19397,11 @@ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -16747,6 +19492,11 @@ "tsconfig": "^7.0.0" } }, + "ts-pattern": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", + "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" + }, "tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -16794,8 +19544,7 @@ "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" }, "type-is": { "version": "1.6.18", @@ -16825,6 +19574,29 @@ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true }, + "undici": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", + "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", + "requires": { + "busboy": "^1.6.0" + }, + "dependencies": { + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + } + } + }, "unfetch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz", @@ -16858,6 +19630,14 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -16918,6 +19698,15 @@ "convert-source-map": "^1.6.0" } }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -16932,6 +19721,19 @@ "makeerror": "1.0.12" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "websocket": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", @@ -16965,6 +19767,15 @@ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17120,6 +19931,16 @@ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" } } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } } } } diff --git a/backend/package.json b/backend/package.json index 84e4d03a6..80049c88f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -63,7 +63,8 @@ "@devoxa/prisma-relay-cursor-connection": "^2.2.2", "@google-cloud/storage": "^6.10.0", "@graphql-tools/schema": "^9.0.19", - "@prisma/client": "2.23.0", + "@morgothulhu/nexus-plugin-prisma": "^0.43.13", + "@prisma/client": "^4.13.0", "@sentry/integrations": "^6.19.7", "@sentry/node": "^6.19.7", "axios": "^1.4.0", @@ -88,13 +89,13 @@ "morgan": "^1.10.0", "newrelic": "^9.15.0", "nexus": "^1.3.0", - "nexus-plugin-prisma": "^0.35.0", "node-rdkafka": "^2.16.0", "nodemailer": "^6.9.1", "patch-package": "^7.0.0", "pg": "^8.10.0", "pg-query-stream": "^4.4.0", - "prisma": "^2.23.0", + "prisma": "^4.13.0", + "prisma-graphql-type-decimal": "^3.0.0", "redis": "^4.6.6", "sharp": "^0.32.1", "shortid": "^2.2.16", @@ -142,7 +143,6 @@ "nanoid": "^3.3.2", "nock": "^13.3.1", "prettier": "^2.8.8", - "prisma": "2.23.0", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", diff --git a/backend/patches/@prisma+client+2.23.0.patch b/backend/patches/@prisma+client+2.23.0.patch deleted file mode 100644 index 6d350c098..000000000 --- a/backend/patches/@prisma+client+2.23.0.patch +++ /dev/null @@ -1,40 +0,0 @@ -diff --git a/node_modules/@prisma/client/generator-build/index.js b/node_modules/@prisma/client/generator-build/index.js -index 1a3c8a3..c11d757 100644 ---- a/node_modules/@prisma/client/generator-build/index.js -+++ b/node_modules/@prisma/client/generator-build/index.js -@@ -13779,6 +13779,7 @@ var require_getPlatform2 = __commonJS2((exports2) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -@@ -15307,6 +15308,7 @@ var require_dist10 = __commonJS2((exports, module) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -diff --git a/node_modules/@prisma/client/runtime/index.js b/node_modules/@prisma/client/runtime/index.js -index 77ca68b..4d509b8 100644 ---- a/node_modules/@prisma/client/runtime/index.js -+++ b/node_modules/@prisma/client/runtime/index.js -@@ -4835,6 +4835,7 @@ var require_dist9 = __commonJS2((exports, module) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -@@ -22556,6 +22557,7 @@ var require_getPlatform2 = __commonJS2((exports2) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` diff --git a/backend/patches/@prisma+engines+2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.patch b/backend/patches/@prisma+engines+2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.patch deleted file mode 100644 index d38bc0864..000000000 --- a/backend/patches/@prisma+engines+2.23.0-36.adf5e8cba3daf12d456d911d72b6e9418681b28b.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/node_modules/@prisma/engines/dist/index.js b/node_modules/@prisma/engines/dist/index.js -index f16f38a..a8fa590 100644 ---- a/node_modules/@prisma/engines/dist/index.js -+++ b/node_modules/@prisma/engines/dist/index.js -@@ -777,6 +777,7 @@ var require_getPlatform = __commonJS((exports2) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` diff --git a/backend/patches/prisma+2.23.0.patch b/backend/patches/prisma+2.23.0.patch deleted file mode 100644 index cb4e90bc2..000000000 --- a/backend/patches/prisma+2.23.0.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/node_modules/prisma/build/index.js b/node_modules/prisma/build/index.js -index f2a76f2..95a9ccb 100755 ---- a/node_modules/prisma/build/index.js -+++ b/node_modules/prisma/build/index.js -@@ -13780,6 +13780,7 @@ var require_getPlatform = __commonJS((exports2) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -@@ -99635,6 +99636,7 @@ var require_getPlatform2 = __commonJS((exports2) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -diff --git a/node_modules/prisma/prisma-client/generator-build/index.js b/node_modules/prisma/prisma-client/generator-build/index.js -index 1a3c8a3..c11d757 100644 ---- a/node_modules/prisma/prisma-client/generator-build/index.js -+++ b/node_modules/prisma/prisma-client/generator-build/index.js -@@ -13779,6 +13779,7 @@ var require_getPlatform2 = __commonJS2((exports2) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -@@ -15307,6 +15308,7 @@ var require_dist10 = __commonJS2((exports, module) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -diff --git a/node_modules/prisma/prisma-client/runtime/index.js b/node_modules/prisma/prisma-client/runtime/index.js -index 77ca68b..4d509b8 100644 ---- a/node_modules/prisma/prisma-client/runtime/index.js -+++ b/node_modules/prisma/prisma-client/runtime/index.js -@@ -4835,6 +4835,7 @@ var require_dist9 = __commonJS2((exports, module) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` -@@ -22556,6 +22557,7 @@ var require_getPlatform2 = __commonJS2((exports2) => { - } - exports2.parseOpenSSLVersion = parseOpenSSLVersion; - async function getOpenSSLVersion() { -+ return '1.1.x'; // hack to force version - const [version, ls] = await Promise.all([ - gracefulExec(`openssl version -v`), - gracefulExec(` diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index a63363dca..fabb275ab 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -1,6 +1,5 @@ generator client { provider = "prisma-client-js" - previewFeatures = ["orderByRelation", "selectRelationCount", "orderByAggregateGroup", "filterJson"] } datasource db { @@ -9,591 +8,639 @@ datasource db { } model AbEnrollment { - id String @id @default(uuid()) - user_id String? - ab_study_id String - group Int? - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - user User? @relation(fields: [user_id], references: [id]) - ab_study AbStudy @relation(fields: [ab_study_id], references: [id]) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + user_id String? @db.Uuid + ab_study_id String @db.Uuid + group Int? + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + ab_study AbStudy @relation(fields: [ab_study_id], references: [id], onDelete: Cascade, onUpdate: NoAction) @@unique([user_id, ab_study_id]) + @@index([ab_study_id]) @@map("ab_enrollment") } model AbStudy { - id String @id @default(uuid()) - group_count Int - name String - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - ab_enrollments AbEnrollment[] + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + group_count Int + name String? @unique + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + ab_enrollments AbEnrollment[] @@map("ab_study") } model Completion { - certificate_id String? - completion_language String? - course_id String? - created_at DateTime? @default(now()) - eligible_for_ects Boolean? @default(true) - email String - grade String? - id String @id @default(uuid()) - student_number String? - updated_at DateTime? @updatedAt - user_id String? - user_upstream_id Int? - course Course? @relation(fields: [course_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - completions_registered CompletionRegistered[] - completion_date DateTime? - tier Int? - completion_registration_attempt_date DateTime? - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + course_id String? @db.Uuid + user_id String? @db.Uuid + certificate_id String? + completion_date DateTime? @default(now()) @db.Timestamptz(6) + completion_language String? + completion_registration_attempt_date DateTime? + eligible_for_ects Boolean? @default(true) + email String + grade String? + student_number String? + tier Int? + user_upstream_id Int? + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + completions_registered CompletionRegistered[] + + @@index([completion_language]) + @@index([course_id, user_id, created_at]) + @@index([user_id, course_id, created_at]) @@map("completion") } model CompletionRegistered { - completion_id String? - course_id String? - created_at DateTime? @default(now()) - id String @id @default(uuid()) - organization_id String? - real_student_number String - updated_at DateTime? @updatedAt - user_id String? - completion Completion? @relation(fields: [completion_id], references: [id]) - course Course? @relation(fields: [course_id], references: [id]) - organization Organization? @relation(fields: [organization_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - registration_date DateTime? - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + real_student_number String + registration_date DateTime? + user_id String? @db.Uuid + completion_id String? @db.Uuid + course_id String? @db.Uuid + organization_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + completion Completion? @relation(fields: [completion_id], references: [id], onUpdate: NoAction) + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + organization Organization? @relation(fields: [organization_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + + @@index([completion_id]) + @@index([course_id]) + @@index([organization_id]) + @@index([user_id, course_id]) @@map("completion_registered") } model Course { - automatic_completions Boolean? @default(false) - automatic_completions_eligible_for_ects Boolean? @default(true) - completion_email_id String? - completions_handled_by_id String? - created_at DateTime? @default(now()) - ects String? - end_date String? - exercise_completions_needed Int? - has_certificate Boolean? @default(false) - hidden Boolean? - id String @id @default(uuid()) - inherit_settings_from_id String? - name String - order Int? - owner_organization_id String? - photo_id String? - points_needed Int? - promote Boolean? - slug String @unique - start_date String - start_point Boolean? - status CourseStatus? @default(Upcoming) - study_module_order Int? - study_module_start_point Boolean? - support_email String? - teacher_in_charge_email String - teacher_in_charge_name String - language String? - updated_at DateTime? @updatedAt - completion_email EmailTemplate? @relation("courseTocourse_completion_email", fields: [completion_email_id], references: [id]) - completions_handled_by Course? @relation("courseTocourse_completions_handled_by", fields: [completions_handled_by_id], references: [id]) - inherit_settings_from Course? @relation("courseTocourse_inherit_settings_from", fields: [inherit_settings_from_id], references: [id]) - owner_organization Organization? @relation(fields: [owner_organization_id], references: [id]) - photo Image? @relation(fields: [photo_id], references: [id]) - completions Completion[] - completions_registered CompletionRegistered[] - handles_completions_for Course[] @relation("courseTocourse_completions_handled_by") - other_course_courseTocourse_inherit_settings_from Course[] @relation("courseTocourse_inherit_settings_from") - triggered_automatically_email EmailTemplate[] @relation("emailTemplateToCourse_triggered") - course_aliases CourseAlias[] - course_organizations CourseOrganization[] - course_translations CourseTranslation[] - course_variants CourseVariant[] - exercises Exercise[] - open_university_registration_links OpenUniversityRegistrationLink[] - user_course_progresses UserCourseProgress[] - user_course_service_progresses UserCourseServiceProgress[] - user_course_settings UserCourseSetting[] - user_course_settings_visibilities UserCourseSettingsVisibility[] - services Service[] @relation("course_to_service") - study_modules StudyModule[] @relation("study_module_to_course") - upcoming_active_link Boolean? - tier Int? - stored_data StoredData[] - ownerships CourseOwnership[] - course_stats_email_id String? - course_stats_email EmailTemplate? @relation("courseTocourse_course_stats_email", fields: [course_stats_email_id], references: [id]) - tags Tag[] - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + name String + slug String @unique + teacher_in_charge_name String + teacher_in_charge_email String + support_email String? + start_date String + end_date String? + ects String? + promote Boolean? + status CourseStatus? @default(Upcoming) + start_point Boolean? + hidden Boolean? + study_module_start_point Boolean? + order Int? + study_module_order Int? + automatic_completions Boolean? @default(false) + automatic_completions_eligible_for_ects Boolean? @default(true) + points_needed Int? + exercise_completions_needed Int? + has_certificate Boolean? @default(false) + upcoming_active_link Boolean? @default(false) + tier Int? + language String? + owner_organization_id String? @db.Uuid + completion_email_id String? @db.Uuid + inherit_settings_from_id String? @db.Uuid + completions_handled_by_id String? @db.Uuid + course_stats_email_id String? @db.Uuid + photo_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + completions Completion[] + completions_registered CompletionRegistered[] + completion_email EmailTemplate? @relation("EmailTemplate_Course_completion_email", fields: [completion_email_id], references: [id], onUpdate: NoAction) + triggered_automatically_email EmailTemplate[] @relation("EmailTemplate_Course_triggered_automatically_by") + course_stats_email EmailTemplate? @relation("EmailTemplate_Course_stats_email", fields: [course_stats_email_id], references: [id], onUpdate: NoAction) + completions_handled_by Course? @relation("Course_completions_handled_by", fields: [completions_handled_by_id], references: [id], onUpdate: NoAction) + handles_completions_for Course[] @relation("Course_completions_handled_by") + inherit_settings_from Course? @relation("Course_inherit_settings_from", fields: [inherit_settings_from_id], references: [id], onUpdate: NoAction) + handles_settings_for Course[] @relation("Course_inherit_settings_from") + owner_organization Organization? @relation(fields: [owner_organization_id], references: [id], onUpdate: NoAction) + photo Image? @relation(fields: [photo_id], references: [id], onUpdate: NoAction) + course_aliases CourseAlias[] + course_organizations CourseOrganization[] + ownerships CourseOwnership[] + course_translations CourseTranslation[] + course_variants CourseVariant[] + exercises Exercise[] + open_university_registration_links OpenUniversityRegistrationLink[] + stored_data StoredData[] + user_course_progresses UserCourseProgress[] + user_course_service_progresses UserCourseServiceProgress[] + user_course_settings UserCourseSetting[] + user_course_settings_visibilities UserCourseSettingsVisibility[] + tags Tag[] @relation("CourseToTag") + services Service[] @relation("course_to_service") + study_modules StudyModule[] @relation("study_module_to_course") + + @@index([completion_email_id]) + @@index([completions_handled_by_id]) + @@index([status]) @@map("course") } model CourseAlias { - course_id String? - course_code String @unique - created_at DateTime? @default(now()) - id String @id @default(uuid()) - updated_at DateTime? @updatedAt - course Course? @relation(fields: [course_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + course_code String @unique + course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + + @@index([course_id]) @@map("course_alias") } model CourseOrganization { - course_id String? - created_at DateTime? @default(now()) - creator Boolean? - id String @id @default(uuid()) - organization_id String? - updated_at DateTime? @updatedAt - course Course? @relation(fields: [course_id], references: [id]) - organization Organization? @relation(fields: [organization_id], references: [id]) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + creator Boolean? + course_id String? @db.Uuid + organization_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + organization Organization? @relation(fields: [organization_id], references: [id], onUpdate: NoAction) @@map("course_organization") } model CourseTranslation { - course_id String? - created_at DateTime? @default(now()) - description String - instructions String? - id String @id @default(uuid()) - language String - link String? - name String - updated_at DateTime? @updatedAt - course Course? @relation(fields: [course_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + name String + language String + description String + link String? + instructions String? + course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + + @@index([course_id, language]) + @@index([name]) @@map("course_translation") } model CourseVariant { - course_id String? - created_at DateTime? @default(now()) - description String? - instructions String? - id String @id @default(uuid()) - slug String - updated_at DateTime? @updatedAt - course Course? @relation(fields: [course_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + slug String + description String? + instructions String? + course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + + @@index([course_id]) + @@index([slug]) @@map("course_variant") } model EmailDelivery { - created_at DateTime? @default(now()) - email_template_id String? - error Boolean @default(false) - error_message String? - id String @id @default(uuid()) - sent Boolean @default(false) - updated_at DateTime? @updatedAt - user_id String? - email_template EmailTemplate? @relation(fields: [email_template_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + sent Boolean @default(false) + error Boolean @default(false) + error_message String? + user_id String? @db.Uuid + email_template_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + email_template EmailTemplate? @relation(fields: [email_template_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + + @@index([email_template_id]) + @@index([user_id, email_template_id]) @@map("email_delivery") } model EmailTemplate { - created_at DateTime? @default(now()) - html_body String? - id String @id @default(uuid()) - name String? - title String? - txt_body String? - template_type String? - exercise_completions_threshold Int? - points_threshold Int? - updated_at DateTime? @updatedAt - course_instance_language String? - triggered_automatically_by_course_id String? - triggered_automatically_by_course Course? @relation("emailTemplateToCourse_triggered", fields: [triggered_automatically_by_course_id], references: [id]) - courses Course[] @relation("courseTocourse_completion_email") - stats_courses Course[] @relation("courseTocourse_course_stats_email") - email_deliveries EmailDelivery[] - course_stats_subscriptions CourseStatsSubscription[] - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + name String? + txt_body String? + html_body String? + title String? + points_threshold Int? + exercise_completions_threshold Int? + template_type String? + course_instance_language String? + triggered_automatically_by_course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + courses Course[] @relation("EmailTemplate_Course_completion_email") + stats_courses Course[] @relation("EmailTemplate_Course_stats_email") + course_stats_subscriptions CourseStatsSubscription[] + email_deliveries EmailDelivery[] + triggered_automatically_by_course Course? @relation("EmailTemplate_Course_triggered_automatically_by", fields: [triggered_automatically_by_course_id], references: [id], onUpdate: NoAction) + + @@index([triggered_automatically_by_course_id, template_type]) @@map("email_template") } model Exercise { - course_id String? - created_at DateTime? @default(now()) - custom_id String - deleted Boolean? @default(false) - id String @id @default(uuid()) - max_points Int? - name String? - part Int? - section Int? - service_id String? - timestamp DateTime? - updated_at DateTime? @updatedAt - course Course? @relation(fields: [course_id], references: [id]) - service Service? @relation(fields: [service_id], references: [id]) - exercise_completions ExerciseCompletion[] - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + custom_id String + name String? + part Int? + section Int? + max_points Int? + timestamp DateTime? + deleted Boolean? @default(false) + service_id String? @db.Uuid + course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + service Service? @relation(fields: [service_id], references: [id], onUpdate: NoAction) + exercise_completions ExerciseCompletion[] + + @@index([course_id, service_id, custom_id]) + @@index([custom_id]) + @@index([service_id]) @@map("exercise") } model ExerciseCompletion { - completed Boolean? @default(false) - created_at DateTime? @default(now()) - exercise_id String? - id String @id @default(uuid()) - n_points Float? - timestamp DateTime - updated_at DateTime? @updatedAt - user_id String? - exercise Exercise? @relation(fields: [exercise_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - exercise_completion_required_actions ExerciseCompletionRequiredAction[] - attempted Boolean? - original_submission_date DateTime? - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + n_points Float? + timestamp DateTime + completed Boolean? @default(false) + attempted Boolean? + original_submission_date DateTime? + user_id String? @db.Uuid + exercise_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + exercise Exercise? @relation(fields: [exercise_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + exercise_completion_required_actions ExerciseCompletionRequiredAction[] + + @@index([user_id, exercise_id, timestamp(sort: Desc), updated_at(sort: Desc)]) @@map("exercise_completion") } model ExerciseCompletionRequiredAction { - exercise_completion_id String? - id String @id @default(uuid()) - value String - exercise_completion ExerciseCompletion? @relation(fields: [exercise_completion_id], references: [id]) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + value String + exercise_completion_id String? @db.Uuid + exercise_completion ExerciseCompletion? @relation(fields: [exercise_completion_id], references: [id], onUpdate: NoAction) @@map("exercise_completion_required_actions") } model Image { - compressed String? - compressed_mimetype String? - created_at DateTime? @default(now()) - default Boolean? - encoding String? - id String @id @default(uuid()) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid name String? original String original_mimetype String uncompressed String uncompressed_mimetype String - updated_at DateTime? @updatedAt + compressed String? + compressed_mimetype String? + encoding String? + default Boolean? + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt courses Course[] @@map("image") } model OpenUniversityRegistrationLink { - course_id String? - course_code String - created_at DateTime? @default(now()) - id String @id @default(uuid()) - language String - link String? - start_date DateTime? - stop_date DateTime? - updated_at DateTime? @updatedAt - course Course? @relation(fields: [course_id], references: [id]) - tiers Json? - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + course_code String + language String + link String? + start_date DateTime? + stop_date DateTime? + course_id String? @db.Uuid + tiers Json? @db.Json + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + + @@index([course_id]) @@map("open_university_registration_link") } model Organization { - contact_information String? - created_at DateTime? @default(now()) - creator_id String? + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + slug String @unique + secret_key String @unique + verified_at DateTime? + verified Boolean? disabled Boolean? - email String? hidden Boolean? - id String @id @default(uuid()) - logo_content_type String? + tmc_created_at DateTime? + tmc_updated_at DateTime? logo_file_name String? + logo_content_type String? logo_file_size Int? logo_updated_at DateTime? phone String? - pinned Boolean? - secret_key String @unique - slug String @unique - tmc_created_at DateTime? - tmc_updated_at DateTime? - updated_at DateTime? @updatedAt - verified Boolean? - verified_at DateTime? + contact_information String? + email String? website String? - creator User? @relation(fields: [creator_id], references: [id]) + pinned Boolean? + creator_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt completions_registered CompletionRegistered[] courses Course[] course_organizations CourseOrganization[] + creator User? @relation(fields: [creator_id], references: [id], onUpdate: NoAction) organization_translations OrganizationTranslation[] user_organizations UserOrganization[] verified_users VerifiedUser[] + @@index([creator_id]) @@map("organization") } model OrganizationTranslation { - created_at DateTime? @default(now()) - disabled_reason String? - id String @id @default(uuid()) - information String? - language String - name String - organization_id String? - updated_at DateTime? @updatedAt - organization Organization? @relation(fields: [organization_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + language String + name String + disabled_reason String? + information String? + organization_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + organization Organization? @relation(fields: [organization_id], references: [id], onUpdate: NoAction) + + @@index([organization_id]) @@map("organization_translation") } model Service { - created_at DateTime? @default(now()) - id String @id @default(uuid()) - name String - updated_at DateTime? @updatedAt + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid url String + name String + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt exercises Exercise[] user_course_service_progresses UserCourseServiceProgress[] - courses Course[] @relation("course_to_service") + courses Course[] @relation("course_to_service") @@map("service") } model StoredData { - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - data String - course_id String - user_id String - course Course? @relation(fields: [course_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - - @@id([user_id, course_id]) + data String? + course_id String @db.Uuid + user_id String @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course @relation(fields: [course_id], references: [id], onDelete: Cascade, onUpdate: NoAction) + user User @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction) + + @@id([course_id, user_id]) + @@unique([course_id, user_id]) + @@index([user_id]) @@map("stored_data") } model StudyModule { - created_at DateTime? @default(now()) - id String @id @default(uuid()) - image String? + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + slug String @unique name String + image String? order Int? - slug String @unique - updated_at DateTime? @updatedAt + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt study_module_translations StudyModuleTranslation[] - courses Course[] @relation("study_module_to_course") + courses Course[] @relation("study_module_to_course") @@map("study_module") } model StudyModuleTranslation { - created_at DateTime? @default(now()) - description String - id String @id @default(uuid()) - language String - name String - study_module_id String? - updated_at DateTime? @updatedAt - study_module StudyModule? @relation(fields: [study_module_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + name String + language String + description String + study_module_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + study_module StudyModule? @relation(fields: [study_module_id], references: [id], onUpdate: NoAction) + + @@index([study_module_id, language]) @@map("study_module_translation") } model User { - administrator Boolean - created_at DateTime? @default(now()) - email String + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + upstream_id Int @unique + username String @unique first_name String? - id String @id @default(uuid()) last_name String? + email String + administrator Boolean + student_number String? real_student_number String? research_consent Boolean? - student_number String? - updated_at DateTime? @updatedAt - upstream_id Int @unique - username String @unique + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + ab_enrollments AbEnrollment[] completions Completion[] completions_registered CompletionRegistered[] + course_ownerships CourseOwnership[] + course_stats_subscriptions CourseStatsSubscription[] email_deliveries EmailDelivery[] exercise_completions ExerciseCompletion[] organizations Organization[] + stored_data StoredData[] user_course_progresses UserCourseProgress[] user_course_service_progresses UserCourseServiceProgress[] user_course_settings UserCourseSetting[] user_organizations UserOrganization[] verified_users VerifiedUser[] - ab_enrollments AbEnrollment[] - stored_data StoredData[] - course_ownerships CourseOwnership[] - course_stats_subscriptions CourseStatsSubscription[] + @@index([email(ops: raw("gin_trgm_ops"))], type: Gin) + @@index([first_name(ops: raw("gin_trgm_ops")), last_name(ops: raw("gin_trgm_ops"))], type: Gin) + @@index([last_name(ops: raw("gin_trgm_ops"))], type: Gin) @@map("user") } model UserAppDatumConfig { - created_at DateTime? @default(now()) - id String @default(uuid()) @id + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid name String? @unique timestamp DateTime? - updated_at DateTime? @updatedAt + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt @@map("user_app_datum_config") } model UserCourseProgress { - course_id String? - created_at DateTime? @default(now()) - id String @id @default(uuid()) - max_points Float? - n_points Float? - progress Json - extra Json? - updated_at DateTime? @updatedAt - user_id String? - course Course? @relation(fields: [course_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - user_course_service_progresses UserCourseServiceProgress[] + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + progress Json @db.Json + extra Json? @db.Json + max_points Float? + n_points Float? + user_id String? @db.Uuid + course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + user_course_service_progresses UserCourseServiceProgress[] + @@index([course_id, user_id]) + @@index([user_id]) @@map("user_course_progress") } model UserCourseServiceProgress { - course_id String? - created_at DateTime? @default(now()) - id String @id @default(uuid()) - progress Json - service_id String? - timestamp DateTime? - updated_at DateTime? @updatedAt - user_id String? - user_course_progress_id String? - course Course? @relation(fields: [course_id], references: [id]) - service Service? @relation(fields: [service_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - user_course_progress UserCourseProgress? @relation(fields: [user_course_progress_id], references: [id]) - - @@map("user_course_service_progress") + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + progress Json @db.Json + timestamp DateTime? + service_id String? @db.Uuid + user_id String? @db.Uuid + course_id String? @db.Uuid + user_course_progress_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + service Service? @relation(fields: [service_id], references: [id], onUpdate: NoAction) + user_course_progress UserCourseProgress? @relation(fields: [user_course_progress_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + + @@index([course_id]) + @@index([service_id, course_id, user_id]) + @@index([user_id]) + @@map("user_course_service_progress") } model UserCourseSetting { - country String? - course_id String? - course_variant String? - created_at DateTime? @default(now()) - id String @default(uuid()) @id - language String? - marketing Boolean? - other Json? - research Boolean? - updated_at DateTime? @updatedAt - user_id String? - course Course? @relation(fields: [course_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + language String? + country String? + research Boolean? + marketing Boolean? + course_variant String? + other Json? @db.Json + user_id String? @db.Uuid + course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + + @@index([country]) + @@index([course_id, user_id, created_at]) + @@index([language]) + @@index([user_id]) @@map("user_course_setting") } model UserCourseSettingsVisibility { - course_id String? - created_at DateTime? @default(now()) - id String @id @default(uuid()) - language String - updated_at DateTime? @updatedAt - course Course? @relation(fields: [course_id], references: [id]) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + language String + course_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onUpdate: NoAction) @@map("user_course_settings_visibility") } model UserOrganization { - created_at DateTime? @default(now()) - id String @id @default(uuid()) - organization_id String? - role OrganizationRole? @default(Student) - updated_at DateTime? @updatedAt - user_id String? - organization Organization? @relation(fields: [organization_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + role OrganizationRole? @default(Student) + organization_id String? @db.Uuid + user_id String? @db.Uuid + consented Boolean? @default(false) + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + organization Organization? @relation(fields: [organization_id], references: [id], onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) @@map("user_organization") } model VerifiedUser { - created_at DateTime? @default(now()) - display_name String? - id String @id @default(uuid()) - organization_id String? - personal_unique_code String - updated_at DateTime? @updatedAt - user_id String? - organization Organization? @relation(fields: [organization_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) - + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + display_name String? + personal_unique_code String + home_organization String? + person_affiliation String? + person_affiliation_updated_at DateTime? + mail String? + organizational_unit String? + user_id String? @db.Uuid + organization_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + user User? @relation(fields: [user_id], references: [id], onUpdate: NoAction) + organization Organization? @relation(fields: [organization_id], references: [id], onUpdate: NoAction) + + @@unique([user_id, personal_unique_code, home_organization]) @@map("verified_user") } model CourseOwnership { - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - id String @id @default(uuid()) - user_id String? - course_id String? - course Course? @relation(fields: [course_id], references: [id]) - user User? @relation(fields: [user_id], references: [id]) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + course_id String? @db.Uuid + user_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + course Course? @relation(fields: [course_id], references: [id], onDelete: Cascade, onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction) @@unique([user_id, course_id]) @@map("course_ownership") } model CourseStatsSubscription { - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - id String @id @default(uuid()) - user_id String? - email_template_id String? - user User? @relation(fields: [user_id], references: [id]) - email_template EmailTemplate? @relation(fields: [email_template_id], references: [id]) + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) @db.Uuid + email_template_id String? @db.Uuid + user_id String? @db.Uuid + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + email_template EmailTemplate? @relation(fields: [email_template_id], references: [id], onDelete: Cascade, onUpdate: NoAction) + user User? @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction) @@unique([user_id, email_template_id]) @@map("course_stats_subscription") } model Tag { - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - id String @id - hidden Boolean? @default(false) - tag_types TagType[] - tag_translations TagTranslation[] - courses Course[] + id String @id @default(dbgenerated("extensions.uuid_generate_v4()")) + hidden Boolean @default(false) + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + courses Course[] @relation("CourseToTag") + tag_types TagType[] @relation("TagToTagType") + tag_translations TagTranslation[] @@map("tag") } model TagType { - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - name String @id - tags Tag[] + name String @id + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + tags Tag[] @relation("TagToTagType") @@map("tag_type") } model TagTranslation { - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - tag_id String - language String - name String - description String? - tag Tag @relation(fields: [tag_id], references: [id]) + language String + name String + description String? + tag_id String + created_at DateTime @default(now()) + updated_at DateTime @default(now()) @updatedAt + tag Tag @relation(fields: [tag_id], references: [id], onDelete: Cascade, onUpdate: NoAction) @@id([tag_id, language]) @@unique([name, language]) @@ -609,9 +656,9 @@ enum CourseStatus { } enum OrganizationRole { - OrganizationAdmin - Student Teacher + Student + OrganizationAdmin @@map("organization_role") -} \ No newline at end of file +} diff --git a/backend/schema.ts b/backend/schema.ts index d5d736853..4fc83522e 100644 --- a/backend/schema.ts +++ b/backend/schema.ts @@ -1,10 +1,22 @@ import * as path from "path" import { join } from "path" -import { DateTimeResolver, JSONObjectResolver } from "graphql-scalars" +import { + DateTimeResolver, + JSONObjectResolver, + JSONResolver, +} from "graphql-scalars" import { GraphQLScalarType } from "graphql/type" -import { connectionPlugin, fieldAuthorizePlugin, makeSchema } from "nexus" -import { nexusPrisma } from "nexus-plugin-prisma" +import { + asNexusMethod, + connectionPlugin, + decorateType, + fieldAuthorizePlugin, + makeSchema, +} from "nexus" +import { GraphQLDecimal } from "prisma-graphql-type-decimal" + +import { nexusPrisma } from "@morgothulhu/nexus-plugin-prisma" import { isProduction, NEW_RELIC_LICENSE_KEY, NEXUS_REFLECTION } from "./config" import * as types from "./graphql" @@ -18,6 +30,14 @@ if (NEXUS_REFLECTION) { require("sharp") // image library sharp seems to crash without this require } +const DateTime = asNexusMethod(DateTimeResolver, "datetime") +const Decimal = asNexusMethod(GraphQLDecimal, "decimal") +const JSONObject = asNexusMethod(JSONObjectResolver, "json") +const Json = decorateType(JSONResolver, { + sourceType: "JSON", + asNexusMethod: "json", +}) + const createPlugins = () => { const plugins = [ nexusPrisma({ @@ -66,7 +86,13 @@ const createPlugins = () => { const createSchema = () => makeSchema({ - types, + types: { + ...types, + DateTime, + Decimal, + Json, + JSONObject, + }, contextType: { module: join(process.cwd(), "context.ts"), export: "Context", @@ -78,9 +104,17 @@ const createSchema = () => alias: "prisma", }, { module: "@types/graphql-upload/index.d.ts", alias: "upload" }, + { + module: path.join(__dirname, "types/GraphQLScalars.d.ts"), + alias: "scalars", + }, ], mapping: { Upload: "upload.Upload['promise']", + Decimal: "scalars.GraphQLDecimal", + DateTime: "scalars.GraphQLDateTime", + Json: "scalars.GraphQLJSON", + JSONObject: "scalars.GraphQLJSONObject", }, }, plugins: createPlugins(), diff --git a/backend/tests/data/fixtures.ts b/backend/tests/data/fixtures.ts index 6ab9cabf1..1949d6fa9 100644 --- a/backend/tests/data/fixtures.ts +++ b/backend/tests/data/fixtures.ts @@ -865,7 +865,7 @@ export const openUniversityRegistrationLink: Prisma.OpenUniversityRegistrationLi language: "en_US", course: { connect: { id: "00000000000000000000000000000001" } }, link: "avoin-link-alias2", - tiers: null, + tiers: Prisma.JsonNull, created_at: "1900-01-01T10:00:00.00+02:00", updated_at: "1900-01-01T10:00:00.00+02:00", }, @@ -875,7 +875,7 @@ export const openUniversityRegistrationLink: Prisma.OpenUniversityRegistrationLi language: "en_US", course: { connect: { id: "00000000000000000000000000000666" } }, link: "avoin-link-alias3", - tiers: null, + tiers: Prisma.JsonNull, created_at: "1900-01-01T10:00:00.00+02:00", updated_at: "1900-01-01T10:00:00.00+02:00", }, diff --git a/backend/types/GraphQLScalars.d.ts b/backend/types/GraphQLScalars.d.ts new file mode 100644 index 000000000..f943a9dbd --- /dev/null +++ b/backend/types/GraphQLScalars.d.ts @@ -0,0 +1,11 @@ +import { + DateTimeResolver, + JSONObjectResolver, + JSONResolver, +} from "graphql-scalars" +import { GraphQLDecimal } from "prisma-graphql-type-decimal" + +export type GraphQLDecimal = typeof GraphQLDecimal +export type GraphQLDAteTime = typeof DateTimeResolver +export type GraphQLJSON = typeof JSONResolver +export type GraphQLJSONObject = typeof JSONObjectResolver