diff --git a/.env.sample b/.env.sample index 5306bbc..1baf76a 100644 --- a/.env.sample +++ b/.env.sample @@ -1,7 +1,11 @@ -NODE_ENV=development -PRISMA_HOST= -PRISMA_SECRET= -GOOGLE_CLIENT_ID= +# database +DATABASE_URL=postgresql://prisma:prisma@localhost:5432/prisma?schema=prisma$default +DB_USER=prisma +DB_PASSWORD=prisma + +# application +PHOENIX_SECRET= +GOOGLE_CLIENT_ID=798725565697-sfibjdadpcan9ks908dnl8p5k1dncmoq.apps.googleusercontent.com NODEMAILER_PASSWORD= AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index b826a43..9c52997 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -7,10 +7,8 @@ on: pull_request: env: - PRISMA_HOST: http://localhost:4466/prisma - PRISMA_MANAGEMENT_API_SECRET: secret123 - PRISMA_SECRET: secret123 - DB_HOST: postgres + PHOENIX_SECRET: secret123 + DATABASE_URL: postgresql://prisma:prisma@localhost:5432/prisma?schema=public DB_USER: prisma DB_PASSWORD: prisma AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} @@ -34,10 +32,9 @@ jobs: - name: Install run: | - docker-compose -f prisma/docker-compose.yml up -d - npm install -g prisma1 + docker-compose -f docker-compose.yml up -d npm install - cd prisma && prisma1 generate && prisma1 deploy + npm run prisma:migrate:dev - name: Test run: npm run test @@ -58,6 +55,6 @@ jobs: uses: docker/build-push-action@v2 with: context: . - file: ./Dockerfile + file: ./dev.Dockerfile push: true tags: rctechclub/phoenix:dev diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml index f3c32cb..0f20a53 100644 --- a/.github/workflows/prod.yml +++ b/.github/workflows/prod.yml @@ -6,10 +6,8 @@ on: - master env: - PRISMA_HOST: ${{ secrets.PRISMA_HOST }} - PRISMA_MANAGEMENT_API_SECRET: ${{ secrets.PRISMA_MANAGEMENT_API_SECRET }} - PRISMA_SECRET: ${{ secrets.PRISMA_SECRET }} - DB_HOST: ${{ secrets.DB_HOST }} + PHOENIX_SECRET: ${{ secrets.PHOENIX_SECRET }} + DATABASE_URL: ${{ secrets.DATABASE_URL }} DB_USER: ${{ secrets.DB_USER }} DB_PASSWORD: ${{ secrets.DB_PASSWORD }} GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }} @@ -30,9 +28,8 @@ jobs: - name: Build run: | - npm install -g prisma1 npm install - cd prisma && prisma1 generate && prisma1 deploy + npm run prisma:generate npm run build - name: Set up Docker Buildx @@ -48,7 +45,7 @@ jobs: uses: docker/build-push-action@v2 with: context: . - file: ./Dockerfile + file: ./prod.Dockerfile push: true tags: rctechclub/phoenix:prod @@ -56,21 +53,21 @@ jobs: uses: docker/build-push-action@v2 with: context: . - file: ./Dockerfile + file: ./prod.Dockerfile push: true tags: rctechclub/phoenix:latest - aws: - needs: dockerimage - runs-on: ubuntu-latest - steps: - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-2 - - - name: Update phoenix ECS service - run: | - aws ecs update-service --cluster phoenix --service phoenix --force-new-deployment --region us-east-2 +# aws: +# needs: dockerimage +# runs-on: ubuntu-latest +# steps: +# - name: Configure AWS credentials +# uses: aws-actions/configure-aws-credentials@v1 +# with: +# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} +# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} +# aws-region: us-east-2 +# +# - name: Update phoenix ECS service +# run: | +# aws ecs update-service --cluster phoenix --service phoenix --force-new-deployment --region us-east-2 diff --git a/.gitignore b/.gitignore index 061f120..bf01718 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,11 @@ node_modules/ .DS_Store .env +.env.legacy .env.prod -prisma/.env -env.db +.env.prod.legacy +prisma/.env.legacy +prisma/.env.prod.legacy *.tfvars .terraform/ *.tfstate @@ -15,4 +17,3 @@ env.db dist/ src/generated -src/prisma.graphql diff --git a/__tests__/bookings.ts b/__tests__/bookings.ts index fc9b216..b85a50d 100644 --- a/__tests__/bookings.ts +++ b/__tests__/bookings.ts @@ -4,19 +4,18 @@ env.config(); import gql from "graphql-tag"; import moment from "moment"; import { createTestServerWithUserLoggedIn } from "./utils/server"; -import { Room, User } from "../src/generated/prisma-client"; +import { User } from "@prisma/client"; import { createTestClient } from "apollo-server-testing"; -import { createUser, deleteUser, deleteUsers } from "./utils/users"; -import { createRoom, deleteRoom } from "./utils/rooms"; +import { createUser, deleteUsers, TestUserInfo } from "./utils/users"; +import { createRoom, deleteRooms, TestRoomInfo } from "./utils/rooms"; import { createBooking, - deleteBooking, + deleteBookings, TestBookingInfo, } from "./utils/bookings"; import { GraphQLResponse } from "apollo-server-types"; -const testUserInfo: User = { - id: undefined, +const testUserInfo: TestUserInfo = { username: "test123", email: "test@connect.hku.hk", image_url: "http://url", @@ -27,8 +26,7 @@ const testUserInfo: User = { role: "USER", }; -const testUserInfo1: User = { - id: undefined, +const testUserInfo1: TestUserInfo = { username: "test234", email: "test234@connect.hku.hk", image_url: "http://url234", @@ -39,8 +37,7 @@ const testUserInfo1: User = { role: "USER", }; -const testRoomInfo: Room = { - id: "", +const testRoomInfo: TestRoomInfo = { number: "123", name: "test", }; @@ -72,6 +69,18 @@ const testInvalidBookingVariables = { remark: "Hi", }; +beforeAll(async () => { + await deleteBookings(); + await deleteRooms(); + await deleteUsers(); +}); + +afterEach(async () => { + await deleteBookings(); + await deleteRooms(); + await deleteUsers(); +}); + describe("Booking queries", () => { test("can query all bookings", async () => { // Create user in the database @@ -110,17 +119,12 @@ describe("Booking queries", () => { room: { number: testRoomInfo.number, }, - start: testBookingInfo.start.toISOString(), - end: testBookingInfo.end.toISOString(), + start: testBookingInfo.start, + end: testBookingInfo.end, remark: testBookingInfo.remark, }, ], }); - - // Cleanup after test - await deleteBooking(booking); - await deleteRoom(room); - await deleteUser(user); }); }); @@ -160,10 +164,6 @@ describe("Booking validation", () => { }); expect(response.data).toEqual({ createBooking: null }); - - await deleteBooking(booking); - await deleteRoom(room); - await deleteUser(user); }); }); @@ -198,8 +198,8 @@ describe("Booking mutations", () => { const testUpdatedBookingInfo = { id: booking.id, room: testBookingInfo.room, - start: booking.start, - end: booking.end, + start: booking.start.toISOString(), + end: booking.end.toISOString(), remark: "HelloWorld", }; const result: GraphQLResponse = await client.mutate({ @@ -212,10 +212,6 @@ describe("Booking mutations", () => { remark: testUpdatedBookingInfo.remark, }, }); - - await deleteBooking(booking); - await deleteRoom(room); - await deleteUser(user); }); test("do not allow to change other user's bookings", async () => { @@ -249,8 +245,8 @@ describe("Booking mutations", () => { const testUpdatedBookingInfo = { id: booking.id, room: "123", - start: booking.start, - end: booking.end, + start: booking.start.toISOString(), + end: booking.end.toString(), remark: "HelloWorld", }; @@ -259,9 +255,6 @@ describe("Booking mutations", () => { variables: testUpdatedBookingInfo, }); expect(result.errors[0].message).toEqual("Not Authorised!"); - await deleteBooking(booking); - await deleteRoom(room); - await deleteUsers(user, user1); }); test("allow users to delete their own bookings", async () => { @@ -287,8 +280,6 @@ describe("Booking mutations", () => { id: booking.id, }, }); - await deleteRoom(room); - await deleteUser(user); }); test("do not allow users to delete other user's own bookings", async () => { @@ -311,8 +302,5 @@ describe("Booking mutations", () => { variables: { id: booking.id }, }); expect(result.errors[0].message).toEqual("Not Authorised!"); - await deleteBooking(booking); - await deleteRoom(room); - await deleteUsers(user, user1); }); }); diff --git a/__tests__/events/comments.ts b/__tests__/events/comments.ts index 7672df3..d1c0620 100644 --- a/__tests__/events/comments.ts +++ b/__tests__/events/comments.ts @@ -4,9 +4,9 @@ env.config(); import gql from "graphql-tag"; import { GraphQLResponse } from "apollo-server-types"; import { createTestServerWithUserLoggedIn } from "../utils/server"; -import { Event, User, Comment } from "../../src/generated/prisma-client"; +import { Event, User, Comment } from "@prisma/client"; import { createTestClient } from "apollo-server-testing"; -import { createUser, deleteUsers } from "../utils/users"; +import { createUser, deleteUsers, TestUserInfo } from "../utils/users"; import { createEvent, deleteEvents, @@ -16,9 +16,9 @@ import { retrieveEventComments, RetrieveEventCommentsInfo, } from "../utils/events"; +import { deleteComments } from "../utils/comments"; -const testUserInfo: User = { - id: undefined, +const testUserInfo: TestUserInfo = { username: "test123", email: "test@connect.hku.hk", image_url: "http://url", @@ -29,8 +29,7 @@ const testUserInfo: User = { role: "USER", }; -const testUserInfo1: User = { - id: undefined, +const testUserInfo1: TestUserInfo = { username: "test234", email: "test234@connect.hku.hk", image_url: "http://url234", @@ -53,6 +52,12 @@ const testEventInfo: TestEventInfo = { beforeAll(async () => await deleteUsers()); +afterEach(async () => { + await deleteEvents(); + await deleteComments(); + await deleteUsers(); +}); + describe("event comment creation", () => { test("should be able to create a new comment for an event", async () => { const testUser: User = await createUser(testUserInfo); @@ -88,8 +93,6 @@ describe("event comment creation", () => { user: { id: testUser.id }, event: { id: testEvent.id }, }); - await deleteEvents(); - await deleteUsers(); }); }); @@ -125,12 +128,11 @@ describe("event comment deletion", () => { variables: { id: testComment.id }, }); + expect(deleteComment.id).toEqual(testComment.id); + const eventInfo: RetrieveEventCommentsInfo = { event_id: testEvent.id }; const testEventComments: Comment[] = await retrieveEventComments(eventInfo); expect(testEventComments).toEqual([]); - - await deleteEvents(); - await deleteUsers(); }); }); @@ -168,8 +170,5 @@ describe("invalid event comment deletion", () => { }); expect(response.errors[0].message).toEqual("Not Authorised!"); - - await deleteEvents(); - await deleteUsers(); }); }); diff --git a/__tests__/events/events.ts b/__tests__/events/events.ts index a126938..7cd7a56 100644 --- a/__tests__/events/events.ts +++ b/__tests__/events/events.ts @@ -4,13 +4,12 @@ import gql from "graphql-tag"; import moment from "moment"; import { GraphQLResponse } from "apollo-server-types"; import { createTestServerWithUserLoggedIn } from "../utils/server"; -import { Event, User } from "../../src/generated/prisma-client"; +import { Event, User } from "@prisma/client"; import { createTestClient } from "apollo-server-testing"; -import { createUser, deleteUsers } from "../utils/users"; +import { createUser, deleteUsers, TestUserInfo } from "../utils/users"; import { createEvent, deleteEvents, TestEventInfo } from "../utils/events"; -const testUserInfo: User = { - id: undefined, +const testUserInfo: TestUserInfo = { username: "test123", email: "test@connect.hku.hk", image_url: "http://url", @@ -21,8 +20,7 @@ const testUserInfo: User = { role: "USER", }; -const testUserInfo1: User = { - id: undefined, +const testUserInfo1: TestUserInfo = { username: "test234", email: "test234@connect.hku.hk", image_url: "http://url234", @@ -51,6 +49,11 @@ const testEventInfo: TestEventInfo = { beforeAll(async () => await deleteUsers()); +afterEach(async () => { + await deleteEvents(); + await deleteUsers(); +}); + describe("event queries", () => { test("should return a list of events", async () => { // Create user in the database @@ -85,17 +88,14 @@ describe("event queries", () => { organiser: { username: testUserInfo.username, }, - start: testEventInfo.start.toISOString(), - end: testEventInfo.end.toISOString(), + start: testEventInfo.start, + end: testEventInfo.end, venue: testEventInfo.venue, image_url: testEventInfo.image_url, description: testEventInfo.description, }, ], }); - - await deleteEvents(); - await deleteUsers(); }); }); @@ -155,16 +155,13 @@ describe("event creation", () => { organiser: { username: testUserInfo.username, }, - start: testEventInfo.start.toISOString(), - end: testEventInfo.end.toISOString(), + start: testEventInfo.start, + end: testEventInfo.end, venue: testEventInfo.venue, image_url: "", description: testEventInfo.description, }, }); - - await deleteEvents(); - await deleteUsers(); }); }); @@ -194,9 +191,6 @@ describe("event deletion", () => { id: event.id, }, }); - - await deleteEvents(); - await deleteUsers(); }); }); @@ -225,8 +219,5 @@ describe("invalid event deletion", () => { variables: { id: event.id }, }); expect(response.errors[0].message).toEqual("Not Authorised!"); - - await deleteEvents(); - await deleteUsers(); }); }); diff --git a/__tests__/events/subscribers.ts b/__tests__/events/subscribers.ts index 03befca..2b65eaf 100644 --- a/__tests__/events/subscribers.ts +++ b/__tests__/events/subscribers.ts @@ -4,9 +4,9 @@ env.config(); import gql from "graphql-tag"; import { GraphQLResponse } from "apollo-server-types"; import { createTestServerWithUserLoggedIn } from "../utils/server"; -import { Event, User } from "../../src/generated/prisma-client"; +import { Event, User } from "@prisma/client"; import { createTestClient } from "apollo-server-testing"; -import { createUser, deleteUsers } from "../utils/users"; +import { createUser, deleteUsers, TestUserInfo } from "../utils/users"; import { createEvent, deleteEvents, @@ -15,8 +15,7 @@ import { AddEventSubscriberInfo, } from "../utils/events"; -const testUserInfo: User = { - id: undefined, +const testUserInfo: TestUserInfo = { username: "test123", email: "test@connect.hku.hk", image_url: "http://url", @@ -39,6 +38,11 @@ const testEventInfo: TestEventInfo = { beforeAll(async () => await deleteUsers()); +afterEach(async () => { + await deleteEvents(); + await deleteUsers(); +}); + describe("event subscriber addition", () => { test("should be able to add current user to event subscribers list", async () => { // Create user in the database @@ -67,9 +71,6 @@ describe("event subscriber addition", () => { }); const { subscribers } = addEventSubscriber; expect(subscribers).toEqual(expect.arrayContaining([{ id: testUser.id }])); - - await deleteEvents(); - await deleteUsers(); }); }); @@ -107,9 +108,6 @@ describe("event subscriber removal for subscribed event", () => { }); const { subscribers } = removeEventSubscriber; expect(subscribers).toEqual([]); - - await deleteEvents(); - await deleteUsers(); }); }); @@ -139,8 +137,5 @@ describe("event subscriber removal for non-subscribed event", () => { }); expect(removeEventSubscriber).toEqual({ id: event_id }); - - await deleteEvents(); - await deleteUsers(); }); }); diff --git a/__tests__/users.ts b/__tests__/users.ts index 50ca9b0..27309bc 100644 --- a/__tests__/users.ts +++ b/__tests__/users.ts @@ -1,17 +1,17 @@ import * as env from "dotenv"; env.config(); -import { User } from "../src/generated/prisma-client"; +import { User } from "@prisma/client"; import { createTestClient } from "apollo-server-testing"; import { createTestServerWithUserLoggedIn, createTestServerWithToken, } from "./utils/server"; import { GraphQLResponse } from "apollo-server-types"; -import { createUser, deleteUser } from "./utils/users"; +import { createUser, deleteUser, TestUserInfo } from "./utils/users"; import gql from "graphql-tag"; -const testUserInfo = { +const testUserInfo: TestUserInfo = { username: "test123", email: "test@connect.hku.hk", image_url: "http://url", diff --git a/__tests__/utils/bookings.ts b/__tests__/utils/bookings.ts index b3ea360..c2140fb 100644 --- a/__tests__/utils/bookings.ts +++ b/__tests__/utils/bookings.ts @@ -1,9 +1,8 @@ import * as env from "dotenv"; -import { - BatchPayloadPromise, - Booking, - prisma, -} from "../../src/generated/prisma-client"; +import { Booking } from "@prisma/client"; +import { setupPrismaForTesting } from "./setupPrismaForTesting"; + +const prisma = setupPrismaForTesting(); env.config(); @@ -18,29 +17,31 @@ export interface TestBookingInfo { export const createBooking = ( testBookingInfo: TestBookingInfo ): Promise => { - return prisma.createBooking({ - start: testBookingInfo.start, - end: testBookingInfo.end, - room: { - connect: { - number: testBookingInfo.room, + return prisma.booking.create({ + data: { + start: testBookingInfo.start, + end: testBookingInfo.end, + room: { + connect: { + number: testBookingInfo.room, + }, }, - }, - user: { - connect: { - username: testBookingInfo.user, + user: { + connect: { + username: testBookingInfo.user, + }, }, + remark: testBookingInfo.remark, }, - remark: testBookingInfo.remark, }); }; -export const deleteBookings = (): BatchPayloadPromise => { - return prisma.deleteManyBookings({}); +export const deleteBookings = async (): Promise => { + await prisma.booking.deleteMany({}); }; -export const deleteBooking = booking => { - return prisma.deleteBooking({ - id: booking.id, +export const deleteBooking = async booking => { + return prisma.booking.delete({ + where: { id: booking.id }, }); }; diff --git a/__tests__/utils/comments.ts b/__tests__/utils/comments.ts new file mode 100644 index 0000000..4242479 --- /dev/null +++ b/__tests__/utils/comments.ts @@ -0,0 +1,11 @@ +import { Comment } from "@prisma/client"; +import { setupPrismaForTesting } from "./setupPrismaForTesting"; + +const prisma = setupPrismaForTesting(); + +export const deleteComment = (comment_id: string): Promise => + prisma.comment.delete({ where: { id: comment_id } }); + +export const deleteComments = async (): Promise => { + await prisma.comment.deleteMany({}); +}; diff --git a/__tests__/utils/events.ts b/__tests__/utils/events.ts index f16f515..8684fb5 100644 --- a/__tests__/utils/events.ts +++ b/__tests__/utils/events.ts @@ -1,14 +1,11 @@ import * as env from "dotenv"; -import { - BatchPayloadPromise, - Event, - Comment, - FragmentableArray, - prisma, -} from "../../src/generated/prisma-client"; +import { Event, Comment } from "@prisma/client"; +import { setupPrismaForTesting } from "./setupPrismaForTesting"; env.config(); +const prisma = setupPrismaForTesting(); + export type TestEventInfo = { title: string; organiser: string; @@ -43,30 +40,32 @@ export const createEvent = ({ image_url, description, }: TestEventInfo): Promise => { - return prisma.createEvent({ - title, - start: new Date(start), - end: new Date(end), - venue, - image_url, - description, - organiser: { - connect: { - username: organiser, + return prisma.event.create({ + data: { + title, + start: new Date(start), + end: new Date(end), + venue, + image_url, + description, + organiser: { + connect: { + username: organiser, + }, }, }, }); }; -export const deleteEvents = (): BatchPayloadPromise => { - return prisma.deleteManyEvents({}); +export const deleteEvents = async (): Promise => { + await prisma.event.deleteMany({}); }; export const addEventSubscriber = ({ event_id, user_id, }: AddEventSubscriberInfo): Promise => { - return prisma.updateEvent({ + return prisma.event.update({ where: { id: event_id }, data: { subscribers: { @@ -81,19 +80,21 @@ export const createEventComment = ({ user_id, content, }: CreateEventCommentInfo): Promise => { - return prisma.createComment({ - content, - user: { - connect: { id: user_id }, - }, - event: { - connect: { id: event_id }, + return prisma.comment.create({ + data: { + content, + user: { + connect: { id: user_id }, + }, + event: { + connect: { id: event_id }, + }, }, }); }; export const retrieveEventComments = ({ event_id, -}: RetrieveEventCommentsInfo): Promise> => { - return prisma.event({ id: event_id }).comments(); +}: RetrieveEventCommentsInfo): Promise => { + return prisma.event.findUnique({ where: { id: event_id } }).comments(); }; diff --git a/__tests__/utils/rooms.ts b/__tests__/utils/rooms.ts index d7ef1e9..58d1892 100644 --- a/__tests__/utils/rooms.ts +++ b/__tests__/utils/rooms.ts @@ -1,24 +1,33 @@ import * as env from "dotenv"; -import { - BatchPayloadPromise, - prisma, - Room, -} from "../../src/generated/prisma-client"; +import { Room } from "@prisma/client"; +import { setupPrismaForTesting } from "./setupPrismaForTesting"; env.config(); -export const createRoom = (room: Room): Promise => { - return prisma.createRoom({ - name: room.name, - number: room.number, + +const prisma = setupPrismaForTesting(); + +export type TestRoomInfo = { + number: string; + name: string; +}; + +export const createRoom = (room: TestRoomInfo): Promise => { + return prisma.room.create({ + data: { + name: room.name, + number: room.number, + }, }); }; -export const deleteRooms = (): BatchPayloadPromise => { - return prisma.deleteManyRooms({}); +export const deleteRooms = async (): Promise => { + await prisma.room.deleteMany({}); }; -export const deleteRoom = (room: Room) => { - return prisma.deleteRoom({ - number: room.number, +export const deleteRoom = (room: Room): Promise => { + return prisma.room.delete({ + where: { + number: room.number, + }, }); }; diff --git a/__tests__/utils/server.ts b/__tests__/utils/server.ts index 38c6905..c7f8021 100644 --- a/__tests__/utils/server.ts +++ b/__tests__/utils/server.ts @@ -3,8 +3,9 @@ import * as env from "dotenv"; import { createUserSession } from "./users"; import { generateToken } from "../../src/utils/authToken"; import server from "../../src/server"; -import { context, AppContext } from "../../src/context"; -import { User } from "../../src/generated/prisma-client"; +import { AppContext, context } from "../../src/context"; +import { User } from "@prisma/client"; + env.config(); export const createTestServerWithToken = (token: string): ApolloServer => { @@ -14,12 +15,10 @@ export const createTestServerWithToken = (token: string): ApolloServer => { }, }; const testServerContext = async ({ req }): Promise => { - const appContext: AppContext = await context({ req: testReq }); - return appContext; + return await context({ req: testReq }); }; - const testServer = server(testServerContext); - return testServer; + return server(testServerContext); }; export const createTestServerWithUserLoggedIn = async ( diff --git a/__tests__/utils/setupPrismaForTesting.ts b/__tests__/utils/setupPrismaForTesting.ts new file mode 100644 index 0000000..a6afeb9 --- /dev/null +++ b/__tests__/utils/setupPrismaForTesting.ts @@ -0,0 +1,11 @@ +import { PrismaClient } from "@prisma/client"; +import { prisma } from "../../src/utils/prisma"; + +export const setupPrismaForTesting = (): PrismaClient => { + afterAll(async done => { + await prisma.$disconnect(); + done(); + }); + + return prisma; +}; diff --git a/__tests__/utils/users.ts b/__tests__/utils/users.ts index 96d8045..91c7af8 100644 --- a/__tests__/utils/users.ts +++ b/__tests__/utils/users.ts @@ -1,42 +1,52 @@ import * as env from "dotenv"; -import { - BatchPayload, - prisma, - User, - UserSession, -} from "../../src/generated/prisma-client"; +import { User, UserSession, Role } from "@prisma/client"; +import { setupPrismaForTesting } from "./setupPrismaForTesting"; env.config(); +const prisma = setupPrismaForTesting(); + +export type TestUserInfo = { + username: string; + email: string; + image_url: string; + phone: string; + first_name: string; + last_name: string; + room_no: string; + role: Role; +}; + export const createUser = (user): Promise => { - return prisma.createUser(user); + return prisma.user.create({ data: user }); }; -export const deleteUser = (user: User) => { - return prisma.deleteUser({ - username: user.username, - }); +export const deleteUser = async (user: User): Promise => { + await prisma.userSession.deleteMany({}); + return prisma.user.delete({ where: { username: user.username } }); }; -export const deleteUsers = async ( - ...users: User[] -): Promise => { +export const deleteUsers = async (...users: User[]): Promise => { if (users.length === 0) { - return prisma.deleteManyUsers({}); + const allUsers = await prisma.user.findMany({}); + await prisma.userSession.deleteMany({}); + await prisma.user.deleteMany({}); + return allUsers; } - const deletedUsers = Promise.all( + return Promise.all( users.map(async user => { return deleteUser(user); }) ); - return deletedUsers; }; export const createUserSession = (user: User): Promise => { - return prisma.createUserSession({ - user: { - connect: { - id: user.id, + return prisma.userSession.create({ + data: { + user: { + connect: { + id: user.id, + }, }, }, }); diff --git a/__tests__/washers.ts b/__tests__/washers.ts index a4c4b75..e67bccc 100644 --- a/__tests__/washers.ts +++ b/__tests__/washers.ts @@ -3,18 +3,22 @@ env.config(); import gql from "graphql-tag"; import jwt from "jsonwebtoken"; -import { BatchPayload, prisma, Washer } from "../src/generated/prisma-client"; +import { Washer } from "@prisma/client"; import { GraphQLResponse } from "apollo-server-types"; import { createTestClient } from "apollo-server-testing"; import { createTestServerWithToken } from "./utils/server"; +import { setupPrismaForTesting } from "./utils/setupPrismaForTesting"; + +const prisma = setupPrismaForTesting(); const createTestWasher = (washer: { id: string; in_use: boolean; -}): Promise => prisma.createWasher(washer); +}): Promise => prisma.washer.create({ data: washer }); -const deleteTestWashers = (): Promise => - prisma.deleteManyWashers({}); +const deleteTestWashers = async (): Promise => { + await prisma.washer.deleteMany({}); +}; const testWasher = { id: "1", @@ -25,14 +29,20 @@ beforeAll(async () => { await deleteTestWashers(); }); +afterEach(async () => await deleteTestWashers()); + +afterAll(async done => { + await prisma.$disconnect(); + done(); +}); + describe("the graphql washers api", () => { test("returns the status of the washing machines", async () => { // create a test server with token const testServer = createTestServerWithToken("some_token"); // create a test client connected to the test server const client = createTestClient(testServer); - - await deleteTestWashers(); + // create a test washer await createTestWasher(testWasher); // query and check response @@ -48,8 +58,6 @@ describe("the graphql washers api", () => { expect(response.data).toEqual({ washers: [testWasher], }); - - await deleteTestWashers(); }); test("updates the status of a machine", async () => { @@ -60,7 +68,6 @@ describe("the graphql washers api", () => { // create a test client connected to the test server const client = createTestClient(testServer); - await deleteTestWashers(); await createTestWasher(testWasher); // update and check response @@ -78,7 +85,5 @@ describe("the graphql washers api", () => { variables, }); expect(response.data).toEqual({ updateWasher: { id: "1", in_use: false } }); - - await deleteTestWashers(); }); }); diff --git a/dev.Dockerfile b/dev.Dockerfile new file mode 100644 index 0000000..bac2e8a --- /dev/null +++ b/dev.Dockerfile @@ -0,0 +1,10 @@ +FROM node:10-alpine +WORKDIR usr/src/app +COPY package.json . +RUN npm install +COPY dist dist +RUN mkdir prisma +COPY prisma/schema.prisma prisma/ +COPY prisma/migrations prisma/migrations/ +EXPOSE 4000 +CMD ["npm", "run", "start:docker-local"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..38fe30f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3' +services: + postgres: + image: postgres + restart: always + environment: + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + volumes: + - phoenix:/var/lib/postgresql/data/ + ports: + - 5432:5432 + +volumes: + phoenix: diff --git a/package-lock.json b/package-lock.json index bcef161..4b9d9d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,12 +25,42 @@ }, "dependencies": { "@types/node": { - "version": "10.17.50", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.50.tgz", - "integrity": "sha512-vwX+/ija9xKc/z9VqMCdbf4WYcMTGsI0I/L/6shIF3qXURxZOhPQlPRHtjTpiNhAwn0paMJzlOQqw6mAGEQnTA==" + "version": "10.17.56", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.56.tgz", + "integrity": "sha512-LuAa6t1t0Bfw4CuSR0UITsm1hP17YL+u82kfHGrHUWdhlBtH7sa7jGY5z7glGaIj/WDYDkRtgGd+KCjCzxBW1w==" } } }, + "@apollographql/apollo-tools": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.9.tgz", + "integrity": "sha512-M50pk8oo3CGTu4waGOklIX3YtTZoPfWG9K/G9WB8NpyQGA1OwYTiBFv94XqUtKElTDoFwoMXpMQd3Wy5dINvxA==", + "requires": { + "apollo-env": "^0.6.6" + } + }, + "@apollographql/graphql-playground-html": { + "version": "1.6.27", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz", + "integrity": "sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==", + "requires": { + "xss": "^1.0.8" + } + }, + "@apollographql/graphql-upload-8-fork": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz", + "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==", + "requires": { + "@types/express": "*", + "@types/fs-capacitor": "*", + "@types/koa": "*", + "busboy": "^0.3.1", + "fs-capacitor": "^2.0.4", + "http-errors": "^1.7.3", + "object-path": "^0.11.4" + } + }, "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", @@ -368,9 +398,9 @@ } }, "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -489,12 +519,6 @@ "minimist": "^1.2.0" } }, - "@heroku/linewrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@heroku/linewrap/-/linewrap-1.0.0.tgz", - "integrity": "sha512-qPeQp2DnALUwWKaL6ZXfnOw/lHp+zNg5V8whx5c/Y10HMWYjuQFqKupgoJgyuEYjnvYwoZTarW280+aOXWQLCQ==", - "dev": true - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1567,22 +1591,94 @@ "@types/yargs": "^13.0.0" } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, + "@josephg/resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.0.tgz", + "integrity": "sha512-OfTtjoqB2doov5aTJxkyAMK8dXoo7CjCUQSYUEtiY34jbWduOGV7+168tmCT8COMsUEd5DMSFg/0iAOPCBTNAQ==" + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.3.tgz", + "integrity": "sha512-9dTIfQW8HVCxLku5QrJ/ysS/b2MdYngs9+/oPrOTLvp3TrggdANYVW2h8FGJGDf0J7MYfp44W+c90cVJx+ASuA==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "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==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@prisma/client": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.20.1.tgz", + "integrity": "sha512-/IYPubBi55rNMHfE0wwglA6eTWEZD77oz+x+3Mm9ji2lDKdS1lnYKZ0wZX0E3AB8gTNL/zsGtfzmfjgn3ePyIw==", "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "@prisma/engines-version": "2.20.0-26.60ba6551f29b17d7d6ce479e5733c70d9c00860e" } }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "@prisma/engines": { + "version": "2.20.0-26.60ba6551f29b17d7d6ce479e5733c70d9c00860e", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.20.0-26.60ba6551f29b17d7d6ce479e5733c70d9c00860e.tgz", + "integrity": "sha512-zOWETm7DTRvlwf/CekPNSeJe6EC5bn2IFexd74wM9zgBXCZo+1sMDuNGtCqIt4Rzv8CcimEgyzrEFVq0LPV8qg==", "dev": true }, + "@prisma/engines-version": { + "version": "2.20.0-26.60ba6551f29b17d7d6ce479e5733c70d9c00860e", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.20.0-26.60ba6551f29b17d7d6ce479e5733c70d9c00860e.tgz", + "integrity": "sha512-fJhbGZXm2SPs/RsI79Ew4SFe+6QmChNdgU2I/SIjmU18bUgK8f1TBEWnVtFdBqEDHYPGxbpaianF7lp04KN7EA==" + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -1705,37 +1801,20 @@ } }, "@types/bcrypt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-3.0.0.tgz", - "integrity": "sha512-nohgNyv+1ViVcubKBh0+XiNJ3dO8nYu///9aJ4cgSqv70gBL+94SNy/iC2NLzKPT2Zt/QavrOkBVbZRLZmw6NQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-3.0.1.tgz", + "integrity": "sha512-SwBrq5wb6jXP0o3O3jStdPWbKpimTImfdFD/OZE3uW+jhGpds/l5wMX9lfYOTDOa5Bod2QmOgo9ln+tMp2XP/w==", "dev": true }, "@types/body-parser": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz", - "integrity": "sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", "requires": { "@types/connect": "*", "@types/node": "*" } }, - "@types/bson": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", - "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", - "requires": { - "@types/node": "*" - } - }, "@types/connect": { "version": "3.4.32", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", @@ -1780,30 +1859,26 @@ "dev": true }, "@types/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.1.tgz", - "integrity": "sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.16.9", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz", - "integrity": "sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ==", - "requires": { - "@types/node": "*", - "@types/range-parser": "*" - } - }, - "@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", - "requires": { - "@types/node": "*" + }, + "dependencies": { + "@types/express-serve-static-core": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + } } }, "@types/fs-capacitor": { @@ -1832,24 +1907,6 @@ "graphql": "*" } }, - "@types/graphql-upload": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-8.0.4.tgz", - "integrity": "sha512-0TRyJD2o8vbkmJF8InppFcPVcXKk+Rvlg/xvpHBIndSJYpmDWfmtx/ZAtl4f3jR2vfarpTqYgj8MZuJssSoU7Q==", - "requires": { - "@types/express": "*", - "@types/fs-capacitor": "*", - "@types/koa": "*", - "graphql": "^15.3.0" - }, - "dependencies": { - "graphql": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz", - "integrity": "sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA==" - } - } - }, "@types/http-assert": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", @@ -1901,9 +1958,10 @@ "dev": true }, "@types/jsonwebtoken": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", - "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-rNAPdomlIUX0i0cg2+I+Q1wOUr531zHBQ+cV/28PJ39bSPKjahatZZ2LMuhiguETkCgLVzfruw/ZvNMNkKoSzw==", + "dev": true, "requires": { "@types/node": "*" } @@ -1914,9 +1972,9 @@ "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" }, "@types/koa": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.6.tgz", - "integrity": "sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Qbno7FWom9nNqu0yHZ6A0+RWt4mrYBhw3wpBAQ3+IuzGcLlfeYkzZrnMq5wsxulN2np8M4KKeUpTodsOsSad5Q==", "requires": { "@types/accepts": "*", "@types/content-disposition": "*", @@ -1937,38 +1995,14 @@ } }, "@types/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", - "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" - }, - "@types/methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.0.tgz", - "integrity": "sha512-ROomEm+QHlUmcQoDr3CBo3GRm0w4PVoFYjVT9YcfyBha/Per4deb1IpvHU7KTK7YBZCIvOYbSADoEyDnFgaWLA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, "@types/mime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" - }, - "@types/mongodb": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.6.tgz", - "integrity": "sha512-ghYevKiSh/TGk2MAwSRZP7T1ilR9Pw8Fa7pT9GGVGZPUsWKdZjZ4G6LG3MqK2iXKdNba994F8W9ikA+qx2Eo3A==", - "dev": true, - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "@types/mysql": { - "version": "2.15.17", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.17.tgz", - "integrity": "sha512-5vlnAFgdjFGqu3fHbd+pp+qL9mMty6c/N65TjsT5H+kfet50Qq4tXWMrD5lm/ftXeiEQwbAndZepB/eaLGaTew==", - "dev": true, - "requires": { - "@types/node": "*" - } + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { "version": "12.7.12", @@ -1985,9 +2019,9 @@ }, "dependencies": { "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1997,9 +2031,9 @@ } }, "@types/nodemailer": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.0.tgz", - "integrity": "sha512-KY7bFWB0MahRZvVW4CuW83qcCDny59pJJ0MQ5ifvfcjNwPlIT0vW4uARO4u1gtkYnWdhSvURegecY/tzcukJcA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.1.tgz", + "integrity": "sha512-8081UY/0XTTDpuGqCnDc8IY+Q3DSg604wB3dBH0CaZlj4nZWHWuxtZ3NRZ9c9WUrz1Vfm6wioAUnqL3bsh49uQ==", "dev": true, "requires": { "@types/node": "*" @@ -2017,15 +2051,10 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/prettier": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.18.3.tgz", - "integrity": "sha512-48rnerQdcZ26odp+HOvDGX8IcUkYOCuMc2BodWYTe956MqkHlOGAG4oFQ83cjZ0a4GAgj7mb4GUClxYd2Hlodg==" - }, "@types/qs": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", - "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" }, "@types/range-parser": { "version": "1.2.3", @@ -2033,12 +2062,12 @@ "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, "@types/serve-static": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", - "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" + "@types/mime": "^1", + "@types/node": "*" } }, "@types/stack-utils": { @@ -2047,17 +2076,20 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, - "@types/tough-cookie": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", - "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==" - }, "@types/universal-cookie": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@types/universal-cookie/-/universal-cookie-2.2.0.tgz", "integrity": "sha512-fNgC782wfxAZZLDfFM70AgDzYh/VX7tH8NPl/fYNgoseXVLTg+vQf2zhzbWDlJiO0fKXwCL54HOKtXpjcV5C+A==", "dev": true }, + "@types/ws": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-ISCK1iFnR+jYv7+jLNX0wDqesZ/5RAeY3wUx6QaphmocphU61h+b+PHjS18TF4WIPTu/MMzxIq2PHr32o2TS5Q==", + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "13.0.11", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", @@ -2259,21 +2291,6 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -2288,7 +2305,6 @@ "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -2296,12 +2312,6 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", @@ -2344,12 +2354,6 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -2365,12 +2369,6 @@ "color-convert": "^1.9.0" } }, - "ansicolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", - "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", - "dev": true - }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -2389,13 +2387,42 @@ } } }, + "apollo-cache-control": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.12.0.tgz", + "integrity": "sha512-kClF5rfAm159Nboul1LxA+l58Tjz0M8L1GUknEMpZt0UHhILLAn3BfcG3ToX4TbNoR9M57kKMUcbPWLdy3Up7w==", + "requires": { + "apollo-server-env": "^3.0.0", + "apollo-server-plugin-base": "^0.11.0" + } + }, "apollo-datasource": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.2.tgz", - "integrity": "sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.8.0.tgz", + "integrity": "sha512-gXgsGVLuejLc138z/2jUjPAzadDQxWbcLJyBgaQsg5BaXJNkv5uW/NjiSPk00cK51hyZrb0Xx8a+L+wPk2qIBA==", + "requires": { + "apollo-server-caching": "^0.6.0", + "apollo-server-env": "^3.0.0" + } + }, + "apollo-env": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.6.tgz", + "integrity": "sha512-hXI9PjJtzmD34XviBU+4sPMOxnifYrHVmxpjykqI/dUD2G3yTiuRaiQqwRwB2RCdwC1Ug/jBfoQ/NHDTnnjndQ==", + "requires": { + "@types/node-fetch": "2.5.7", + "core-js": "^3.0.1", + "node-fetch": "^2.2.0", + "sha.js": "^2.4.11" + } + }, + "apollo-graphql": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.6.1.tgz", + "integrity": "sha512-ZRXAV+k+hboCVS+FW86FW/QgnDR7gm/xMUwJPGXEbV53OLGuQQdIT0NCYK7AzzVkCfsbb7NJ3mmEclkZY9uuxQ==", "requires": { - "apollo-server-caching": "^0.5.2", - "apollo-server-env": "^2.4.5" + "apollo-env": "^0.6.6", + "lodash.sortby": "^4.7.0" } }, "apollo-link": { @@ -2450,15 +2477,16 @@ } }, "apollo-server": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.19.1.tgz", - "integrity": "sha512-vsOJdRz9n8wYst8P4ZB5H3+SaiRJ9ay0ovO0ZRyies2vmbVXvpPSrItqNSObNTpG2GPeNekV63X9kv1EBUSpvA==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.22.2.tgz", + "integrity": "sha512-Lt+7FxqweSMg2cn5HXksEhdZj1lOojJ+5RMNKys0hkKp9xP/qwHW7+NrFTcItRstHPz27filleAHjoziaWdpiA==", "requires": { - "apollo-server-core": "^2.19.1", - "apollo-server-express": "^2.19.1", + "apollo-server-core": "^2.22.2", + "apollo-server-express": "^2.22.2", "express": "^4.0.0", "graphql-subscriptions": "^1.0.0", - "graphql-tools": "^4.0.0" + "graphql-tools": "^4.0.8", + "stoppable": "^1.1.0" }, "dependencies": { "apollo-link": { @@ -2496,99 +2524,46 @@ } }, "apollo-server-caching": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz", - "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.6.0.tgz", + "integrity": "sha512-SfjKaccrhRzUQ8TAke9FrYppp4pZV3Rp8KCs+4Ox3kGtbco68acRPJkiYYtSVc4idR8XNAUOOVfAEZVNHdZQKQ==", "requires": { - "lru-cache": "^5.0.0" + "lru-cache": "^6.0.0" } }, "apollo-server-core": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.19.1.tgz", - "integrity": "sha512-5EVmcY8Ij7Ywwu+Ze4VaUhZBcxl8t5ztcSatJrKMd4HYlEHyaNGBV2itfpyqAthxfdMbGKqlpeCHmTGSqDcNpA==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.22.2.tgz", + "integrity": "sha512-YPrhfN+I5vUerc4c0I6pd89fdqP5UNYCt/+MGv4bDA/a0kOCLvzylkQ3NlEepK1fewtqf4QO+S1LscC8vMmYdg==", "requires": { "@apollographql/apollo-tools": "^0.4.3", - "@apollographql/graphql-playground-html": "1.6.26", - "@types/graphql-upload": "^8.0.0", + "@apollographql/graphql-playground-html": "1.6.27", + "@apollographql/graphql-upload-8-fork": "^8.1.3", + "@josephg/resolvable": "^1.0.0", "@types/ws": "^7.0.0", - "apollo-cache-control": "^0.11.5", - "apollo-datasource": "^0.7.2", + "apollo-cache-control": "^0.12.0", + "apollo-datasource": "^0.8.0", "apollo-graphql": "^0.6.0", "apollo-reporting-protobuf": "^0.6.2", - "apollo-server-caching": "^0.5.2", - "apollo-server-env": "^2.4.5", + "apollo-server-caching": "^0.6.0", + "apollo-server-env": "^3.0.0", "apollo-server-errors": "^2.4.2", - "apollo-server-plugin-base": "^0.10.3", - "apollo-server-types": "^0.6.2", - "apollo-tracing": "^0.12.1", + "apollo-server-plugin-base": "^0.11.0", + "apollo-server-types": "^0.7.0", + "apollo-tracing": "^0.13.0", "async-retry": "^1.2.1", "fast-json-stable-stringify": "^2.0.0", - "graphql-extensions": "^0.12.7", - "graphql-tag": "^2.9.2", - "graphql-tools": "^4.0.0", - "graphql-upload": "^8.0.2", + "graphql-extensions": "^0.13.0", + "graphql-tag": "^2.11.0", + "graphql-tools": "^4.0.8", "loglevel": "^1.6.7", - "lru-cache": "^5.0.0", + "lru-cache": "^6.0.0", "sha.js": "^2.4.11", "subscriptions-transport-ws": "^0.9.11", "uuid": "^8.0.0", "ws": "^6.0.0" }, "dependencies": { - "@apollographql/apollo-tools": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz", - "integrity": "sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA==", - "requires": { - "apollo-env": "^0.6.5" - } - }, - "@apollographql/graphql-playground-html": { - "version": "1.6.26", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz", - "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==", - "requires": { - "xss": "^1.0.6" - } - }, - "@types/ws": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.0.tgz", - "integrity": "sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw==", - "requires": { - "@types/node": "*" - } - }, - "apollo-cache-control": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.5.tgz", - "integrity": "sha512-jvarfQhwDRazpOsmkt5Pd7qGFrtbL70zMbUZGqDhJSYpfqI672f7bXXc7O3vtpbD3qnS3XTBvK2kspX/Bdo0IA==", - "requires": { - "apollo-server-env": "^2.4.5", - "apollo-server-plugin-base": "^0.10.3" - } - }, - "apollo-env": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.5.tgz", - "integrity": "sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg==", - "requires": { - "@types/node-fetch": "2.5.7", - "core-js": "^3.0.1", - "node-fetch": "^2.2.0", - "sha.js": "^2.4.11" - } - }, - "apollo-graphql": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.6.0.tgz", - "integrity": "sha512-BxTf5LOQe649e9BNTPdyCGItVv4Ll8wZ2BKnmiYpRAocYEXAVrQPWuSr3dO4iipqAU8X0gvle/Xu9mSqg5b7Qg==", - "requires": { - "apollo-env": "^0.6.5", - "lodash.sortby": "^4.7.0" - } - }, "apollo-link": { "version": "1.2.14", "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", @@ -2600,41 +2575,14 @@ "zen-observable-ts": "^0.8.21" } }, - "apollo-server-plugin-base": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.3.tgz", - "integrity": "sha512-NCLOsk9Jsd8oLvefkQvROdMDQvnHnzbzz3MPCqEYjCOEv0YBM8T77D0wCwbcViDS2M5p0W6un2ub9s/vU71f7Q==", - "requires": { - "apollo-server-types": "^0.6.2" - } - }, "apollo-server-types": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.2.tgz", - "integrity": "sha512-LgSKgAStiDzpUSLYwJoAmy0W8nkxx/ExMmgEPgEYVi6dKPkUmtu561J970PhGdYH+D79ke3g87D+plkUkgfnlQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.7.0.tgz", + "integrity": "sha512-pJ6ri2N4xJ+e2PUUPHeCNpMDzHUagJyn0DDZGQmXDz6aoMlSd4B2KUvK81hHyHkw3wHk9clgcpfM9hKqbfZweA==", "requires": { "apollo-reporting-protobuf": "^0.6.2", - "apollo-server-caching": "^0.5.2", - "apollo-server-env": "^2.4.5" - } - }, - "apollo-tracing": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.12.1.tgz", - "integrity": "sha512-qdkUjW+pOaidGOSITypeYE288y28HkPmGNpUtyQSOeTxgqXHtQX3TDWiOJ2SmrLH08xdSwfvz9o5KrTq4PdISg==", - "requires": { - "apollo-server-env": "^2.4.5", - "apollo-server-plugin-base": "^0.10.3" - } - }, - "graphql-extensions": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.7.tgz", - "integrity": "sha512-yc9qOmEmWVZNkux9m0eCiHdtYSwNZRHkFhgfKfDn4u/gpsJolft1iyMUADnG/eytiRW0CGZFBpZjHkJhpginuQ==", - "requires": { - "@apollographql/apollo-tools": "^0.4.3", - "apollo-server-env": "^2.4.5", - "apollo-server-types": "^0.6.2" + "apollo-server-caching": "^0.6.0", + "apollo-server-env": "^3.0.0" } }, "graphql-tools": { @@ -2673,9 +2621,9 @@ } }, "apollo-server-env": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz", - "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.0.0.tgz", + "integrity": "sha512-tPSN+VttnPsoQAl/SBVUpGbLA97MXG990XIwq6YUnJyAixrrsjW1xYG7RlaOqetxm80y5mBZKLrRDiiSsW/vog==", "requires": { "node-fetch": "^2.1.2", "util.promisify": "^1.0.0" @@ -2687,37 +2635,29 @@ "integrity": "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==" }, "apollo-server-express": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.19.1.tgz", - "integrity": "sha512-PJQmPtV3JD7RiV6cP7JcqAwVdUq6hWUtvDIoCOxPoeUWYf79nEF4WiYsPXVF0+meLLWKlL1fuSwEEt1CEHEG5w==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.22.2.tgz", + "integrity": "sha512-MRiWF/oT6toUz909iq1I08vKfRxaqRMKS/v9kzyEXcnuudUCQ5WnxrjZEh/iMEfr7RHSQ4STjY7E/ZooPnueqA==", "requires": { - "@apollographql/graphql-playground-html": "1.6.26", + "@apollographql/graphql-playground-html": "1.6.27", "@types/accepts": "^1.3.5", "@types/body-parser": "1.19.0", "@types/cors": "2.8.8", - "@types/express": "4.17.7", - "@types/express-serve-static-core": "4.17.17", + "@types/express": "4.17.11", + "@types/express-serve-static-core": "4.17.19", "accepts": "^1.3.5", - "apollo-server-core": "^2.19.1", - "apollo-server-types": "^0.6.2", + "apollo-server-core": "^2.22.2", + "apollo-server-types": "^0.7.0", "body-parser": "^1.18.3", "cors": "^2.8.4", "express": "^4.17.1", "graphql-subscriptions": "^1.0.0", - "graphql-tools": "^4.0.0", + "graphql-tools": "^4.0.8", "parseurl": "^1.3.2", "subscriptions-transport-ws": "^0.9.16", "type-is": "^1.6.16" }, "dependencies": { - "@apollographql/graphql-playground-html": { - "version": "1.6.26", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz", - "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==", - "requires": { - "xss": "^1.0.6" - } - }, "@types/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", @@ -2728,20 +2668,20 @@ } }, "@types/express": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz", - "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", + "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "*", + "@types/express-serve-static-core": "^4.17.18", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz", - "integrity": "sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", + "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", "requires": { "@types/node": "*", "@types/qs": "*", @@ -2760,13 +2700,13 @@ } }, "apollo-server-types": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.2.tgz", - "integrity": "sha512-LgSKgAStiDzpUSLYwJoAmy0W8nkxx/ExMmgEPgEYVi6dKPkUmtu561J970PhGdYH+D79ke3g87D+plkUkgfnlQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.7.0.tgz", + "integrity": "sha512-pJ6ri2N4xJ+e2PUUPHeCNpMDzHUagJyn0DDZGQmXDz6aoMlSd4B2KUvK81hHyHkw3wHk9clgcpfM9hKqbfZweA==", "requires": { "apollo-reporting-protobuf": "^0.6.2", - "apollo-server-caching": "^0.5.2", - "apollo-server-env": "^2.4.5" + "apollo-server-caching": "^0.6.0", + "apollo-server-env": "^3.0.0" } }, "graphql-tools": { @@ -2792,24 +2732,64 @@ } } }, + "apollo-server-plugin-base": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.11.0.tgz", + "integrity": "sha512-Du68x0XCyQ6EWlgoL9Z+1s8fJfXgY131QbKP7ao617StQPzwB0aGCwxBDfcMt1A75VXf4TkvV1rdUH5YeJFlhQ==", + "requires": { + "apollo-server-types": "^0.7.0" + }, + "dependencies": { + "apollo-server-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.7.0.tgz", + "integrity": "sha512-pJ6ri2N4xJ+e2PUUPHeCNpMDzHUagJyn0DDZGQmXDz6aoMlSd4B2KUvK81hHyHkw3wHk9clgcpfM9hKqbfZweA==", + "requires": { + "apollo-reporting-protobuf": "^0.6.2", + "apollo-server-caching": "^0.6.0", + "apollo-server-env": "^3.0.0" + } + } + } + }, "apollo-server-testing": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/apollo-server-testing/-/apollo-server-testing-2.19.1.tgz", - "integrity": "sha512-8jj2F/iIEUmOupAyAvqZrtV5aQlaXHoCxG5W9fs/ohsC+RG/4TbdA8pvPSLjH8vibpyqt6Fkl2DDbJrCPzvobQ==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/apollo-server-testing/-/apollo-server-testing-2.22.2.tgz", + "integrity": "sha512-kSdpBdWL6KOiOPa0y5fqiZOBZb/w+/s5oaI+Z9sIakck78bBnHZDBJIrgqpluO8PxrieV10aarN7hxP8DEA7cw==", "dev": true, "requires": { - "apollo-server-core": "^2.19.1" + "apollo-server-core": "^2.22.2" } }, "apollo-server-types": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.2.tgz", - "integrity": "sha512-LgSKgAStiDzpUSLYwJoAmy0W8nkxx/ExMmgEPgEYVi6dKPkUmtu561J970PhGdYH+D79ke3g87D+plkUkgfnlQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.3.tgz", + "integrity": "sha512-aVR7SlSGGY41E1f11YYz5bvwA89uGmkVUtzMiklDhZ7IgRJhysT5Dflt5IuwDxp+NdQkIhVCErUXakopocFLAg==", "dev": true, "requires": { "apollo-reporting-protobuf": "^0.6.2", - "apollo-server-caching": "^0.5.2", - "apollo-server-env": "^2.4.5" + "apollo-server-caching": "^0.5.3", + "apollo-server-env": "^3.0.0" + }, + "dependencies": { + "apollo-server-caching": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.3.tgz", + "integrity": "sha512-iMi3087iphDAI0U2iSBE9qtx9kQoMMEWr6w+LwXruBD95ek9DWyj7OeC2U/ngLjRsXM43DoBDXlu7R+uMjahrQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "apollo-tracing": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.13.0.tgz", + "integrity": "sha512-28z4T+XfLQ6t696usU0nTFDxVN8BfF3o74d2p/zsT4eu1OuoyoDOEmVJqdInmVRpyTJK0tDEOjkIuDJJHZftog==", + "requires": { + "apollo-server-env": "^3.0.0", + "apollo-server-plugin-base": "^0.11.0" } }, "apollo-upload-client": { @@ -2854,42 +2834,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, - "archiver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", - "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^1.2.0" - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -2926,32 +2870,11 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -2967,7 +2890,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -2975,8 +2897,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -2990,15 +2911,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -3011,9 +2923,9 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "async-retry": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz", - "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", + "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", "requires": { "retry": "0.12.0" } @@ -3030,9 +2942,9 @@ "dev": true }, "aws-sdk": { - "version": "2.817.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.817.0.tgz", - "integrity": "sha512-DZIdWpkcqbqsCz0MEskHsyFaqc6Tk9XIFqXAg1AKHbOgC8nU45bz+Y2osX77pU01JkS/G7OhGtGmlKDrOPvFwg==", + "version": "2.884.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.884.0.tgz", + "integrity": "sha512-+rhzq7zmntsj4VJRUf0v6ri9vw3dYroy9BbRtbxLHILdnSFPkoqMcodr/pwcUSO5kYEYbCG7mxr5/R2a+cfbxQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -3045,11 +2957,6 @@ "xml2js": "0.4.19" }, "dependencies": { - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -3060,14 +2967,12 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-jest": { "version": "26.6.3", @@ -3299,19 +3204,18 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "bcrypt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.0.tgz", - "integrity": "sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz", + "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==", "requires": { - "node-addon-api": "^3.0.0", - "node-pre-gyp": "0.15.0" + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^3.1.0" } }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -3337,22 +3241,6 @@ "file-uri-to-path": "1.0.0" } }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -3499,12 +3387,6 @@ "node-int64": "^0.4.0" } }, - "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==", - "dev": true - }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -3515,43 +3397,16 @@ "isarray": "^1.0.0" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, "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", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "buffer-writer": { "version": "2.0.0", @@ -3588,11 +3443,14 @@ "unset-value": "^1.0.0" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } }, "callsites": { "version": "3.1.0", @@ -3600,16 +3458,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3631,21 +3479,10 @@ "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, - "cardinal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", - "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", - "dev": true, - "requires": { - "ansicolors": "~0.2.1", - "redeyed": "~1.0.0" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "2.4.2", @@ -3670,21 +3507,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true - }, - "charm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", - "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -3746,9 +3568,9 @@ } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "ci-info": { "version": "2.0.0", @@ -3797,65 +3619,6 @@ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", "dev": true }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-table": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.4.tgz", - "integrity": "sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "string-width": "^4.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -3885,9 +3648,9 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -3912,66 +3675,6 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "clipboardy": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", - "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", - "dev": true, - "requires": { - "arch": "^2.1.0", - "execa": "^0.8.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -4090,34 +3793,11 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "configstore": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", @@ -4202,9 +3882,9 @@ "dev": true }, "core-js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", - "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==" + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz", + "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==" }, "core-util-is": { "version": "1.0.2", @@ -4241,37 +3921,6 @@ } } }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "requires": { - "buffer": "^5.1.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -4281,22 +3930,6 @@ "capture-stack-trace": "^1.0.0" } }, - "cross-fetch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz", - "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=", - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - }, - "dependencies": { - "node-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" - } - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -4310,12 +3943,6 @@ "which": "^1.2.9" } }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true - }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", @@ -4354,7 +3981,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -4370,11 +3996,6 @@ "whatwg-url": "^8.0.0" } }, - "dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4410,7 +4031,8 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true }, "deep-is": { "version": "0.1.3", @@ -4483,12 +4105,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4529,30 +4145,6 @@ "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, - "directory-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/directory-tree/-/directory-tree-2.2.1.tgz", - "integrity": "sha512-AWgnCDEKC2/oSAA/0Ae3RhXnMkvOZtNAVQu7wF2/qXF5Xm8LhjWnEXLV4Yza45SmWkNPvNlo4zWPhZjcVd4T5w==", - "dev": true - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4603,7 +4195,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -4639,26 +4230,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -4677,15 +4248,6 @@ "ansi-colors": "^4.1.1" } }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4696,43 +4258,38 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "requires": { - "es-to-primitive": "^1.2.0", + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4888,9 +4445,9 @@ } }, "eslint-plugin-prettier": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz", - "integrity": "sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -5204,74 +4761,6 @@ } } }, - "express-request-proxy": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/express-request-proxy/-/express-request-proxy-2.2.2.tgz", - "integrity": "sha512-0Dzn6LQG0ohd2S+zJVMhsntwcDakEzm/uKJSZxH7B66ZBvTsB5LU/HvfO1dHG+RRiKuCg0aWfUa66PljnDjEdw==", - "dev": true, - "requires": { - "async": "^2.6.1", - "body-parser": "^1.18.3", - "camel-case": "^3.0.0", - "debug": "^3.1.0", - "lodash": "^4.17.10", - "lru-cache": "^4.1.3", - "path-to-regexp": "^1.1.1", - "request": "^2.87.0", - "simple-errors": "^1.0.1", - "through2": "^2.0.3", - "type-is": "^1.6.16", - "url-join": "4.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5382,14 +4871,12 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-diff": { "version": "1.2.0", @@ -5397,20 +4884,6 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -5498,22 +4971,13 @@ "unpipe": "~1.0.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", "dev": true, "requires": { - "semver-regex": "^2.0.0" + "semver-regex": "^3.1.2" } }, "flat-cache": { @@ -5544,10 +5008,13 @@ "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, - "flow-bin": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.87.0.tgz", - "integrity": "sha512-mnvBXXZkUp4y6A96bR5BHa3q1ioIIN2L10w5osxJqagAakTXFYZwjl0t9cT3y2aCEf1wnK6n91xgYypQS/Dqbw==" + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } }, "for-in": { "version": "1.0.2", @@ -5558,8 +5025,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", @@ -5595,29 +5061,12 @@ "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" } }, "fs.realpath": { @@ -5692,9 +5141,9 @@ } }, "gaxios": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.1.0.tgz", - "integrity": "sha512-vb0to8xzGnA2qcgywAjtshOKKVDf2eQhJoiL6fHhgW5tVN7wNk7egnYIO9zotfn3lQ3De1VPdf7V5/BWfCtCmg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.2.0.tgz", + "integrity": "sha512-Ms7fNifGv0XVU+6eIyL9LB7RVESeML9+cMvkwGS70xyD6w2Z80wl6RiqiJ9k1KFlJCUTQqFFc8tXmPQfSKUe8g==", "requires": { "abort-controller": "^3.0.0", "extend": "^3.0.2", @@ -5761,6 +5210,16 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -5798,7 +5257,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5837,12 +5295,6 @@ } } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -5858,39 +5310,10 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - } - } - }, "google-auth-library": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.0.0.tgz", - "integrity": "sha512-9c36ZJYZP9UADFghGHSDBzVs+FpW46iWrUWey1yX40u6aoaQFx1yg5gv1CnV6CU1JmEMNyJBd/pkCwj7fmDx2w==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.0.4.tgz", + "integrity": "sha512-o8irYyeijEiecTXeoEe8UKNEzV1X+uhR4b2oNdapDMZixypp0J+eHimGOyx5Joa3UAeokGngdtDLXtq9vDqG2Q==", "requires": { "arrify": "^2.0.0", "base64-js": "^1.3.0", @@ -5921,19 +5344,6 @@ "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -5986,98 +5396,24 @@ "iterall": "^1.2.2" } }, - "graphql-config": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-2.2.1.tgz", - "integrity": "sha512-U8+1IAhw9m6WkZRRcyj8ZarK96R6lQBQ0an4lp76Ps9FyhOXENC5YQOxOFGm5CxPrX2rD0g3Je4zG5xdNJjwzQ==", - "dev": true, - "requires": { - "graphql-import": "^0.7.1", - "graphql-request": "^1.5.0", - "js-yaml": "^3.10.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.4" - } - }, - "graphql-config-extension-prisma": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/graphql-config-extension-prisma/-/graphql-config-extension-prisma-0.2.5.tgz", - "integrity": "sha512-7Qh3TzZS3hwZpJbTNfTHXBM6UbzV7DMik9Mc95Rz76yTAs7Wr83xBFsH4Ap1NWlqBgANfO3cLLI4YomDJmO5SA==", - "dev": true, + "graphql-extensions": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.13.0.tgz", + "integrity": "sha512-Bb7E97nvfX4gtrIdZ/i5YFlqOd6MGzrw8ED+t4wQVraYje6NQ+8P8MHMOV2WZLfbW8zsNTx8NdnnlbsdH5siag==", "requires": { - "graphql-config": "2.2.1", - "prisma-yml": "1.20.0-beta.18" + "@apollographql/apollo-tools": "^0.4.3", + "apollo-server-env": "^3.0.0", + "apollo-server-types": "^0.7.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "prisma-yml": { - "version": "1.20.0-beta.18", - "resolved": "https://registry.npmjs.org/prisma-yml/-/prisma-yml-1.20.0-beta.18.tgz", - "integrity": "sha512-wI/lOQrD78de2+ZNzJlbEYcYiUANtpdyT0VzAS+YbF5+1/O+shOnpwYsBtjrVL5Er0RwMkwH7j+oZQM61ENBMQ==", - "dev": true, + "apollo-server-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.7.0.tgz", + "integrity": "sha512-pJ6ri2N4xJ+e2PUUPHeCNpMDzHUagJyn0DDZGQmXDz6aoMlSd4B2KUvK81hHyHkw3wHk9clgcpfM9hKqbfZweA==", "requires": { - "ajv": "5", - "bluebird": "^3.5.1", - "chalk": "^2.3.0", - "debug": "^3.1.0", - "dotenv": "^4.0.0", - "fs-extra": "^7.0.0", - "graphql-request": "^1.5.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "isomorphic-fetch": "^2.2.1", - "js-yaml": "^3.10.0", - "json-stable-stringify": "^1.0.1", - "jsonwebtoken": "^8.1.0", - "lodash": "^4.17.4", - "prisma-json-schema": "0.1.3", - "replaceall": "^0.1.6", - "scuid": "^1.0.2", - "yaml-ast-parser": "^0.0.40" + "apollo-reporting-protobuf": "^0.6.2", + "apollo-server-caching": "^0.6.0", + "apollo-server-env": "^3.0.0" } } } @@ -6140,37 +5476,10 @@ } } }, - "graphql-playground-html": { - "version": "1.6.29", - "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz", - "integrity": "sha512-fbF/zZKuw2sdfKp8gjTORJ/I9xBsqeEYRseWxBzuR15NHMptRTT9414IyRCs3ognZzUDr5MDJgx97SlLZCtQyA==", - "dev": true, - "requires": { - "xss": "^1.0.6" - } - }, - "graphql-playground-middleware-express": { - "version": "1.7.22", - "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.22.tgz", - "integrity": "sha512-PJLiCxLmN6Dp+dHGyHU92m9y3hB/RAkcUBWcqYl2fiP+EbpDDgNfElrsVzW60MhJe+LTV1PFqiInH2d3KNvlCQ==", - "dev": true, - "requires": { - "graphql-playground-html": "^1.6.29" - } - }, - "graphql-request": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", - "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", - "dev": true, - "requires": { - "cross-fetch": "2.2.2" - } - }, "graphql-shield": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/graphql-shield/-/graphql-shield-7.4.4.tgz", - "integrity": "sha512-5oAf6M+ypdh+Tyg74s9R+WjLqtmN7xzYqJfj/RhPzh6HCvdc6DBP551Ic77SnADIUVG0Igx69PbOWZkhj/agEg==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/graphql-shield/-/graphql-shield-7.5.0.tgz", + "integrity": "sha512-T1A6OreOe/dHDk/1Qg3AHCrKLmTkDJ3fPFGYpSOmUbYXyDnjubK4J5ab5FjHdKHK5fWQRZNTvA0SrBObYsyfaw==", "requires": { "@types/yup": "0.29.11", "object-hash": "^2.0.3", @@ -6178,11 +5487,18 @@ } }, "graphql-subscriptions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", - "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", + "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", "requires": { - "iterall": "^1.2.1" + "iterall": "^1.3.0" + }, + "dependencies": { + "iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + } } }, "graphql-tag": { @@ -6252,17 +5568,6 @@ } } }, - "graphql-upload": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz", - "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==", - "requires": { - "busboy": "^0.3.1", - "fs-capacitor": "^2.0.4", - "http-errors": "^1.7.3", - "object-path": "^0.11.4" - } - }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -6304,14 +5609,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -6325,6 +5628,11 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6332,9 +5640,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-unicode": { "version": "2.0.1", @@ -6406,75 +5714,16 @@ "toidentifier": "1.0.0" } }, - "http-link-dataloader": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/http-link-dataloader/-/http-link-dataloader-0.1.6.tgz", - "integrity": "sha512-r9B/n+SR32k++Z3MIAumI+Kv6ucL3+3ZfqcvGECWVkUc2BmfUWKu6gkPH7+uR1UKyUUJyuZENOLS/RDXVyXVTA==", - "requires": { - "apollo-link": "^1.2.3", - "cross-fetch": "2.2.2", - "dataloader": "^1.4.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -6482,18 +5731,18 @@ "dev": true }, "husky": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.6.tgz", - "integrity": "sha512-o6UjVI8xtlWRL5395iWq9LKDyp/9TE7XMOTvIpEVzW638UcGxTmV5cfel6fsk/jbZSTlvfGVJf2svFtybcIZag==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", "dev": true, "requires": { "chalk": "^4.0.0", "ci-info": "^2.0.0", "compare-versions": "^3.6.0", "cosmiconfig": "^7.0.0", - "find-versions": "^3.2.0", + "find-versions": "^4.0.0", "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", + "pkg-dir": "^5.0.0", "please-upgrade-node": "^3.2.0", "slash": "^3.0.0", "which-pm-runs": "^1.0.0" @@ -6533,35 +5782,87 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "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==", + "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==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "p-locate": "^5.0.0" } - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.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==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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 + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "ignore": { "version": "4.0.6", @@ -6575,14 +5876,6 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -6646,7 +5939,8 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "inquirer": { "version": "7.0.3", @@ -6785,6 +6079,11 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -6794,6 +6093,14 @@ "binary-extensions": "^1.0.0" } }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -6801,9 +6108,9 @@ "dev": true }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, "is-ci": { "version": "2.0.0", @@ -6844,9 +6151,9 @@ } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-descriptor": { "version": "0.1.6", @@ -6916,6 +6223,11 @@ "is-path-inside": "^1.0.0" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -6942,6 +6254,11 @@ } } }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -6985,11 +6302,12 @@ "dev": true }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "requires": { - "has": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" } }, "is-regexp": { @@ -7010,18 +6328,28 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "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==", "dev": true }, "is-windows": { @@ -7030,12 +6358,6 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -7053,33 +6375,10 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - }, - "dependencies": { - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { "version": "3.0.0", @@ -9923,8 +9222,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { "version": "16.4.0", @@ -10048,23 +9346,12 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -10075,8 +9362,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "2.1.3", @@ -10087,21 +9373,6 @@ "minimist": "^1.2.5" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -10130,7 +9401,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -10163,15 +9433,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -10187,15 +9448,6 @@ "package-json": "^4.0.0" } }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -10219,9 +9471,9 @@ "dev": true }, "lint-staged": { - "version": "10.5.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.3.tgz", - "integrity": "sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", + "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -10364,13 +9616,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.3.tgz", + "integrity": "sha512-ueuSaP4i67F/FAUac9zzZ0Dz/5KeKDkITYIS/k4fps+9qeh1SkeH6gbljcqz97mNBOsaWZ+iv2UobMKK/yD+aw==", "dev": true, "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.1" } }, "ms": { @@ -10445,9 +9697,9 @@ } }, "listr2": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz", - "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.6.2.tgz", + "integrity": "sha512-B2vlu7Zx/2OAMVUovJ7Tv1kQ2v2oXd0nZKzkSAcRCej269d8gkS/gupDEdNl23KQ3ZjVD8hQmifrrBFbx8F9LA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -10456,10 +9708,17 @@ "indent-string": "^4.0.0", "log-update": "^4.0.0", "p-map": "^4.0.0", - "rxjs": "^6.6.3", - "through": "^2.3.8" + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10494,21 +9753,53 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" } }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10517,87 +9808,29 @@ "requires": { "has-flag": "^4.0.0" } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash-es": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.20.tgz", - "integrity": "sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA==" - }, - "lodash.ary": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.ary/-/lodash.ary-4.1.1.tgz", - "integrity": "sha1-ZgZfqRusx6A02cj85S+D08fkAhI=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.differenceby": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/lodash.differenceby/-/lodash.differenceby-4.8.0.tgz", - "integrity": "sha1-z9WelDU69d5R2l0wLKTr/zP6rFc=", - "dev": true - }, - "lodash.every": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", - "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", - "dev": true - }, - "lodash.identity": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-3.0.0.tgz", - "integrity": "sha1-rXvGpOZH15yXLhuA/u968VYmeHY=", - "dev": true + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.includes": { "version": "4.3.0", @@ -10629,71 +9862,24 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true - }, - "lodash.maxby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", - "integrity": "sha1-CCJABo88eiJ6oAqDgOTzjPB4bj0=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "lodash.partial": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.partial/-/lodash.partial-4.2.1.tgz", - "integrity": "sha1-SfPYz9qjv/izqR0SfpIyRUGJYdQ=", - "dev": true - }, - "lodash.property": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.property/-/lodash.property-4.4.2.tgz", - "integrity": "sha1-2gcSSCHGQJ0CXzDbjfhRMUUVv/4=", - "dev": true - }, - "lodash.result": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.result/-/lodash.result-4.5.2.tgz", - "integrity": "sha1-y0Wyf7kU6qjY7m8M57KHC4fLcKo=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true - }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "ansi-styles": { @@ -10760,12 +9946,12 @@ }, "dependencies": { "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "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.11.0" + "type-fest": "^0.21.3" } }, "ansi-styles": { @@ -10835,9 +10021,9 @@ } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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 } } @@ -10852,12 +10038,6 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -10865,18 +10045,17 @@ "dev": true }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "make-dir": { "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" }, @@ -10884,23 +10063,15 @@ "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==" } } }, "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" - }, - "make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", - "requires": { - "make-error": "^1.2.0" - } + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true }, "makeerror": { "version": "1.0.11", @@ -10926,91 +10097,20 @@ "object-visit": "^1.0.0" } }, - "marked": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", - "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==", - "dev": true - }, - "marked-terminal": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.3.0.tgz", - "integrity": "sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A==", - "dev": true, - "requires": { - "ansi-escapes": "^3.1.0", - "cardinal": "^2.1.1", - "chalk": "^2.4.1", - "cli-table": "^0.3.1", - "node-emoji": "^1.4.1", - "supports-hyperlinks": "^1.0.1" - }, - "dependencies": { - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - } - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "dev": true, - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "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 - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "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 }, "methods": { @@ -11074,23 +10174,24 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, "mixin-deep": { @@ -11118,6 +10219,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, "requires": { "minimist": "^1.2.5" } @@ -11127,104 +10229,17 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, - "mongodb": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.4.tgz", - "integrity": "sha512-Y+Ki9iXE9jI+n9bVtbTOOdK0B95d6wVGSucwtBkvQ+HIvVdTCfpVRp01FDC24uhC/Q2WXQ8Lpq3/zwtB5Op9Qw==", - "dev": true, - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - }, - "dependencies": { - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "dev": true, - "requires": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - }, - "dependencies": { - "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "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" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, "nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", @@ -11257,31 +10272,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "needle": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", - "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -11293,29 +10283,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, "node-addon-api": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==" }, - "node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", - "dev": true, - "requires": { - "lodash.toarray": "^4.4.0" - } - }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -11409,38 +10381,10 @@ } } }, - "node-pre-gyp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", - "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, "nodemailer": { - "version": "6.4.17", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.17.tgz", - "integrity": "sha512-89ps+SBGpo0D4Bi5ZrxcrCiRFaMmkCt+gItMXQGzEtZVR3uAD3QAQIDoxTWnx3ky0Dwwy/dhFrQ+6NNGXpw/qQ==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.5.0.tgz", + "integrity": "sha512-Tm4RPrrIZbnqDKAvX+/4M+zovEReiKlEXWDzG4iwtpL9X34MJY+D5LnQPH/+eghe8DLlAVshHAJZAZWBGhkguw==" }, "nodemon": { "version": "1.19.4", @@ -11513,81 +10457,6 @@ "remove-trailing-separator": "^1.0.1" } }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, - "requires": { - "which": "^1.2.10" - } - }, - "npm-run": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npm-run/-/npm-run-4.1.2.tgz", - "integrity": "sha1-EDDh7FaQjIn8w/o2bQOiwrqY65k=", - "dev": true, - "requires": { - "cross-spawn": "^5.1.0", - "minimist": "^1.2.0", - "npm-path": "^2.0.3", - "npm-which": "^3.0.1", - "serializerr": "^1.0.3", - "sync-exec": "^0.6.2" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -11597,17 +10466,6 @@ "path-key": "^2.0.0" } }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", - "dev": true, - "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -11633,8 +10491,7 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -11677,6 +10534,11 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -11696,13 +10558,25 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" } }, "object.pick": { @@ -11745,15 +10619,6 @@ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -11768,24 +10633,11 @@ "word-wrap": "~1.2.3" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-each-series": { "version": "2.2.0", @@ -11808,15 +10660,6 @@ "p-try": "^2.0.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -11893,12 +10736,6 @@ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -11927,20 +10764,10 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pg": { "version": "7.18.2", @@ -12019,831 +10846,141 @@ "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "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" - }, - "dependencies": { - "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" - } - }, - "locate-path": { - "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" - } - }, - "p-locate": { - "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" - } - }, - "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 - } - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" - }, - "popsicle": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-10.0.1.tgz", - "integrity": "sha512-IFVBRz+hc05+MiVDH+KH9QoeE6gjFOiIZNxKePIwz+JbH/yP9rLreUT9+GocxRweYBiRh7O9+MfI5X1zKfSH6Q==", - "requires": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/methods": "^1.1.0", - "@types/tough-cookie": "^2.3.0", - "concat-stream": "^1.4.7", - "form-data": "^2.0.0", - "make-error-cause": "^1.2.1", - "tough-cookie": "^2.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" - }, - "postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" - }, - "postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" - }, - "postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "requires": { - "xtend": "^4.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - }, - "prisma-cli-core": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-cli-core/-/prisma-cli-core-1.34.12.tgz", - "integrity": "sha512-6mq5CuLWAzV1wdqYQz1ApHUS3op0wstlTvL/1r/pZTziTr+B29DqzcVR6mA5lTryuNvdBN+88G13MJvmhUD5oA==", - "dev": true, - "requires": { - "@types/express": "^4.16.1", - "adm-zip": "^0.4.7", - "archiver": "^2.0.3", - "callsites": "^2.0.0", - "chalk": "^2.3.0", - "clipboardy": "^1.2.3", - "cross-spawn": "^5.1.0", - "express": "^4.16.3", - "express-request-proxy": "^2.0.0", - "figures": "^2.0.0", - "fs-extra": "^7.0.0", - "globby": "^8.0.1", - "graphql": "^14.3.0", - "graphql-config": "2.2.1", - "graphql-config-extension-prisma": "0.2.5", - "graphql-playground-middleware-express": "^1.6.2", - "inquirer": "^6.2.0", - "js-yaml": "^3.9.1", - "lodash": "^4.17.4", - "lodash.differenceby": "^4.8.0", - "mongodb": "^3.1.10", - "multimatch": "^2.1.0", - "mysql": "^2.16.0", - "node-forge": "^0.7.1", - "npm-run": "4.1.2", - "opn": "^5.1.0", - "prisma-client-lib": "1.34.12", - "prisma-datamodel": "1.34.12", - "prisma-db-introspection": "1.34.12", - "prisma-generate-schema": "1.34.12", - "prisma-yml": "1.34.12", - "scuid": "^1.0.2", - "semver": "^5.6.0", - "sillyname": "^0.1.0", - "source-map-support": "^0.4.18", - "table": "^4.0.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz", - "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "node-forge": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", - "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==", - "dev": true - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", - "dev": true - }, - "prisma-client-lib": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-client-lib/-/prisma-client-lib-1.34.12.tgz", - "integrity": "sha512-VNl0wcI4MYbag3PI3Oy22tomg0rO3+VYGdumISg81NV2nB6PZyB+z4SirNk8E7qo0HRCeSd2xj3su92Jq+M3QQ==", - "dev": true, - "requires": { - "@types/node": "^10.12.0", - "@types/prettier": "^1.13.2", - "debug": "^4.1.0", - "flow-bin": "^0.87.0", - "graphql-tag": "^2.10.0", - "http-link-dataloader": "^0.1.6", - "jsonwebtoken": "^8.3.0", - "lodash.flatten": "^4.4.0", - "prettier": "1.16.4", - "prisma-datamodel": "1.34.12", - "prisma-generate-schema": "1.34.12", - "subscriptions-transport-ws": "^0.9.15", - "uppercamelcase": "^3.0.0", - "ws": "^6.1.0", - "zen-observable": "^0.8.10" - } - }, - "prisma-datamodel": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-datamodel/-/prisma-datamodel-1.34.12.tgz", - "integrity": "sha512-95m7ZEjzuNz++Tuo+GRuIhtS3/xG9fPZm5So/E3kw/lQ4RjE7/BT8Je12XFk47sk7cewQBmQ+Of32J7FW+0cxQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "graphql": "^14.3.0", - "pluralize": "^7.0.0", - "popsicle": "10" - } - }, - "prisma-generate-schema": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-generate-schema/-/prisma-generate-schema-1.34.12.tgz", - "integrity": "sha512-USrNLFtXwGNORJHpeXihCIc3/ARtVaFjQ1OZhvmLnqoiJVhnh29sc0daCqFijO1AXiArF5kxjMcM27JVzTdJiA==", - "dev": true, - "requires": { - "graphql": "^14.3.0", - "pluralize": "^7.0.0", - "popsicle": "10", - "prisma-datamodel": "1.34.12" - } - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "prisma-cli-engine": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-cli-engine/-/prisma-cli-engine-1.34.12.tgz", - "integrity": "sha512-6EolXDNgeXIVeSeT0pKh8x4GtKmC1lOIHCJL0BvukwvGswBjSLopbcqrAIJqeveQx8gCI+eSB0pwPejfV+4eyQ==", - "dev": true, - "requires": { - "@heroku/linewrap": "^1.0.0", - "ansi-escapes": "^3.0.0", - "ansi-styles": "^3.2.0", - "cardinal": "^1.0.0", - "chalk": "^2.3.0", - "charm": "^1.0.2", - "debug": "^3.1.0", - "directory-tree": "2.2.1", - "figures": "^2.0.0", - "find-up": "^3.0.0", - "fs-extra": "^7.0.0", - "graphql": "^14.3.0", - "graphql-request": "^1.5.0", - "inquirer": "^6.2.0", - "isomorphic-fetch": "^2.2.1", - "jsonwebtoken": "^8.1.0", - "klaw-sync": "^6.0.0", - "lodash": "^4.17.4", - "lodash.ary": "^4.1.1", - "lodash.defaults": "^4.2.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.groupby": "^4.6.0", - "lodash.identity": "^3.0.0", - "lodash.maxby": "4.x", - "lodash.partial": "^4.2.1", - "lodash.property": "^4.4.2", - "lodash.result": "^4.5.2", - "lodash.uniqby": "^4.7.0", - "marked": "^0.5.1", - "marked-terminal": "^3.1.1", - "mkdirp": "^0.5.1", - "opn": "^5.1.0", - "prisma-json-schema": "0.1.3", - "prisma-yml": "1.34.12", - "raven": "2.6.4", - "rwlockfile": "^1.4.8", - "scuid": "^1.0.2", - "serialize-error": "^3.0.0", - "source-map-support": "^0.4.18", - "string-similarity": "^1.2.0", - "strip-ansi": "^4.0.0", - "supports-color": "^4.4.0", - "treeify": "^1.0.1", - "update-notifier": "^2.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "prisma-client-lib": { - "version": "1.34.10", - "resolved": "https://registry.npmjs.org/prisma-client-lib/-/prisma-client-lib-1.34.10.tgz", - "integrity": "sha512-faMDYpYyToeD0HZZunbuozljWw/o2MEEuja96ADElTohuM688ZyOec9wL+oZxgFib0abz68FqmHdig8lgvc2HQ==", - "requires": { - "@types/node": "^10.12.0", - "@types/prettier": "^1.13.2", - "debug": "^4.1.0", - "flow-bin": "^0.87.0", - "graphql-tag": "^2.10.0", - "http-link-dataloader": "^0.1.6", - "jsonwebtoken": "^8.3.0", - "lodash.flatten": "^4.4.0", - "prettier": "1.16.4", - "prisma-datamodel": "1.34.10", - "prisma-generate-schema": "1.34.10", - "subscriptions-transport-ws": "^0.9.15", - "uppercamelcase": "^3.0.0", - "ws": "^6.1.0", - "zen-observable": "^0.8.10" - }, - "dependencies": { - "@types/node": { - "version": "10.17.50", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.50.tgz", - "integrity": "sha512-vwX+/ija9xKc/z9VqMCdbf4WYcMTGsI0I/L/6shIF3qXURxZOhPQlPRHtjTpiNhAwn0paMJzlOQqw6mAGEQnTA==" - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==" - } - } - }, - "prisma-datamodel": { - "version": "1.34.10", - "resolved": "https://registry.npmjs.org/prisma-datamodel/-/prisma-datamodel-1.34.10.tgz", - "integrity": "sha512-pTIG/yR/EynDJXGt4O1DiuwJDKb3U8Oo/bRu8I8YbGWR+6MSbRHnsScHe5SFHituhCfbuP5T3iagFkJYtHwbVQ==", - "requires": { - "debug": "^4.1.1", - "graphql": "^14.3.0", - "pluralize": "^7.0.0", - "popsicle": "10" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "prisma-db-introspection": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-db-introspection/-/prisma-db-introspection-1.34.12.tgz", - "integrity": "sha512-8lQtN5Z12vxwmMBuvmSBbl55jtv2MSPBm+Dntkx0WkbtqNymspNgz2pjed+h4sIuocF42110dxcyplOTPs/iMw==", - "dev": true, - "requires": { - "@types/mongodb": "^3.1.14", - "@types/mysql": "^2.15.5", - "graphql-request": "^1.5.0", - "lodash": "^4.17.4", - "mongodb": "^3.1.10", - "mysql": "^2.16.0", - "pg": "^7.4.1", - "pluralize": "^7.0.0", - "prisma-datamodel": "1.34.12", - "prisma-yml": "1.34.12", - "scuid": "^1.0.2" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "prisma-datamodel": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-datamodel/-/prisma-datamodel-1.34.12.tgz", - "integrity": "sha512-95m7ZEjzuNz++Tuo+GRuIhtS3/xG9fPZm5So/E3kw/lQ4RjE7/BT8Je12XFk47sk7cewQBmQ+Of32J7FW+0cxQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "graphql": "^14.3.0", - "pluralize": "^7.0.0", - "popsicle": "10" - } - } - } - }, - "prisma-generate-schema": { - "version": "1.34.10", - "resolved": "https://registry.npmjs.org/prisma-generate-schema/-/prisma-generate-schema-1.34.10.tgz", - "integrity": "sha512-u2wYeJVELhUKlfy6FAjqg1p8olPRyWj1GEUhn9Nv130e6PfmblmqwSo4h9tvLxW08bqsohcKF0NgiTtjqxwqGQ==", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, "requires": { - "graphql": "^14.3.0", - "pluralize": "^7.0.0", - "popsicle": "10", - "prisma-datamodel": "1.34.10" + "node-modules-regexp": "^1.0.0" } }, - "prisma-json-schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/prisma-json-schema/-/prisma-json-schema-0.1.3.tgz", - "integrity": "sha512-XZrf2080oR81mY8/OC8al68HiwBm0nXlFE727JIia0ZbNqwuV4MyRYk6E0+OIa6/9KEYxZrcAmoBs3EW1cCvnA==", - "dev": true - }, - "prisma-yml": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma-yml/-/prisma-yml-1.34.12.tgz", - "integrity": "sha512-n3tazQHGeji0wylinEu076d378k4+BI0vhQIBqgX467FC32FQnpRPnAANWFmmf32jKAXEJzTbQBwJ0UCPLisOw==", - "dev": true, - "requires": { - "ajv": "5", - "bluebird": "^3.5.1", - "chalk": "^2.3.0", - "debug": "^3.1.0", - "dotenv": "^4.0.0", - "fs-extra": "^7.0.0", - "graphql-request": "^1.5.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "isomorphic-fetch": "^2.2.1", - "js-yaml": "^3.10.0", - "json-stable-stringify": "^1.0.1", - "jsonwebtoken": "^8.1.0", - "lodash": "^4.17.4", - "prisma-json-schema": "0.1.3", - "replaceall": "^0.1.6", - "scuid": "^1.0.2", - "yaml-ast-parser": "^0.0.40" + "pkg-dir": { + "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" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "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": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "ms": "^2.1.1" + "p-locate": "^4.1.0" } }, - "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "p-locate": { + "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" + } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "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 } } }, - "prisma1": { - "version": "1.34.12", - "resolved": "https://registry.npmjs.org/prisma1/-/prisma1-1.34.12.tgz", - "integrity": "sha512-LrbHjyN6IlGsxyruzXLhxRquHKO60VL/zvagYt240Yap9mW80vNn9uU1aKqNpNkoDC0M8E9d5vOp4RCkanbuGQ==", + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, "requires": { - "fs-extra": "^7.0.0", - "prisma-cli-core": "1.34.12", - "prisma-cli-engine": "1.34.12", - "semver": "^5.4.1", - "source-map-support": "^0.4.18" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } + "semver-compare": "^1.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "prisma": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-2.20.1.tgz", + "integrity": "sha512-zyPvJSUfJrmciP2D/4aUrsyIefiH8AIJUeuq1a0X1df1AFw9QQ+ata/7VQdoP+RIQHnCb6Kln9kqfUw/fieljw==", + "dev": true, + "requires": { + "@prisma/engines": "2.20.0-26.60ba6551f29b17d7d6ce479e5733c70d9c00860e" } }, "process-nextick-args": { @@ -12872,12 +11009,6 @@ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" }, - "protochain": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/protochain/-/protochain-1.0.5.tgz", - "integrity": "sha1-mRxAfpneJkqt+PgVBLXn+ve/omA=", - "dev": true - }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -12887,12 +11018,6 @@ "ipaddr.js": "1.9.0" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -12940,33 +11065,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, - "raven": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/raven/-/raven-2.6.4.tgz", - "integrity": "sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw==", - "dev": true, - "requires": { - "cookie": "0.3.1", - "md5": "^2.2.1", - "stack-trace": "0.0.10", - "timed-out": "4.0.1", - "uuid": "3.3.2" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", @@ -13001,6 +11099,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -13113,23 +11212,6 @@ "readable-stream": "^2.0.2" } }, - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", - "dev": true, - "requires": { - "esprima": "~3.0.0" - }, - "dependencies": { - "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", - "dev": true - } - } - }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", @@ -13188,17 +11270,10 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "replaceall": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", - "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -13225,8 +11300,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" } } }, @@ -13262,24 +11336,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "dev": true, - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - }, - "dependencies": { - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - } - } - }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -13311,33 +11367,6 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - } - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -13350,9 +11379,9 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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" } @@ -13372,28 +11401,6 @@ "is-promise": "^2.1.0" } }, - "rwlockfile": { - "version": "1.4.12", - "resolved": "https://registry.npmjs.org/rwlockfile/-/rwlockfile-1.4.12.tgz", - "integrity": "sha1-QM7xfJFSB8QxXB9TWgBuDRVWvNg=", - "dev": true, - "requires": { - "fs-extra": "^5.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, "rxjs": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", @@ -13451,20 +11458,10 @@ } } }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "dev": true, - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "saxes": { "version": "5.0.1", @@ -13475,12 +11472,6 @@ "xmlchars": "^2.2.0" } }, - "scuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz", - "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", - "dev": true - }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -13502,9 +11493,9 @@ } }, "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", "dev": true }, "send": { @@ -13534,21 +11525,6 @@ } } }, - "serialize-error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-3.0.0.tgz", - "integrity": "sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A==", - "dev": true - }, - "serializerr": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/serializerr/-/serializerr-1.0.3.tgz", - "integrity": "sha1-EtTFqhw/+49tHcXzlaqUVVacP5E=", - "dev": true, - "requires": { - "protochain": "^1.0.5" - } - }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -13629,21 +11605,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "sillyname": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/sillyname/-/sillyname-0.1.0.tgz", - "integrity": "sha1-z9mIWOJJhnE0d3Xv47tRQfRsh9Y=", - "dev": true - }, - "simple-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-errors/-/simple-errors-1.0.1.tgz", - "integrity": "sha1-sLvsrB8QgvE7OWKJS0qeiPOgye8=", - "dev": true, - "requires": { - "errno": "^0.1.1" - } - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -13853,16 +11814,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "dev": true, - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -13930,17 +11881,10 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=", - "dev": true - }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -13953,12 +11897,6 @@ "tweetnacl": "~0.14.0" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, "stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", @@ -14008,6 +11946,11 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" + }, "streamsearch": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", @@ -14046,19 +11989,6 @@ } } }, - "string-similarity": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz", - "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==", - "dev": true, - "requires": { - "lodash.every": "^4.6.0", - "lodash.flattendeep": "^4.4.0", - "lodash.foreach": "^4.5.0", - "lodash.map": "^4.6.0", - "lodash.maxby": "^4.6.0" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -14070,6 +12000,24 @@ "strip-ansi": "^5.1.0" } }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -14126,7 +12074,8 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "subscriptions-transport-ws": { "version": "0.9.16", @@ -14159,24 +12108,6 @@ "has-flag": "^3.0.0" } }, - "supports-hyperlinks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", - "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", - "dev": true, - "requires": { - "has-flag": "^2.0.0", - "supports-color": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - } - } - }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -14188,12 +12119,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "sync-exec": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/sync-exec/-/sync-exec-0.6.2.tgz", - "integrity": "sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU=", - "dev": true - }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -14220,32 +12145,23 @@ } }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } } }, "term-size": { @@ -14388,16 +12304,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -14419,12 +12325,6 @@ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -14510,12 +12410,6 @@ "punycode": "^2.1.1" } }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true - }, "ts-invariant": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", @@ -14525,196 +12419,42 @@ } }, "ts-jest": { - "version": "26.4.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", - "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "version": "26.5.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.4.tgz", + "integrity": "sha512-I5Qsddo+VTm94SukBJ4cPimOoFZsYTeElR2xy6H2TOVs+NsvgYglW8KuQgKoApOKuaU/Ix/vrF9ebFZlb5D2Pg==", "dev": true, "requires": { - "@types/jest": "26.x", "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", "jest-util": "^26.1.0", "json5": "2.x", - "lodash.memoize": "4.x", + "lodash": "4.x", "make-error": "1.x", "mkdirp": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, "dependencies": { - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.19", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz", - "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", - "dev": true - }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", "dev": true } } @@ -14737,7 +12477,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -14745,8 +12484,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { "version": "0.3.2", @@ -14778,11 +12516,6 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -14793,11 +12526,22 @@ } }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", "dev": true }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -14837,12 +12581,6 @@ "cookie": "^0.4.0" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14935,32 +12673,10 @@ } } }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uppercamelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uppercamelcase/-/uppercamelcase-3.0.0.tgz", - "integrity": "sha1-OAsyG41zy6Fv7E11KldRUtHvcxc=", - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } - } - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -14987,12 +12703,6 @@ } } }, - "url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", - "dev": true - }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", @@ -15014,12 +12724,15 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", + "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "for-each": "^0.3.3", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.1" } }, "utils-merge": { @@ -15076,7 +12789,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -15125,11 +12837,6 @@ "iconv-lite": "0.4.24" } }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", @@ -15156,6 +12863,18 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -15403,20 +13122,14 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", - "dev": true - }, - "yaml-ast-parser": { - "version": "0.0.40", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.40.tgz", - "integrity": "sha1-CFNtTnPTIrHJziB6uN1w4E0grm4=", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { @@ -15522,6 +13235,12 @@ "decamelize": "^1.2.0" } }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "yup": { "version": "0.31.1", "resolved": "https://registry.npmjs.org/yup/-/yup-0.31.1.tgz", @@ -15547,18 +13266,6 @@ "tslib": "^1.9.3", "zen-observable": "^0.8.0" } - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } } } } diff --git a/package.json b/package.json index fbd23f9..5271dc6 100644 --- a/package.json +++ b/package.json @@ -4,61 +4,66 @@ "description": "RC Tech data server", "main": "src/index.ts", "scripts": { - "build": "tsc", + "build": "npm run prisma:generate && tsc", "postbuild": "node postbuild.js", "start": "node dist/index.js", + "start:docker-local": "npm run prisma:migrate:deploy && npm run prisma:generate && npm start", "test": "jest --runInBand --testPathIgnorePatterns utils", "dev": "nodemon", - "lint": "eslint . --ext .ts" + "lint": "eslint . --ext .ts", + "prisma:migrate:dev": "npx prisma migrate dev --name migration", + "prisma:migrate:deploy": "npx prisma migrate deploy", + "prisma:generate": "npx prisma generate" }, "author": "", "license": "ISC", "dependencies": { - "@types/jsonwebtoken": "^8.5.0", - "apollo-server": "^2.19.1", - "apollo-server-express": "^2.19.1", - "aws-sdk": "^2.817.0", - "bcrypt": "^5.0.0", + "@prisma/client": "^2.20.1", + "apollo-server": "^2.22.2", + "apollo-server-express": "^2.22.2", + "aws-sdk": "^2.884.0", + "bcrypt": "^5.0.1", "body-parser": "^1.19.0", "cors": "^2.8.5", "dotenv": "^8.2.0", "express": "^4.17.1", - "google-auth-library": "^7.0.0", + "google-auth-library": "^7.0.4", "graphql": "^14.7.0", "graphql-import": "^0.7.1", "graphql-middleware": "^4.0.3", - "graphql-shield": "^7.4.4", + "graphql-shield": "^7.5.0", "graphql-tools": "^5.0.0", "jsonwebtoken": "^8.5.1", "moment": "^2.29.1", - "nodemailer": "^6.4.17", + "nodemailer": "^6.5.0", "pg": "^7.18.2", - "prisma-client-lib": "^1.34.10", + "request": "^2.88.2", "universal-cookie": "^4.0.4" }, "devDependencies": { - "@types/bcrypt": "^3.0.0", + "@types/bcrypt": "^3.0.1", "@types/graphql": "^14.5.0", "@types/jest": "^24.9.1", - "@types/nodemailer": "^6.4.0", + "@types/jsonwebtoken": "^8.5.1", + "@types/nodemailer": "^6.4.1", "@types/universal-cookie": "^2.2.0", "@typescript-eslint/eslint-plugin": "^2.34.0", "@typescript-eslint/parser": "^2.34.0", - "apollo-server-testing": "^2.19.1", - "apollo-server-types": "^0.6.2", + "apollo-server-testing": "^2.22.2", + "apollo-server-types": "^0.6.3", "eslint": "^6.8.0", "eslint-config-prettier": "^6.15.0", "eslint-plugin-jest": "^23.20.0", - "eslint-plugin-prettier": "^3.3.0", + "eslint-plugin-prettier": "^3.3.1", "graphql-tag": "^2.11.0", - "husky": "^4.3.6", + "husky": "^4.3.8", "jest": "^26.6.3", - "lint-staged": "^10.5.3", + "lint-staged": "^10.5.4", "nodemon": "^1.19.4", "prettier": "^1.19.1", - "prisma1": "^1.34.12", - "ts-jest": "^26.4.4", - "typescript": "^3.9.7" + "prisma": "^2.20.1", + "ts-jest": "^26.5.4", + "typescript": "^4.2.4" }, "nodemonConfig": { "ignore": [ @@ -72,7 +77,7 @@ "package.json", "prisma" ], - "exec": "prisma generate && npm run build && npm start", + "exec": "npm run build && npm start", "ext": "ts" }, "husky": { diff --git a/postbuild.js b/postbuild.js index e483744..9490018 100644 --- a/postbuild.js +++ b/postbuild.js @@ -5,10 +5,10 @@ const operatingSystem = type(); if (operatingSystem === "Linux") exec( - "cp src/schema.graphql src/prisma.graphql ./dist && sed -i 's/src/dist/g' ./dist/schema.js" + "cp src/schema.graphql src/prisma.legacy.graphql ./dist && sed -i 's/src/dist/g' ./dist/typedefs.js" ); else if (operatingSystem === "Darwin") exec( - "cp src/schema.graphql src/prisma.graphql ./dist && sed -i '' 's+src/schema.graphql+dist/schema.graphql+g' ./dist/schema.js" + "cp src/schema.graphql src/prisma.legacy.graphql ./dist && sed -i '' 's+src/schema.graphql+dist/schema.graphql+g' ./dist/typedefs.js" ); else throw new Error("Unsupported OS found: " + operatingSystem); diff --git a/prisma/.env.sample b/prisma/.env.sample deleted file mode 100644 index 553044c..0000000 --- a/prisma/.env.sample +++ /dev/null @@ -1,6 +0,0 @@ -PRISMA_MANAGEMENT_API_SECRET=secret123 -PRISMA_HOST=http://localhost:4466/prisma -PRISMA_SECRET=secret123 -DB_HOST=postgres -DB_USER=prisma -DB_PASSWORD=prisma diff --git a/prisma/docker-compose.yml b/prisma/docker-compose.yml deleted file mode 100644 index 5548ee8..0000000 --- a/prisma/docker-compose.yml +++ /dev/null @@ -1,30 +0,0 @@ -version: '3' -services: - prisma: - image: prismagraphql/prisma:1.34 - restart: always - ports: - - "4466:4466" - environment: - PRISMA_CONFIG: | - managementApiSecret: ${PRISMA_MANAGEMENT_API_SECRET} - port: 4466 - databases: - default: - connector: postgres - host: ${DB_HOST} - user: ${DB_USER} - password: ${DB_PASSWORD} - port: 5432 - migrations: true - postgres: - image: postgres - restart: always - environment: - POSTGRES_USER: ${DB_USER} - POSTGRES_PASSWORD: ${DB_PASSWORD} - volumes: - - postgres:/var/lib/postgresql/data - -volumes: - postgres: \ No newline at end of file diff --git a/prisma/migrations/20210410200142_migration/migration.sql b/prisma/migrations/20210410200142_migration/migration.sql new file mode 100644 index 0000000..6cc2aa5 --- /dev/null +++ b/prisma/migrations/20210410200142_migration/migration.sql @@ -0,0 +1,131 @@ +-- CreateEnum +CREATE TYPE "Role" AS ENUM ('ADMIN', 'USER'); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "password" TEXT, + "email" TEXT NOT NULL, + "image_url" TEXT NOT NULL, + "phone" TEXT NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, + "room_no" TEXT NOT NULL, + "role" "Role" NOT NULL DEFAULT E'USER', + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserSession" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "userId" TEXT NOT NULL, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Washer" ( + "id" TEXT NOT NULL, + "in_use" BOOLEAN NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Room" ( + "id" TEXT NOT NULL, + "number" TEXT NOT NULL, + "name" TEXT NOT NULL, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Booking" ( + "id" TEXT NOT NULL, + "start" TIMESTAMP(3) NOT NULL, + "end" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "remark" TEXT, + "userId" TEXT NOT NULL, + "roomId" TEXT NOT NULL, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Event" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "start" TIMESTAMP(3) NOT NULL, + "end" TIMESTAMP(3) NOT NULL, + "venue" TEXT NOT NULL, + "image_url" TEXT NOT NULL, + "description" TEXT, + "organiserId" TEXT NOT NULL, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Comment" ( + "id" TEXT NOT NULL, + "content" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "eventId" TEXT, + "userId" TEXT NOT NULL, + + PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_EventSubscribers" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "User.username_unique" ON "User"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "User.phone_unique" ON "User"("phone"); + +-- CreateIndex +CREATE UNIQUE INDEX "Room.number_unique" ON "Room"("number"); + +-- CreateIndex +CREATE UNIQUE INDEX "_EventSubscribers_AB_unique" ON "_EventSubscribers"("A", "B"); + +-- CreateIndex +CREATE INDEX "_EventSubscribers_B_index" ON "_EventSubscribers"("B"); + +-- AddForeignKey +ALTER TABLE "UserSession" ADD FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Booking" ADD FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Booking" ADD FOREIGN KEY ("roomId") REFERENCES "Room"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Event" ADD FOREIGN KEY ("organiserId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_EventSubscribers" ADD FOREIGN KEY ("A") REFERENCES "Event"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_EventSubscribers" ADD FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..33241c3 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,96 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model User { + id String @id @default(uuid()) + username String @unique + password String? + email String @unique + image_url String + phone String @unique + first_name String + last_name String + room_no String + + sessions UserSession[] @relation("UserLoginSessions") + roomBookings Booking[] @relation("UserBookings") + eventsOrganised Event[] @relation("UserEvents") + eventsSubscribed Event[] @relation("EventSubscribers") + userComments Comment[] @relation("UserComments") + + role Role @default(USER) +} + +enum Role { + ADMIN + USER +} + +model UserSession { + id String @id @default(uuid()) + createdAt DateTime @default(now()) + userId String + user User @relation(name: "UserLoginSessions", fields: [userId], references: [id]) +} + +model Washer { + id String @id @default(uuid()) + in_use Boolean + updatedAt DateTime @updatedAt +} + +model Room { + id String @id @default(uuid()) + number String @unique + name String + bookings Booking[] @relation("RoomBookings") +} + +model Booking { + id String @id @default(uuid()) + start DateTime + end DateTime + createdAt DateTime @default(now()) + remark String? + + userId String + user User @relation(name: "UserBookings", fields: [userId], references: [id]) + + roomId String + room Room @relation(name: "RoomBookings", fields: [roomId], references: [id]) +} + +model Event { + id String @id @default(uuid()) + title String + start DateTime + end DateTime + venue String + image_url String + description String? + + organiserId String + organiser User @relation(name: "UserEvents", fields: [organiserId], references: [id]) + + subscribers User[] @relation("EventSubscribers") + + comments Comment[] @relation("EventComments") +} + +model Comment { + id String @id @default(uuid()) + content String + createdAt DateTime @default(now()) + + eventId String? + event Event? @relation(name: "EventComments", fields: [eventId], references: [id]) + + userId String + user User @relation(name: "UserComments", fields: [userId], references: [id]) +} diff --git a/Dockerfile b/prod.Dockerfile similarity index 100% rename from Dockerfile rename to prod.Dockerfile diff --git a/src/auth/admin.ts b/src/auth/admin.ts index 50d1057..4711220 100644 --- a/src/auth/admin.ts +++ b/src/auth/admin.ts @@ -2,9 +2,11 @@ import * as env from "dotenv"; env.config(); import express from "express"; -import { prisma } from "../generated/prisma-client"; +import { Role } from "@prisma/client"; import * as bcrypt from "bcrypt"; -import * as jwt from "jsonwebtoken"; +import { prisma } from "../utils/prisma"; +import { generateToken } from "../utils/authToken"; + const router = express.Router(); const saltRounds = 10; @@ -16,18 +18,20 @@ router.post("/login", async (req, res) => { } const username: string = req.body.username; const password: string = req.body.password; - const adminUser = await prisma.user({ username: username }); + const adminUser = await prisma.user.findUnique({ where: { username } }); if (adminUser.role === "ADMIN") { const hashedPassword = adminUser.password; if (await bcrypt.compare(password, hashedPassword)) { - const adminSession = await prisma.createUserSession({ - user: { - connect: { - id: adminUser.id, + const adminSession = await prisma.userSession.create({ + data: { + user: { + connect: { + id: adminUser.id, + }, }, }, }); - const token = jwt.sign(adminSession, process.env.PRISMA_SECRET); + const token = generateToken(adminSession); res.status(200).send(token); return; } else { @@ -52,16 +56,18 @@ router.post("/register", async (req, res) => { const phone = req.body.phone; bcrypt.hash(password, saltRounds).then(async hash => { - await prisma.createUser({ - username: username, - password: hash, - email: username, - first_name: first_name, - last_name: last_name, - room_no: room_no, - image_url: image_url, - phone: phone, - role: "ADMIN", + await prisma.user.create({ + data: { + username: username, + password: hash, + email: username, + first_name: first_name, + last_name: last_name, + room_no: room_no, + image_url: image_url, + phone: phone, + role: Role.ADMIN, + }, }); res.status(200).send(`User: ${username} is registered`); }); diff --git a/src/auth/user.ts b/src/auth/user.ts index e2db9c3..2030ab3 100644 --- a/src/auth/user.ts +++ b/src/auth/user.ts @@ -2,9 +2,9 @@ import * as env from "dotenv"; env.config(); import express from "express"; -import { prisma } from "../generated/prisma-client"; import { OAuth2Client } from "google-auth-library"; import { generateToken } from "../utils/authToken"; +import { prisma } from "../utils/prisma"; import { TokenPayload } from "google-auth-library/build/src/auth/loginticket"; const client: OAuth2Client = new OAuth2Client(process.env.GOOGLE_CLIENT_ID); @@ -42,17 +42,21 @@ router.post("/login", async (req, res) => { } // Get the user from the email address. - const user = await prisma.user({ email: payload.email }); + const user = await prisma.user.findUnique({ + where: { email: payload.email }, + }); if (user === null) { res.status(200).send({ registered: false, logged_in: false, token: null }); return; } // Create a user session for the user - const userSession = await prisma.createUserSession({ - user: { - connect: { - id: user.id, + const userSession = await prisma.userSession.create({ + data: { + user: { + connect: { + id: user.id, + }, }, }, }); diff --git a/src/context.ts b/src/context.ts index 36da516..265eef8 100644 --- a/src/context.ts +++ b/src/context.ts @@ -1,12 +1,13 @@ -import { prisma, Prisma, User } from "./generated/prisma-client"; +import { PrismaClient, User } from "@prisma/client"; import Cookies from "universal-cookie"; import { resolveUserUsingJWT } from "./utils/resolveUser"; +import { prisma } from "./utils/prisma"; export type AppContext = { - prisma: Prisma; + prisma: PrismaClient; token: string; auth: { - user: User; + user: User | undefined; isAuthenticated: boolean; }; }; @@ -21,7 +22,7 @@ export const context = async ({ req }): Promise => { prisma, token, auth: { - user: user, + user: user ?? undefined, isAuthenticated: user !== null, }, }; diff --git a/src/index.ts b/src/index.ts index 64f98ed..f605963 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ env.config(); import server from "./server"; import express from "express"; import cors, { CorsOptions } from "cors"; -import { auth, adminAuth } from "./auth"; +// import { auth, adminAuth } from "./auth"; import * as bodyParser from "body-parser"; import { context } from "./context"; @@ -42,8 +42,8 @@ app.get("/", (req, res) => { app.use(bodyParser.json({ type: "application/json" })); -app.use("/oauth/user", auth); -app.use("/oauth/admin", adminAuth); +// app.use("/oauth/user", auth); +// app.use("/oauth/admin", adminAuth); app.listen({ port: PORT }, () => { console.log(`Server started at port ${PORT}`); diff --git a/src/mutations/bookings.ts b/src/mutations/bookings.ts index bda41f5..8abb786 100644 --- a/src/mutations/bookings.ts +++ b/src/mutations/bookings.ts @@ -1,4 +1,5 @@ -import { Booking, Room, User } from "../generated/prisma-client"; +import { Booking, Room, User } from "@prisma/client"; + import { sendEmail } from "../utils/email/sendEmail"; import { validateBooking } from "../utils/validateBooking"; import { AppContext } from "../context"; @@ -12,8 +13,8 @@ const createBooking = async ( const start: Date = new Date(data.start); const end: Date = new Date(data.end); const remark: string = data.remark; - const room: Room = await ctx.prisma.room({ - number: data.room_number, + const room: Room = await ctx.prisma.room.findUnique({ + where: { number: data.room_number }, }); const validity: boolean = await validateBooking( @@ -23,18 +24,20 @@ const createBooking = async ( ); if (!validity) return null; - const booking: Booking = await ctx.prisma.createBooking({ - user: { - connect: { - username: user.username, + const booking: Booking = await ctx.prisma.booking.create({ + data: { + user: { + connect: { + username: user.username, + }, }, - }, - start, - end, - remark, - room: { - connect: { - number: room.number, + start, + end, + remark, + room: { + connect: { + number: room.number, + }, }, }, }); @@ -50,19 +53,19 @@ const updateBooking = async ( const start: Date = new Date(data.start); const end: Date = new Date(data.end); const remark: string = data.remark; - const room: Room = await ctx.prisma.room({ - number: data.room_number, + const room: Room = await ctx.prisma.room.findUnique({ + where: { number: data.room_number }, }); const id = data.id; - return ctx.prisma.updateBooking({ + return ctx.prisma.booking.update({ data: { start, end, remark, room: { - update: { - number: room.number, + connect: { + number: data.room_number, }, }, }, @@ -77,7 +80,7 @@ const deleteBooking = async ( { id }, ctx: AppContext ): Promise => { - return ctx.prisma.deleteBooking({ id }); + return ctx.prisma.booking.delete({ where: { id } }); }; export { createBooking, updateBooking, deleteBooking }; diff --git a/src/mutations/comments.ts b/src/mutations/comments.ts index 25c7553..197b704 100644 --- a/src/mutations/comments.ts +++ b/src/mutations/comments.ts @@ -1,8 +1,11 @@ -import assert from "assert"; -import { User, Event, Comment } from "../generated/prisma-client"; -import { resolveUserUsingJWT } from "../utils/resolveUser"; +import { User, Comment } from "@prisma/client"; +import { AppContext } from "../context"; -const createComment = async (parent, data, ctx): Promise => { +const createComment = async ( + parent, + data, + ctx: AppContext +): Promise => { const currentUser: User = ctx.auth.user; const userId: string = currentUser.id; @@ -10,25 +13,31 @@ const createComment = async (parent, data, ctx): Promise => { const eventId: string | null = data.eventId; if (eventId) { - return ctx.prisma.createComment({ - content, - user: { - connect: { - id: userId, + return ctx.prisma.comment.create({ + data: { + content, + user: { + connect: { + id: userId, + }, }, - }, - event: { - connect: { - id: eventId, + event: { + connect: { + id: eventId, + }, }, }, }); } else throw new Error("No id of a particular data type is provided"); }; -const deleteComment = async (parent, { id }, ctx): Promise => { - return ctx.prisma.deleteComment({ - id, +const deleteComment = async ( + parent, + { id }, + ctx: AppContext +): Promise => { + return ctx.prisma.comment.delete({ + where: { id }, }); }; diff --git a/src/mutations/events/events.ts b/src/mutations/events/events.ts index 5316363..cdbf880 100644 --- a/src/mutations/events/events.ts +++ b/src/mutations/events/events.ts @@ -1,10 +1,12 @@ import env from "dotenv"; env.config(); -import { Event, User } from "../../generated/prisma-client"; +import { Event, User } from "@prisma/client"; + +import { AppContext } from "../../context"; + import { uploadToS3, deleteFromS3 } from "../../utils/S3"; import { S3UploadResponse, S3DeleteResponse } from "../../utils/S3/types"; -import assert from "assert"; import { isImageValid } from "../../utils/validateImage"; const bucket_suffix = @@ -14,22 +16,24 @@ const bucket_name = `rctechclub-raven/${bucket_suffix}`; const createEvent = async ( parent, { title, start, end, venue, image_base64, description }, - ctx + ctx: AppContext ): Promise | null => { const user: User = ctx.auth.user; start = new Date(start); end = new Date(end); - const event: Event = await ctx.prisma.createEvent({ - title, - start, - end, - venue, - description, - image_url: "", - organiser: { - connect: { - id: user.id, + const event: Event = await ctx.prisma.event.create({ + data: { + title, + start, + end, + venue, + description, + image_url: "", + organiser: { + connect: { + id: user.id, + }, }, }, }); @@ -40,7 +44,7 @@ const createEvent = async ( const sizeLimit = 10 * 1000000; const imageValidity = isImageValid(image_base64, sizeLimit); if (!imageValidity) { - await ctx.prisma.deleteEvent({ id }); + await ctx.prisma.event.delete({ where: { id } }); return null; } @@ -62,17 +66,21 @@ const createEvent = async ( //if there's an error in uploading image to S3 //then delete pre-created event and return null if (!isSuccessful) { - await ctx.prisma.deleteEvent({ id }); + await ctx.prisma.event.delete({ where: { id } }); return null; } - return ctx.prisma.updateEvent({ + return ctx.prisma.event.update({ data: { image_url }, where: { id }, }); }; -const deleteEvent = async (parent, { id }, ctx): Promise | null => { +const deleteEvent = async ( + parent, + { id }, + ctx: AppContext +): Promise | null => { const s3DeleteResponse: S3DeleteResponse = await deleteFromS3({ file_name: id, bucket_name, @@ -82,7 +90,7 @@ const deleteEvent = async (parent, { id }, ctx): Promise | null => { //return null if unable to delete image from S3 if (!isSuccessful) return null; - return ctx.prisma.deleteEvent({ id }); + return ctx.prisma.event.delete({ where: { id } }); }; export { createEvent, deleteEvent }; diff --git a/src/mutations/events/subscribers.ts b/src/mutations/events/subscribers.ts index e526b4d..052d273 100644 --- a/src/mutations/events/subscribers.ts +++ b/src/mutations/events/subscribers.ts @@ -1,11 +1,15 @@ -import assert from "assert"; -import { Event, User } from "../../generated/prisma-client"; +import { Event, User } from "@prisma/client"; +import { AppContext } from "../../context"; -const addEventSubscriber = async (parent, { id }, ctx): Promise => { +const addEventSubscriber = async ( + parent, + { id }, + ctx: AppContext +): Promise => { const currentUser: User = ctx.auth.user; const { id: user_id } = currentUser; - return ctx.prisma.updateEvent({ + return ctx.prisma.event.update({ data: { subscribers: { connect: { id: user_id }, @@ -17,15 +21,22 @@ const addEventSubscriber = async (parent, { id }, ctx): Promise => { }); }; -const removeEventSubscriber = async (parent, { id }, ctx): Promise => { +const removeEventSubscriber = async ( + parent, + { id }, + ctx: AppContext +): Promise => { const currentUser: User = ctx.auth.user; const { id: user_id } = currentUser; - const subscribers: [User] = await ctx.prisma.event({ id }).subscribers(); - const subscribersID: string[] = subscribers.map(({ id }) => id); + const event = await ctx.prisma.event.findUnique({ + where: { id }, + include: { subscribers: true }, + }); + const subscribersID: string[] = event.subscribers.map(({ id }) => id); if (subscribersID.includes(user_id)) { - return ctx.prisma.updateEvent({ + return ctx.prisma.event.update({ data: { subscribers: { disconnect: { id: user_id }, @@ -37,7 +48,7 @@ const removeEventSubscriber = async (parent, { id }, ctx): Promise => { }); } - return ctx.prisma.event({ id }); + return event; }; export { addEventSubscriber, removeEventSubscriber }; diff --git a/src/mutations/user.ts b/src/mutations/user.ts index c77d4ec..2e066dd 100644 --- a/src/mutations/user.ts +++ b/src/mutations/user.ts @@ -1,6 +1,6 @@ import * as env from "dotenv"; import { OAuth2Client } from "google-auth-library"; -import { User, UserSession } from "../generated/prisma-client"; +import { User, UserSession, Role } from "@prisma/client"; import { TokenPayload } from "google-auth-library/build/src/auth/loginticket"; import { generateToken } from "../utils/authToken"; import { AppContext } from "../context"; @@ -27,15 +27,19 @@ const login = async (parent, args, ctx: AppContext): Promise => { // Check if the user email is an HKU email address if (payload && payload.hd !== "connect.hku.hk") return { token: null, login_status: false, register: false }; - const user: User = await ctx.prisma.user({ email: payload.email }); + const user: User = await ctx.prisma.user.findUnique({ + where: { email: payload.email }, + }); // If the user does not exist, return that the user needs to be registered if (user === null) return { token: null, login_status: false, register: true }; // If the user is valid, then register a user session and return a to - const userSession: UserSession = await ctx.prisma.createUserSession({ - user: { - connect: { - id: user.id, + const userSession: UserSession = await ctx.prisma.userSession.create({ + data: { + user: { + connect: { + id: user.id, + }, }, }, }); @@ -47,7 +51,11 @@ const login = async (parent, args, ctx: AppContext): Promise => { } }; -const register = async (parent, { user }, ctx): Promise | null => { +const register = async ( + parent, + { user }, + ctx: AppContext +): Promise | null => { try { await client.verifyIdToken({ idToken: ctx.token, @@ -63,15 +71,17 @@ const register = async (parent, { user }, ctx): Promise | null => { }); const payload: TokenPayload = ticket.getPayload(); if (payload && payload.hd !== "connect.hku.hk") return null; - return ctx.prisma.createUser({ - username: user.username, - email: payload.email, - image_url: payload.picture, - phone: user.phone, - first_name: payload.given_name, - last_name: payload.family_name, - room_no: user.room_no, - role: "USER", + return ctx.prisma.user.create({ + data: { + username: user.username, + email: payload.email, + image_url: payload.picture, + phone: user.phone, + first_name: payload.given_name, + last_name: payload.family_name, + room_no: user.room_no, + role: Role.USER, + }, }); }; diff --git a/src/mutations/washers.ts b/src/mutations/washers.ts index fb57d40..5f94a5b 100644 --- a/src/mutations/washers.ts +++ b/src/mutations/washers.ts @@ -1,19 +1,24 @@ -import { Washer } from "../generated/prisma-client"; +import { Washer } from "@prisma/client"; import jwt from "jsonwebtoken"; import assert from "assert"; +import { AppContext } from "../context"; -const updateWasher = async (parent, { id, in_use }, ctx): Promise => { +const updateWasher = async ( + parent, + { id, in_use }, + ctx: AppContext +): Promise => { try { - const secretString: string = jwt.verify( + const secretString: string = (await jwt.verify( ctx.token, process.env.SLS_SECRET - ) as string; + )) as string; assert.strictEqual(secretString, "sls to phoenix"); // same string is sent from sls lambda function } catch (e) { return null; } - return ctx.prisma.updateWasher({ + return ctx.prisma.washer.update({ data: { in_use, }, diff --git a/src/prisma.legacy.graphql b/src/prisma.legacy.graphql new file mode 100644 index 0000000..6c84dd6 --- /dev/null +++ b/src/prisma.legacy.graphql @@ -0,0 +1,2228 @@ +type AggregateBooking { + count: Int! +} + +type AggregateComment { + count: Int! +} + +type AggregateEvent { + count: Int! +} + +type AggregateRoom { + count: Int! +} + +type AggregateUser { + count: Int! +} + +type AggregateUserSession { + count: Int! +} + +type AggregateWasher { + count: Int! +} + +type BatchPayload { + count: Long! +} + +type Booking { + id: ID! + user: User! + room: Room! + start: DateTime! + end: DateTime! + remark: String + createdAt: DateTime! +} + +type BookingConnection { + pageInfo: PageInfo! + edges: [BookingEdge]! + aggregate: AggregateBooking! +} + +input BookingCreateInput { + id: ID + user: UserCreateOneWithoutRoomBookingsInput! + room: RoomCreateOneWithoutBookingsInput! + start: DateTime! + end: DateTime! + remark: String +} + +input BookingCreateManyWithoutRoomInput { + create: [BookingCreateWithoutRoomInput!] + connect: [BookingWhereUniqueInput!] +} + +input BookingCreateManyWithoutUserInput { + create: [BookingCreateWithoutUserInput!] + connect: [BookingWhereUniqueInput!] +} + +input BookingCreateWithoutRoomInput { + id: ID + user: UserCreateOneWithoutRoomBookingsInput! + start: DateTime! + end: DateTime! + remark: String +} + +input BookingCreateWithoutUserInput { + id: ID + room: RoomCreateOneWithoutBookingsInput! + start: DateTime! + end: DateTime! + remark: String +} + +type BookingEdge { + node: Booking! + cursor: String! +} + +enum BookingOrderByInput { + id_ASC + id_DESC + start_ASC + start_DESC + end_ASC + end_DESC + remark_ASC + remark_DESC + createdAt_ASC + createdAt_DESC +} + +type BookingPreviousValues { + id: ID! + start: DateTime! + end: DateTime! + remark: String + createdAt: DateTime! +} + +input BookingScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + start: DateTime + start_not: DateTime + start_in: [DateTime!] + start_not_in: [DateTime!] + start_lt: DateTime + start_lte: DateTime + start_gt: DateTime + start_gte: DateTime + end: DateTime + end_not: DateTime + end_in: [DateTime!] + end_not_in: [DateTime!] + end_lt: DateTime + end_lte: DateTime + end_gt: DateTime + end_gte: DateTime + remark: String + remark_not: String + remark_in: [String!] + remark_not_in: [String!] + remark_lt: String + remark_lte: String + remark_gt: String + remark_gte: String + remark_contains: String + remark_not_contains: String + remark_starts_with: String + remark_not_starts_with: String + remark_ends_with: String + remark_not_ends_with: String + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [BookingScalarWhereInput!] + OR: [BookingScalarWhereInput!] + NOT: [BookingScalarWhereInput!] +} + +type BookingSubscriptionPayload { + mutation: MutationType! + node: Booking + updatedFields: [String!] + previousValues: BookingPreviousValues +} + +input BookingSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: BookingWhereInput + AND: [BookingSubscriptionWhereInput!] + OR: [BookingSubscriptionWhereInput!] + NOT: [BookingSubscriptionWhereInput!] +} + +input BookingUpdateInput { + user: UserUpdateOneRequiredWithoutRoomBookingsInput + room: RoomUpdateOneRequiredWithoutBookingsInput + start: DateTime + end: DateTime + remark: String +} + +input BookingUpdateManyDataInput { + start: DateTime + end: DateTime + remark: String +} + +input BookingUpdateManyMutationInput { + start: DateTime + end: DateTime + remark: String +} + +input BookingUpdateManyWithoutRoomInput { + create: [BookingCreateWithoutRoomInput!] + delete: [BookingWhereUniqueInput!] + connect: [BookingWhereUniqueInput!] + set: [BookingWhereUniqueInput!] + disconnect: [BookingWhereUniqueInput!] + update: [BookingUpdateWithWhereUniqueWithoutRoomInput!] + upsert: [BookingUpsertWithWhereUniqueWithoutRoomInput!] + deleteMany: [BookingScalarWhereInput!] + updateMany: [BookingUpdateManyWithWhereNestedInput!] +} + +input BookingUpdateManyWithoutUserInput { + create: [BookingCreateWithoutUserInput!] + delete: [BookingWhereUniqueInput!] + connect: [BookingWhereUniqueInput!] + set: [BookingWhereUniqueInput!] + disconnect: [BookingWhereUniqueInput!] + update: [BookingUpdateWithWhereUniqueWithoutUserInput!] + upsert: [BookingUpsertWithWhereUniqueWithoutUserInput!] + deleteMany: [BookingScalarWhereInput!] + updateMany: [BookingUpdateManyWithWhereNestedInput!] +} + +input BookingUpdateManyWithWhereNestedInput { + where: BookingScalarWhereInput! + data: BookingUpdateManyDataInput! +} + +input BookingUpdateWithoutRoomDataInput { + user: UserUpdateOneRequiredWithoutRoomBookingsInput + start: DateTime + end: DateTime + remark: String +} + +input BookingUpdateWithoutUserDataInput { + room: RoomUpdateOneRequiredWithoutBookingsInput + start: DateTime + end: DateTime + remark: String +} + +input BookingUpdateWithWhereUniqueWithoutRoomInput { + where: BookingWhereUniqueInput! + data: BookingUpdateWithoutRoomDataInput! +} + +input BookingUpdateWithWhereUniqueWithoutUserInput { + where: BookingWhereUniqueInput! + data: BookingUpdateWithoutUserDataInput! +} + +input BookingUpsertWithWhereUniqueWithoutRoomInput { + where: BookingWhereUniqueInput! + update: BookingUpdateWithoutRoomDataInput! + create: BookingCreateWithoutRoomInput! +} + +input BookingUpsertWithWhereUniqueWithoutUserInput { + where: BookingWhereUniqueInput! + update: BookingUpdateWithoutUserDataInput! + create: BookingCreateWithoutUserInput! +} + +input BookingWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + user: UserWhereInput + room: RoomWhereInput + start: DateTime + start_not: DateTime + start_in: [DateTime!] + start_not_in: [DateTime!] + start_lt: DateTime + start_lte: DateTime + start_gt: DateTime + start_gte: DateTime + end: DateTime + end_not: DateTime + end_in: [DateTime!] + end_not_in: [DateTime!] + end_lt: DateTime + end_lte: DateTime + end_gt: DateTime + end_gte: DateTime + remark: String + remark_not: String + remark_in: [String!] + remark_not_in: [String!] + remark_lt: String + remark_lte: String + remark_gt: String + remark_gte: String + remark_contains: String + remark_not_contains: String + remark_starts_with: String + remark_not_starts_with: String + remark_ends_with: String + remark_not_ends_with: String + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [BookingWhereInput!] + OR: [BookingWhereInput!] + NOT: [BookingWhereInput!] +} + +input BookingWhereUniqueInput { + id: ID +} + +type Comment { + id: ID! + content: String! + user: User! + event: Event + createdAt: DateTime! +} + +type CommentConnection { + pageInfo: PageInfo! + edges: [CommentEdge]! + aggregate: AggregateComment! +} + +input CommentCreateInput { + id: ID + content: String! + user: UserCreateOneWithoutUserCommentsInput! + event: EventCreateOneWithoutCommentsInput +} + +input CommentCreateManyWithoutEventInput { + create: [CommentCreateWithoutEventInput!] + connect: [CommentWhereUniqueInput!] +} + +input CommentCreateManyWithoutUserInput { + create: [CommentCreateWithoutUserInput!] + connect: [CommentWhereUniqueInput!] +} + +input CommentCreateWithoutEventInput { + id: ID + content: String! + user: UserCreateOneWithoutUserCommentsInput! +} + +input CommentCreateWithoutUserInput { + id: ID + content: String! + event: EventCreateOneWithoutCommentsInput +} + +type CommentEdge { + node: Comment! + cursor: String! +} + +enum CommentOrderByInput { + id_ASC + id_DESC + content_ASC + content_DESC + createdAt_ASC + createdAt_DESC +} + +type CommentPreviousValues { + id: ID! + content: String! + createdAt: DateTime! +} + +input CommentScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + content: String + content_not: String + content_in: [String!] + content_not_in: [String!] + content_lt: String + content_lte: String + content_gt: String + content_gte: String + content_contains: String + content_not_contains: String + content_starts_with: String + content_not_starts_with: String + content_ends_with: String + content_not_ends_with: String + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [CommentScalarWhereInput!] + OR: [CommentScalarWhereInput!] + NOT: [CommentScalarWhereInput!] +} + +type CommentSubscriptionPayload { + mutation: MutationType! + node: Comment + updatedFields: [String!] + previousValues: CommentPreviousValues +} + +input CommentSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: CommentWhereInput + AND: [CommentSubscriptionWhereInput!] + OR: [CommentSubscriptionWhereInput!] + NOT: [CommentSubscriptionWhereInput!] +} + +input CommentUpdateInput { + content: String + user: UserUpdateOneRequiredWithoutUserCommentsInput + event: EventUpdateOneWithoutCommentsInput +} + +input CommentUpdateManyDataInput { + content: String +} + +input CommentUpdateManyMutationInput { + content: String +} + +input CommentUpdateManyWithoutEventInput { + create: [CommentCreateWithoutEventInput!] + delete: [CommentWhereUniqueInput!] + connect: [CommentWhereUniqueInput!] + set: [CommentWhereUniqueInput!] + disconnect: [CommentWhereUniqueInput!] + update: [CommentUpdateWithWhereUniqueWithoutEventInput!] + upsert: [CommentUpsertWithWhereUniqueWithoutEventInput!] + deleteMany: [CommentScalarWhereInput!] + updateMany: [CommentUpdateManyWithWhereNestedInput!] +} + +input CommentUpdateManyWithoutUserInput { + create: [CommentCreateWithoutUserInput!] + delete: [CommentWhereUniqueInput!] + connect: [CommentWhereUniqueInput!] + set: [CommentWhereUniqueInput!] + disconnect: [CommentWhereUniqueInput!] + update: [CommentUpdateWithWhereUniqueWithoutUserInput!] + upsert: [CommentUpsertWithWhereUniqueWithoutUserInput!] + deleteMany: [CommentScalarWhereInput!] + updateMany: [CommentUpdateManyWithWhereNestedInput!] +} + +input CommentUpdateManyWithWhereNestedInput { + where: CommentScalarWhereInput! + data: CommentUpdateManyDataInput! +} + +input CommentUpdateWithoutEventDataInput { + content: String + user: UserUpdateOneRequiredWithoutUserCommentsInput +} + +input CommentUpdateWithoutUserDataInput { + content: String + event: EventUpdateOneWithoutCommentsInput +} + +input CommentUpdateWithWhereUniqueWithoutEventInput { + where: CommentWhereUniqueInput! + data: CommentUpdateWithoutEventDataInput! +} + +input CommentUpdateWithWhereUniqueWithoutUserInput { + where: CommentWhereUniqueInput! + data: CommentUpdateWithoutUserDataInput! +} + +input CommentUpsertWithWhereUniqueWithoutEventInput { + where: CommentWhereUniqueInput! + update: CommentUpdateWithoutEventDataInput! + create: CommentCreateWithoutEventInput! +} + +input CommentUpsertWithWhereUniqueWithoutUserInput { + where: CommentWhereUniqueInput! + update: CommentUpdateWithoutUserDataInput! + create: CommentCreateWithoutUserInput! +} + +input CommentWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + content: String + content_not: String + content_in: [String!] + content_not_in: [String!] + content_lt: String + content_lte: String + content_gt: String + content_gte: String + content_contains: String + content_not_contains: String + content_starts_with: String + content_not_starts_with: String + content_ends_with: String + content_not_ends_with: String + user: UserWhereInput + event: EventWhereInput + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [CommentWhereInput!] + OR: [CommentWhereInput!] + NOT: [CommentWhereInput!] +} + +input CommentWhereUniqueInput { + id: ID +} + +scalar DateTime + +type Event { + id: ID! + organiser: User! + title: String! + start: DateTime! + end: DateTime! + venue: String! + image_url: String! + description: String + subscribers(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User!] + comments(where: CommentWhereInput, orderBy: CommentOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Comment!] +} + +type EventConnection { + pageInfo: PageInfo! + edges: [EventEdge]! + aggregate: AggregateEvent! +} + +input EventCreateInput { + id: ID + organiser: UserCreateOneWithoutEventsOrganisedInput! + title: String! + start: DateTime! + end: DateTime! + venue: String! + image_url: String! + description: String + subscribers: UserCreateManyWithoutEventsSubscribedInput + comments: CommentCreateManyWithoutEventInput +} + +input EventCreateManyWithoutOrganiserInput { + create: [EventCreateWithoutOrganiserInput!] + connect: [EventWhereUniqueInput!] +} + +input EventCreateManyWithoutSubscribersInput { + create: [EventCreateWithoutSubscribersInput!] + connect: [EventWhereUniqueInput!] +} + +input EventCreateOneWithoutCommentsInput { + create: EventCreateWithoutCommentsInput + connect: EventWhereUniqueInput +} + +input EventCreateWithoutCommentsInput { + id: ID + organiser: UserCreateOneWithoutEventsOrganisedInput! + title: String! + start: DateTime! + end: DateTime! + venue: String! + image_url: String! + description: String + subscribers: UserCreateManyWithoutEventsSubscribedInput +} + +input EventCreateWithoutOrganiserInput { + id: ID + title: String! + start: DateTime! + end: DateTime! + venue: String! + image_url: String! + description: String + subscribers: UserCreateManyWithoutEventsSubscribedInput + comments: CommentCreateManyWithoutEventInput +} + +input EventCreateWithoutSubscribersInput { + id: ID + organiser: UserCreateOneWithoutEventsOrganisedInput! + title: String! + start: DateTime! + end: DateTime! + venue: String! + image_url: String! + description: String + comments: CommentCreateManyWithoutEventInput +} + +type EventEdge { + node: Event! + cursor: String! +} + +enum EventOrderByInput { + id_ASC + id_DESC + title_ASC + title_DESC + start_ASC + start_DESC + end_ASC + end_DESC + venue_ASC + venue_DESC + image_url_ASC + image_url_DESC + description_ASC + description_DESC +} + +type EventPreviousValues { + id: ID! + title: String! + start: DateTime! + end: DateTime! + venue: String! + image_url: String! + description: String +} + +input EventScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + title: String + title_not: String + title_in: [String!] + title_not_in: [String!] + title_lt: String + title_lte: String + title_gt: String + title_gte: String + title_contains: String + title_not_contains: String + title_starts_with: String + title_not_starts_with: String + title_ends_with: String + title_not_ends_with: String + start: DateTime + start_not: DateTime + start_in: [DateTime!] + start_not_in: [DateTime!] + start_lt: DateTime + start_lte: DateTime + start_gt: DateTime + start_gte: DateTime + end: DateTime + end_not: DateTime + end_in: [DateTime!] + end_not_in: [DateTime!] + end_lt: DateTime + end_lte: DateTime + end_gt: DateTime + end_gte: DateTime + venue: String + venue_not: String + venue_in: [String!] + venue_not_in: [String!] + venue_lt: String + venue_lte: String + venue_gt: String + venue_gte: String + venue_contains: String + venue_not_contains: String + venue_starts_with: String + venue_not_starts_with: String + venue_ends_with: String + venue_not_ends_with: String + image_url: String + image_url_not: String + image_url_in: [String!] + image_url_not_in: [String!] + image_url_lt: String + image_url_lte: String + image_url_gt: String + image_url_gte: String + image_url_contains: String + image_url_not_contains: String + image_url_starts_with: String + image_url_not_starts_with: String + image_url_ends_with: String + image_url_not_ends_with: String + description: String + description_not: String + description_in: [String!] + description_not_in: [String!] + description_lt: String + description_lte: String + description_gt: String + description_gte: String + description_contains: String + description_not_contains: String + description_starts_with: String + description_not_starts_with: String + description_ends_with: String + description_not_ends_with: String + AND: [EventScalarWhereInput!] + OR: [EventScalarWhereInput!] + NOT: [EventScalarWhereInput!] +} + +type EventSubscriptionPayload { + mutation: MutationType! + node: Event + updatedFields: [String!] + previousValues: EventPreviousValues +} + +input EventSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: EventWhereInput + AND: [EventSubscriptionWhereInput!] + OR: [EventSubscriptionWhereInput!] + NOT: [EventSubscriptionWhereInput!] +} + +input EventUpdateInput { + organiser: UserUpdateOneRequiredWithoutEventsOrganisedInput + title: String + start: DateTime + end: DateTime + venue: String + image_url: String + description: String + subscribers: UserUpdateManyWithoutEventsSubscribedInput + comments: CommentUpdateManyWithoutEventInput +} + +input EventUpdateManyDataInput { + title: String + start: DateTime + end: DateTime + venue: String + image_url: String + description: String +} + +input EventUpdateManyMutationInput { + title: String + start: DateTime + end: DateTime + venue: String + image_url: String + description: String +} + +input EventUpdateManyWithoutOrganiserInput { + create: [EventCreateWithoutOrganiserInput!] + delete: [EventWhereUniqueInput!] + connect: [EventWhereUniqueInput!] + set: [EventWhereUniqueInput!] + disconnect: [EventWhereUniqueInput!] + update: [EventUpdateWithWhereUniqueWithoutOrganiserInput!] + upsert: [EventUpsertWithWhereUniqueWithoutOrganiserInput!] + deleteMany: [EventScalarWhereInput!] + updateMany: [EventUpdateManyWithWhereNestedInput!] +} + +input EventUpdateManyWithoutSubscribersInput { + create: [EventCreateWithoutSubscribersInput!] + delete: [EventWhereUniqueInput!] + connect: [EventWhereUniqueInput!] + set: [EventWhereUniqueInput!] + disconnect: [EventWhereUniqueInput!] + update: [EventUpdateWithWhereUniqueWithoutSubscribersInput!] + upsert: [EventUpsertWithWhereUniqueWithoutSubscribersInput!] + deleteMany: [EventScalarWhereInput!] + updateMany: [EventUpdateManyWithWhereNestedInput!] +} + +input EventUpdateManyWithWhereNestedInput { + where: EventScalarWhereInput! + data: EventUpdateManyDataInput! +} + +input EventUpdateOneWithoutCommentsInput { + create: EventCreateWithoutCommentsInput + update: EventUpdateWithoutCommentsDataInput + upsert: EventUpsertWithoutCommentsInput + delete: Boolean + disconnect: Boolean + connect: EventWhereUniqueInput +} + +input EventUpdateWithoutCommentsDataInput { + organiser: UserUpdateOneRequiredWithoutEventsOrganisedInput + title: String + start: DateTime + end: DateTime + venue: String + image_url: String + description: String + subscribers: UserUpdateManyWithoutEventsSubscribedInput +} + +input EventUpdateWithoutOrganiserDataInput { + title: String + start: DateTime + end: DateTime + venue: String + image_url: String + description: String + subscribers: UserUpdateManyWithoutEventsSubscribedInput + comments: CommentUpdateManyWithoutEventInput +} + +input EventUpdateWithoutSubscribersDataInput { + organiser: UserUpdateOneRequiredWithoutEventsOrganisedInput + title: String + start: DateTime + end: DateTime + venue: String + image_url: String + description: String + comments: CommentUpdateManyWithoutEventInput +} + +input EventUpdateWithWhereUniqueWithoutOrganiserInput { + where: EventWhereUniqueInput! + data: EventUpdateWithoutOrganiserDataInput! +} + +input EventUpdateWithWhereUniqueWithoutSubscribersInput { + where: EventWhereUniqueInput! + data: EventUpdateWithoutSubscribersDataInput! +} + +input EventUpsertWithoutCommentsInput { + update: EventUpdateWithoutCommentsDataInput! + create: EventCreateWithoutCommentsInput! +} + +input EventUpsertWithWhereUniqueWithoutOrganiserInput { + where: EventWhereUniqueInput! + update: EventUpdateWithoutOrganiserDataInput! + create: EventCreateWithoutOrganiserInput! +} + +input EventUpsertWithWhereUniqueWithoutSubscribersInput { + where: EventWhereUniqueInput! + update: EventUpdateWithoutSubscribersDataInput! + create: EventCreateWithoutSubscribersInput! +} + +input EventWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + organiser: UserWhereInput + title: String + title_not: String + title_in: [String!] + title_not_in: [String!] + title_lt: String + title_lte: String + title_gt: String + title_gte: String + title_contains: String + title_not_contains: String + title_starts_with: String + title_not_starts_with: String + title_ends_with: String + title_not_ends_with: String + start: DateTime + start_not: DateTime + start_in: [DateTime!] + start_not_in: [DateTime!] + start_lt: DateTime + start_lte: DateTime + start_gt: DateTime + start_gte: DateTime + end: DateTime + end_not: DateTime + end_in: [DateTime!] + end_not_in: [DateTime!] + end_lt: DateTime + end_lte: DateTime + end_gt: DateTime + end_gte: DateTime + venue: String + venue_not: String + venue_in: [String!] + venue_not_in: [String!] + venue_lt: String + venue_lte: String + venue_gt: String + venue_gte: String + venue_contains: String + venue_not_contains: String + venue_starts_with: String + venue_not_starts_with: String + venue_ends_with: String + venue_not_ends_with: String + image_url: String + image_url_not: String + image_url_in: [String!] + image_url_not_in: [String!] + image_url_lt: String + image_url_lte: String + image_url_gt: String + image_url_gte: String + image_url_contains: String + image_url_not_contains: String + image_url_starts_with: String + image_url_not_starts_with: String + image_url_ends_with: String + image_url_not_ends_with: String + description: String + description_not: String + description_in: [String!] + description_not_in: [String!] + description_lt: String + description_lte: String + description_gt: String + description_gte: String + description_contains: String + description_not_contains: String + description_starts_with: String + description_not_starts_with: String + description_ends_with: String + description_not_ends_with: String + subscribers_every: UserWhereInput + subscribers_some: UserWhereInput + subscribers_none: UserWhereInput + comments_every: CommentWhereInput + comments_some: CommentWhereInput + comments_none: CommentWhereInput + AND: [EventWhereInput!] + OR: [EventWhereInput!] + NOT: [EventWhereInput!] +} + +input EventWhereUniqueInput { + id: ID +} + +scalar Long + +type Mutation { + createBooking(data: BookingCreateInput!): Booking! + updateBooking(data: BookingUpdateInput!, where: BookingWhereUniqueInput!): Booking + updateManyBookings(data: BookingUpdateManyMutationInput!, where: BookingWhereInput): BatchPayload! + upsertBooking(where: BookingWhereUniqueInput!, create: BookingCreateInput!, update: BookingUpdateInput!): Booking! + deleteBooking(where: BookingWhereUniqueInput!): Booking + deleteManyBookings(where: BookingWhereInput): BatchPayload! + createComment(data: CommentCreateInput!): Comment! + updateComment(data: CommentUpdateInput!, where: CommentWhereUniqueInput!): Comment + updateManyComments(data: CommentUpdateManyMutationInput!, where: CommentWhereInput): BatchPayload! + upsertComment(where: CommentWhereUniqueInput!, create: CommentCreateInput!, update: CommentUpdateInput!): Comment! + deleteComment(where: CommentWhereUniqueInput!): Comment + deleteManyComments(where: CommentWhereInput): BatchPayload! + createEvent(data: EventCreateInput!): Event! + updateEvent(data: EventUpdateInput!, where: EventWhereUniqueInput!): Event + updateManyEvents(data: EventUpdateManyMutationInput!, where: EventWhereInput): BatchPayload! + upsertEvent(where: EventWhereUniqueInput!, create: EventCreateInput!, update: EventUpdateInput!): Event! + deleteEvent(where: EventWhereUniqueInput!): Event + deleteManyEvents(where: EventWhereInput): BatchPayload! + createRoom(data: RoomCreateInput!): Room! + updateRoom(data: RoomUpdateInput!, where: RoomWhereUniqueInput!): Room + updateManyRooms(data: RoomUpdateManyMutationInput!, where: RoomWhereInput): BatchPayload! + upsertRoom(where: RoomWhereUniqueInput!, create: RoomCreateInput!, update: RoomUpdateInput!): Room! + deleteRoom(where: RoomWhereUniqueInput!): Room + deleteManyRooms(where: RoomWhereInput): BatchPayload! + createUser(data: UserCreateInput!): User! + updateUser(data: UserUpdateInput!, where: UserWhereUniqueInput!): User + updateManyUsers(data: UserUpdateManyMutationInput!, where: UserWhereInput): BatchPayload! + upsertUser(where: UserWhereUniqueInput!, create: UserCreateInput!, update: UserUpdateInput!): User! + deleteUser(where: UserWhereUniqueInput!): User + deleteManyUsers(where: UserWhereInput): BatchPayload! + createUserSession(data: UserSessionCreateInput!): UserSession! + updateUserSession(data: UserSessionUpdateInput!, where: UserSessionWhereUniqueInput!): UserSession + upsertUserSession(where: UserSessionWhereUniqueInput!, create: UserSessionCreateInput!, update: UserSessionUpdateInput!): UserSession! + deleteUserSession(where: UserSessionWhereUniqueInput!): UserSession + deleteManyUserSessions(where: UserSessionWhereInput): BatchPayload! + createWasher(data: WasherCreateInput!): Washer! + updateWasher(data: WasherUpdateInput!, where: WasherWhereUniqueInput!): Washer + updateManyWashers(data: WasherUpdateManyMutationInput!, where: WasherWhereInput): BatchPayload! + upsertWasher(where: WasherWhereUniqueInput!, create: WasherCreateInput!, update: WasherUpdateInput!): Washer! + deleteWasher(where: WasherWhereUniqueInput!): Washer + deleteManyWashers(where: WasherWhereInput): BatchPayload! +} + +enum MutationType { + CREATED + UPDATED + DELETED +} + +interface Node { + id: ID! +} + +type PageInfo { + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String + endCursor: String +} + +type Query { + booking(where: BookingWhereUniqueInput!): Booking + bookings(where: BookingWhereInput, orderBy: BookingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Booking]! + bookingsConnection(where: BookingWhereInput, orderBy: BookingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): BookingConnection! + comment(where: CommentWhereUniqueInput!): Comment + comments(where: CommentWhereInput, orderBy: CommentOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Comment]! + commentsConnection(where: CommentWhereInput, orderBy: CommentOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): CommentConnection! + event(where: EventWhereUniqueInput!): Event + events(where: EventWhereInput, orderBy: EventOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Event]! + eventsConnection(where: EventWhereInput, orderBy: EventOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): EventConnection! + room(where: RoomWhereUniqueInput!): Room + rooms(where: RoomWhereInput, orderBy: RoomOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Room]! + roomsConnection(where: RoomWhereInput, orderBy: RoomOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): RoomConnection! + user(where: UserWhereUniqueInput!): User + users(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [User]! + usersConnection(where: UserWhereInput, orderBy: UserOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): UserConnection! + userSession(where: UserSessionWhereUniqueInput!): UserSession + userSessions(where: UserSessionWhereInput, orderBy: UserSessionOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [UserSession]! + userSessionsConnection(where: UserSessionWhereInput, orderBy: UserSessionOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): UserSessionConnection! + washer(where: WasherWhereUniqueInput!): Washer + washers(where: WasherWhereInput, orderBy: WasherOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Washer]! + washersConnection(where: WasherWhereInput, orderBy: WasherOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): WasherConnection! + node(id: ID!): Node +} + +enum Role { + ADMIN + USER +} + +type Room { + id: ID! + number: String! + name: String! + bookings(where: BookingWhereInput, orderBy: BookingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Booking!] +} + +type RoomConnection { + pageInfo: PageInfo! + edges: [RoomEdge]! + aggregate: AggregateRoom! +} + +input RoomCreateInput { + id: ID + number: String! + name: String! + bookings: BookingCreateManyWithoutRoomInput +} + +input RoomCreateOneWithoutBookingsInput { + create: RoomCreateWithoutBookingsInput + connect: RoomWhereUniqueInput +} + +input RoomCreateWithoutBookingsInput { + id: ID + number: String! + name: String! +} + +type RoomEdge { + node: Room! + cursor: String! +} + +enum RoomOrderByInput { + id_ASC + id_DESC + number_ASC + number_DESC + name_ASC + name_DESC +} + +type RoomPreviousValues { + id: ID! + number: String! + name: String! +} + +type RoomSubscriptionPayload { + mutation: MutationType! + node: Room + updatedFields: [String!] + previousValues: RoomPreviousValues +} + +input RoomSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: RoomWhereInput + AND: [RoomSubscriptionWhereInput!] + OR: [RoomSubscriptionWhereInput!] + NOT: [RoomSubscriptionWhereInput!] +} + +input RoomUpdateInput { + number: String + name: String + bookings: BookingUpdateManyWithoutRoomInput +} + +input RoomUpdateManyMutationInput { + number: String + name: String +} + +input RoomUpdateOneRequiredWithoutBookingsInput { + create: RoomCreateWithoutBookingsInput + update: RoomUpdateWithoutBookingsDataInput + upsert: RoomUpsertWithoutBookingsInput + connect: RoomWhereUniqueInput +} + +input RoomUpdateWithoutBookingsDataInput { + number: String + name: String +} + +input RoomUpsertWithoutBookingsInput { + update: RoomUpdateWithoutBookingsDataInput! + create: RoomCreateWithoutBookingsInput! +} + +input RoomWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + number: String + number_not: String + number_in: [String!] + number_not_in: [String!] + number_lt: String + number_lte: String + number_gt: String + number_gte: String + number_contains: String + number_not_contains: String + number_starts_with: String + number_not_starts_with: String + number_ends_with: String + number_not_ends_with: String + name: String + name_not: String + name_in: [String!] + name_not_in: [String!] + name_lt: String + name_lte: String + name_gt: String + name_gte: String + name_contains: String + name_not_contains: String + name_starts_with: String + name_not_starts_with: String + name_ends_with: String + name_not_ends_with: String + bookings_every: BookingWhereInput + bookings_some: BookingWhereInput + bookings_none: BookingWhereInput + AND: [RoomWhereInput!] + OR: [RoomWhereInput!] + NOT: [RoomWhereInput!] +} + +input RoomWhereUniqueInput { + id: ID + number: String +} + +type Subscription { + booking(where: BookingSubscriptionWhereInput): BookingSubscriptionPayload + comment(where: CommentSubscriptionWhereInput): CommentSubscriptionPayload + event(where: EventSubscriptionWhereInput): EventSubscriptionPayload + room(where: RoomSubscriptionWhereInput): RoomSubscriptionPayload + user(where: UserSubscriptionWhereInput): UserSubscriptionPayload + userSession(where: UserSessionSubscriptionWhereInput): UserSessionSubscriptionPayload + washer(where: WasherSubscriptionWhereInput): WasherSubscriptionPayload +} + +type User { + id: ID! + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + roomBookings(where: BookingWhereInput, orderBy: BookingOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Booking!] + sessions(where: UserSessionWhereInput, orderBy: UserSessionOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [UserSession!] + eventsOrganised(where: EventWhereInput, orderBy: EventOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Event!] + eventsSubscribed(where: EventWhereInput, orderBy: EventOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Event!] + userComments(where: CommentWhereInput, orderBy: CommentOrderByInput, skip: Int, after: String, before: String, first: Int, last: Int): [Comment!] + role: Role! +} + +type UserConnection { + pageInfo: PageInfo! + edges: [UserEdge]! + aggregate: AggregateUser! +} + +input UserCreateInput { + id: ID + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + roomBookings: BookingCreateManyWithoutUserInput + sessions: UserSessionCreateManyWithoutUserInput + eventsOrganised: EventCreateManyWithoutOrganiserInput + eventsSubscribed: EventCreateManyWithoutSubscribersInput + userComments: CommentCreateManyWithoutUserInput + role: Role +} + +input UserCreateManyWithoutEventsSubscribedInput { + create: [UserCreateWithoutEventsSubscribedInput!] + connect: [UserWhereUniqueInput!] +} + +input UserCreateOneWithoutEventsOrganisedInput { + create: UserCreateWithoutEventsOrganisedInput + connect: UserWhereUniqueInput +} + +input UserCreateOneWithoutRoomBookingsInput { + create: UserCreateWithoutRoomBookingsInput + connect: UserWhereUniqueInput +} + +input UserCreateOneWithoutSessionsInput { + create: UserCreateWithoutSessionsInput + connect: UserWhereUniqueInput +} + +input UserCreateOneWithoutUserCommentsInput { + create: UserCreateWithoutUserCommentsInput + connect: UserWhereUniqueInput +} + +input UserCreateWithoutEventsOrganisedInput { + id: ID + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + roomBookings: BookingCreateManyWithoutUserInput + sessions: UserSessionCreateManyWithoutUserInput + eventsSubscribed: EventCreateManyWithoutSubscribersInput + userComments: CommentCreateManyWithoutUserInput + role: Role +} + +input UserCreateWithoutEventsSubscribedInput { + id: ID + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + roomBookings: BookingCreateManyWithoutUserInput + sessions: UserSessionCreateManyWithoutUserInput + eventsOrganised: EventCreateManyWithoutOrganiserInput + userComments: CommentCreateManyWithoutUserInput + role: Role +} + +input UserCreateWithoutRoomBookingsInput { + id: ID + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + sessions: UserSessionCreateManyWithoutUserInput + eventsOrganised: EventCreateManyWithoutOrganiserInput + eventsSubscribed: EventCreateManyWithoutSubscribersInput + userComments: CommentCreateManyWithoutUserInput + role: Role +} + +input UserCreateWithoutSessionsInput { + id: ID + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + roomBookings: BookingCreateManyWithoutUserInput + eventsOrganised: EventCreateManyWithoutOrganiserInput + eventsSubscribed: EventCreateManyWithoutSubscribersInput + userComments: CommentCreateManyWithoutUserInput + role: Role +} + +input UserCreateWithoutUserCommentsInput { + id: ID + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + roomBookings: BookingCreateManyWithoutUserInput + sessions: UserSessionCreateManyWithoutUserInput + eventsOrganised: EventCreateManyWithoutOrganiserInput + eventsSubscribed: EventCreateManyWithoutSubscribersInput + role: Role +} + +type UserEdge { + node: User! + cursor: String! +} + +enum UserOrderByInput { + id_ASC + id_DESC + username_ASC + username_DESC + password_ASC + password_DESC + email_ASC + email_DESC + image_url_ASC + image_url_DESC + phone_ASC + phone_DESC + first_name_ASC + first_name_DESC + last_name_ASC + last_name_DESC + room_no_ASC + room_no_DESC + role_ASC + role_DESC +} + +type UserPreviousValues { + id: ID! + username: String! + password: String + email: String! + image_url: String! + phone: String! + first_name: String! + last_name: String! + room_no: String! + role: Role! +} + +input UserScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + username: String + username_not: String + username_in: [String!] + username_not_in: [String!] + username_lt: String + username_lte: String + username_gt: String + username_gte: String + username_contains: String + username_not_contains: String + username_starts_with: String + username_not_starts_with: String + username_ends_with: String + username_not_ends_with: String + password: String + password_not: String + password_in: [String!] + password_not_in: [String!] + password_lt: String + password_lte: String + password_gt: String + password_gte: String + password_contains: String + password_not_contains: String + password_starts_with: String + password_not_starts_with: String + password_ends_with: String + password_not_ends_with: String + email: String + email_not: String + email_in: [String!] + email_not_in: [String!] + email_lt: String + email_lte: String + email_gt: String + email_gte: String + email_contains: String + email_not_contains: String + email_starts_with: String + email_not_starts_with: String + email_ends_with: String + email_not_ends_with: String + image_url: String + image_url_not: String + image_url_in: [String!] + image_url_not_in: [String!] + image_url_lt: String + image_url_lte: String + image_url_gt: String + image_url_gte: String + image_url_contains: String + image_url_not_contains: String + image_url_starts_with: String + image_url_not_starts_with: String + image_url_ends_with: String + image_url_not_ends_with: String + phone: String + phone_not: String + phone_in: [String!] + phone_not_in: [String!] + phone_lt: String + phone_lte: String + phone_gt: String + phone_gte: String + phone_contains: String + phone_not_contains: String + phone_starts_with: String + phone_not_starts_with: String + phone_ends_with: String + phone_not_ends_with: String + first_name: String + first_name_not: String + first_name_in: [String!] + first_name_not_in: [String!] + first_name_lt: String + first_name_lte: String + first_name_gt: String + first_name_gte: String + first_name_contains: String + first_name_not_contains: String + first_name_starts_with: String + first_name_not_starts_with: String + first_name_ends_with: String + first_name_not_ends_with: String + last_name: String + last_name_not: String + last_name_in: [String!] + last_name_not_in: [String!] + last_name_lt: String + last_name_lte: String + last_name_gt: String + last_name_gte: String + last_name_contains: String + last_name_not_contains: String + last_name_starts_with: String + last_name_not_starts_with: String + last_name_ends_with: String + last_name_not_ends_with: String + room_no: String + room_no_not: String + room_no_in: [String!] + room_no_not_in: [String!] + room_no_lt: String + room_no_lte: String + room_no_gt: String + room_no_gte: String + room_no_contains: String + room_no_not_contains: String + room_no_starts_with: String + room_no_not_starts_with: String + room_no_ends_with: String + room_no_not_ends_with: String + role: Role + role_not: Role + role_in: [Role!] + role_not_in: [Role!] + AND: [UserScalarWhereInput!] + OR: [UserScalarWhereInput!] + NOT: [UserScalarWhereInput!] +} + +type UserSession { + id: ID! + user: User! + createdAt: DateTime! +} + +type UserSessionConnection { + pageInfo: PageInfo! + edges: [UserSessionEdge]! + aggregate: AggregateUserSession! +} + +input UserSessionCreateInput { + id: ID + user: UserCreateOneWithoutSessionsInput! +} + +input UserSessionCreateManyWithoutUserInput { + create: [UserSessionCreateWithoutUserInput!] + connect: [UserSessionWhereUniqueInput!] +} + +input UserSessionCreateWithoutUserInput { + id: ID +} + +type UserSessionEdge { + node: UserSession! + cursor: String! +} + +enum UserSessionOrderByInput { + id_ASC + id_DESC + createdAt_ASC + createdAt_DESC +} + +type UserSessionPreviousValues { + id: ID! + createdAt: DateTime! +} + +input UserSessionScalarWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [UserSessionScalarWhereInput!] + OR: [UserSessionScalarWhereInput!] + NOT: [UserSessionScalarWhereInput!] +} + +type UserSessionSubscriptionPayload { + mutation: MutationType! + node: UserSession + updatedFields: [String!] + previousValues: UserSessionPreviousValues +} + +input UserSessionSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: UserSessionWhereInput + AND: [UserSessionSubscriptionWhereInput!] + OR: [UserSessionSubscriptionWhereInput!] + NOT: [UserSessionSubscriptionWhereInput!] +} + +input UserSessionUpdateInput { + user: UserUpdateOneRequiredWithoutSessionsInput +} + +input UserSessionUpdateManyWithoutUserInput { + create: [UserSessionCreateWithoutUserInput!] + delete: [UserSessionWhereUniqueInput!] + connect: [UserSessionWhereUniqueInput!] + set: [UserSessionWhereUniqueInput!] + disconnect: [UserSessionWhereUniqueInput!] + deleteMany: [UserSessionScalarWhereInput!] +} + +input UserSessionWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + user: UserWhereInput + createdAt: DateTime + createdAt_not: DateTime + createdAt_in: [DateTime!] + createdAt_not_in: [DateTime!] + createdAt_lt: DateTime + createdAt_lte: DateTime + createdAt_gt: DateTime + createdAt_gte: DateTime + AND: [UserSessionWhereInput!] + OR: [UserSessionWhereInput!] + NOT: [UserSessionWhereInput!] +} + +input UserSessionWhereUniqueInput { + id: ID +} + +type UserSubscriptionPayload { + mutation: MutationType! + node: User + updatedFields: [String!] + previousValues: UserPreviousValues +} + +input UserSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: UserWhereInput + AND: [UserSubscriptionWhereInput!] + OR: [UserSubscriptionWhereInput!] + NOT: [UserSubscriptionWhereInput!] +} + +input UserUpdateInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + roomBookings: BookingUpdateManyWithoutUserInput + sessions: UserSessionUpdateManyWithoutUserInput + eventsOrganised: EventUpdateManyWithoutOrganiserInput + eventsSubscribed: EventUpdateManyWithoutSubscribersInput + userComments: CommentUpdateManyWithoutUserInput + role: Role +} + +input UserUpdateManyDataInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + role: Role +} + +input UserUpdateManyMutationInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + role: Role +} + +input UserUpdateManyWithoutEventsSubscribedInput { + create: [UserCreateWithoutEventsSubscribedInput!] + delete: [UserWhereUniqueInput!] + connect: [UserWhereUniqueInput!] + set: [UserWhereUniqueInput!] + disconnect: [UserWhereUniqueInput!] + update: [UserUpdateWithWhereUniqueWithoutEventsSubscribedInput!] + upsert: [UserUpsertWithWhereUniqueWithoutEventsSubscribedInput!] + deleteMany: [UserScalarWhereInput!] + updateMany: [UserUpdateManyWithWhereNestedInput!] +} + +input UserUpdateManyWithWhereNestedInput { + where: UserScalarWhereInput! + data: UserUpdateManyDataInput! +} + +input UserUpdateOneRequiredWithoutEventsOrganisedInput { + create: UserCreateWithoutEventsOrganisedInput + update: UserUpdateWithoutEventsOrganisedDataInput + upsert: UserUpsertWithoutEventsOrganisedInput + connect: UserWhereUniqueInput +} + +input UserUpdateOneRequiredWithoutRoomBookingsInput { + create: UserCreateWithoutRoomBookingsInput + update: UserUpdateWithoutRoomBookingsDataInput + upsert: UserUpsertWithoutRoomBookingsInput + connect: UserWhereUniqueInput +} + +input UserUpdateOneRequiredWithoutSessionsInput { + create: UserCreateWithoutSessionsInput + update: UserUpdateWithoutSessionsDataInput + upsert: UserUpsertWithoutSessionsInput + connect: UserWhereUniqueInput +} + +input UserUpdateOneRequiredWithoutUserCommentsInput { + create: UserCreateWithoutUserCommentsInput + update: UserUpdateWithoutUserCommentsDataInput + upsert: UserUpsertWithoutUserCommentsInput + connect: UserWhereUniqueInput +} + +input UserUpdateWithoutEventsOrganisedDataInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + roomBookings: BookingUpdateManyWithoutUserInput + sessions: UserSessionUpdateManyWithoutUserInput + eventsSubscribed: EventUpdateManyWithoutSubscribersInput + userComments: CommentUpdateManyWithoutUserInput + role: Role +} + +input UserUpdateWithoutEventsSubscribedDataInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + roomBookings: BookingUpdateManyWithoutUserInput + sessions: UserSessionUpdateManyWithoutUserInput + eventsOrganised: EventUpdateManyWithoutOrganiserInput + userComments: CommentUpdateManyWithoutUserInput + role: Role +} + +input UserUpdateWithoutRoomBookingsDataInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + sessions: UserSessionUpdateManyWithoutUserInput + eventsOrganised: EventUpdateManyWithoutOrganiserInput + eventsSubscribed: EventUpdateManyWithoutSubscribersInput + userComments: CommentUpdateManyWithoutUserInput + role: Role +} + +input UserUpdateWithoutSessionsDataInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + roomBookings: BookingUpdateManyWithoutUserInput + eventsOrganised: EventUpdateManyWithoutOrganiserInput + eventsSubscribed: EventUpdateManyWithoutSubscribersInput + userComments: CommentUpdateManyWithoutUserInput + role: Role +} + +input UserUpdateWithoutUserCommentsDataInput { + username: String + password: String + email: String + image_url: String + phone: String + first_name: String + last_name: String + room_no: String + roomBookings: BookingUpdateManyWithoutUserInput + sessions: UserSessionUpdateManyWithoutUserInput + eventsOrganised: EventUpdateManyWithoutOrganiserInput + eventsSubscribed: EventUpdateManyWithoutSubscribersInput + role: Role +} + +input UserUpdateWithWhereUniqueWithoutEventsSubscribedInput { + where: UserWhereUniqueInput! + data: UserUpdateWithoutEventsSubscribedDataInput! +} + +input UserUpsertWithoutEventsOrganisedInput { + update: UserUpdateWithoutEventsOrganisedDataInput! + create: UserCreateWithoutEventsOrganisedInput! +} + +input UserUpsertWithoutRoomBookingsInput { + update: UserUpdateWithoutRoomBookingsDataInput! + create: UserCreateWithoutRoomBookingsInput! +} + +input UserUpsertWithoutSessionsInput { + update: UserUpdateWithoutSessionsDataInput! + create: UserCreateWithoutSessionsInput! +} + +input UserUpsertWithoutUserCommentsInput { + update: UserUpdateWithoutUserCommentsDataInput! + create: UserCreateWithoutUserCommentsInput! +} + +input UserUpsertWithWhereUniqueWithoutEventsSubscribedInput { + where: UserWhereUniqueInput! + update: UserUpdateWithoutEventsSubscribedDataInput! + create: UserCreateWithoutEventsSubscribedInput! +} + +input UserWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + username: String + username_not: String + username_in: [String!] + username_not_in: [String!] + username_lt: String + username_lte: String + username_gt: String + username_gte: String + username_contains: String + username_not_contains: String + username_starts_with: String + username_not_starts_with: String + username_ends_with: String + username_not_ends_with: String + password: String + password_not: String + password_in: [String!] + password_not_in: [String!] + password_lt: String + password_lte: String + password_gt: String + password_gte: String + password_contains: String + password_not_contains: String + password_starts_with: String + password_not_starts_with: String + password_ends_with: String + password_not_ends_with: String + email: String + email_not: String + email_in: [String!] + email_not_in: [String!] + email_lt: String + email_lte: String + email_gt: String + email_gte: String + email_contains: String + email_not_contains: String + email_starts_with: String + email_not_starts_with: String + email_ends_with: String + email_not_ends_with: String + image_url: String + image_url_not: String + image_url_in: [String!] + image_url_not_in: [String!] + image_url_lt: String + image_url_lte: String + image_url_gt: String + image_url_gte: String + image_url_contains: String + image_url_not_contains: String + image_url_starts_with: String + image_url_not_starts_with: String + image_url_ends_with: String + image_url_not_ends_with: String + phone: String + phone_not: String + phone_in: [String!] + phone_not_in: [String!] + phone_lt: String + phone_lte: String + phone_gt: String + phone_gte: String + phone_contains: String + phone_not_contains: String + phone_starts_with: String + phone_not_starts_with: String + phone_ends_with: String + phone_not_ends_with: String + first_name: String + first_name_not: String + first_name_in: [String!] + first_name_not_in: [String!] + first_name_lt: String + first_name_lte: String + first_name_gt: String + first_name_gte: String + first_name_contains: String + first_name_not_contains: String + first_name_starts_with: String + first_name_not_starts_with: String + first_name_ends_with: String + first_name_not_ends_with: String + last_name: String + last_name_not: String + last_name_in: [String!] + last_name_not_in: [String!] + last_name_lt: String + last_name_lte: String + last_name_gt: String + last_name_gte: String + last_name_contains: String + last_name_not_contains: String + last_name_starts_with: String + last_name_not_starts_with: String + last_name_ends_with: String + last_name_not_ends_with: String + room_no: String + room_no_not: String + room_no_in: [String!] + room_no_not_in: [String!] + room_no_lt: String + room_no_lte: String + room_no_gt: String + room_no_gte: String + room_no_contains: String + room_no_not_contains: String + room_no_starts_with: String + room_no_not_starts_with: String + room_no_ends_with: String + room_no_not_ends_with: String + roomBookings_every: BookingWhereInput + roomBookings_some: BookingWhereInput + roomBookings_none: BookingWhereInput + sessions_every: UserSessionWhereInput + sessions_some: UserSessionWhereInput + sessions_none: UserSessionWhereInput + eventsOrganised_every: EventWhereInput + eventsOrganised_some: EventWhereInput + eventsOrganised_none: EventWhereInput + eventsSubscribed_every: EventWhereInput + eventsSubscribed_some: EventWhereInput + eventsSubscribed_none: EventWhereInput + userComments_every: CommentWhereInput + userComments_some: CommentWhereInput + userComments_none: CommentWhereInput + role: Role + role_not: Role + role_in: [Role!] + role_not_in: [Role!] + AND: [UserWhereInput!] + OR: [UserWhereInput!] + NOT: [UserWhereInput!] +} + +input UserWhereUniqueInput { + id: ID + username: String + email: String + phone: String + room_no: String +} + +type Washer { + id: ID! + in_use: Boolean! + updatedAt: DateTime! +} + +type WasherConnection { + pageInfo: PageInfo! + edges: [WasherEdge]! + aggregate: AggregateWasher! +} + +input WasherCreateInput { + id: ID + in_use: Boolean! +} + +type WasherEdge { + node: Washer! + cursor: String! +} + +enum WasherOrderByInput { + id_ASC + id_DESC + in_use_ASC + in_use_DESC + updatedAt_ASC + updatedAt_DESC +} + +type WasherPreviousValues { + id: ID! + in_use: Boolean! + updatedAt: DateTime! +} + +type WasherSubscriptionPayload { + mutation: MutationType! + node: Washer + updatedFields: [String!] + previousValues: WasherPreviousValues +} + +input WasherSubscriptionWhereInput { + mutation_in: [MutationType!] + updatedFields_contains: String + updatedFields_contains_every: [String!] + updatedFields_contains_some: [String!] + node: WasherWhereInput + AND: [WasherSubscriptionWhereInput!] + OR: [WasherSubscriptionWhereInput!] + NOT: [WasherSubscriptionWhereInput!] +} + +input WasherUpdateInput { + in_use: Boolean +} + +input WasherUpdateManyMutationInput { + in_use: Boolean +} + +input WasherWhereInput { + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_lt: ID + id_lte: ID + id_gt: ID + id_gte: ID + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + in_use: Boolean + in_use_not: Boolean + updatedAt: DateTime + updatedAt_not: DateTime + updatedAt_in: [DateTime!] + updatedAt_not_in: [DateTime!] + updatedAt_lt: DateTime + updatedAt_lte: DateTime + updatedAt_gt: DateTime + updatedAt_gte: DateTime + AND: [WasherWhereInput!] + OR: [WasherWhereInput!] + NOT: [WasherWhereInput!] +} + +input WasherWhereUniqueInput { + id: ID +} diff --git a/src/query/bookings.ts b/src/query/bookings.ts index 5707e7c..e845834 100644 --- a/src/query/bookings.ts +++ b/src/query/bookings.ts @@ -1,19 +1,23 @@ -import { Booking, FragmentableArray, Room } from "../generated/prisma-client"; +import { Booking, Room } from "@prisma/client"; import moment from "moment"; +import { AppContext } from "../context"; -export const bookings = ( +export const bookings = async ( parent, { data, start_limit }, - ctx -): FragmentableArray => { + ctx: AppContext +): Promise => { const end_gte: Date = moment(start_limit, moment.defaultFormat).isValid() ? new Date(start_limit) : new Date(); - return ctx.prisma.bookings({ - where: { ...data, end_gte }, - orderBy: "start_ASC", + return ctx.prisma.booking.findMany({ + where: { ...data, end: { gte: end_gte } }, + orderBy: { start: "asc" }, }); }; -export const rooms = (parent, { data }, ctx): FragmentableArray => - ctx.prisma.rooms(data); +export const rooms = async ( + parent, + { data }, + ctx: AppContext +): Promise => ctx.prisma.room.findMany({ where: data }); diff --git a/src/query/events.ts b/src/query/events.ts index 9264243..1f19774 100644 --- a/src/query/events.ts +++ b/src/query/events.ts @@ -1,16 +1,17 @@ -import { Event, FragmentableArray } from "../generated/prisma-client"; +import { Event } from "@prisma/client"; import moment from "moment"; +import { AppContext } from "../context"; -export const events = ( +export const events = async ( parent, { data, start_limit }, - ctx -): FragmentableArray => { + ctx: AppContext +): Promise => { const end_gte: Date = moment(start_limit, moment.defaultFormat).isValid() ? new Date(start_limit) : new Date(); - return ctx.prisma.events({ - where: { ...data, end_gte }, - orderBy: "start_ASC", + return ctx.prisma.event.findMany({ + where: { ...data, end: { gte: end_gte } }, + orderBy: { start: "asc" }, }); }; diff --git a/src/query/user.ts b/src/query/user.ts index deae1ec..da6e305 100644 --- a/src/query/user.ts +++ b/src/query/user.ts @@ -1,8 +1,9 @@ -import { FragmentableArray, User } from "../generated/prisma-client"; +import { User } from "@prisma/client"; +import { AppContext } from "../context"; -export const user = (parent, { username }, ctx): FragmentableArray => { - return ctx.prisma.user({ - username, +export const user = (parent, { username }, ctx: AppContext): Promise => { + return ctx.prisma.user.findUnique({ + where: { username }, }); }; diff --git a/src/query/washers.ts b/src/query/washers.ts index 64d20e4..d4755b0 100644 --- a/src/query/washers.ts +++ b/src/query/washers.ts @@ -1,4 +1,5 @@ -import { FragmentableArray, Washer } from "../generated/prisma-client"; +import { Washer } from "@prisma/client"; +import { AppContext } from "../context"; -export const washers = (parent, { data }, ctx): FragmentableArray => - ctx.prisma.washers({ where: data, orderBy: "id_ASC" }); +export const washers = (parent, { data }, ctx: AppContext): Promise => + ctx.prisma.washer.findMany({ where: data, orderBy: { id: "asc" } }); diff --git a/src/resolvers.ts b/src/resolvers.ts index be8cf9d..5858c2f 100644 --- a/src/resolvers.ts +++ b/src/resolvers.ts @@ -14,12 +14,13 @@ import { deleteEvent, addEventSubscriber, removeEventSubscriber, -} from "./mutations/events/index"; +} from "./mutations/events"; import { createComment, deleteComment } from "./mutations/comments"; import { IResolvers } from "apollo-server-express"; -import { Booking, Room, User, Event, Comment } from "./generated/prisma-client"; +import { Booking, Room, User, Event, Comment } from "@prisma/client"; +import { AppContext } from "./context"; -const resolvers: IResolvers = { +export const resolvers: IResolvers = { Query: { user, me, @@ -43,51 +44,59 @@ const resolvers: IResolvers = { deleteComment, }, User: { - roomBookings(parent, args, ctx): Promise<[Booking]> { - return ctx.prisma.user({ id: parent.id }).roomBookings(); + roomBookings(parent, args, ctx: AppContext): Promise { + return ctx.prisma.booking.findMany({ + where: { user: { id: { equals: parent.id } } }, + }); }, - eventsOrganised(parent, args, ctx): Promise<[Event]> { - return ctx.prisma.user({ id: parent.id }).eventsOrganised(); + eventsOrganised(parent, args, ctx: AppContext): Promise { + return ctx.prisma.event.findMany({ + where: { organiser: { id: { equals: parent.id } } }, + }); }, - eventsSubscribed(parent, args, ctx): Promise<[Event]> { - return ctx.prisma.user({ id: parent.id }).eventsSubscribed(); - }, - password: (parent, args, ctx): null => { - return null; + eventsSubscribed(parent, args, ctx: AppContext): Promise { + return ctx.prisma.user + .findUnique({ where: { id: parent.id } }) + .eventsSubscribed(); }, + password: (): null => null, }, Booking: { - room(parent, _, ctx): Promise { - return ctx.prisma.booking({ id: parent.id }).room(); + room(parent, _, ctx: AppContext): Promise { + return ctx.prisma.room.findUnique({ where: { id: parent.roomId } }); }, - user(parent, _, ctx): Promise { - return ctx.prisma.booking({ id: parent.id }).user(); + user(parent, _, ctx: AppContext): Promise { + return ctx.prisma.user.findUnique({ where: { id: parent.userId } }); }, }, Room: { - bookings(parent, _, ctx): Promise<[Booking]> { - return ctx.prisma.room({ id: parent.id }).bookings(); + bookings(parent, _, ctx): Promise { + return ctx.prisma.booking.findMany({ + where: { room: { id: { equals: parent.id } } }, + }); }, }, Event: { - organiser(parent, _, ctx): Promise { - return ctx.prisma.event({ id: parent.id }).organiser(); + organiser(parent, _, ctx: AppContext): Promise { + return ctx.prisma.user.findUnique({ where: { id: parent.organiserId } }); }, - subscribers(parent, _, ctx): Promise<[User]> { - return ctx.prisma.event({ id: parent.id }).subscribers(); + subscribers(parent, _, ctx: AppContext): Promise { + return ctx.prisma.event + .findUnique({ where: { id: parent.id } }) + .subscribers(); }, - comments(parent, _, ctx): Promise<[Comment]> { - return ctx.prisma.event({ id: parent.id }).comments(); + comments(parent, _, ctx: AppContext): Promise { + return ctx.prisma.event + .findUnique({ where: { id: parent.id } }) + .comments(); }, }, Comment: { - event(parent, _, ctx): Promise { - return ctx.prisma.comment({ id: parent.id }).event(); + event(parent, _, ctx: AppContext): Promise { + return ctx.prisma.event.findUnique({ where: { id: parent.eventId } }); }, user(parent, _, ctx): Promise { - return ctx.prisma.comment({ id: parent.id }).user(); + return ctx.prisma.user.findUnique({ where: { id: parent.userId } }); }, }, }; - -export default resolvers; diff --git a/src/schema.graphql b/src/schema.graphql index 761c6af..3eb4bbd 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -1,14 +1,14 @@ -# import User from "./prisma.graphql" -# import Admin from "./prisma.graphql" -# import Washer from "./prisma.graphql" -# import WasherWhereInput from "./prisma.graphql" -# import Booking from "./prisma.graphql" -# import Room from "./prisma.graphql" -# import BookingWhereInput from "./prisma.graphql" -# import DateTimeInput from "./prisma.graphql" -# import Event from "./prisma.graphql" -# import EventWhereInput from "./prisma.graphql" -# import Comment from "./prisma.graphql" +# import User from "./prisma.legacy.graphql" +# import Admin from "./prisma.legacy.graphql" +# import Washer from "./prisma.legacy.graphql" +# import WasherWhereInput from "./prisma.legacy.graphql" +# import Booking from "./prisma.legacy.graphql" +# import Room from "./prisma.legacy.graphql" +# import BookingWhereInput from "./prisma.legacy.graphql" +# import DateTimeInput from "./prisma.legacy.graphql" +# import Event from "./prisma.legacy.graphql" +# import EventWhereInput from "./prisma.legacy.graphql" +# import Comment from "./prisma.legacy.graphql" input UserRegisterInput { username: String diff --git a/src/schema.ts b/src/schema.ts deleted file mode 100644 index fefedc8..0000000 --- a/src/schema.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { importSchema } from "graphql-import"; - -const typeDefs: string = importSchema("./src/schema.graphql"); - -export default typeDefs; diff --git a/src/server.ts b/src/server.ts index 48d3761..bf80704 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,13 +1,17 @@ import { ApolloServer, makeExecutableSchema } from "apollo-server-express"; +import { Context, ContextFunction } from "apollo-server-core"; +import { ExpressContext } from "apollo-server-express/src"; import * as env from "dotenv"; env.config(); -import typeDefs from "./schema"; -import resolvers from "./resolvers"; +import { typeDefs } from "./typedefs"; +import { resolvers } from "./resolvers"; import { applyMiddleware } from "graphql-middleware"; import { permissions } from "./shield/permissions"; -const server = (context): ApolloServer => +const server = ( + context: ContextFunction | Context +): ApolloServer => new ApolloServer({ schema: applyMiddleware( makeExecutableSchema({ @@ -16,7 +20,10 @@ const server = (context): ApolloServer => }), permissions ), - context: context, + context, + playground: true, + introspection: true, + debug: process.env.NODE_ENV !== "production", }); export default server; diff --git a/src/shield/rules.ts b/src/shield/rules.ts index 8732556..158a246 100644 --- a/src/shield/rules.ts +++ b/src/shield/rules.ts @@ -1,6 +1,6 @@ import { rule } from "graphql-shield"; + import { AppContext } from "../context"; -import { User } from "../generated/prisma-client"; export const isAuthenticated = rule({ cache: "contextual" })( async (parent, args, ctx: AppContext) => { @@ -16,28 +16,33 @@ export const isAdmin = rule({ cache: "contextual" })( export const isBookingCreator = rule({ cache: "contextual" })( async (parent, args, ctx: AppContext) => { - const currentUser: User = ctx.auth.user; - const bookingUser: User = await ctx.prisma.booking({ id: args.id }).user(); + const currentUser = ctx.auth.user; + const { user: bookingUser } = await ctx.prisma.booking.findUnique({ + where: { id: args.id }, + select: { id: true, user: { select: { id: true } } }, + }); return currentUser.id === bookingUser.id; } ); export const isEventOrganiser = rule({ cache: "contextual" })( async (parent, args, ctx: AppContext) => { - const currentUser: User = ctx.auth.user; - const eventOrganiser: User = await ctx.prisma - .event({ id: args.id }) - .organiser(); - return currentUser.id === eventOrganiser.id; + const currentUser = ctx.auth.user; + const { organiser } = await ctx.prisma.event.findUnique({ + where: { id: args.id }, + select: { id: true, organiser: { select: { id: true } } }, + }); + return currentUser.id === organiser.id; } ); export const isCommentAuthor = rule({ cache: "contextual" })( async (parent, args, ctx: AppContext) => { - const currentUser: User = ctx.auth.user; - const commentCreator: User = await ctx.prisma - .comment({ id: args.id }) - .user(); + const currentUser = ctx.auth.user; + const { user: commentCreator } = await ctx.prisma.comment.findUnique({ + where: { id: args.id }, + select: { id: true, user: { select: { id: true } } }, + }); return currentUser.id === commentCreator.id; } ); diff --git a/src/typedefs.ts b/src/typedefs.ts new file mode 100644 index 0000000..7e6f6cc --- /dev/null +++ b/src/typedefs.ts @@ -0,0 +1,3 @@ +import { importSchema } from "graphql-import"; + +export const typeDefs: string = importSchema("./src/schema.graphql"); diff --git a/src/utils/authToken.ts b/src/utils/authToken.ts index d34c707..39f4780 100644 --- a/src/utils/authToken.ts +++ b/src/utils/authToken.ts @@ -1,11 +1,11 @@ import * as env from "dotenv"; import * as jwt from "jsonwebtoken"; -import { UserSession } from "../generated/prisma-client"; +import { UserSession } from "@prisma/client"; env.config(); const generateToken = (session: UserSession): string => { - return jwt.sign(session, process.env.PRISMA_SECRET); + return jwt.sign(session, process.env.PHOENIX_SECRET); }; export { generateToken }; diff --git a/src/utils/prisma.ts b/src/utils/prisma.ts new file mode 100644 index 0000000..901f3a0 --- /dev/null +++ b/src/utils/prisma.ts @@ -0,0 +1,3 @@ +import { PrismaClient } from "@prisma/client"; + +export const prisma = new PrismaClient(); diff --git a/src/utils/resolveUser.ts b/src/utils/resolveUser.ts index 6fac65a..ffcb020 100644 --- a/src/utils/resolveUser.ts +++ b/src/utils/resolveUser.ts @@ -1,17 +1,20 @@ import * as jwt from "jsonwebtoken"; -import { Prisma, User, UserSession } from "../generated/prisma-client"; +import { PrismaClient, User, UserSession } from "@prisma/client"; export const resolveUserUsingJWT = async ( - prisma: Prisma, + prisma: PrismaClient, token: string ): Promise => { try { const userSession: UserSession = jwt.verify( token, - process.env.PRISMA_SECRET + process.env.PHOENIX_SECRET ) as UserSession; const sessionId = userSession.id; - return prisma.userSession({ id: sessionId }).user(); + const foundUserSession = await prisma.userSession.findUnique({ + where: { id: sessionId }, + }); + return prisma.user.findUnique({ where: { id: foundUserSession.userId } }); } catch (e) { return null; } diff --git a/src/utils/validateBooking.ts b/src/utils/validateBooking.ts index 90ca473..5f3fb72 100644 --- a/src/utils/validateBooking.ts +++ b/src/utils/validateBooking.ts @@ -1,5 +1,7 @@ import moment from "moment"; -import { Booking, Prisma } from "../generated/prisma-client"; +import { Booking } from "@prisma/client"; + +import { AppContext } from "../context"; type BookingData = { start: Date; @@ -21,21 +23,24 @@ const getTimeSlots = (start: Date, end: Date): Date[] => { export const validateBooking = async ( roomNumber: string, booking: BookingData, - { prisma }: { prisma: Prisma } + { prisma }: AppContext ): Promise => { - const existingBookings: Booking[] = await prisma - .room({ number: roomNumber }) - .bookings({ - where: { - start_gte: moment(booking.start) + const existingBookings: Booking[] = await prisma.booking.findMany({ + where: { + room: { number: { equals: roomNumber } }, + start: { + gte: moment(booking.start) .startOf("date") .toDate(), - end_lte: moment(booking.end) + }, + end: { + lte: moment(booking.end) .endOf("date") .toDate(), }, - orderBy: "start_ASC", - }); + }, + orderBy: { start: "asc" }, + }); const bookedTimeSlots: Date[] = []; for (const existingBooking of existingBookings) {