Browse Source

query node - content nft schema I

ondratra 3 years ago
parent
commit
d53271b987

+ 2 - 121
query-node/schemas/content.graphql

@@ -68,19 +68,6 @@ type Channel @entity {
   collaborators: [Membership!]
 }
 
-type CuratorGroup @entity {
-  "Runtime identifier"
-  id: ID!
-
-  "Curators belonging to this group"
-  curatorIds: [Int!]!
-
-  "Is group active or not"
-  isActive: Boolean!
-
-  channels: [Channel!]! @derivedFrom(field: "ownerCuratorGroup")
-}
-
 type VideoCategory @entity {
   "Runtime identifier"
   id: ID!
@@ -132,8 +119,8 @@ type Video @entity {
   "Flag signaling whether a video is censored."
   isCensored: Boolean!
 
-  "Video nft details"
-  nft: OwnedNFT
+  "Video NFT details"
+  nft: OwnedNft
 
   "Whether the Video contains explicit material."
   isExplicit: Boolean
@@ -155,112 +142,6 @@ type Video @entity {
   isFeatured: Boolean!
 }
 
-"Represents nft details"
-type OwnedNFT @entity {
-  "Member owning the nft (if any)"
-  ownerMember: Membership
-
-  "Curator group owning the nft (if any)"
-  ownerCuratorGroup: CuratorGroup
-
-  "NFT transactional status"
-  transactionalStatus: TransactionalStatus!
-
-  "Creator royalty"
-  creatorRoyalty: Float
-}
-
-"NFT transactional state"
-union TransactionalStatus = TransactionalStatusIdle 
-  | TransactionalStatusInitiatedOfferToMember
-  | TransactionalStatusAuction
-  | TransactionalStatusBuyNow
-
-"Represents TransactionalStatus Idle"
-variant TransactionalStatusIdle @variant {
-  "Variant needs to have at least one not null property. This value is not used."
-  dummy: Int!
-}
-
-"Represents TransactionalStatus InitiatedOfferToMember"
-variant TransactionalStatusInitiatedOfferToMember @variant {
-  "Member identifier"
-  member: Int!
-
-  "Whether member should pay to accept offer (optional)"
-  price: Int
-}
-
-"Represents TransactionalStatus Auction"
-variant TransactionalStatusAuction @variant {
-  "Member identifier"
-  auction: Auction!
-}
-
-"Represents TransactionalStatus BuyNow"
-variant TransactionalStatusBuyNow @variant {
-  price: Int!
-}
-
-"Represents auction data"
-type Auction @entity {
-  "Auction starting price"
-  starting_price: Int!
-
-  "Whether auction can be completed instantly"
-  buy_now_price: Int
-
-  "The type of auction"
-  auction_type: AuctionType!
-
-  "Minimal step between auction bids"
-  minimal_bid_step: Int!
-
-  "Auction last bid (if exists)"
-  last_bid: Bid
-
-  "Whether auction starts at some predefined time in future"
-  starts_at: Int
-
-  "Auction participants whitelist"
-  whitelist: [Int!]
-}
-
-"Represents bid data"
-type Bid @entity {
-  "Bidder membership"
-  bidder: Membership!
-
-  "Bidder account, used to pay for nft"
-  bidderAccount: String
-
-  "Amount bidded"
-  amount: Int!
-
-  "Bid time"
-  time: Int!
-}
-
-"Represents various action types"
-union AuctionType = English
-  | Open
-
-
-"Represents English auction details"
-variant English @variant {
-  "English auction duration"
-  duration: Int!
-
-  "Auction extension time"
-  extensionTime: Int, 
-}
-
-"Represents Open auction details"
-variant Open @variant {
-  "Auction bid lock duration"
-  bidLockingTime: Int!
-}
-
 type VideoMediaMetadata @entity {
   "Unique identifier"
   id: ID!

+ 165 - 0
query-node/schemas/contentNft.graphql

@@ -0,0 +1,165 @@
+# TODO: add runtime ids to entities (`id: ID!`) where it's needed and possible
+
+# TODO: move `ContentActor*` to `content.graphql` after schema/mappings are finished
+#       keep it here for easier reviews
+type ContentActorCurator @variant {
+  "Type needs to have at least one non-relation entity. This value is not used."
+  dummy: Int
+
+  curator: Curator!
+}
+
+type ContentActorMember @variant {
+  "Type needs to have at least one non-relation entity. This value is not used."
+  dummy: Int
+
+  member: Membership!
+}
+
+type ContentActorLead @variant {
+  "Type needs to have at least one non-relation entity. This value is not used."
+  dummy: Int
+}
+
+type ContentActorCollaborator @variant {
+  "Type needs to have at least one non-relation entity. This value is not used."
+  dummy: Int
+
+  member: Membership!
+}
+
+union ContentActor = ContentActorCurator | ContentActorMember | ContentActorLead | ContentActorCollaborator
+
+type CuratorGroup @entity {
+  "Runtime identifier"
+  id: ID!
+
+  "Is group active or not"
+  isActive: Boolean!
+
+  "Curators belonging to this group"
+  curators: [Curator!]! @derivedFrom(field: "curatorGroup")
+
+  "Channels curated by this group"
+  channels: [Channel!]! @derivedFrom(field: "ownerCuratorGroup")
+}
+
+type Curator @entity {
+  #TODO: curator
+  dummy: Int
+
+  curatorGroup: CuratorGroup!
+}
+
+"Represents NFT details"
+type OwnedNft @entity { # NFT in name can't be UPPERCASE because it causes codegen errors
+  "Member owning the NFT (if any)"
+  ownerMember: Membership
+
+  "Curator group owning the NFT (if any)"
+  ownerCuratorGroup: CuratorGroup
+
+  "NFT transactional status"
+  transactionalStatus: TransactionalStatus!
+
+  "Creator royalty"
+  creatorRoyalty: Float
+}
+
+"NFT transactional state"
+union TransactionalStatus = TransactionalStatusIdle
+  | TransactionalStatusInitiatedOfferToMember
+  | TransactionalStatusAuction
+  | TransactionalStatusBuyNow
+
+"Represents TransactionalStatus Idle"
+type TransactionalStatusIdle @variant {
+  "Type needs to have at least one non-relation entity. This value is not used."
+  dummy: Int
+}
+
+"Represents TransactionalStatus InitiatedOfferToMember"
+type TransactionalStatusInitiatedOfferToMember @variant {
+  "Member identifier"
+  member: Int!
+
+  "Whether member should pay to accept offer (optional)"
+  price: BigInt
+}
+
+"Represents TransactionalStatus Auction"
+type TransactionalStatusAuction @variant {
+  "Type needs to have at least one non-relation entity. This value is not used."
+  dummy: Int
+
+  "Member identifier"
+  auction: Auction!
+}
+
+"Represents TransactionalStatus BuyNow"
+type TransactionalStatusBuyNow @variant {
+  price: Int!
+}
+
+"Represents various action types"
+union AuctionType = AuctionTypeEnglish | AuctionTypeOpen
+
+"Represents English auction details"
+type AuctionTypeEnglish @variant {
+  "English auction duration"
+  duration: Int!
+
+  "Auction extension time"
+  extensionTime: Int
+}
+
+"Represents Open auction details"
+type AuctionTypeOpen @variant {
+  "Auction bid lock duration"
+  bidLockingTime: Int!
+}
+
+"Represents NFT auction"
+type Auction @entity {
+  "Auction starting price"
+  startingPrice: BigInt!
+
+  "Whether auction can be completed instantly"
+  buyNowPrice: BigInt
+
+  "The type of auction"
+  auctionType: AuctionType!
+
+  "Minimal step between auction bids"
+  minimalBidStep: BigInt!
+
+  "Auction last bid (if exists)"
+  lastBid: Bid
+
+  "Block when auction starts"
+  startsAtBlock: Int!
+
+  "Block when auction starts"
+  endedAtBlock: Int!
+
+  "Auction participants whitelist"
+  whitelistedMembers: [Membership!]! @derivedFrom(field: "whitelistedInAuctions")
+}
+
+"Represents bid in NFT auction"
+type Bid @entity {
+  "Bidder membership"
+  bidder: Membership!
+
+  "Bidder account, used to pay for NFT"
+  bidderAccount: String!
+
+  "Amount bidded"
+  amount: BigInt!
+
+  "Bid time"
+  createdInTime: DateTime!
+
+  "Block in which the bid was placed"
+  createdInBlock: Int!
+}

+ 406 - 0
query-node/schemas/contentNftEvents.graphql

@@ -0,0 +1,406 @@
+# TODO: add `implements Event @entity` to events
+# remove relations in events and save snapshot representation (immutable)
+# TODO: unite leading dot `.` in property descriptions
+
+type AuctionStartedEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Actor that started this auction"
+  actor: ContentActor!
+
+  "Video that's being auctioned"
+  video: Video!
+
+  "Auction started"
+  auction: Auction!
+}
+
+type NftIssuedEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Content actor that issued the NFT"
+  contentActor: ContentActor!
+
+  "Video represented via NFT"
+  video: Video!
+
+  "Royalty for the NFT/video"
+  royalty: Float
+
+  # TODO: inspect if metadata can be unpacked and mean something useful
+  "NFT's metadata"
+  metadata: String!
+
+  "Member NFT was originally issued to"
+  newOwner: Membership
+}
+
+type AuctionBidMadeEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Member bidding in the auction."
+  member: Membership!
+
+  "Video that's bidden on"
+  video: Video!
+
+  "Bid made"
+  bidAmount: BigInt!
+
+  "Sign of auction duration being extended by making this bid"
+  extendsAuction: Boolean!
+}
+
+type AuctionBidCanceledEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Auction that canceled the bid"
+  member: Membership!
+
+  "Auctioned video"
+  video: Video!
+}
+
+type AuctionCanceledEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Content actor canceling the event"
+  contentActor: ContentActor!
+
+  "Auctioned video"
+  video: Video!
+}
+
+type EnglishAuctionCompletedEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Member claiming the auctioned NFT"
+  member: Membership!
+
+  "Auctioned video"
+  video: Video!
+}
+
+type BidMadeCompletingAuctionEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Member completing the auction"
+  member: Membership!
+
+  "Auctioned video"
+  video: Video!
+}
+
+type OpenAuctionBidAcceptedEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "Content actor canceling the event"
+  contentActor: ContentActor!
+
+  "Auctioned video"
+  video: Video!
+}
+
+type OfferStartedEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "NFT's video"
+  video: Video!
+
+  "Content actor acting as NFT owner"
+  contentActor: ContentActor!
+
+  "Member that receives the offer"
+  member: Membership!
+
+  "Offer's price"
+  price: BigInt
+}
+
+type OfferAcceptedEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "NFT's video"
+  video: Video!
+}
+
+type OfferCanceledEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "NFT's video"
+  video: Video!
+
+  "Content actor acting as NFT owner"
+  contentActor: ContentActor!
+}
+
+type NftSellOrderMadeEvent @entity { # NFT in name can't be UPPERCASE because it causes codegen errors
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "NFT's video"
+  video: Video!
+
+  "Content actor acting as NFT owner"
+  contentActor: ContentActor!
+
+  "Offer's price"
+  price: BigInt!
+}
+
+type NftBoughtEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "NFT's video"
+  video: Video!
+
+  "Member that bought the NFT"
+  member: Membership!
+}
+
+type BuyNowCanceledEvent @entity {
+  ### GENERIC DATA ###
+
+  "(network}-{blockNumber}-{indexInBlock}"
+  id: ID!
+
+  "Hash of the extrinsic which caused the event to be emitted"
+  inExtrinsic: String
+
+  "Blocknumber of the block in which the event was emitted."
+  inBlock: Int!
+
+  "Network the block was produced in"
+  network: Network!
+
+  "Index of event in block from which it was emitted."
+  indexInBlock: Int!
+
+  ### SPECIFIC DATA ###
+
+  "NFT's video"
+  video: Video!
+
+  "Content actor acting as NFT owner"
+  contentActor: ContentActor!
+}

+ 6 - 0
query-node/schemas/membership.graphql

@@ -38,4 +38,10 @@ type Membership @entity {
 
   "List of channels the member has collaborator access to"
   collaboratorInChannels: [Channel!] @derivedFrom(field: "collaborators")
+
+  "Auctions in which is this user whitelisted to participate"
+  whitelistedInAuctions: [Auction!]! @derivedFrom(field: "whitelistedMembers")
+
+  "NFTs owned by this member"
+  ownedNfts: [OwnedNft!]! @derivedFrom(field: "ownerMember")
 }

+ 5 - 74
yarn.lock

@@ -3151,7 +3151,7 @@
     lodash "^4.17.15"
     moment "^2.24.0"
 
-"@joystream/warthog@2.39.0":
+"@joystream/warthog@2.39.0", "@joystream/warthog@^2.40.0":
   version "2.39.0"
   resolved "https://registry.yarnpkg.com/@joystream/warthog/-/warthog-2.39.0.tgz#3587b94953aed929bff809a7ba763d495e03170c"
   integrity sha512-gwZ8oBqcN7Xez8BfBDeDIyMhZ7VcL2paMuj0n3qOplyH+sxsBwgBemDzV6RThmAGi3GOhVVQJqOMq3w6siWqzA==
@@ -6381,7 +6381,7 @@
   resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
   integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
 
-"@types/pg@^7.11.2", "@types/pg@^7.14.11":
+"@types/pg@^7.14.11":
   version "7.14.11"
   resolved "https://registry.yarnpkg.com/@types/pg/-/pg-7.14.11.tgz#daf5555504a1f7af4263df265d91f140fece52e3"
   integrity sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==
@@ -24390,7 +24390,7 @@ pg-types@^2.1.0, pg-types@^2.2.0:
     postgres-date "~1.0.4"
     postgres-interval "^1.1.0"
 
-pg@8.0.3, pg@^8.3.2, pg@^8.4.0, pg@^8.6.0, pg@^8.7.1:
+pg@^8.3.2, pg@^8.4.0, pg@^8.6.0, pg@^8.7.1:
   version "8.6.0"
   resolved "https://registry.yarnpkg.com/pg/-/pg-8.6.0.tgz#e222296b0b079b280cce106ea991703335487db2"
   integrity sha512-qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==
@@ -24410,7 +24410,7 @@ pgpass@1.x:
   dependencies:
     split2 "^3.1.1"
 
-pgtools@^0.3.0, pgtools@^0.3.1:
+pgtools@^0.3.1:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/pgtools/-/pgtools-0.3.2.tgz#df11d54057c889e27ba891664efda69de1b7a0fe"
   integrity sha512-o9iI8CrJohpjt3hgoJuEC18oYrt/iLsc3BYtW6kP/0T7EyQ9T/WlnuzyKcC2GtfutREfXCmwaUcbqPrLw8sjng==
@@ -30545,17 +30545,12 @@ typeforce@^1.11.5:
   resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
   integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==
 
-typeorm-typedi-extensions@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/typeorm-typedi-extensions/-/typeorm-typedi-extensions-0.2.3.tgz#94fca2656206d771bf6d2242f5aab570511188e8"
-  integrity sha512-T9i1NvRZNjPn9Jb8oT772ihfn6PwdqDVpzPCtKSqjkZGOgXrCkdyD3dDrzfMaoWJ1afU58bVx2CMb95FzT42Ow==
-
 typeorm-typedi-extensions@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/typeorm-typedi-extensions/-/typeorm-typedi-extensions-0.4.1.tgz#e62e3c8f30021c9b8f258e068d38723dbd64de1d"
   integrity sha512-05hWktQ4zuXzTTUO3ao56yOezlvUuZhH2NRS//m0SOGCAJoVlfPTMHcmDaMSQy/lMfAwPWoIyn+sfK7ONzTdXQ==
 
-typeorm@0.2.34, typeorm@^0.2.25, typeorm@^0.2.31, typeorm@^0.2.32:
+typeorm@0.2.34, typeorm@^0.2.25, typeorm@^0.2.32:
   version "0.2.34"
   resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.34.tgz#637b3cec2de54ee7f423012b813a2022c0aacc8b"
   integrity sha512-FZAeEGGdSGq7uTH3FWRQq67JjKu0mgANsSZ04j3kvDYNgy9KwBl/6RFgMVgiSgjf7Rqd7NrhC2KxVT7I80qf7w==
@@ -31640,70 +31635,6 @@ warning@^4.0.1, warning@^4.0.2, warning@^4.0.3:
   dependencies:
     loose-envify "^1.0.0"
 
-"warthog@https://github.com/metmirr/warthog/releases/download/v2.30.0/warthog-v2.30.0.tgz":
-  version "2.30.0"
-  resolved "https://github.com/metmirr/warthog/releases/download/v2.30.0/warthog-v2.30.0.tgz#24a0b975f2ad5cba17a934752ac07052e856b49c"
-  dependencies:
-    "@types/app-root-path" "^1.2.4"
-    "@types/bn.js" "^4.11.6"
-    "@types/caller" "^1.0.0"
-    "@types/cosmiconfig" "^6.0.0"
-    "@types/debug" "^4.1.5"
-    "@types/dotenv" "^8.2.0"
-    "@types/express" "^4.17.2"
-    "@types/graphql" "^14.5.0"
-    "@types/graphql-fields" "^1.3.2"
-    "@types/graphql-iso-date" "^3.3.3"
-    "@types/graphql-type-json" "^0.3.2"
-    "@types/isomorphic-fetch" "^0.0.35"
-    "@types/lodash" "^4.14.148"
-    "@types/mkdirp" "^0.5.2"
-    "@types/node" "^12.12.8"
-    "@types/node-emoji" "^1.8.1"
-    "@types/open" "^6.2.1"
-    "@types/pg" "^7.11.2"
-    "@types/prettier" "^1.18.3"
-    "@types/shortid" "^0.0.29"
-    "@types/ws" "^6.0.3"
-    apollo-link-error "^1.1.12"
-    apollo-link-http "^1.5.16"
-    apollo-server "^2.9.9"
-    apollo-server-express "^2.9.9"
-    app-root-path "^3.0.0"
-    bn.js "^5.2.0"
-    caller "^1.0.1"
-    class-transformer "^0.2.3"
-    class-validator "^0.11.0"
-    cosmiconfig "^6.0.0"
-    cross-fetch "^3.0.4"
-    dataloader "^1.4.0"
-    debug "^4.1.1"
-    execa "^4.0.3"
-    express "^4.17.1"
-    gluegun "^4.1.0"
-    graphql "^14.5.8"
-    graphql-binding "^2.5.2"
-    graphql-fields "^2.0.3"
-    graphql-import-node "^0.0.4"
-    graphql-iso-date "^3.6.1"
-    graphql-scalars "^1.2.6"
-    graphql-tools "^4.0.6"
-    graphql-type-json "^0.3.0"
-    lodash "^4.17.15"
-    mkdirp "^0.5.1"
-    node-emoji "^1.10.0"
-    open "^7.0.0"
-    pg "8.0.3"
-    pgtools "^0.3.0"
-    prettier "^1.19.1"
-    reflect-metadata "^0.1.13"
-    shortid "^2.2.15"
-    type-graphql "^0.17.5"
-    typedi "^0.8.0"
-    typeorm "^0.2.25"
-    typeorm-typedi-extensions "^0.2.3"
-    typescript "^3.9.7"
-
 watchpack-chokidar2@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"