diff --git a/.babelrc b/.babelrc index 1ff94f7..8d8afd6 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,4 @@ { - "presets": ["next/babel"] -} + "presets": ["next/babel"], + "plugins": [["relay", { "artifactDirectory": "./gql/__generated__" }]] +} \ No newline at end of file diff --git a/.env.local.example b/.env.local.example index 30743ad..f698edb 100644 --- a/.env.local.example +++ b/.env.local.example @@ -6,6 +6,9 @@ METAPHYSICS_URL="https://metaphysics-production.artsy.net" NEXT_PUBLIC_GRAVITY_URL="https://api.artsy.net" NEXT_PUBLIC_METAPHYSICS_URL="https://metaphysics-production.artsy.net" +NEXT_PUBLIC_CAUSALITY_URL="https://causality-staging.artsy.net" +NEXT_PUBLIC_CAUSALITY_TEMP_JWT= + # Gravity client application CLIENT_APPLICATION_ID=REPLACE CLIENT_APPLICATION_SECRET=REPLACE diff --git a/.gitignore b/.gitignore index 1437c53..371695a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# Relay +__generated__/ + # dependencies /node_modules /.pnp diff --git a/gql/causality.graphql b/gql/causality.graphql new file mode 100644 index 0000000..e09c255 --- /dev/null +++ b/gql/causality.graphql @@ -0,0 +1,314 @@ + +# Type not included by sangria's SchemaRenderer +scalar Long + +type ArtsyBidder { + id: ID! + paddleNumber: ID! + userId: ID +} + +"an online (Artsy) bidder, or an offline bidder in the auction" +union Bidder = ArtsyBidder | OfflineBidder + +"DateTime is a scalar value that represents an ISO8601 formatted date and time." +scalar DateTime + +"A permanent schedule of increments to use in for upcoming asking prices for a lot." +type IncrementPolicy { + id: ID! + groupTag: ID! + subgroupTag: ID! + createdAt: DateTime! + initialIncrementCents: Long! + changes: [IncrementPolicyChange!]! + + "Generate a list of asking prices across a given range." + enumerate(from: Long = 0, until: Long = 0, + + "Defines treatment of off-increment `from` values." + nextIncrementRule: NextIncrementRule = SnapToPresetIncrements): [Money!]! +} + +"Change thresholds and amounts for IncrementPolicy." +type IncrementPolicyChange { + thresholdCents: Long! + incrementCents: Long! + threshold: Money! + increment: Money! +} + +"A change in increment amount, to take effect at the given threshold." +input IncrementPolicyChangeInput { + thresholdCents: Long! + incrementCents: Long! +} + +"A groupTag and list of IncrementPolicySubgroups" +type IncrementPolicyGroup { + groupTag: ID! + subgroupTags: [ID!]! + subgroups: [IncrementPolicySubgroup!]! +} + +type IncrementPolicySubgroup { + subgroupTag: ID! + group: IncrementPolicyGroup! + revisions: [IncrementPolicy!]! +} + +"A lot in a sale" +type Lot { + "The Gravity Lot ID." + id: ID! + + "The Gravity Lot ID." + internalID: ID! + + "The Gravity Sale ID." + saleId: ID! + + "total number of bids placed on the lot" + bidCount: Int! + + "selling price on the live auction floor" + floorSellingPrice: Money + + "The bidder currently winning the online portion of the auction" + floorWinningBidder: Bidder + + "asking price for online bidders" + onlineAskingPrice: Money! + + "The bidder currently winning the online portion of the auction" + onlineSellingToBidder: Bidder + + "Whether the lot is sold, for sale or passed" + soldStatus: SoldStatus! + + "The current reserve status for the lot" + reserveStatus: ReserveStatus! +} + +"A user's position on a lot" +type LotStanding implements Node { + "The ID of an object" + id: ID! + rawId: String! + + "The current leading bid on the lot, whether it is winning or not" + leadingBidAmount: Money! + + "whether this user has the leading bid" + isHighestBidder: Boolean! + + "whether this user has the leading bid" + lotState: Lot! +} + +"A connection to a list of items." +type LotStandingConnection { + "Information to aid in pagination." + pageInfo: PageInfo! + + "A list of edges." + edges: [LotStandingEdge] +} + +"An edge in a connection." +type LotStandingEdge { + "The item at the end of the edge." + node: LotStanding! + + "A cursor for use in pagination." + cursor: String! +} + +"Represents currency units and formatting" +type Money { + units: Long! + + "Formatted string version of currency amount" + displayAmount( + "Number of decimal places for the currency." + fractionalDigits: Int = 2, + + "The 1000s separator." + groupingSeparator: String = ",", + + "The decimal separator." + decimalSeparator: String = ".", + + "Whether to show the fractional units." + showFractionalDigits: Boolean = true): String! +} + +type Mutation { + "Permanently add a new increment policy to the database. It cannot be removed once added" + addIncrementPolicy(newIncrementPolicy: NewIncrementPolicyInput!): IncrementPolicy + addSale(id: ID!): Sale + banUserFromSale(saleId: ID!, userId: ID!): Sale + unbanUserFromSale(userId: ID!, saleId: ID!): Sale +} + +"A draft schedule of increments to use in for upcoming asking prices for a lot." +type NewIncrementPolicy { + id: ID + groupTag: ID! + subgroupTag: ID! + initialIncrementCents: Long! + changes: [IncrementPolicyChange!]! + + "A listing of increments by tier" + enumeratedIncrements: [[Money!]!]! + + "A listing of increments by tier" + prettyPrintedIncrements( + "Number of decimal places for the currency." + fractionalDigits: Int = 2): [String!]! + + "The minimum percentage change between increments (~4% is typical)." + minPercentChange: Float! + + "The maximum percentage change between increments (~10% is typical)." + maxPercentChange: Float! + + "Any non-fatal warnings to check before committing the increment policy." + warnings: [String!]! +} + +input NewIncrementPolicyInput { + id: ID + groupTag: ID! + subgroupTag: ID! + initialIncrementCents: Long! + changes: [IncrementPolicyChangeInput!]! +} + +enum NextIncrementRule { + AddToPastValue + SnapToPresetIncrements +} + +"An object with an ID" +interface Node { + "The id of the object." + id: ID! +} + +"An offline bidder (in the auction room)" +type OfflineBidder { + singletonDummyField: String +} + +"Information about pagination in a connection." +type PageInfo { + "When paginating forwards, are there more items?" + hasNextPage: Boolean! + + "When paginating backwards, are there more items?" + hasPreviousPage: Boolean! + + "When paginating backwards, the cursor to continue." + startCursor: String + + "When paginating forwards, the cursor to continue." + endCursor: String +} + +type Query { + "Lot standings for a user" + lotStandingConnection(userId: ID!, before: String, after: String, first: Int, last: Int): LotStandingConnection! + + "Returns an increment policy with specific `id`." + incrementPolicy(id: ID!): IncrementPolicy + + "Previews a draft of a new increment policy." + previewIncrementPolicy(newIncrementPolicy: NewIncrementPolicyInput!): NewIncrementPolicy! + + "All increment polices" + incrementPolicies: [IncrementPolicy!]! + + "All increment polices by Group" + incrementPolicyGroups: [IncrementPolicyGroup!]! + + "Returns a lot with specific `id`." + lot(id: ID!): Lot + + "Returns a sale with specific `id`." + sale(id: ID!): Sale + + "Fetches an object given its ID" + node( + "The ID of an object" + id: ID!): Node + + "Fetches objects given their IDs" + nodes( + "The IDs of objects" + ids: [ID!]!): [Node]! +} + +enum ReserveStatus { + NoReserve + ReserveMet + ReserveNotMet +} + +"A collection of lots." +type Sale { + "Users not allowed to participate in the sale" + bannedUsers: [User!]! + + "The current lot on block." + currentLot: Lot + + "The Gravity Sale ID." + id: ID! + + "The Gravity Lot ID." + internalID: ID! + + "The lots belonging to this sale." + lots: [Lot!]! + + "Lot ids without a FairWarning event" + lotIdsWithoutFairWarning: [String!]! + + "Lot ids without a FinalCall event" + lotIdsWithoutFinalCall: [String!]! + + "Lot ids that had an Artsy bid that was the highest bid on the lot but did not win" + lotIdsWithHigherArtsyBidNotWon: [String!]! + + "Lot ids that had an Artsy bid that was the same max bid as the hammer price on the lot but did not win" + lotIdsWithSameArtsyBidNotWon: [String!]! + + "Passed lot ids with bids from Artsy bidders" + passedLotIdsWithArtsyBids: [String!]! + + "Re-opened lots ids" + reopenedLotIds: [String!]! + + "Total Artsy GMV for the sale" + totalSoldGMVCents: Long! +} + +enum SoldStatus { + ForSale + Passed + Sold +} + +"An Artsy User" +type User implements Node { + "The ID of an object" + id: ID! + rawId: String! + + "The user's id" + userId: ID! + + "The user's gravity id" + internalID: ID! +} \ No newline at end of file diff --git a/gql/metaphysicsV2.graphql b/gql/metaphysicsV2.graphql new file mode 100644 index 0000000..b7727ad --- /dev/null +++ b/gql/metaphysicsV2.graphql @@ -0,0 +1,11250 @@ +directive @principalField on FIELD + +type AccountRequest { + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + notes: String +} + +# Autogenerated input type of AddAssetToConsignmentSubmission +input AddAssetToConsignmentSubmissionInput { + assetType: String + + # A unique identifier for the client performing the mutation. + clientMutationId: String + geminiToken: String! + submissionID: ID! +} + +# Autogenerated return type of AddAssetToConsignmentSubmission +type AddAssetToConsignmentSubmissionPayload { + asset: ConsignmentSubmissionCategoryAsset + + # A unique identifier for the client performing the mutation. + clientMutationId: String +} + +# One item in an aggregation +type AggregationCount { + count: Int! + name: String! + value: String! +} + +type AnalyticsArtist { + entityId: String! +} + +type AnalyticsArtwork { + entityId: String! +} + +# Publish artwork Series Stats +type AnalyticsArtworksPublishedStats { + percentageChanged: Int! + period: AnalyticsQueryPeriodEnum! + timeSeries: [AnalyticsPartnerTimeSeriesStats!]! + totalCount: Int! +} + +# An ISO 8601 datetime +scalar AnalyticsDateTime + +# Visitor countries, device, referals and session page +type AnalyticsGroupedStats { + groupedEntity: AnalyticsGroupedStatsUnion! + period: AnalyticsQueryPeriodEnum! +} + +# The connection type for GroupedStats. +type AnalyticsGroupedStatsConnection { + # A list of edges. + edges: [AnalyticsGroupedStatsEdge] + + # A list of nodes. + nodes: [AnalyticsGroupedStats] + + # Information to aid in pagination. + pageInfo: AnalyticsPageInfo! +} + +# An edge in a connection. +type AnalyticsGroupedStatsEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: AnalyticsGroupedStats +} + +enum AnalyticsGroupedStatsMetricEnum { + # visitor_by_device + VISITOR_BY_DEVICE + + # visitor_by_landing_page + VISITOR_BY_LANDING_PAGE + + # visitor_by_location + VISITOR_BY_LOCATION + + # visitor_by_referral + VISITOR_BY_REFERRAL +} + +enum AnalyticsGroupedStatsObjectTypeEnum { + # country + COUNTRY + + # device type + DEVICE + + # landing page + LANDING_PAGE + + # referral + REFERRAL +} + +# A grouped stat item: country or device etc. +union AnalyticsGroupedStatsUnion = + AnalyticsVisitorsByCountry + | AnalyticsVisitorsByDevice + | AnalyticsVisitorsByLandingPage + | AnalyticsVisitorsByReferral + +# A histogram bin +type AnalyticsHistogramBin { + maxPrice( + decimal: String = "." + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + maxPriceCents: Int! + minPrice( + decimal: String = "." + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + minPriceCents: Int! + numArtworks: Int! +} + +# Information about pagination in a connection. +type AnalyticsPageInfo { + # When paginating forwards, the cursor to continue. + endCursor: String + + # When paginating forwards, are there more items? + hasNextPage: Boolean! + + # When paginating backwards, are there more items? + hasPreviousPage: Boolean! + + # When paginating backwards, the cursor to continue. + startCursor: String +} + +# Stats for pageviews of partner content +type AnalyticsPageviewStats { + artworkViews: Int + galleryViews: Int + percentageChanged: Int! + period: AnalyticsQueryPeriodEnum! + showViews: Int + timeSeries: [AnalyticsPartnerTimeSeriesStats!]! + totalCount: Int! + uniqueVisitors: Int +} + +# Audience stats of a partner +type AnalyticsPartnerAudienceStats { + commercialVisitors: Int! + partnerId: String! + period: AnalyticsQueryPeriodEnum! + uniqueVisitors: Int! +} + +# Inquiry count time series data of a partner +type AnalyticsPartnerInquiryCountTimeSeriesStats { + count: Int + endTime: AnalyticsDateTime + startTime: AnalyticsDateTime +} + +# Inquiry stats of a partner +type AnalyticsPartnerInquiryStats { + inquiryCount: Int! + + # Inquiry response time in seconds + inquiryResponseTime: Int + partnerId: String! + period: AnalyticsQueryPeriodEnum! + + # Partner inquiry count time series + timeSeries( + cumulative: Boolean = false + ): [AnalyticsPartnerInquiryCountTimeSeriesStats!] +} + +# Sales stats of a partner +type AnalyticsPartnerSalesStats { + orderCount: Int! + + # Order response time in seconds + orderResponseTime: Int + partnerId: String! + period: AnalyticsQueryPeriodEnum! + + # Partner sales time series + timeSeries( + cumulative: Boolean = false + ): [AnalyticsPartnerSalesTimeSeriesStats!] + total( + decimal: String = "." + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + totalCents: Int! +} + +# Sales time series data of a partner +type AnalyticsPartnerSalesTimeSeriesStats { + count: Int + endTime: AnalyticsDateTime + startTime: AnalyticsDateTime + total( + decimal: String = "." + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + totalCents: Int! +} + +# Partner Stats +type AnalyticsPartnerStats { + # Time series data on number of artworks published + artworkPublished( + period: AnalyticsQueryPeriodEnum! + ): AnalyticsPartnerStatsArtworksPublished + + # Time series data on number of artworks published + artworksPublished( + period: AnalyticsQueryPeriodEnum! + ): AnalyticsArtworksPublishedStats + @deprecated( + reason: "Use artworkPublished for refactored time series bucket code" + ) + + # Audience stats + audience(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerAudienceStats + + # Visitor countries, device, referals and session page + groupedStats( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + metric: AnalyticsGroupedStatsMetricEnum! + objectType: AnalyticsGroupedStatsObjectTypeEnum! + period: AnalyticsQueryPeriodEnum! + ): AnalyticsGroupedStatsConnection + + # Inquiry stats + inquiry(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerInquiryStats + + # Different types of partner pageviews + pageview(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerStatsPageviews + + # Different types of partner pageviews + pageviews(period: AnalyticsQueryPeriodEnum!): AnalyticsPageviewStats + @deprecated(reason: "Use pageview for refactored time series bucket code") + partnerId: String! + + # Artworks, shows, or artists ranked by views. Capped at 20 by the underlying sql query. + rankedStats( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + objectType: AnalyticsRankedStatsObjectTypeEnum! + period: AnalyticsQueryPeriodEnum! + ): AnalyticsRankedStatsConnection + + # Sales stats + sales(period: AnalyticsQueryPeriodEnum!): AnalyticsPartnerSalesStats + + # Top artworks ranked by views + topArtworks( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + ): AnalyticsRankedStatsConnection + @deprecated(reason: "Use rankedStats(objectType: ) instead") + + # Number of unique visitors + uniqueVisitors(period: AnalyticsQueryPeriodEnum!): Int + @deprecated(reason: "Use audience() { uniqueVisitors } instead") +} + +# Publish artwork Series Stats +type AnalyticsPartnerStatsArtworksPublished { + partnerId: String! + percentageChanged: Int! + period: AnalyticsQueryPeriodEnum! + + # Partner artworks published count time series + timeSeries( + cumulative: Boolean = false + ): [AnalyticsPartnerStatsArtworksPublishedTimeSeries!]! + totalCount: Int! +} + +# Artworks published time series data of a partner +type AnalyticsPartnerStatsArtworksPublishedTimeSeries { + count: Int + endTime: AnalyticsDateTime + startTime: AnalyticsDateTime +} + +# Stats for pageviews of partner content +type AnalyticsPartnerStatsPageviews { + artworkViews: Int! + galleryViews: Int! + partnerId: String! + percentageChanged: Int! + period: AnalyticsQueryPeriodEnum! + showViews: Int! + + # Pageviews time series + timeSeries( + cumulative: Boolean = false + ): [AnalyticsPartnerStatsPageviewsTimeSeries!] + totalCount: Int! + uniqueVisitors: Int! +} + +# Pageviews time series data of a partner +type AnalyticsPartnerStatsPageviewsTimeSeries { + count: Int + endTime: AnalyticsDateTime + startTime: AnalyticsDateTime +} + +# Partner Time Series Stats +type AnalyticsPartnerTimeSeriesStats { + count: Int + endTime: AnalyticsDateTime + startTime: AnalyticsDateTime +} + +# Price Context Filter Type +type AnalyticsPriceContextFilterType { + category: AnalyticsPricingContextCategoryEnum + dimension: AnalyticsPricingContextDimensionEnum +} + +# Pricing Context Histogram +type AnalyticsPricingContext { + appliedFilters: AnalyticsPriceContextFilterType! + appliedFiltersDisplay: String + bins: [AnalyticsHistogramBin!]! +} + +enum AnalyticsPricingContextCategoryEnum { + # Architecture + ARCHITECTURE + + # Books and Portfolios + BOOKS_AND_PORTFOLIOS + + # Design/Decorative Art + DESIGN_DECORATIVE_ART + + # Drawing, Collage or other Work on Paper + DRAWING_COLLAGE_OTHER_WORK_ON_PAPER + + # Fashion Design and Wearable Art + FASHION + + # Installation + INSTALLATION + + # Jewelry + JEWELRY + + # Mixed Media + MIXED_MEDIA + + # Other + OTHER + + # Painting + PAINTING + + # Performance Art + PERFORMANCE + + # Photography + PHOTOGRAPHY + + # Posters + POSTERS + + # Print + PRINT + + # Sculpture + SCULPTURE + + # Sound + SOUND + + # Textile Arts + TEXTILE + + # Video/Film/Animation + VIDEO_FILM_ANIMATION + + # Work on Paper + WORK_ON_PAPER +} + +enum AnalyticsPricingContextDimensionEnum { + # Large + LARGE + + # Medium + MEDIUM + + # Small + SMALL +} + +enum AnalyticsQueryPeriodEnum { + # Four weeks + FOUR_WEEKS + + # One year + ONE_YEAR + + # Sixteen weeks + SIXTEEN_WEEKS +} + +union AnalyticsRankedEntityUnion = Artist | Artwork | Show + +# Top artworks, shows, or artists from a partner +type AnalyticsRankedStats { + entity: AnalyticsRankedEntityUnion + period: AnalyticsQueryPeriodEnum! + rankedEntity: AnalyticsRankedStatsUnion! + value: Int! +} + +# The connection type for RankedStats. +type AnalyticsRankedStatsConnection { + # A list of edges. + edges: [AnalyticsRankedStatsEdge] + + # A list of nodes. + nodes: [AnalyticsRankedStats] + + # Information to aid in pagination. + pageInfo: AnalyticsPageInfo! +} + +# An edge in a connection. +type AnalyticsRankedStatsEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: AnalyticsRankedStats +} + +enum AnalyticsRankedStatsObjectTypeEnum { + # Artist + ARTIST + + # Artwork + ARTWORK + + # Show + SHOW +} + +# An artwork, artist, or show +union AnalyticsRankedStatsUnion = + AnalyticsArtist + | AnalyticsArtwork + | AnalyticsShow + +type AnalyticsShow { + entityId: String! +} + +# Statistics for users +type AnalyticsUserStats { + totalPurchaseCount: Int! + userId: String! +} + +type AnalyticsVisitorsByCountry { + metric: String! + name: String! + percent: Float! + type: String! + value: Int! +} + +type AnalyticsVisitorsByDevice { + metric: String! + name: String! + percent: Float! + type: String! + value: Int! +} + +type AnalyticsVisitorsByLandingPage { + metric: String! + name: String! + percent: Float! + type: String! + value: Int! +} + +type AnalyticsVisitorsByReferral { + metric: String! + name: String! + percent: Float! + type: String! + value: Int! +} + +# App Authenticator Two-Factor Authentication factor +type AppSecondFactor implements SecondFactor { + createdAt: ISO8601DateTime! + disabledAt: ISO8601DateTime + enabled: Boolean! + enabledAt: ISO8601DateTime + internalID: ID! + kind: SecondFactorKind! + name: String + otpProvisioningURI: String + otpSecret: String + updatedAt: ISO8601DateTime! +} + +# Second factor input attributes +input AppSecondFactorAttributes { + # Name of the second factor + name: String +} + +# An app second factor or errors +union AppSecondFactorOrErrorsUnion = AppSecondFactor | Errors + +type ARImage { + height: Int + imageURLs: ImageURLs + internalID: ID! + width: Int +} + +input ARImageInput { + internalID: ID! +} + +type Article implements Node { + author: Author + cached: Int + channelID: String + contributingAuthors: [Author] + href: String + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + publishedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + slug: String + thumbnailImage: Image + thumbnailTeaser: String + thumbnailTitle: String + tier: Int + title: String + updatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String +} + +# A connection to a list of items. +type ArticleConnection { + # A list of edges. + edges: [ArticleEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type ArticleEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Article +} + +enum ArticleSorts { + PUBLISHED_AT_ASC + PUBLISHED_AT_DESC +} + +type Artist implements EntityWithFilterArtworksConnectionInterface & Node & Searchable { + alternateNames: [String] + articlesConnection( + after: String + before: String + first: Int + inEditorialFeed: Boolean + last: Int + limit: Int + sort: ArticleSorts + ): ArticleConnection + artistSeriesConnection( + after: String + before: String + first: Int + last: Int + ): ArtistSeriesConnection + artworksConnection( + after: String + before: String + + # List of artwork IDs to exclude from the response. + exclude: [String] + filter: [ArtistArtworksFilters] + first: Int + last: Int + published: Boolean = true + sort: ArtworkSorts + ): ArtworkConnection + auctionResultsConnection( + after: String + + # Filter auction results by empty artwork created date values + allowEmptyCreatedDates: Boolean = true + before: String + + # Filter auction results by category (medium) + categories: [String] + + # Filter auction results by earliest created at year + earliestCreatedYear: Int + first: Int + last: Int + + # Filter auction results by latest created at year + latestCreatedYear: Int + + # Filter auction results by organizations + organizations: [String] + + # When true, will only return records for allowed artists. + recordsTrusted: Boolean = false + + # Filter auction results by Artwork sizes + sizes: [ArtworkSizes] + sort: AuctionResultSorts + ): AuctionResultConnection + + # In applicable contexts, this is what the artist (as a suggestion) is based on. + basedOn: Artist + bio: String + + # The Artist biography article written by Artsy + biography: Article + biographyBlurb( + format: Format + + # If true, will return featured bio over Artsy one. + partnerBio: Boolean = false + ): ArtistBlurb + birthday: String + blurb(format: Format): String + cached: Int + carousel: ArtistCarousel + collections: [String] + contemporary( + excludeArtistsWithoutArtworks: Boolean = true + + # The number of Artists to return + size: Int + ): [Artist] + counts: ArtistCounts + currentEvent: CurrentEvent + deathday: String + disablePriceContext: Boolean + displayLabel: String + + # Custom-sorted list of shows for an artist, in order of significance. + exhibitionHighlights( + # The number of Shows to return + size: Int = 5 + ): [Show] + + # Artworks Elastic Search results + filterArtworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + + # A string showing the total number of works and those for sale + formattedArtworksCount: String + + # A string of the form "Nationality, Birthday (or Birthday-Deathday)" + formattedNationalityAndBirthday: String + gender: String + + # A list of genes associated with an artist + genes: [Gene] + hasMetadata: Boolean + highlights: ArtistHighlights + hometown: String + href: String + + # A globally unique ID. + id: ID! + image: Image + imageUrl: String + initials(length: Int = 3): String + insights: [ArtistInsight] + + # A type-specific ID likely used as a database ID. + internalID: ID! + isConsignable: Boolean + + # Only specific Artists should show a link to auction results. + isDisplayAuctionLink: Boolean + isFollowed: Boolean + isPublic: Boolean + isShareable: Boolean + location: String + marketingCollections( + category: String + isFeaturedArtistContent: Boolean + randomizationSeed: String + showOnEditorial: Boolean + size: Int + slugs: [String!] + ): [MarketingCollection] + meta: ArtistMeta + name: String + nationality: String + partnerArtists( + # The number of PartnerArtists to return + size: Int + ): [PartnerArtist] + partnersConnection( + after: String + before: String + first: Int + last: Int + partnerCategory: [String] + representedBy: Boolean + ): PartnerArtistConnection + related: ArtistRelatedData + sales( + isAuction: Boolean + live: Boolean + + # The number of Sales to return + size: Int + sort: SaleSorts + ): [Sale] + showsConnection( + active: Boolean + after: String + atAFair: Boolean + before: String + first: Int + isReference: Boolean + last: Int + + # The number of PartnerShows to return + size: Int + soloShow: Boolean + sort: ShowSorts + status: String + topTier: Boolean + visibleToPublic: Boolean + ): ShowConnection + + # A slug ID. + slug: ID! + + # Use this attribute to sort by when sorting a collection of Artists + sortableID: String + statuses: ArtistStatuses + targetSupply: ArtistTargetSupply + years: String +} + +type ArtistArtworkGrid implements ArtworkContextGrid { + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + ctaHref: String + ctaTitle: String + title: String +} + +enum ArtistArtworksFilters { + IS_FOR_SALE + IS_NOT_FOR_SALE +} + +type ArtistBlurb { + credit: String + + # The partner id of the partner who submitted the featured bio. + partnerID: String + text: String +} + +type ArtistCarousel { + images: [Image] +} + +# A connection to a list of items. +type ArtistConnection { + # A list of edges. + edges: [ArtistEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +type ArtistCounts { + articles: Int + artworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + auctionArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + ecommerceArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + follows( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + forSaleArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + hasMakeOfferArtworks: Boolean + partnerShows( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + relatedArtists: Int +} + +# An edge in a connection. +type ArtistEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Artist +} + +type ArtistGroup { + # Artists sorted by last name + items: [Artist] + + # Letter artists group belongs to + letter: String +} + +type ArtistHighlights { + partnersConnection( + after: String + before: String + displayOnPartnerProfile: Boolean + first: Int + last: Int + partnerCategory: [String] + representedBy: Boolean + ): PartnerArtistConnection +} + +type ArtistInsight { + # List of entities relevant to the insight. + entities: [String] + + # Label to use when displaying the insight. + label: String + + # The type of insight. + type: String +} + +type ArtistMeta { + description: String + title: String +} + +# A connection to a list of items. +type ArtistPartnerConnection { + # A list of edges. + edges: [ArtistPartnerEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type ArtistPartnerEdge { + artist: Artist + biography: String + counts: PartnerArtistCounts + + # A cursor for use in pagination + cursor: String! + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + isDisplayOnPartnerProfile: Boolean + isUseDefaultBiography: Boolean + + # The item at the end of the edge + node: Artist + partner: Partner + representedBy: Boolean + sortableID: String +} + +type ArtistRelatedData { + artistsConnection( + after: String + before: String + excludeArtistsWithoutArtworks: Boolean = true + first: Int + kind: RelatedArtistsKind + last: Int + minForsaleArtworks: Int + ): ArtistConnection + genes(after: String, before: String, first: Int, last: Int): GeneConnection + + # A list of the current user’s suggested artists, based on a single artist + suggestedConnection( + after: String + before: String + + # Exclude these ids from results, may result in all artists being excluded. + excludeArtistIDs: [String] + + # Exclude artists without any artworks + excludeArtistsWithoutArtworks: Boolean + + # Exclude artists without for sale works + excludeArtistsWithoutForsaleArtworks: Boolean + + # Exclude artists the user already follows + excludeFollowedArtists: Boolean + first: Int + last: Int + ): ArtistConnection +} + +type ArtistSeries { + # List of Mongo IDs for associated Artists + artistIDs: [String!]! + artists(page: Int, size: Int): [Artist] + artworkIDs: [ID!]! + artworksConnection(after: String, first: Int): ArtworkConnection + artworksCount: Int! + + # A formatted string that shows the number of available works or + # (as a fallback) the number of works in general. + artworksCountMessage: String + description: String + descriptionFormatted(format: Format): String + featured: Boolean! + filterArtworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + marketable: Boolean + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + forSaleArtworksCount: Int! + image: Image + imageHeight: Int + imageURL: String + imageWidth: Int + + # Unique ID for this artist series + internalID: ID! + published: Boolean! + representativeArtworkID: ID + slug: String! + title: String! +} + +# The connection type for ArtistSeries. +type ArtistSeriesConnection { + # A list of edges. + edges: [ArtistSeriesEdge] + + # A list of nodes. + nodes: [ArtistSeries] + + # Information to aid in pagination. + pageInfo: PageInfo! + + # Total count of matching nodes, before pagination + totalCount: Int! +} + +# An edge in a connection. +type ArtistSeriesEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: ArtistSeries +} + +enum ArtistSorts { + SORTABLE_ID_ASC + SORTABLE_ID_DESC + TRENDING_DESC +} + +type ArtistStatuses { + articles: Boolean + artists: Boolean + artworks: Boolean + auctionLots: Boolean + biography: Boolean + contemporary: Boolean + cv( + # Suppress the cv tab when artist show count is less than this. + minShowCount: Int = 15 + ): Boolean + shows: Boolean +} + +type ArtistTargetSupply { + # True if an artist is in the microfunnel list. + isInMicrofunnel: Boolean + + # True if artist is in target supply list. + isTargetSupply: Boolean + microfunnel: ArtistTargetSupplyMicrofunnel +} + +type ArtistTargetSupplyMicrofunnel { + artworks( + # Randomize the order of artworks for display purposes. + randomize: Boolean + + # Number of artworks to return + size: Int + ): [ArtistTargetSupplyMicrofunnelArtwork] + @deprecated( + reason: "Prefer to use `artworksConnection`. [Will be removed in v2]" + ) + + # A list of recently sold artworks. + artworksConnection( + after: String + before: String + first: Int + last: Int + + # Randomize the order of artworks for display purposes. + randomize: Boolean + ): ArtworkConnection + metadata: TargetSupplyMicrofunnelMetadata +} + +type ArtistTargetSupplyMicrofunnelArtwork { + artwork: Artwork + realizedPrice: String +} + +type Artwork implements Node & Searchable & Sellable { + additionalInformation(format: Format): String + articles(size: Int): [Article] + artist( + # Use whatever is in the original response instead of making a request + shallow: Boolean + ): Artist + artistNames: String + artists( + # Use whatever is in the original response instead of making a request + shallow: Boolean + ): [Artist] + artistSeriesConnection( + after: String + before: String + first: Int + last: Int + ): ArtistSeriesConnection + + # Attribution class object + attributionClass: AttributionClass + availability: String + cached: Int + + # Can a user request a lot conditions report for this artwork? + canRequestLotConditionsReport: Boolean + category: String + + # Returns the display label and detail for artwork certificate of authenticity + certificateOfAuthenticity: ArtworkInfoRow + collectingInstitution: String + conditionDescription: ArtworkInfoRow + contactLabel: String + + # Pre-filled inquiry text + contactMessage: String + + # Returns the associated Fair/Sale/Show + context: ArtworkContext + contextGrids: [ArtworkContextGrid] + + # The currency code used to pay for the artwork + costCurrencyCode: String + + # The amount paid for the artwork, in cents + costMinor: Int + culturalMaker: String + date: String + + # The depth as expressed by the original input metric + depth: String + description(format: Format): String + dimensions: dimensions + displayLabel: String + editionNumber: String + editionOf: String + editionSets(sort: EditionSetSorts): [EditionSet] + editionSize: String + + # Returns an HTML string representing the embedded content (video) + embed(autoplay: Boolean = false, height: Int = 450, width: Int = 853): String + + # Flags if artwork located in one of EU local shipping countries. + euShippingOrigin: Boolean + exhibitionHistory(format: Format): String + fair: Fair + + # Formatted artwork metadata, including artist, title, date and partner; e.g., 'Andy Warhol, Truck, 1980, Westward Gallery'. + formattedMetadata: String + framed: ArtworkInfoRow + + # Returns true when artwork has a certificate of authenticity + hasCertificateOfAuthenticity: Boolean + + # The height as expressed by the original input metric + height: String + + # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field + heightCm: Float + + # Returns the highlighted shows and articles + highlights: [ArtworkHighlight] + href: String + + # A globally unique ID. + id: ID! + image: Image + imageRights: String + images(size: Int): [Image] + imageTitle: String + imageUrl: String + + # Structured questions a collector can inquire on about this work + inquiryQuestions: [InquiryQuestion] + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Private text field for partner use + inventoryId: String + + # Whether a work can be purchased through e-commerce + isAcquireable: Boolean + + # Is this artwork part of an auction that is currently running? + isBiddable: Boolean + + # When in an auction, can the work be bought immediately + isBuyNowable: Boolean + isComparableWithAuctionResults: Boolean + isDownloadable: Boolean + isEmbeddableVideo: Boolean + isForSale: Boolean + isHangable: Boolean + + # Is this artwork part of an auction? + isInAuction: Boolean + + # Do we want to encourage inquiries on this work? + isInquireable: Boolean + + # Is this artwork part of a current show + isInShow: Boolean + isNotForSale: String + + # Whether a user can make an offer on a work + isOfferable: Boolean + isOnHold: String + isPriceHidden: Boolean + isPriceRange: Boolean + isSaved: Boolean + isShareable: Boolean + isSold: Boolean + isUnique: Boolean + layer(id: String): ArtworkLayer + layers: [ArtworkLayer] + listPrice: ListPrice + literature(format: Format): String + manufacturer(format: Format): String + medium: String + meta: ArtworkMeta + + # The unit of length of the artwork, expressed in `in` or `cm` + metric: String + myLotStanding(live: Boolean = null): [LotStanding!] + + # Is this work only available for shipping domestically? + onlyShipsDomestically: Boolean + partner( + # Use whatever is in the original response instead of making a request + shallow: Boolean + ): Partner + pickupAvailable: Boolean + priceCurrency: String + priceIncludesTax: Boolean + priceIncludesTaxDisplay: String + pricingContext: AnalyticsPricingContext + provenance(format: Format): String + + # Whether this artwork is published or not + published: Boolean! + publisher(format: Format): String + + # Price which an artwork was sold for. This generally only applies to artworks + # in the target supply microfunnel and (currently) queries against hardcoded + # spreadsheet data. + realizedPrice: String + related(size: Int): [Artwork] + sale: Sale + saleArtwork(saleID: String = null): SaleArtwork + saleMessage: String + series(format: Format): String + + # The country an artwork will be shipped from. + shippingCountry: String + + # The string that describes domestic and international shipping. + shippingInfo: String + + # Minimal location information describing from where artwork will be shipped. + shippingOrigin: String + + # Is this work available for shipping only within the Contenental US? + shipsToContinentalUSOnly: Boolean + @deprecated( + reason: "Prefer to use `onlyShipsDomestically`. [Will be removed in v2]" + ) + show(active: Boolean, atAFair: Boolean, sort: ShowSorts): Show + shows(active: Boolean, atAFair: Boolean, size: Int, sort: ShowSorts): [Show] + signature(format: Format): String + signatureInfo: ArtworkInfoRow + + # score assigned to an artwork based on its dimensions + sizeScore: Float + + # A slug ID. + slug: ID! + title: String + + # Whether this artwork is unlisted or not + unlisted: Boolean + + # If the category is video, then it returns the href for the (youtube/vimeo) video, otherwise returns the website from CMS + website: String + + # The width as expressed by the original input metric + width: String + + # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field + widthCm: Float +} + +enum ArtworkAggregation { + ARTIST + COLOR + DIMENSION_RANGE + FOLLOWED_ARTISTS + GALLERY + INSTITUTION + MAJOR_PERIOD + MEDIUM + MERCHANDISABLE_ARTISTS + PARTNER_CITY + PERIOD + PRICE_RANGE + TOTAL +} + +# A connection to a list of items. +type ArtworkConnection implements ArtworkConnectionInterface { + # A list of edges. + edges: [ArtworkEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +interface ArtworkConnectionInterface { + edges: [ArtworkEdgeInterface] + pageCursors: PageCursors! + pageInfo: PageInfo! +} + +union ArtworkContext = Fair | Sale | Show + +# A specific grid. +interface ArtworkContextGrid { + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + ctaHref: String + ctaTitle: String + title: String +} + +# An edge in a connection. +type ArtworkEdge implements ArtworkEdgeInterface { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Artwork +} + +interface ArtworkEdgeInterface { + cursor: String + node: Artwork +} + +union ArtworkFilterFacet = Gene | Tag + +union ArtworkHighlight = Article | Show + +type ArtworkInfoRow { + # Additional details about given attribute + details: String + + # Label for information row + label: String +} + +# An inquiry on an Artwork +type ArtworkInquiry { + artwork: Artwork! + + # A globally unique ID. + id: ID! + impulseConversationID: String + + # A type-specific ID likely used as a database ID. + internalID: ID! +} + +# A connection to a list of items. +type ArtworkInquiryConnection { + # A list of edges. + edges: [ArtworkInquiryEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type ArtworkInquiryEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: ArtworkInquiry +} + +type ArtworkLayer { + # A connection of artworks from a Layer. + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + description: String + href: String + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + name: String + type: String +} + +type ArtworkMeta { + description(limit: Int = 155): String + image: String + share: String + title: String +} + +# The results for one of the requested aggregations +type ArtworksAggregationResults { + counts: [AggregationCount] + slice: ArtworkAggregation +} + +enum ArtworkSizes { + LARGE + MEDIUM + SMALL +} + +enum ArtworkSorts { + AVAILABILITY_ASC + CREATED_AT_ASC + CREATED_AT_DESC + DELETED_AT_ASC + DELETED_AT_DESC + ICONICITY_DESC + MERCHANDISABILITY_DESC + PARTNER_UPDATED_AT_DESC + PUBLISHED_AT_ASC + PUBLISHED_AT_DESC + TITLE_ASC + TITLE_DESC +} + +type ArtworkVersion implements Node { + # The names for the artists related to this Artwork Version + artistNames: String + + # The artists related to this Artwork Version + artists: [Artist] + + # The Image id + defaultImageID: String + + # A globally unique ID. + id: ID! + + # The image representing the Artwork Version + image: Image + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Artwork title + title: String +} + +# Fields of an attachment (currently from Radiation) +type Attachment { + # Content type of file. + contentType: String! + + # URL of attachment. + downloadURL: String! + + # File name. + fileName: String! + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! +} + +# Collection of fields that describe attribution class +type AttributionClass { + # A globally unique ID. + id: ID! + + # Descriptive phrase used as companion for attribution class name display + info: String + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Long descriptive phrase used as companion for short_description + longDescription: String + + # Shortest form of attribution class display + name: String + + # Longer version of attribution class display + shortDescription: String +} + +type AuctionArtworkGrid implements ArtworkContextGrid { + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + ctaHref: String + ctaTitle: String + title: String +} + +# In centimeters. +type AuctionLotDimensions { + depth: Float + height: Float + width: Float +} + +type AuctionLotEstimate { + display: String + high: Float + low: Float +} + +type AuctionLotImages { + larger: Image + thumbnail: Image +} + +type AuctionResult implements Node { + artistID: String! + boughtIn: Boolean + categoryText: String + currency: String + date( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + dateText: String + description: String + dimensions: AuctionLotDimensions + dimensionText: String + estimate: AuctionLotEstimate + externalURL: String + + # A globally unique ID. + id: ID! + images: AuctionLotImages + + # A type-specific ID likely used as a database ID. + internalID: ID! + mediumText: String + organization: String + priceRealized: AuctionResultPriceRealized + saleDate( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + saleDateText: String + saleTitle: String + title: String +} + +# A connection to a list of items. +type AuctionResultConnection { + createdYearRange: YearRange + + # A list of edges. + edges: [AuctionResultEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type AuctionResultEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: AuctionResult +} + +type AuctionResultPriceRealized { + cents: Float + centsUSD: Float + display( + # Passes in to numeral, such as `'0.00'` + format: String = "" + ): String +} + +enum AuctionResultSorts { + DATE_DESC + ESTIMATE_AND_DATE_DESC + PRICE_AND_DATE_DESC +} + +type AuctionsArtsyBidder { + id: ID! + paddleNumber: ID! + userId: ID +} + +# an online (Artsy) bidder, or an offline bidder in the auction +union AuctionsBidder = AuctionsArtsyBidder | AuctionsOfflineBidder + +# DateTime is a scalar value that represents an ISO8601 formatted date and time. +scalar AuctionsDateTime + +# A permanent schedule of increments to use in for upcoming asking prices for a lot. +type AuctionsIncrementPolicy { + changes: [AuctionsIncrementPolicyChange!]! + createdAt: AuctionsDateTime! + + # Generate a list of asking prices across a given range. + enumerate( + from: Long = 0 + + # Defines treatment of off-increment `from` values. + nextIncrementRule: AuctionsNextIncrementRule = SnapToPresetIncrements + until: Long = 0 + ): [AuctionsMoney!]! + groupTag: ID! + id: ID! + initialIncrementCents: Long! + subgroupTag: ID! +} + +# Change thresholds and amounts for IncrementPolicy. +type AuctionsIncrementPolicyChange { + increment: AuctionsMoney! + incrementCents: Long! + threshold: AuctionsMoney! + thresholdCents: Long! +} + +# A change in increment amount, to take effect at the given threshold. +input AuctionsIncrementPolicyChangeInput { + incrementCents: Long! + thresholdCents: Long! +} + +# A groupTag and list of IncrementPolicySubgroups +type AuctionsIncrementPolicyGroup { + groupTag: ID! + subgroups: [AuctionsIncrementPolicySubgroup!]! + subgroupTags: [ID!]! +} + +type AuctionsIncrementPolicySubgroup { + group: AuctionsIncrementPolicyGroup! + revisions: [AuctionsIncrementPolicy!]! + subgroupTag: ID! +} + +# A user's position on a lot +type AuctionsLotStanding implements AuctionsNode { + # The ID of an object + id: ID! + + # whether this user has the leading bid + isHighestBidder: Boolean! + + # The current leading bid on the lot, whether it is winning or not + leadingBidAmount: AuctionsMoney! + + # whether this user has the leading bid + lotState: AuctionsLotState! + rawId: String! + saleArtwork: SaleArtwork +} + +# A connection to a list of items. +type AuctionsLotStandingConnection { + # A list of edges. + edges: [AuctionsLotStandingEdge] + + # Information to aid in pagination. + pageInfo: AuctionsPageInfo! +} + +# An edge in a connection. +type AuctionsLotStandingEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: AuctionsLotStanding! +} + +# A lot in a sale +type AuctionsLotState { + # total number of bids placed on the lot + bidCount: Int! + + # selling price on the live auction floor + floorSellingPrice: AuctionsMoney + + # The bidder currently winning the online portion of the auction + floorWinningBidder: AuctionsBidder + + # The Gravity Lot ID. + id: ID! + + # The Gravity Lot ID. + internalID: ID! + + # asking price for online bidders + onlineAskingPrice: AuctionsMoney! + + # The bidder currently winning the online portion of the auction + onlineSellingToBidder: AuctionsBidder + + # The current reserve status for the lot + reserveStatus: AuctionsReserveStatus! + + # The Gravity Sale ID. + saleId: ID! + + # Whether the lot is sold, for sale or passed + soldStatus: AuctionsSoldStatus! +} + +# Represents currency units and formatting +type AuctionsMoney { + # Formatted string version of currency amount + displayAmount( + # The decimal separator. + decimalSeparator: String = "." + + # Number of decimal places for the currency. + fractionalDigits: Int = 2 + + # The 1000s separator. + groupingSeparator: String = "," + + # Whether to show the fractional units. + showFractionalDigits: Boolean = true + ): String! + units: Long! +} + +# A draft schedule of increments to use in for upcoming asking prices for a lot. +type AuctionsNewIncrementPolicy { + changes: [AuctionsIncrementPolicyChange!]! + + # A listing of increments by tier + enumeratedIncrements: [[AuctionsMoney!]!]! + groupTag: ID! + id: ID + initialIncrementCents: Long! + + # The maximum percentage change between increments (~10% is typical). + maxPercentChange: Float! + + # The minimum percentage change between increments (~4% is typical). + minPercentChange: Float! + + # A listing of increments by tier + prettyPrintedIncrements( + # Number of decimal places for the currency. + fractionalDigits: Int = 2 + ): [String!]! + subgroupTag: ID! + + # Any non-fatal warnings to check before committing the increment policy. + warnings: [String!]! +} + +input AuctionsNewIncrementPolicyInput { + changes: [AuctionsIncrementPolicyChangeInput!]! + groupTag: ID! + id: ID + initialIncrementCents: Long! + subgroupTag: ID! +} + +enum AuctionsNextIncrementRule { + AddToPastValue + SnapToPresetIncrements +} + +# An object with an ID +interface AuctionsNode { + # The id of the object. + id: ID! +} + +# An offline bidder (in the auction room) +type AuctionsOfflineBidder { + singletonDummyField: String +} + +# Information about pagination in a connection. +type AuctionsPageInfo { + # When paginating forwards, the cursor to continue. + endCursor: String + + # When paginating forwards, are there more items? + hasNextPage: Boolean! + + # When paginating backwards, are there more items? + hasPreviousPage: Boolean! + + # When paginating backwards, the cursor to continue. + startCursor: String +} + +enum AuctionsReserveStatus { + NoReserve + ReserveMet + ReserveNotMet +} + +# A collection of lots. +type AuctionsSaleState { + # Users not allowed to participate in the sale + bannedUsers: [AuctionsUser!]! + + # The current lot on block. + currentLot: AuctionsLotState + + # The Gravity Sale ID. + id: ID! + + # The Gravity Lot ID. + internalID: ID! + + # Lot ids that had an Artsy bid that was the highest bid on the lot but did not win + lotIdsWithHigherArtsyBidNotWon: [String!]! + + # Lot ids without a FairWarning event + lotIdsWithoutFairWarning: [String!]! + + # Lot ids without a FinalCall event + lotIdsWithoutFinalCall: [String!]! + + # Lot ids that had an Artsy bid that was the same max bid as the hammer price on the lot but did not win + lotIdsWithSameArtsyBidNotWon: [String!]! + + # The lots belonging to this sale. + lots: [AuctionsLotState!]! + + # Passed lot ids with bids from Artsy bidders + passedLotIdsWithArtsyBids: [String!]! + + # Re-opened lots ids + reopenedLotIds: [String!]! + + # Total Artsy GMV for the sale + totalSoldGMVCents: Long! +} + +enum AuctionsSoldStatus { + ForSale + Passed + Sold +} + +# An Artsy User +type AuctionsUser implements AuctionsNode { + # The ID of an object + id: ID! + + # The user's gravity id + internalID: ID! + rawId: String! + + # The user's id + userId: ID! +} + +type Author { + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + name: String + profileHandle: String +} + +# Backup Two-Factor Authentication factor +type BackupSecondFactor implements SecondFactor { + code: String! + createdAt: ISO8601DateTime! + disabledAt: ISO8601DateTime + enabled: Boolean! + enabledAt: ISO8601DateTime + internalID: ID! + kind: SecondFactorKind! + updatedAt: ISO8601DateTime! +} + +type BackupSecondFactors { + secondFactors: [BackupSecondFactor!]! +} + +# A list of backup second factors or errors +union BackupSecondFactorsOrErrorsUnion = BackupSecondFactors | Errors + +type Bidder implements Node { + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + pin: String + qualifiedForBidding: Boolean + sale: Sale + user: User +} + +type BidderPosition { + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + highestBid: HighestBid + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + isActive: Boolean + isRetracted: Boolean + isWinning: Boolean + isWithBidMax: Boolean + maxBid: BidderPositionMaxBid + processedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + saleArtwork: SaleArtwork + suggestedNextBid: BidderPositionSuggestedNextBid + updatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String +} + +input BidderPositionInput { + artworkID: String! + clientMutationId: String + maxBidAmountCents: Float! + saleID: String! +} + +type BidderPositionMaxBid { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +type BidderPositionPayload { + clientMutationId: String + result: BidderPositionResult +} + +type BidderPositionResult { + messageDescriptionMD: String + messageHeader: String + position: BidderPosition + status: String! +} + +type BidderPositionSuggestedNextBid { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +type BidIncrement { + amount: Int + from: Int + to: Int +} + +type BidIncrementsFormatted { + cents: Float + display: String +} + +# Represents non-fractional signed whole numeric values. Since the value may +# exceed the size of a 32-bit integer, it's encoded as a string. +scalar BigInt + +type BuyersPremium { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + cents: Int + percent: Float +} + +type CalculatedCost { + bidAmount: Money + buyersPremium: Money + subtotal: Money +} + +# Autogenerated input type of CaptureHold +input CaptureHoldInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # Globally unique ID for the hold. + inventoryHoldId: ID! + + # Globally unique ID for the requester of the hold. Ex. Exchange Order ID. + referenceId: String! +} + +# Autogenerated return type of CaptureHold +type CaptureHoldPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + holdOrError: InventoryHoldOrErrorUnion! +} + +type City { + coordinates: LatLng + fairsConnection( + after: String + before: String + first: Int + last: Int + sort: FairSorts + status: EventStatus + ): FairConnection + name: String + showsConnection( + after: String + before: String + + # Only used when status is CLOSING_SOON or UPCOMING. Number of days used to filter upcoming and closing soon shows + dayThreshold: Int + first: Int + + # Whether to include local discovery stubs + includeStubShows: Boolean + last: Int + + # Filter shows by partner type + partnerType: PartnerShowPartnerType + sort: ShowSorts + + # Filter shows by chronological event status + status: EventStatus = CURRENT + ): ShowConnection + slug: String + sponsoredContent: CitySponsoredContent +} + +type CitySponsoredContent { + artGuideUrl: String + featuredShows: [Show] + introText: String + showsConnection( + after: String + before: String + first: Int + last: Int + sort: ShowSorts + status: EventStatus + ): ShowConnection +} + +enum CollectionSorts { + POSITION_ASC + POSITION_DESC +} + +type CollectorProfileType { + collectorLevel: Int + confirmedBuyerAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + email: String + + # A globally unique ID. + id: ID! + intents: [String] + + # A type-specific ID likely used as a database ID. + internalID: ID! + loyaltyApplicantAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + name: String + professionalBuyerAppliedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + professionalBuyerAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + selfReportedPurchases: String +} + +# Autogenerated input type of AddInitialOfferToOrder +input CommerceAddInitialOfferToOrderInput { + amountCents: Int! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + note: String + orderId: ID! +} + +# Autogenerated return type of AddInitialOfferToOrder +type CommerceAddInitialOfferToOrderPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# An generic error type for mutations +type CommerceApplicationError { + # Code of this error + code: String! + + # What caused the error + data: String + + # Type of this error + type: String! +} + +# Autogenerated input type of ApproveOrder +input CommerceApproveOrderInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + id: ID! +} + +# Autogenerated return type of ApproveOrder +type CommerceApproveOrderPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of BuyerAcceptOffer +input CommerceBuyerAcceptOfferInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + offerId: ID! +} + +# Autogenerated return type of BuyerAcceptOffer +type CommerceBuyerAcceptOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of BuyerCounterOffer +input CommerceBuyerCounterOfferInput { + amountCents: Int! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + note: String + offerId: ID! +} + +# Autogenerated return type of BuyerCounterOffer +type CommerceBuyerCounterOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of BuyerRejectOffer +input CommerceBuyerRejectOfferInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + offerId: ID! + rejectReason: CommerceCancelReasonTypeEnum +} + +# Autogenerated return type of BuyerRejectOffer +type CommerceBuyerRejectOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +type CommerceBuyOrder implements CommerceOrder { + buyer: CommerceOrderPartyUnion! + buyerDetails: OrderParty + buyerPhoneNumber: String + buyerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + buyerTotalCents: Int + code: String! + commissionFee( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + commissionFeeCents: Int + commissionRate: Float + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! + creditCard: CreditCard + creditCardId: String + currencyCode: String! + displayCommissionRate: String + id: ID! + internalID: ID! + itemsTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # Item total in cents, for Offer Orders this field reflects current offer + itemsTotalCents: Int + lastApprovedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + lastSubmittedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + lastTransactionFailed: Boolean + lineItems( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + ): CommerceLineItemConnection + mode: CommerceOrderModeEnum + requestedFulfillment: CommerceRequestedFulfillmentUnion + seller: CommerceOrderPartyUnion! + sellerDetails: OrderParty + sellerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + sellerTotalCents: Int + shippingTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + shippingTotalCents: Int + state: CommerceOrderStateEnum! + stateExpiresAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + stateReason: String + stateUpdatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + taxTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + taxTotalCents: Int + totalListPrice( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + totalListPriceCents: Int! + transactionFee( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + transactionFeeCents: Int + updatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! +} + +enum CommerceCancelReasonTypeEnum { + # cancelation reason is: admin_canceled + ADMIN_CANCELED + + # cancelation reason is: buyer_lapsed + BUYER_LAPSED + + # cancelation reason is: buyer_rejected + BUYER_REJECTED + + # cancelation reason is: seller_lapsed + SELLER_LAPSED + + # cancelation reason is: seller_rejected + SELLER_REJECTED + + # cancelation reason is: seller_rejected_artwork_unavailable + SELLER_REJECTED_ARTWORK_UNAVAILABLE + + # cancelation reason is: seller_rejected_offer_too_low + SELLER_REJECTED_OFFER_TOO_LOW + + # cancelation reason is: seller_rejected_other + SELLER_REJECTED_OTHER + + # cancelation reason is: seller_rejected_shipping_unavailable + SELLER_REJECTED_SHIPPING_UNAVAILABLE +} + +# Autogenerated input type of ConfirmFulfillment +input CommerceConfirmFulfillmentInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + id: ID! +} + +# Autogenerated return type of ConfirmFulfillment +type CommerceConfirmFulfillmentPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of ConfirmPickup +input CommerceConfirmPickupInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + id: ID! +} + +# Autogenerated return type of ConfirmPickup +type CommerceConfirmPickupPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of CreateOfferOrderWithArtwork +input CommerceCreateOfferOrderWithArtworkInput { + # Artwork Id + artworkId: String! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # EditionSet Id + editionSetId: String + + # When set to false, we will create a new order. Otherwise if current user has + # pending/submitted orders on same artwork/edition with same quantity, we will return that + findActiveOrCreate: Boolean = true + + # Number of items in the line item, default is 1 + quantity: Int +} + +# Autogenerated return type of CreateOfferOrderWithArtwork +type CommerceCreateOfferOrderWithArtworkPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure. If find_active_or_create is not false, it will + # return existing pending/submitted order for current user if exists, otherwise + # it will return newly created order + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of CreateOrderWithArtwork +input CommerceCreateOrderWithArtworkInput { + # Artwork Id + artworkId: String! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # EditionSet Id + editionSetId: String + + # Number of items in the line item + quantity: Int +} + +# Autogenerated return type of CreateOrderWithArtwork +type CommerceCreateOrderWithArtworkPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Date in YYYY-MM-DD format +scalar CommerceDate + +# An ISO 8601 datetime +scalar CommerceDateTime + +# Autogenerated input type of FixFailedPayment +input CommerceFixFailedPaymentInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + creditCardId: String! + offerId: ID! +} + +# Autogenerated return type of FixFailedPayment +type CommerceFixFailedPaymentPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of FulfillAtOnce +input CommerceFulfillAtOnceInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + fulfillment: CommerceFulfillmentAttributes! + id: ID! +} + +# Autogenerated return type of FulfillAtOnce +type CommerceFulfillAtOncePayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# A Fulfillment for an order +type CommerceFulfillment { + courier: String! + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! + estimatedDelivery( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + id: ID! + internalID: ID! + notes: String + trackingId: String + updatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! +} + +# Attributes of a Fulfillment +input CommerceFulfillmentAttributes { + courier: String! + estimatedDelivery: CommerceDate + notes: String + trackingId: String +} + +# The connection type for Fulfillment. +type CommerceFulfillmentConnection { + # A list of edges. + edges: [CommerceFulfillmentEdge] + + # A list of nodes. + nodes: [CommerceFulfillment] + + # Information to aid in pagination. + pageInfo: CommercePageInfo! +} + +# An edge in a connection. +type CommerceFulfillmentEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: CommerceFulfillment +} + +# A Line Item +type CommerceLineItem { + artwork: Artwork + artworkId: String! + artworkVersion: ArtworkVersion + artworkVersionId: String! + commissionFee( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + commissionFeeCents: Int + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! + editionSetId: String + fulfillments( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + ): CommerceFulfillmentConnection + id: ID! + internalID: ID! + listPrice( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + listPriceCents: Int! + order: CommerceOrder! + priceCents: Int! @deprecated(reason: "switch to use listPriceCents") + quantity: Int! + shippingTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + shippingTotalCents: Int + updatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! +} + +# The connection type for LineItem. +type CommerceLineItemConnection { + # A list of edges. + edges: [CommerceLineItemEdge] + + # A list of nodes. + nodes: [CommerceLineItem] + + # Information to aid in pagination. + pageInfo: CommercePageInfo! +} + +# An edge in a connection. +type CommerceLineItemEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: CommerceLineItem +} + +# An Offer +type CommerceOffer { + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + amountCents: Int! + buyerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + buyerTotalCents: Int + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! + creatorId: String! + currencyCode: String! + from: CommerceOrderPartyUnion! + fromDetails: OrderParty + fromParticipant: CommerceOrderParticipantEnum + id: ID! + internalID: ID! + note: String + order: CommerceOrder! + respondsTo: CommerceOffer + shippingTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + shippingTotalCents: Int + submittedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + taxTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + taxTotalCents: Int +} + +# The connection type for Offer. +type CommerceOfferConnection { + # A list of edges. + edges: [CommerceOfferEdge] + + # A list of nodes. + nodes: [CommerceOffer] + + # Information to aid in pagination. + pageInfo: CommercePageInfo! +} + +# An edge in a connection. +type CommerceOfferEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: CommerceOffer +} + +type CommerceOfferOrder implements CommerceOrder { + awaitingResponseFrom: CommerceOrderParticipantEnum + buyer: CommerceOrderPartyUnion! + buyerDetails: OrderParty + buyerPhoneNumber: String + buyerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + buyerTotalCents: Int + code: String! + commissionFee( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + commissionFeeCents: Int + commissionRate: Float + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! + creditCard: CreditCard + creditCardId: String + currencyCode: String! + displayCommissionRate: String + id: ID! + internalID: ID! + itemsTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # Item total in cents, for Offer Orders this field reflects current offer + itemsTotalCents: Int + lastApprovedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # Last submitted offer + lastOffer: CommerceOffer + lastSubmittedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + lastTransactionFailed: Boolean + lineItems( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + ): CommerceLineItemConnection + mode: CommerceOrderModeEnum + myLastOffer: CommerceOffer + offers( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + fromId: String + fromType: String + + # Returns the last _n_ elements from the list. + last: Int + ): CommerceOfferConnection + offerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + requestedFulfillment: CommerceRequestedFulfillmentUnion + seller: CommerceOrderPartyUnion! + sellerDetails: OrderParty + sellerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + sellerTotalCents: Int + shippingTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + shippingTotalCents: Int + state: CommerceOrderStateEnum! + stateExpiresAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + stateReason: String + stateUpdatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + taxTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + taxTotalCents: Int + totalListPrice( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + totalListPriceCents: Int! + transactionFee( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + transactionFeeCents: Int + updatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! +} + +# Order +interface CommerceOrder { + buyer: CommerceOrderPartyUnion! + buyerDetails: OrderParty + buyerPhoneNumber: String + buyerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + buyerTotalCents: Int + code: String! + commissionFee( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + commissionFeeCents: Int + commissionRate: Float + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! + creditCard: CreditCard + creditCardId: String + currencyCode: String! + displayCommissionRate: String + id: ID! + internalID: ID! + itemsTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # Item total in cents, for Offer Orders this field reflects current offer + itemsTotalCents: Int + lastApprovedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + lastSubmittedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + lastTransactionFailed: Boolean + lineItems( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + ): CommerceLineItemConnection + mode: CommerceOrderModeEnum + requestedFulfillment: CommerceRequestedFulfillmentUnion + seller: CommerceOrderPartyUnion! + sellerDetails: OrderParty + sellerTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + sellerTotalCents: Int + shippingTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + shippingTotalCents: Int + state: CommerceOrderStateEnum! + stateExpiresAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + stateReason: String + stateUpdatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + taxTotal( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + taxTotalCents: Int + totalListPrice( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + totalListPriceCents: Int! + transactionFee( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + transactionFeeCents: Int + updatedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String! +} + +# Order Action data +type CommerceOrderActionData { + clientSecret: String! +} + +# Fields to sort by +enum CommerceOrderConnectionSortEnum { + # Sort by the timestamp the state of the order expires at in ascending order + STATE_EXPIRES_AT_ASC + + # Sort by the timestamp the state of the order expires at in descending order + STATE_EXPIRES_AT_DESC + + # Sort by the timestamp the state of order was last updated in ascending order + STATE_UPDATED_AT_ASC + + # Sort by the timestamp the state of order was last updated in descending order + STATE_UPDATED_AT_DESC + + # Sort by the timestamp the order was last updated in ascending order + UPDATED_AT_ASC + + # Sort by the timestamp the order was last updated in descending order + UPDATED_AT_DESC +} + +# The connection type for Order. +type CommerceOrderConnectionWithTotalCount { + # A list of edges. + edges: [CommerceOrderEdge] + + # A list of nodes. + nodes: [CommerceOrder] + pageCursors: CommercePageCursors + + # Information to aid in pagination. + pageInfo: CommercePageInfo! + totalCount: Int + totalPages: Int +} + +# An edge in a connection. +type CommerceOrderEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: CommerceOrder +} + +enum CommerceOrderFulfillmentTypeEnum { + # fulfillment type is: pickup + PICKUP + + # fulfillment type is: ship + SHIP +} + +enum CommerceOrderModeEnum { + # Buy Order + BUY + + # Offer Order + OFFER +} + +# Represents either a resolved Order or a potential failure +union CommerceOrderOrFailureUnion = + CommerceOrderRequiresAction + | CommerceOrderWithMutationFailure + | CommerceOrderWithMutationSuccess + +enum CommerceOrderParticipantEnum { + # Participant on the buyer side + BUYER + + # Participant on the seller side + SELLER +} + +# Represents either a partner or a user +union CommerceOrderPartyUnion = CommercePartner | CommerceUser + +# Data reflecting actions required +type CommerceOrderRequiresAction { + # Data related to action needed + actionData: CommerceOrderActionData! +} + +enum CommerceOrderStateEnum { + # order is abandoned by buyer and never submitted + ABANDONED + + # order is approved by seller + APPROVED + + # order is canceled + CANCELED + + # order is fulfilled by seller + FULFILLED + + # order is still pending submission by buyer + PENDING + + # order is refunded after being approved or fulfilled + REFUNDED + + # order is submitted by buyer + SUBMITTED +} + +# An error response for changes to an order +type CommerceOrderWithMutationFailure { + error: CommerceApplicationError! +} + +# A successfully returned order type +type CommerceOrderWithMutationSuccess { + order: CommerceOrder! +} + +type CommercePageCursor { + # first cursor on the page + cursor: String! + + # is this the current page? + isCurrent: Boolean! + + # page number out of totalPages + page: Int! +} + +type CommercePageCursors { + around: [CommercePageCursor!]! + + # optional, may be included in field around + first: CommercePageCursor + + # optional, may be included in field around + last: CommercePageCursor + previous: CommercePageCursor +} + +# Information about pagination in a connection. +type CommercePageInfo { + # When paginating forwards, the cursor to continue. + endCursor: String + + # When paginating forwards, are there more items? + hasNextPage: Boolean! + + # When paginating backwards, are there more items? + hasPreviousPage: Boolean! + + # When paginating backwards, the cursor to continue. + startCursor: String +} + +type CommercePartner { + id: String! + type: String! +} + +type CommercePickup { + fulfillmentType: String! + phoneNumber: String +} + +# Autogenerated input type of RejectOrder +input CommerceRejectOrderInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + id: ID! +} + +# Autogenerated return type of RejectOrder +type CommerceRejectOrderPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Represents either a shipping information or pickup +union CommerceRequestedFulfillmentUnion = CommercePickup | CommerceShip + +# Autogenerated input type of SellerAcceptOffer +input CommerceSellerAcceptOfferInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + offerId: ID! +} + +# Autogenerated return type of SellerAcceptOffer +type CommerceSellerAcceptOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of SellerCounterOffer +input CommerceSellerCounterOfferInput { + amountCents: Int! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + note: String + offerId: ID! +} + +# Autogenerated return type of SellerCounterOffer +type CommerceSellerCounterOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of SellerRejectOffer +input CommerceSellerRejectOfferInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + offerId: ID! + rejectReason: CommerceCancelReasonTypeEnum +} + +# Autogenerated return type of SellerRejectOffer +type CommerceSellerRejectOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of SetPayment +input CommerceSetPaymentInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + creditCardId: String! + id: ID! +} + +# Autogenerated return type of SetPayment +type CommerceSetPaymentPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of SetShipping +input CommerceSetShippingInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + fulfillmentType: CommerceOrderFulfillmentTypeEnum! + id: ID! + phoneNumber: String + shipping: CommerceShippingAttributes +} + +# Autogenerated return type of SetShipping +type CommerceSetShippingPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +type CommerceShip { + addressLine1: String + addressLine2: String + city: String + country: String + name: String + phoneNumber: String + postalCode: String + region: String +} + +# Shipping information +input CommerceShippingAttributes { + addressLine1: String + addressLine2: String + city: String + country: String + name: String + phoneNumber: String + postalCode: String + region: String +} + +# Autogenerated input type of SubmitOrder +input CommerceSubmitOrderInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + id: ID! +} + +# Autogenerated return type of SubmitOrder +type CommerceSubmitOrderPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of SubmitOrderWithOffer +input CommerceSubmitOrderWithOfferInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + confirmedSetupIntentId: String + offerId: ID! +} + +# Autogenerated return type of SubmitOrderWithOffer +type CommerceSubmitOrderWithOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +# Autogenerated input type of SubmitPendingOffer +input CommerceSubmitPendingOfferInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + offerId: ID! +} + +# Autogenerated return type of SubmitPendingOffer +type CommerceSubmitPendingOfferPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # A union of success/failure + orderOrError: CommerceOrderOrFailureUnion! +} + +type CommerceUser { + id: String! +} + +type ConditionReportRequest { + internalID: ID! + saleArtworkID: ID + userID: ID +} + +# Autogenerated input type of ConfirmPassword +input ConfirmPasswordInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # User password to confirm. + password: String! +} + +# Autogenerated return type of ConfirmPassword +type ConfirmPasswordPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + valid: Boolean! +} + +# Consignment +type Consignment { + currency: String + + # Uniq ID for this consignment + id: ID! + internalID: ID + saleDate: String + saleName: String + salePriceCents: Int + state: ConsignmentState + submission: ConsignmentSubmission! + submissionId: ID! + submissionID: ID +} + +# The connection type for Consignment. +type ConsignmentConnection { + # A list of edges. + edges: [ConsignmentEdge] + + # A list of nodes. + nodes: [Consignment] + pageCursors: ConsignmentPageCursors + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int + totalPages: Int +} + +# An edge in a connection. +type ConsignmentEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: Consignment +} + +# Consignment Offer +type ConsignmentOffer { + commissionPercentWhole: Int + createdAt: ISO8601DateTime + createdById: ID + currency: String + deadlineToConsign: String + highEstimateAmount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + highEstimateCents: Int + + # Uniq ID for this offer + id: ID! + insuranceInfo: String + lowEstimateAmount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + lowEstimateCents: Int + notes: String + offerType: String + otherFeesInfo: String + partnerInfo: String + photographyInfo: String + saleDate: String + saleLocation: String + saleName: String + shippingInfo: String + state: String + submission: ConsignmentSubmission! +} + +# The connection type for Offer. +type ConsignmentOfferConnection { + # A list of edges. + edges: [ConsignmentOfferEdge] + + # A list of nodes. + nodes: [ConsignmentOffer] + pageCursors: ConsignmentPageCursors + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int + totalPages: Int +} + +# An edge in a connection. +type ConsignmentOfferEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: ConsignmentOffer +} + +enum ConsignmentOfferSort { + # sort by commission_percent in ascending order + COMMISSION_PERCENT_ASC + + # sort by commission_percent in descending order + COMMISSION_PERCENT_DESC + + # sort by consigned_at in ascending order + CONSIGNED_AT_ASC + + # sort by consigned_at in descending order + CONSIGNED_AT_DESC + + # sort by created_at in ascending order + CREATED_AT_ASC + + # sort by created_at in descending order + CREATED_AT_DESC + + # sort by created_by_id in ascending order + CREATED_BY_ID_ASC + + # sort by created_by_id in descending order + CREATED_BY_ID_DESC + + # sort by currency in ascending order + CURRENCY_ASC + + # sort by currency in descending order + CURRENCY_DESC + + # sort by deadline_to_consign in ascending order + DEADLINE_TO_CONSIGN_ASC + + # sort by deadline_to_consign in descending order + DEADLINE_TO_CONSIGN_DESC + + # sort by high_estimate_cents in ascending order + HIGH_ESTIMATE_CENTS_ASC + + # sort by high_estimate_cents in descending order + HIGH_ESTIMATE_CENTS_DESC + + # sort by id in ascending order + ID_ASC + + # sort by id in descending order + ID_DESC + + # sort by insurance_info in ascending order + INSURANCE_INFO_ASC + + # sort by insurance_info in descending order + INSURANCE_INFO_DESC + + # sort by low_estimate_cents in ascending order + LOW_ESTIMATE_CENTS_ASC + + # sort by low_estimate_cents in descending order + LOW_ESTIMATE_CENTS_DESC + + # sort by notes in ascending order + NOTES_ASC + + # sort by notes in descending order + NOTES_DESC + + # sort by offer_type in ascending order + OFFER_TYPE_ASC + + # sort by offer_type in descending order + OFFER_TYPE_DESC + + # sort by other_fees_info in ascending order + OTHER_FEES_INFO_ASC + + # sort by other_fees_info in descending order + OTHER_FEES_INFO_DESC + + # sort by override_email in ascending order + OVERRIDE_EMAIL_ASC + + # sort by override_email in descending order + OVERRIDE_EMAIL_DESC + + # sort by partner_info in ascending order + PARTNER_INFO_ASC + + # sort by partner_info in descending order + PARTNER_INFO_DESC + + # sort by partner_submission_id in ascending order + PARTNER_SUBMISSION_ID_ASC + + # sort by partner_submission_id in descending order + PARTNER_SUBMISSION_ID_DESC + + # sort by photography_info in ascending order + PHOTOGRAPHY_INFO_ASC + + # sort by photography_info in descending order + PHOTOGRAPHY_INFO_DESC + + # sort by price_cents in ascending order + PRICE_CENTS_ASC + + # sort by price_cents in descending order + PRICE_CENTS_DESC + + # sort by reference_id in ascending order + REFERENCE_ID_ASC + + # sort by reference_id in descending order + REFERENCE_ID_DESC + + # sort by rejected_at in ascending order + REJECTED_AT_ASC + + # sort by rejected_at in descending order + REJECTED_AT_DESC + + # sort by rejected_by in ascending order + REJECTED_BY_ASC + + # sort by rejected_by in descending order + REJECTED_BY_DESC + + # sort by rejection_note in ascending order + REJECTION_NOTE_ASC + + # sort by rejection_note in descending order + REJECTION_NOTE_DESC + + # sort by rejection_reason in ascending order + REJECTION_REASON_ASC + + # sort by rejection_reason in descending order + REJECTION_REASON_DESC + + # sort by review_started_at in ascending order + REVIEW_STARTED_AT_ASC + + # sort by review_started_at in descending order + REVIEW_STARTED_AT_DESC + + # sort by sale_date in ascending order + SALE_DATE_ASC + + # sort by sale_date in descending order + SALE_DATE_DESC + + # sort by sale_location in ascending order + SALE_LOCATION_ASC + + # sort by sale_location in descending order + SALE_LOCATION_DESC + + # sort by sale_name in ascending order + SALE_NAME_ASC + + # sort by sale_name in descending order + SALE_NAME_DESC + + # sort by sale_period_end in ascending order + SALE_PERIOD_END_ASC + + # sort by sale_period_end in descending order + SALE_PERIOD_END_DESC + + # sort by sale_period_start in ascending order + SALE_PERIOD_START_ASC + + # sort by sale_period_start in descending order + SALE_PERIOD_START_DESC + + # sort by sent_at in ascending order + SENT_AT_ASC + + # sort by sent_at in descending order + SENT_AT_DESC + + # sort by sent_by in ascending order + SENT_BY_ASC + + # sort by sent_by in descending order + SENT_BY_DESC + + # sort by shipping_info in ascending order + SHIPPING_INFO_ASC + + # sort by shipping_info in descending order + SHIPPING_INFO_DESC + + # sort by state in ascending order + STATE_ASC + + # sort by state in descending order + STATE_DESC + + # sort by submission_id in ascending order + SUBMISSION_ID_ASC + + # sort by submission_id in descending order + SUBMISSION_ID_DESC + + # sort by updated_at in ascending order + UPDATED_AT_ASC + + # sort by updated_at in descending order + UPDATED_AT_DESC +} + +type ConsignmentPageCursor { + # first cursor on the page + cursor: String! + + # is this the current page? + isCurrent: Boolean! + + # page number out of totalPages + page: Int! +} + +type ConsignmentPageCursors { + around: [ConsignmentPageCursor!]! + + # optional, may be included in field around + first: ConsignmentPageCursor + + # optional, may be included in field around + last: ConsignmentPageCursor + previous: ConsignmentPageCursor +} + +enum ConsignmentSort { + # sort by accepted_offer_id in ascending order + ACCEPTED_OFFER_ID_ASC + + # sort by accepted_offer_id in descending order + ACCEPTED_OFFER_ID_DESC + + # sort by artsy_commission_percent in ascending order + ARTSY_COMMISSION_PERCENT_ASC + + # sort by artsy_commission_percent in descending order + ARTSY_COMMISSION_PERCENT_DESC + + # sort by canceled_reason in ascending order + CANCELED_REASON_ASC + + # sort by canceled_reason in descending order + CANCELED_REASON_DESC + + # sort by created_at in ascending order + CREATED_AT_ASC + + # sort by created_at in descending order + CREATED_AT_DESC + + # sort by currency in ascending order + CURRENCY_ASC + + # sort by currency in descending order + CURRENCY_DESC + + # sort by id in ascending order + ID_ASC + + # sort by id in descending order + ID_DESC + + # sort by notes in ascending order + NOTES_ASC + + # sort by notes in descending order + NOTES_DESC + + # sort by notified_at in ascending order + NOTIFIED_AT_ASC + + # sort by notified_at in descending order + NOTIFIED_AT_DESC + + # sort by partner_commission_percent in ascending order + PARTNER_COMMISSION_PERCENT_ASC + + # sort by partner_commission_percent in descending order + PARTNER_COMMISSION_PERCENT_DESC + + # sort by partner_id in ascending order + PARTNER_ID_ASC + + # sort by partner_id in descending order + PARTNER_ID_DESC + + # sort by partner_invoiced_at in ascending order + PARTNER_INVOICED_AT_ASC + + # sort by partner_invoiced_at in descending order + PARTNER_INVOICED_AT_DESC + + # sort by partner_paid_at in ascending order + PARTNER_PAID_AT_ASC + + # sort by partner_paid_at in descending order + PARTNER_PAID_AT_DESC + + # sort by reference_id in ascending order + REFERENCE_ID_ASC + + # sort by reference_id in descending order + REFERENCE_ID_DESC + + # sort by sale_date in ascending order + SALE_DATE_ASC + + # sort by sale_date in descending order + SALE_DATE_DESC + + # sort by sale_location in ascending order + SALE_LOCATION_ASC + + # sort by sale_location in descending order + SALE_LOCATION_DESC + + # sort by sale_lot_number in ascending order + SALE_LOT_NUMBER_ASC + + # sort by sale_lot_number in descending order + SALE_LOT_NUMBER_DESC + + # sort by sale_name in ascending order + SALE_NAME_ASC + + # sort by sale_name in descending order + SALE_NAME_DESC + + # sort by sale_price_cents in ascending order + SALE_PRICE_CENTS_ASC + + # sort by sale_price_cents in descending order + SALE_PRICE_CENTS_DESC + + # sort by state in ascending order + STATE_ASC + + # sort by state in descending order + STATE_DESC + + # sort by submission_id in ascending order + SUBMISSION_ID_ASC + + # sort by submission_id in descending order + SUBMISSION_ID_DESC + + # sort by updated_at in ascending order + UPDATED_AT_ASC + + # sort by updated_at in descending order + UPDATED_AT_DESC +} + +enum ConsignmentState { + BOUGHT_IN + CANCELLED + OPEN + SOLD +} + +# Consignment Submission +type ConsignmentSubmission { + additionalInfo: String + artist: Artist + artistId: String! + assets: [ConsignmentSubmissionCategoryAsset] + authenticityCertificate: Boolean + category: String + createdAt: ISO8601DateTime + currency: String + depth: String + dimensionsMetric: String + edition: String + editionNumber: String + editionSize: Int + height: String + + # Uniq ID for this submission + id: ID! + internalID: ID + locationCity: String + locationCountry: String + locationState: String + medium: String + minimumPriceDollars: Int + offers(gravityPartnerId: ID!): [ConsignmentOffer!]! + primaryImage: ConsignmentSubmissionCategoryAsset + provenance: String + publishedAt: ISO8601DateTime + signature: Boolean + state: ConsignmentSubmissionStateAggregation + title: String + userAgent: String + userId: String! + width: String + year: String +} + +enum ConsignmentSubmissionCategoryAggregation { + ARCHITECTURE + DESIGN_DECORATIVE_ART + DRAWING_COLLAGE_OR_OTHER_WORK_ON_PAPER + FASHION_DESIGN_AND_WEARABLE_ART + INSTALLATION + JEWELRY + MIXED_MEDIA + OTHER + PAINTING + PERFORMANCE_ART + PHOTOGRAPHY + PRINT + SCULPTURE + TEXTILE_ARTS + VIDEO_FILM_ANIMATION +} + +# Submission Asset +type ConsignmentSubmissionCategoryAsset { + # type of this Asset + assetType: String! + + # gemini token for asset + geminiToken: String + + # Uniq ID for this asset + id: ID! + + # known image urls + imageUrls: JSON + submissionId: ID! + submissionID: ID +} + +# The connection type for Submission. +type ConsignmentSubmissionConnection { + # A list of edges. + edges: [SubmissionEdge] + + # A list of nodes. + nodes: [ConsignmentSubmission] + pageCursors: ConsignmentPageCursors + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int + totalPages: Int +} + +enum ConsignmentSubmissionSort { + # sort by additional_info in ascending order + ADDITIONAL_INFO_ASC + + # sort by additional_info in descending order + ADDITIONAL_INFO_DESC + + # sort by admin_receipt_sent_at in ascending order + ADMIN_RECEIPT_SENT_AT_ASC + + # sort by admin_receipt_sent_at in descending order + ADMIN_RECEIPT_SENT_AT_DESC + + # sort by approved_at in ascending order + APPROVED_AT_ASC + + # sort by approved_at in descending order + APPROVED_AT_DESC + + # sort by approved_by in ascending order + APPROVED_BY_ASC + + # sort by approved_by in descending order + APPROVED_BY_DESC + + # sort by artist_id in ascending order + ARTIST_ID_ASC + + # sort by artist_id in descending order + ARTIST_ID_DESC + + # sort by artist_score in ascending order + ARTIST_SCORE_ASC + + # sort by artist_score in descending order + ARTIST_SCORE_DESC + + # sort by assigned_to in ascending order + ASSIGNED_TO_ASC + + # sort by assigned_to in descending order + ASSIGNED_TO_DESC + + # sort by auction_score in ascending order + AUCTION_SCORE_ASC + + # sort by auction_score in descending order + AUCTION_SCORE_DESC + + # sort by authenticity_certificate in ascending order + AUTHENTICITY_CERTIFICATE_ASC + + # sort by authenticity_certificate in descending order + AUTHENTICITY_CERTIFICATE_DESC + + # sort by category in ascending order + CATEGORY_ASC + + # sort by category in descending order + CATEGORY_DESC + + # sort by consigned_partner_submission_id in ascending order + CONSIGNED_PARTNER_SUBMISSION_ID_ASC + + # sort by consigned_partner_submission_id in descending order + CONSIGNED_PARTNER_SUBMISSION_ID_DESC + + # sort by created_at in ascending order + CREATED_AT_ASC + + # sort by created_at in descending order + CREATED_AT_DESC + + # sort by currency in ascending order + CURRENCY_ASC + + # sort by currency in descending order + CURRENCY_DESC + + # sort by deadline_to_sell in ascending order + DEADLINE_TO_SELL_ASC + + # sort by deadline_to_sell in descending order + DEADLINE_TO_SELL_DESC + + # sort by deleted_at in ascending order + DELETED_AT_ASC + + # sort by deleted_at in descending order + DELETED_AT_DESC + + # sort by depth in ascending order + DEPTH_ASC + + # sort by depth in descending order + DEPTH_DESC + + # sort by dimensions_metric in ascending order + DIMENSIONS_METRIC_ASC + + # sort by dimensions_metric in descending order + DIMENSIONS_METRIC_DESC + + # sort by edition in ascending order + EDITION_ASC + + # sort by edition in descending order + EDITION_DESC + + # sort by edition_number in ascending order + EDITION_NUMBER_ASC + + # sort by edition_number in descending order + EDITION_NUMBER_DESC + + # sort by edition_size in ascending order + EDITION_SIZE_ASC + + # sort by edition_size in descending order + EDITION_SIZE_DESC + + # sort by ext_user_id in ascending order + EXT_USER_ID_ASC + + # sort by ext_user_id in descending order + EXT_USER_ID_DESC + + # sort by height in ascending order + HEIGHT_ASC + + # sort by height in descending order + HEIGHT_DESC + + # sort by id in ascending order + ID_ASC + + # sort by id in descending order + ID_DESC + + # sort by location_city in ascending order + LOCATION_CITY_ASC + + # sort by location_city in descending order + LOCATION_CITY_DESC + + # sort by location_country in ascending order + LOCATION_COUNTRY_ASC + + # sort by location_country in descending order + LOCATION_COUNTRY_DESC + + # sort by location_state in ascending order + LOCATION_STATE_ASC + + # sort by location_state in descending order + LOCATION_STATE_DESC + + # sort by medium in ascending order + MEDIUM_ASC + + # sort by medium in descending order + MEDIUM_DESC + + # sort by minimum_price_cents in ascending order + MINIMUM_PRICE_CENTS_ASC + + # sort by minimum_price_cents in descending order + MINIMUM_PRICE_CENTS_DESC + + # sort by offers_count in ascending order + OFFERS_COUNT_ASC + + # sort by offers_count in descending order + OFFERS_COUNT_DESC + + # sort by primary_image_id in ascending order + PRIMARY_IMAGE_ID_ASC + + # sort by primary_image_id in descending order + PRIMARY_IMAGE_ID_DESC + + # sort by provenance in ascending order + PROVENANCE_ASC + + # sort by provenance in descending order + PROVENANCE_DESC + + # sort by published_at in ascending order + PUBLISHED_AT_ASC + + # sort by published_at in descending order + PUBLISHED_AT_DESC + + # sort by qualified in ascending order + QUALIFIED_ASC + + # sort by qualified in descending order + QUALIFIED_DESC + + # sort by receipt_sent_at in ascending order + RECEIPT_SENT_AT_ASC + + # sort by receipt_sent_at in descending order + RECEIPT_SENT_AT_DESC + + # sort by rejected_at in ascending order + REJECTED_AT_ASC + + # sort by rejected_at in descending order + REJECTED_AT_DESC + + # sort by rejected_by in ascending order + REJECTED_BY_ASC + + # sort by rejected_by in descending order + REJECTED_BY_DESC + + # sort by reminders_sent_count in ascending order + REMINDERS_SENT_COUNT_ASC + + # sort by reminders_sent_count in descending order + REMINDERS_SENT_COUNT_DESC + + # sort by signature in ascending order + SIGNATURE_ASC + + # sort by signature in descending order + SIGNATURE_DESC + + # sort by state in ascending order + STATE_ASC + + # sort by state in descending order + STATE_DESC + + # sort by title in ascending order + TITLE_ASC + + # sort by title in descending order + TITLE_DESC + + # sort by updated_at in ascending order + UPDATED_AT_ASC + + # sort by updated_at in descending order + UPDATED_AT_DESC + + # sort by user_agent in ascending order + USER_AGENT_ASC + + # sort by user_agent in descending order + USER_AGENT_DESC + + # sort by user_email in ascending order + USER_EMAIL_ASC + + # sort by user_email in descending order + USER_EMAIL_DESC + + # sort by user_id in ascending order + USER_ID_ASC + + # sort by user_id in descending order + USER_ID_DESC + + # sort by width in ascending order + WIDTH_ASC + + # sort by width in descending order + WIDTH_DESC + + # sort by year in ascending order + YEAR_ASC + + # sort by year in descending order + YEAR_DESC +} + +enum ConsignmentSubmissionStateAggregation { + APPROVED + DRAFT + REJECTED + SUBMITTED +} + +type ConvectionService { + geminiTemplateKey: String! +} + +# A conversation. +type Conversation implements Node { + # Only the artworks discussed in the conversation. + artworks: [Artwork] + buyerOutcome: String + buyerOutcomeAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # The participant who initiated the conversation + from: ConversationInitiator! + fromLastViewedMessageID: String + + # A globally unique ID. + id: ID! + initialMessage: String! + @deprecated( + reason: "This field is no longer required. Prefer the first message from the MessageConnection." + ) + + # Gravity inquiry id. + inquiryID: String + + # An optional type-specific ID. + internalID: ID + + # True if user/conversation initiator is a recipient. + isLastMessageToUser: Boolean + + # The artworks and/or partner shows discussed in the conversation. + items: [ConversationItem] + + # This is a snippet of text from the last message. + lastMessage: String + lastMessageAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # Delivery id if the user is a recipient of the last message, null otherwise. + lastMessageDeliveryID: String + + # Impulse id of the last message. + lastMessageID: String + @deprecated( + reason: "Prefer querying `messagesConnection(last:1) { edges { node { internalID } } }`" + ) + + # A connection for all messages in a single conversation + messages( + after: String + before: String + first: Int + last: Int + sort: sort + ): MessageConnection @deprecated(reason: "Prefer messagesConnection") + + # A connection for all messages in a single conversation + messagesConnection( + after: String + before: String + first: Int + last: Int + sort: sort + ): MessageConnection + + # The participant(s) responding to the conversation + to: ConversationResponder! + + # True if there is an unread message by the user. + unread: Boolean +} + +# A connection to a list of items. +type ConversationConnection { + # A list of edges. + edges: [ConversationEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! + totalUnreadCount: Int +} + +# An edge in a connection. +type ConversationEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Conversation +} + +# The participant who started the conversation, currently always a User +type ConversationInitiator { + email: String! + + # A globally unique ID. + id: ID! + initials(length: Int = 3): String + + # A type-specific ID likely used as a database ID. + internalID: ID! + name: String! + + # The type of participant, e.g. Partner or User + type: String! +} + +type ConversationItem { + item: ConversationItemType + permalink: String + title: String +} + +union ConversationItemType = Artwork | Show + +# The participant responding to the conversation, currently always a Partner +type ConversationResponder { + # A globally unique ID. + id: ID! + initials(length: Int = 3): String + + # A type-specific ID likely used as a database ID. + internalID: ID! + name: String! + + # An array of Impulse IDs that correspond to all email addresses that messages should be sent to + replyToImpulseIDs: [String]! + + # The type of participant, e.g. Partner or User + type: String! +} + +type CreateAccountRequestMutationFailure { + mutationError: GravityMutationError +} + +input CreateAccountRequestMutationInput { + # Type of account request. + action: String + clientMutationId: String + + # Email to associate with message. + email: String + + # Name to associate with message. + name: String + + # Message to be sent. + notes: String! + + # Used when logged in. + userID: String +} + +type CreateAccountRequestMutationPayload { + accountRequestOrError: CreateAccountRequestMutationType + clientMutationId: String +} + +type CreateAccountRequestMutationSuccess { + accountRequest: AccountRequest +} + +union CreateAccountRequestMutationType = + CreateAccountRequestMutationFailure + | CreateAccountRequestMutationSuccess + +# Autogenerated input type of CreateAppSecondFactor +input CreateAppSecondFactorInput { + attributes: AppSecondFactorAttributes! + + # A unique identifier for the client performing the mutation. + clientMutationId: String +} + +# Autogenerated return type of CreateAppSecondFactor +type CreateAppSecondFactorPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorOrErrors: AppSecondFactorOrErrorsUnion! +} + +# Autogenerated input type of CreateBackupSecondFactors +input CreateBackupSecondFactorsInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + password: String +} + +# Autogenerated return type of CreateBackupSecondFactors +type CreateBackupSecondFactorsPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorsOrErrors: BackupSecondFactorsOrErrorsUnion! +} + +input CreateBidderInput { + clientMutationId: String + saleID: String! +} + +type CreateBidderPayload { + bidder: Bidder + clientMutationId: String +} + +input CreateGeminiEntryForAssetInput { + clientMutationId: String + + # Additional JSON data to pass through gemini, should definitely contain an `id` and a `_type` + metadata: JSON! + + # The S3 bucket where the file was uploaded + sourceBucket: String! + + # The path to the file + sourceKey: String! + + # The template key, this is `name` in the asset request + templateKey: String! +} + +type CreateGeminiEntryForAssetPayload { + asset: GeminiEntry + clientMutationId: String +} + +# Autogenerated input type of CreateImage +input CreateImageInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # The S3 url for the image to be processed + src: String! + + # The Gemini template key that tells us which image versions we want to generate during processing + templateKey: String! +} + +# Autogenerated return type of CreateImage +type CreateImagePayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + image: ARImage! +} + +# Autogenerated input type of CreateOfferMutation +input CreateOfferMutationInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + commissionPercentWhole: Int! + createdById: String + currency: String + deadlineToConsign: String + gravityPartnerId: String! + highEstimateDollars: Int + insuranceInfo: String + lowEstimateDollars: Int + notes: String + offerType: String + otherFeesInfo: String + partnerInfo: String + photographyInfo: String + saleDate: Date + saleLocation: String + saleName: String + shippingInfo: String + state: String + submissionId: ID! +} + +# Autogenerated return type of CreateOfferMutation +type CreateOfferMutationPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + consignmentOffer: ConsignmentOffer +} + +# Autogenerated input type of CreateSmsSecondFactor +input CreateSmsSecondFactorInput { + attributes: SmsSecondFactorAttributes! + + # A unique identifier for the client performing the mutation. + clientMutationId: String +} + +# Autogenerated return type of CreateSmsSecondFactor +type CreateSmsSecondFactorPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorOrErrors: SmsSecondFactorOrErrorsUnion! +} + +# Autogenerated input type of CreateSubmissionMutation +input CreateSubmissionMutationInput { + additionalInfo: String + artistID: String! + authenticityCertificate: Boolean + category: ConsignmentSubmissionCategoryAggregation + + # A unique identifier for the client performing the mutation. + clientMutationId: String + currency: String + depth: String + dimensionsMetric: String + edition: Boolean + editionNumber: String + editionSize: Int + height: String + locationCity: String + locationCountry: String + locationState: String + medium: String + minimumPriceDollars: Int + provenance: String + signature: Boolean + state: ConsignmentSubmissionStateAggregation + title: String + userAgent: String + width: String + year: String +} + +# Autogenerated return type of CreateSubmissionMutation +type CreateSubmissionMutationPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + consignmentSubmission: ConsignmentSubmission +} + +# Autogenerated input type of CreateViewingRoom +input CreateViewingRoomInput { + attributes: ViewingRoomAttributes + + # Main text + body: String + + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # End datetime + endAt: ISO8601DateTime + image: ARImageInput + + # Introduction + introStatement: String + + # Partner Id + partnerId: String + partnerID: String + + # Pullquote + pullQuote: String + + # Start datetime + startAt: ISO8601DateTime + + # Timezone + timeZone: String + + # Title + title: String +} + +# Autogenerated return type of CreateViewingRoom +type CreateViewingRoomPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoomOrErrors: ViewingRoomOrErrorsUnion! +} + +# An asset which is assigned to a consignment submission +type Credentials { + # The key to use with S3. + credentials: String! + + # The s3 policy document for your request + policyDocument: S3PolicyDocumentType! + + # A base64 encoded version of the S3 policy + policyEncoded: String! + + # The signature for your asset. + signature: String! +} + +type CreditCard { + # Brand of credit card + brand: String! + + # Billing address city + city: String + + # Billing address country code + country: String + + # Credit card's expiration month + expirationMonth: Int! + + # Credit card's expiration year + expirationYear: Int! + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Last four digits on the credit card + lastDigits: String! + + # Name on the credit card + name: String + + # Billing address postal code + postalCode: String + + # Billing address state + state: String + + # Billing address street1 + street1: String + + # Billing address street2 + street2: String +} + +# A connection to a list of items. +type CreditCardConnection { + # A list of edges. + edges: [CreditCardEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type CreditCardEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: CreditCard +} + +input CreditCardInput { + clientMutationId: String + oneTimeUse: Boolean = false + token: String! +} + +type CreditCardMutationFailure { + mutationError: GravityMutationError +} + +type CreditCardMutationSuccess { + creditCard: CreditCard + creditCardEdge: CreditCardEdge +} + +union CreditCardMutationType = + CreditCardMutationFailure + | CreditCardMutationSuccess + +type CreditCardPayload { + clientMutationId: String + creditCardOrError: CreditCardMutationType +} + +type CroppedImageUrl { + height: Int! + src: String! + srcSet: String! + url: String! + width: Int! +} + +type CurrentEvent { + # Location and date of the event if available + details: String + event: UnderlyingCurrentEvent! + + # Link to the event + href: String + image: Image + + # Name of the event + name: String + + # Name of the partner associated to the event + partner: String + + # The state of the event + status: String +} + +# Date in YYYY-MM-DD format +scalar Date + +type DaySchedule { + dayOfWeek: String + endTime: Int + startTime: Int +} + +type DeepZoom { + Image: DeepZoomImage +} + +type DeepZoomImage { + Format: String + Overlap: Int + Size: DeepZoomImageSize + TileSize: Int + Url: String + xmlns: String +} + +type DeepZoomImageSize { + Height: Int + Width: Int +} + +input DeleteCreditCardInput { + clientMutationId: String + id: String! +} + +type DeleteCreditCardPayload { + clientMutationId: String + creditCardOrError: CreditCardMutationType +} + +# Autogenerated input type of DeleteViewingRoom +input DeleteViewingRoomInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoomID: ID! +} + +# Autogenerated return type of DeleteViewingRoom +type DeleteViewingRoomPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoom: ViewingRoom! +} + +# Autogenerated input type of DeliverSecondFactor +input DeliverSecondFactorInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorID: ID! +} + +# Autogenerated return type of DeliverSecondFactor +type DeliverSecondFactorPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorOrErrors: SecondFactorOrErrorsUnion! +} + +# Fields of a delivery (currently from Radiation) +type Delivery { + bouncedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + clickedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + deliveredAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # Masked email w/ display name. + fullTransformedEmail: String! + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + openedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String +} + +type dimensions { + cm: String + in: String +} + +# Autogenerated input type of DisableSecondFactor +input DisableSecondFactorInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + password: String + secondFactorID: ID! +} + +# Autogenerated return type of DisableSecondFactor +type DisableSecondFactorPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorOrErrors: SecondFactorOrErrorsUnion! +} + +type DoNotUseThisPartner { + display_name: String @deprecated(reason: "Use displayName") + displayName: String + given_name: String @deprecated(reason: "Use givenName") + givenName: String + id: ID! + relative_size: Int @deprecated(reason: "Use relativeSize") + relativeSize: Int + slug: String + subscription_state: String @deprecated(reason: "Use subscriptionState") + subscriptionState: String +} + +input EditableLocation { + # First line of an address + address: String + + # Second line of an address + address2: String + + # The city the location is based in + city: String + + # The county the location is based in + country: String + + # Postal code for a string + postalCode: String + + # The (optional) name of the state for location + state: String + + # The (optional) state code of the state for location + stateCode: String + + # An optional display string for the location + summary: String +} + +type EditionSet implements Sellable { + dimensions: dimensions + editionOf: String + + # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field + heightCm: Float + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + isAcquireable: Boolean + isForSale: Boolean + isOfferable: Boolean + isSold: Boolean + listPrice: ListPrice + saleMessage: String + + # score assigned to an artwork based on its dimensions + sizeScore: Float + + # If you need to render artwork dimensions as a string, prefer the `Artwork#dimensions` field + widthCm: Float +} + +enum EditionSetSorts { + PRICE_ASC +} + +# Autogenerated input type of EnableSecondFactor +input EnableSecondFactorInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + code: String! + password: String + secondFactorID: ID! +} + +# Autogenerated return type of EnableSecondFactor +type EnableSecondFactorPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + recoveryCodes: [String!] + secondFactorOrErrors: SecondFactorOrErrorsUnion! +} + +input EndSaleInput { + clientMutationId: String + saleID: String +} + +type EndSalePayload { + clientMutationId: String + sale: Sale +} + +interface EntityWithFilterArtworksConnectionInterface { + filterArtworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + + # A globally unique ID. + id: ID! +} + +# A user-readable error +type Error { + # Error code + code: String! + + # Extra data about error. + data: JSON + + # A description of the error + message: String! + + # Which input value this error came from + path: [String!] +} + +# A user-readable list of errors +type Errors { + # List of Errors. + errors: [Error!]! +} + +enum EventStatus { + # End date is in the past + CLOSED + + # End date is in near future + CLOSING_SOON + + # Start date or end date is in the future + CURRENT + + # Start date is in the past and end date is in the future + RUNNING + + # Special filtering option which is used to show running and upcoming shows + RUNNING_AND_UPCOMING + + # Start date is in the future + UPCOMING +} + +type ExternalPartner { + city: String + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + name: String +} + +type Fair implements EntityWithFilterArtworksConnectionInterface & Node { + about(format: Format): String + activeStartAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + articlesConnection( + after: String + before: String + first: Int + last: Int + sort: ArticleSorts + ): ArticleConnection + artistsConnection( + after: String + before: String + first: Int + last: Int + + # Sorts for artists in a fair + sort: FairArtistSorts + ): ArtistConnection + bannerSize: String + cached: Int + contact(format: Format): String + counts: FairCounts + endAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # A formatted description of the start to end dates + exhibitionPeriod: String + + # The exhibitors with booths in this fair with letter. + exhibitorsGroupedByName: [FairExhibitorsGroup] + + # Artworks Elastic Search results + filterArtworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + followedContent: FollowedContent + + # A formatted description of when the fair starts or closes or if it is closed + formattedOpeningHours: String + hasFullFeature: Boolean + hasHomepageSection: Boolean + hasLargeBanner: Boolean + hasListing: Boolean + hours(format: Format): String + href: String + + # A globally unique ID. + id: ID! + image: Image + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Are we currently in the fair's active period? + isActive: Boolean + isPublished: Boolean + kawsCollectionSlugs: [String]! + links(format: Format): String + location: Location + marketingCollections(size: Int): [MarketingCollection]! + mobileImage: Image + name: String + organizer: organizer + profile: Profile + + # This connection only supports forward pagination. We're replacing Relay's default cursor with one from Gravity. + showsConnection( + after: String + before: String + first: Int + last: Int + + # Number of artworks to return + section: String + + # Sorts for shows in a fair + sort: ShowSorts + totalCount: Boolean = false + ): ShowConnection + + # A slug ID. + slug: ID! + sponsoredContent: FairSponsoredContent + startAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + summary(format: Format): String + tagline: String + tickets(format: Format): String + ticketsLink: String +} + +enum FairArtistSorts { + NAME_ASC + NAME_DESC +} + +# A connection to a list of items. +type FairConnection { + # A list of edges. + edges: [FairEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +type FairCounts { + artists( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + artworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + partners( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + partnerShows( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +# An edge in a connection. +type FairEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Fair +} + +type FairExhibitor { + # Exhibitor name + name: String + + # Exhibitors _id + partnerID: String + + # Partner default profile id + profileID: String + + # A slug ID. + slug: ID! +} + +type FairExhibitorsGroup { + # The exhibitor data. + exhibitors: [FairExhibitor] + + # Letter exhibitors group belongs to + letter: String +} + +enum FairSorts { + CREATED_AT_ASC + CREATED_AT_DESC + NAME_ASC + NAME_DESC + START_AT_ASC + START_AT_DESC +} + +type FairSponsoredContent { + activationText: String + pressReleaseUrl: String +} + +# A Feature +type Feature { + callout(format: Format): String + description(format: Format): String + + # A globally unique ID. + id: ID! + image: Image + + # A type-specific ID likely used as a database ID. + internalID: ID! + isActive: Boolean! + layout: FeatureLayouts! + meta: FeatureMeta! + name: String! + + # Features are composed of sets, which are themselves composed of items of various types + setsConnection( + after: String + before: String + first: Int + last: Int + sort: OrderedSetSorts + ): OrderedSetConnection + + # A slug ID. + slug: ID! + subheadline(format: Format): String +} + +# An illustrated link chosen to highlight a Gene from a given GeneFamily +type FeaturedGeneLink { + href: String! + image: Image + internalID: String! + title: String! +} + +type FeaturedLink { + description(format: Format): String + href: String + + # A globally unique ID. + id: ID! + image: Image + initials(length: Int = 3): String + + # A type-specific ID likely used as a database ID. + internalID: String + subtitle(format: Format): String + title: String +} + +enum FeatureLayouts { + DEFAULT + FULL +} + +# Meta-tag related fields for Features +type FeatureMeta { + description: String! + image: String + name: String! +} + +type Feedback { + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Feedback message + message: String! +} + +# A connection to a list of items. +type FilterArtworksConnection implements ArtworkConnectionInterface & Node { + # Returns aggregation counts for the given filter query. + aggregations: [ArtworksAggregationResults] + counts: FilterArtworksCounts + + # A list of edges. + edges: [FilterArtworksEdge] + facet: ArtworkFilterFacet + + # Artwork results. + hits: [Artwork] + @deprecated(reason: "Prefer to use `edges`. [Will be removed in v2]") + + # The ID of the object. + id: ID! + + # Returns a list of merchandisable artists sorted by merch score. + merchandisableArtists( + # The number of artists to return + size: Int = 12 + ): [Artist] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +type FilterArtworksCounts { + followedArtists( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + total( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +# An edge in a connection. +type FilterArtworksEdge implements ArtworkEdgeInterface { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Artwork +} + +type FilterSaleArtworksCounts { + followedArtists( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + total( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +type FollowArtist { + artist: Artist + auto: Boolean + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! +} + +# A connection to a list of items. +type FollowArtistConnection { + # A list of edges. + edges: [FollowArtistEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +type FollowArtistCounts { + artists: Int +} + +# An edge in a connection. +type FollowArtistEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: FollowArtist +} + +input FollowArtistInput { + artistID: String! + clientMutationId: String + unfollow: Boolean = false +} + +type FollowArtistPayload { + artist: Artist + clientMutationId: String + + # Popular artists + popularArtists( + # Exclude these ids from results, may result in all artists being excluded. + excludeArtistIDs: [String] + + # If true, will exclude followed artists for the user + excludeFollowedArtists: Boolean + + # Number of results to return + size: Int + ): [Artist] +} + +type FollowArtists { + artists: [Artist] + counts: FollowArtistCounts +} + +type FollowedArtistsArtworksGroup implements Node { + artists: String + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + href: String + + # A globally unique ID. + id: ID! + image: Image + publishedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + summary: String +} + +# A connection to a list of items. +type FollowedArtistsArtworksGroupConnection { + # A list of edges. + edges: [FollowedArtistsArtworksGroupEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type FollowedArtistsArtworksGroupEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: FollowedArtistsArtworksGroup +} + +type FollowedContent { + artists: [Artist] + galleries: [Partner] +} + +# A connection to a list of items. +type FollowedFairConnection { + # A list of edges. + edges: [FollowedFairEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type FollowedFairEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Fair +} + +# A connection to a list of items. +type FollowedGalleryConnection { + # A list of edges. + edges: [FollowedGalleryEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type FollowedGalleryEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Partner +} + +# A connection to a list of items. +type FollowedShowConnection { + # A list of edges. + edges: [FollowedShowEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type FollowedShowEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Show +} + +type FollowGene { + gene: Gene + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! +} + +# A connection to a list of items. +type FollowGeneConnection { + # A list of edges. + edges: [FollowGeneEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type FollowGeneEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: FollowGene +} + +input FollowGeneInput { + clientMutationId: String + geneID: String +} + +type FollowGenePayload { + clientMutationId: String + gene: Gene +} + +input FollowProfileInput { + clientMutationId: String + profileID: String + unfollow: Boolean = false +} + +type FollowProfilePayload { + clientMutationId: String + profile: Profile +} + +type FollowsAndSaves { + # A Connection of followed artists by current user + artistsConnection( + after: String + before: String + fairID: String + first: Int + last: Int + ): FollowArtistConnection + artworksConnection( + after: String + before: String + first: Int + last: Int + private: Boolean = false + sort: CollectionSorts + ): SavedArtworksConnection + + # A list of published artworks by followed artists (grouped by date and artists). + bundledArtworksByArtistConnection( + after: String + before: String + first: Int + forSale: Boolean + last: Int + sort: ArtworkSorts + ): FollowedArtistsArtworksGroupConnection + + # A list of the current user’s currently followed fair profiles + fairsConnection( + after: String + before: String + first: Int + last: Int + ): FollowedFairConnection + + # A list of the current user’s currently followed gallery profiles + galleriesConnection( + after: String + before: String + first: Int + last: Int + ): FollowedGalleryConnection + + # A list of the current user’s inquiry requests + genesConnection( + after: String + before: String + first: Int + last: Int + ): FollowGeneConnection + + # A list of the current user’s currently followed shows + showsConnection( + after: String + before: String + + # A string representing one of the supported cities in the City Guide, which + # are: new-york-ny-usa, los-angeles-ca-usa, london-united-kingdom, + # berlin-germany, paris-france, hong-kong-hong-kong + city: String + + # Number of days which will be used to filter upcoming and closing soon shows + dayThreshold: Int + first: Int + last: Int + status: EventStatus + ): FollowedShowConnection +} + +input FollowShowInput { + clientMutationId: String + partnerShowID: String + unfollow: Boolean = false +} + +type FollowShowPayload { + clientMutationId: String + show: Show +} + +enum Format { + HTML + MARKDOWN + PLAIN +} + +type FormattedDaySchedules { + days: String + hours: String +} + +# The `FormattedNumber` type represents a number that can optionally be returnedas +# a formatted String. It does not try to coerce the type. +scalar FormattedNumber + +# An entry from gemini +type GeminiEntry { + # The token that represents the gemini entry. + token: String! +} + +type Gene implements Node & Searchable { + artistsConnection( + after: String + before: String + first: Int + last: Int + ): ArtistConnection + cached: Int + description: String + displayLabel: String + displayName: String + + # Artworks Elastic Search results + filterArtworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + href: String + + # A globally unique ID. + id: ID! + image: Image + imageUrl: String + + # A type-specific ID likely used as a database ID. + internalID: ID! + isFollowed: Boolean + isPublished: Boolean + mode: String + name: String + + # A list of genes similar to the specified gene + similar( + after: String + before: String + + # Array of gene ids (not slugs) to exclude, may result in all genes being excluded. + excludeGeneIDs: [String] + first: Int + last: Int + ): GeneConnection + + # A slug ID. + slug: ID! + trendingArtists(sample: Int): [Artist] +} + +# A connection to a list of items. +type GeneConnection { + # A list of edges. + edges: [GeneEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type GeneEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Gene +} + +# A user-facing thematic grouping of Genes +type GeneFamily { + featuredGeneLinks: [FeaturedGeneLink] + genes: [Gene] + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + name: String! + + # A slug ID. + slug: ID! +} + +# A connection to a list of items. +type GeneFamilyConnection { + # A list of edges. + edges: [GeneFamilyEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type GeneFamilyEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: GeneFamily +} + +type GravityMutationError { + detail: String + error: String + message: String + type: String +} + +type HighestBid { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + cents: Int + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + display: String + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + isCancelled: Boolean + number: Int +} + +type Highlights { + # List of curated genes that are broad collecting. (Meant for e.g. suggestions in on-boarding.) + broadCollectingGenes: [Gene] + + # Popular artists + popularArtists( + # Exclude these ids from results, may result in all artists being excluded. + excludeArtistIDs: [String] + + # If true, will exclude followed artists for the user + excludeFollowedArtists: Boolean + + # Number of results to return + size: Int + ): [Artist] +} + +# Autogenerated input type of HoldInventory +input HoldInventoryInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + expiresInSeconds: Int + items: [InventoryHoldItemAttributes!]! + + # Globally unique ID for the requester of this hold. Ex. Exchange Order ID. + referenceId: String! +} + +# Autogenerated return type of HoldInventory +type HoldInventoryPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + holdOrErrors: InventoryHoldOrErrorsUnion! +} + +type HomePage { + # Single artist module to show on the home screen. + artistModule( + # Module identifier. + key: HomePageArtistModuleTypes + ): HomePageArtistModule + + # Artist modules to show on the home screen + artistModules: [HomePageArtistModule] + + # Single artwork module to show on the home screen + artworkModule( + # ID of followed artist to target for related artist rails + followedArtistID: String + + # ID of generic gene rail to target + id: String + + # Module key + key: String + + # ID of related artist to target for related artist rails + relatedArtistID: String + ): HomePageArtworkModule + + # Artwork modules to show on the home screen + artworkModules( + # Exclude certain modules + exclude: [HomePageArtworkModuleTypes] = [] + + # Maximum number of followed genes to return, disable with a negative number + maxFollowedGeneRails: Int = 1 + + # Maximum number of modules to return, disable limit with a negative number + maxRails: Int = 8 + + # The preferred order of modules, defaults to order returned by Gravity + order: [HomePageArtworkModuleTypes] + ): [HomePageArtworkModule] + fairsModule: HomePageFairsModule + + # A list of enabled hero units to show on the requested platform + heroUnits(platform: HomePageHeroUnitPlatform!): [HomePageHeroUnit] + marketingCollectionsModule: HomePageMarketingCollectionsModule + salesModule: HomePageSalesModule +} + +type HomePageArtistModule implements Node { + # A globally unique ID. + id: ID! + + # Module identifier. + key: String + results: [Artist] +} + +enum HomePageArtistModuleTypes { + # The most searched for artists. + POPULAR + + # Artists recommended for the specific user. + SUGGESTED + + # The trending artists. + TRENDING +} + +type HomePageArtworkModule implements Node { + context: HomePageArtworkModuleContext + + # A globally unique ID. + id: ID! + isDisplayable: Boolean + key: String + params: HomePageModulesParams + results: [Artwork] + title: String +} + +union HomePageArtworkModuleContext = + Fair + | FollowArtists + | Gene + | HomePageFollowedArtistArtworkModule + | HomePageRelatedArtistArtworkModule + | Sale + | TrendingArtists + +enum HomePageArtworkModuleTypes { + ACTIVE_BIDS + CURRENT_FAIRS + FOLLOWED_ARTIST + FOLLOWED_ARTISTS + FOLLOWED_GALLERIES + FOLLOWED_GENES + GENERIC_GENES + LIVE_AUCTIONS + POPULAR_ARTISTS + RECENTLY_VIEWED_WORKS + RECOMMENDED_WORKS + RELATED_ARTISTS + SAVED_WORKS + SIMILAR_TO_RECENTLY_VIEWED + SIMILAR_TO_SAVED_WORKS +} + +type HomePageFairsModule { + results: [Fair]! +} + +type HomePageFollowedArtistArtworkModule { + artist: Artist +} + +type HomePageHeroUnit { + # The image to show, on desktop this defaults to the wide version. + backgroundImageURL(version: HomePageHeroUnitImageVersion): String + cached: Int + creditLine: String + heading: String + href: String + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + linkText: String + mode: HomePageHeroUnitMode + + # A slug ID. + slug: ID! + subtitle: String + title: String + titleImageURL(retina: Boolean): String +} + +enum HomePageHeroUnitImageVersion { + NARROW + WIDE +} + +enum HomePageHeroUnitMode { + CENTERED_DARK + CENTERED_LIGHT + LEFT_DARK + LEFT_LIGHT + RIGHT_DARK + RIGHT_LIGHT +} + +enum HomePageHeroUnitPlatform { + DESKTOP + MARTSY + MOBILE +} + +type HomePageMarketingCollectionsModule { + results: [MarketingCollection]! +} + +type HomePageModulesParams { + followedArtistID: ID + geneID: String + + # An optional type-specific ID. + internalID: ID + medium: String + priceRange: String + relatedArtistID: ID +} + +type HomePageRelatedArtistArtworkModule { + artist: Artist + basedOn: Artist +} + +type HomePageSalesModule { + results: [Sale]! +} + +type IdentityVerification { + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + invitationExpiresAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # Where the identity verification is in its lifecycle + state: String! + + # User ID of the identity verification's owner + userID: String! +} + +type Image { + aspectRatio: Float! + caption: String + cropped(height: Int!, version: [String], width: Int!): CroppedImageUrl + deepZoom: DeepZoom + height: Int + href: String + imageURL: String + imageVersions: [String] + + # An optional type-specific ID. + internalID: ID + isDefault: Boolean + isZoomable: Boolean + maxTiledHeight: Int + maxTiledWidth: Int + orientation: String + originalHeight: Int + originalWidth: Int + + # Value to use when `padding-bottom` for fluid image placeholders + placeholder: String + position: Int + resized(height: Int, version: [String], width: Int): ResizedImageUrl + tileBaseURL: String + tileFormat: String + tileSize: Int + title: String + url(version: [String]): String + versions: [String] + width: Int +} + +type ImageURLs { + normalized: String +} + +union InquiryItemType = Artwork | Show + +type InquiryQuestion { + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + question: String! +} + +input InquiryQuestionInput { + details: String + questionID: String! +} + +# A request to inquire on an artwork +type InquiryRequest { + # A globally unique ID. + id: ID! + inquireable: InquiryItemType + inquirer: User + + # A type-specific ID likely used as a database ID. + internalID: ID! + questions: [String] + shippingLocation: Location +} + +enum Intents { + BUY_ART_AND_DESIGN + FIND_ART_EXHIBITS + LEARN_ABOUT_ART + READ_ART_MARKET_NEWS + RESEARCH_ART_PRICES + SELL_ART_AND_DESIGN +} + +type InventoryHold { + capturedAt: String + id: ID! + items( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + ): InventoryHoldItemConnection + referenceId: String! +} + +type InventoryHoldItem { + artworkId: String! + editionSetId: String + id: ID! + quantity: Int! +} + +# Attributes for creating or updating an inventory hold item +input InventoryHoldItemAttributes { + # ID of the artwork + artworkId: String! + + # ID of edition set + editionSetId: String + quantity: Int! +} + +# The connection type for InventoryHoldItem. +type InventoryHoldItemConnection { + # A list of edges. + edges: [InventoryHoldItemEdge] + + # A list of nodes. + nodes: [InventoryHoldItem] + + # Information to aid in pagination. + pageInfo: PageInfo! + + # Total count of matching nodes, before pagination + totalCount: Int! +} + +# An edge in a connection. +type InventoryHoldItemEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: InventoryHoldItem +} + +# A hold or error object +union InventoryHoldOrErrorsUnion = Errors | InventoryHold + +# A hold or error object +union InventoryHoldOrErrorUnion = Error | InventoryHold + +# Fields of an invoice (currently from Lewitt) +type Invoice implements Node { + # A globally unique ID. + id: ID! + @deprecated( + reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]" + ) + + # A type-specific ID likely used as a database ID. + internalID: ID! + @deprecated( + reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]" + ) + + # Lewitt's invoice id. + lewittInvoiceID: String! + @deprecated( + reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]" + ) + + # Link to public checkout page. + paymentURL: String + @deprecated( + reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]" + ) + + # Current state of invoice. + state: InvoiceState + @deprecated( + reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]" + ) + + # A formatted price with various currency formatting options. + total( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + @deprecated( + reason: "Payment Request was deprecated. The type was kept for legacy client support. [Will be removed in v2]" + ) +} + +enum InvoiceState { + PAID + REFUNDED + UNPAID + VOID +} + +# An ISO 8601-encoded datetime +scalar ISO8601DateTime + +# Represents untyped JSON +scalar JSON + +type LatLng { + lat: Float + lng: Float +} + +union ListPrice = Money | PriceRange + +type Location { + address: String + address2: String + cached: Int + city: String + coordinates: LatLng + country: String + daySchedules: [DaySchedule] + + # Alternate Markdown-supporting free text representation of a location's opening hours + dayScheduleText: String + display: String + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + + # Union returning opening hours in formatted structure or a string + openingHours: OpeningHoursUnion + phone: String + postalCode: String + state: String + summary: String +} + +# A connection to a list of items. +type LocationConnection { + # A list of edges. + edges: [LocationEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type LocationEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Location +} + +scalar Long + +type LotStanding { + # Your bid if it is currently winning + activeBid: BidderPosition + bidder: Bidder + + # You are winning and reserve is met + isHighestBidder: Boolean + + # You are the leading bidder without regard to reserve + isLeadingBidder: Boolean + + # Your most recent bid—which is not necessarily winning (may be higher or lower) + mostRecentBid: BidderPosition + sale: Sale + saleArtwork: SaleArtwork +} + +# Object representing a collection page +type MarketingCollection { + artworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + marketable: Boolean + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + + # Category of the collection + category: String! + createdAt: MarketingDateTime! + + # Image credit for the header image + credit: String + + # Description of the collection which can include links to other collections + description: String + + # Markdown alternate of description field contents. + descriptionMarkdown: String + + # IDs of artists that should be excluded from Featured Artists for this collection + featuredArtistExclusionIds: [String!] + + # Background image for the header of the collection page + headerImage: String + id: ID! + internalID: ID! + + # Collection has prioritized connection to artist + is_featured_artist_content: Boolean! + @deprecated(reason: "Prefer isFeaturedArtistContent") + isDepartment: Boolean! + + # Collection has prioritized connection to artist + isFeaturedArtistContent: Boolean! + + # Set of keywords used for SEO purposes + keywords: String! + + # CollectionGroups of this collection + linkedCollections: [MarketingCollectionGroup!]! + + # Suggested average price for included works + price_guidance: Float @deprecated(reason: "Prefer priceGuidance") + + # Suggested average price for included works + priceGuidance: Float + + # Structured object used to build filtered artworks query + query: MarketingCollectionQuery! + relatedCollections(size: Int = 10): [MarketingCollection!]! + + # Collection can be surfaced on editorial pages + show_on_editorial: Boolean! @deprecated(reason: "Prefer showOnEditorial") + + # Collection can be surfaced on editorial pages + showOnEditorial: Boolean! + + # slug version of title, used for pretty URLs (e.g. `kaws-prints` for Kaws Prints + slug: String! + + # URL for Thumbnail image to be used when this collection is displayed. + thumbnail: String + + # Name of the collection + title: String! + updatedAt: MarketingDateTime! +} + +type MarketingCollectionCategory { + collections: [MarketingCollection!]! + name: String! +} + +type MarketingCollectionGroup { + groupType: MarketingGroupTypes! + internalID: ID + members: [MarketingCollection!]! + name: String! +} + +type MarketingCollectionQuery { + acquireable: Boolean + aggregations: [String!] + artist_id: String @deprecated(reason: "Prefer artistID") + artist_ids: [String!] @deprecated(reason: "Prefer artistIDs") + artistID: String + artistIDs: [String!] + at_auction: Boolean @deprecated(reason: "Prefer atAuction") + atAuction: Boolean + color: String + dimension_range: String @deprecated(reason: "Prefer dimensionRange") + dimensionRange: String + extra_aggregation_gene_ids: [String!] + @deprecated(reason: "prefer extraAggregationGeneIDs") + extraAggregationGeneIDs: [String!] + for_sale: Boolean @deprecated(reason: "Prefer forSale") + forSale: Boolean + gene_id: String @deprecated(reason: "Prefer geneID") + gene_ids: [String!] @deprecated(reason: "Prefer geneIDs") + geneID: String + geneIDs: [String!] + height: String + id: ID + include_artworks_by_followed_artists: Boolean + @deprecated(reason: "Prefer includeArtworksByFollowedArtists") + include_medium_filter_in_aggregation: Boolean + @deprecated(reason: "Prefer includeMediumFilterInAggregation") + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireable_only: Boolean @deprecated(reason: "Prefer inquireableOnly") + inquireableOnly: Boolean + internalID: ID + keyword: String + major_periods: [String!] @deprecated(reason: "Prefer majorPeriods") + majorPeriods: [String!] + medium: String + page: Int + partner_cities: [String!] @deprecated(reason: "Prefer partnerCities") + partner_id: ID @deprecated(reason: "Prefer partnerID") + partnerCities: [String!] + partnerID: ID + period: String + periods: [String!] + price_range: String @deprecated(reason: "Prefer priceRange") + priceRange: String + sale_id: ID @deprecated(reason: "Prefer saleID") + saleID: ID + size: Int + sort: String + tag_id: String @deprecated(reason: "Prefer tagID") + tagID: String + width: String +} + +scalar MarketingDateTime + +# Available types of CollectionGroup +enum MarketingGroupTypes { + ArtistSeries + FeaturedCollections + OtherCollections +} + +# Market Price Insights +type MarketPriceInsights { + annualLotsSold: Int + annualValueSoldCents: BigInt + artistId: ID + artistName: String + artsyQInventory: Int + createdAt: ISO8601DateTime + demandRank: Float + demandTrend: Float + highRangeCents: BigInt + largeHighRangeCents: BigInt + largeLowRangeCents: BigInt + largeMidRangeCents: BigInt + liquidityRank: Float + lowRangeCents: BigInt + medianSaleToEstimateRatio: Float + medium: String + mediumHighRangeCents: BigInt + mediumLowRangeCents: BigInt + mediumMidRangeCents: BigInt + midRangeCents: BigInt + sellThroughRate: Float + smallHighRangeCents: BigInt + smallLowRangeCents: BigInt + smallMidRangeCents: BigInt + updatedAt: ISO8601DateTime +} + +type Me implements Node { + # A list of the current user’s inquiry requests + artworkInquiriesConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkInquiryConnection + auctionsLotStandingConnection( + after: String + before: String + first: Int + last: Int + ): AuctionsLotStandingConnection! + + # Returns a single bidder position + bidderPosition(id: String!): BidderPositionResult + + # A list of the current user's bidder positions + bidderPositions( + # Only the bidder positions on a specific artwork + artworkID: String + + # Only the most recent bidder positions per artwork. + current: Boolean + + # Only the bidder positions for a specific auction + saleID: String + ): [BidderPosition] + + # A list of the current user’s bidder registrations + bidders( + # Limit results to bidders in active auctions + active: Boolean + + # The slug or ID of a Sale + saleID: String + ): [Bidder] + + # The current user's status relating to bids on artworks + bidderStatus(artworkID: String!, saleID: String!): LotStanding + + # Whether user is allowed to request email confirmation + canRequestEmailConfirmation: Boolean! + + # A collector profile. + collectorProfile: CollectorProfileType + + # A conversation, usually between a user and a partner + conversation( + # The ID of the Conversation + id: String! + ): Conversation + + # Conversations, usually between a user and partner. + conversationsConnection( + after: String + before: String + first: Int + last: Int + ): ConversationConnection + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # A list of the current user’s credit cards + creditCards( + after: String + before: String + first: Int + last: Int + ): CreditCardConnection + email: String + followsAndSaves: FollowsAndSaves + hasCreditCards: Boolean + hasPassword: Boolean! + hasQualifiedCreditCards: Boolean + hasSecondFactorEnabled: Boolean! + + # A globally unique ID. + id: ID! + + # An identity verification that the user has access to + identityVerification( + # ID of the IdentityVerification + id: String! + ): IdentityVerification + identityVerified: Boolean + initials(length: Int = 3): String + + # A type-specific ID. + internalID: ID! + + # An invoice + invoice( + # The ID of the Conversation + conversationId: String! + + # The ID of the invoice + invoiceId: String! + ): Invoice + @deprecated( + reason: "Payment Request was deprecated. The field was kept for legacy client support. [Will be removed in v2]" + ) + + # List of lab features for this user + labFeatures: [String!]! + + # Sale Artworks search results + lotsByFollowedArtistsConnection( + after: String + + # Please make sure to supply the TOTAL aggregation if you will be setting any aggregations + aggregations: [SaleArtworkAggregation] + artistIDs: [String] + before: String + estimateRange: String + first: Int + geneIDs: [String] + + # When called under the Me field, this defaults to true. Otherwise it defaults to false + includeArtworksByFollowedArtists: Boolean + isAuction: Boolean + last: Int + liveSale: Boolean + page: Int + saleID: ID + size: Int + sort: String + ): SaleArtworksConnection + + # The current user's status relating to bids on artworks + lotStanding( + artworkID: String + saleArtworkID: String + saleID: String + ): LotStanding + + # A list of the current user's auction standings for given lots + lotStandings( + # Only includes lots on which you have a leading bidder position. + activePositions: Boolean + + # Only the lot standings on a specific artwork + artworkID: String + + # Only the lot standings for currently open or closed auctions. + live: Boolean + saleArtworkID: String + + # Only the lot standings for a specific auction + saleID: String + ): [LotStanding] + myCollectionConnection( + after: String + before: String + first: Int + last: Int + sort: MyCollectionArtworkSorts + ): MyCollectionConnection + name: String + orders( + after: String + before: String + first: Int + last: Int + mode: CommerceOrderModeEnum + sellerId: String + sort: CommerceOrderConnectionSortEnum + states: [CommerceOrderStateEnum!] + ): CommerceOrderConnectionWithTotalCount + paddleNumber: String + + # The user's most current pending identity verification, if it exists + pendingIdentityVerification: IdentityVerification + phone: String + + # This user should receive lot opening notifications + receiveLotOpeningSoonNotification: Boolean + + # This user should receive new sales notifications + receiveNewSalesNotification: Boolean + + # This user should receive new works notifications + receiveNewWorksNotification: Boolean + + # This user should receive outbid notifications + receiveOutbidNotification: Boolean + + # This user should receive promotional notifications + receivePromotionNotification: Boolean + + # This user should receive purchase notifications + receivePurchaseNotification: Boolean + + # This user should receive sale opening/closing notifications + receiveSaleOpeningClosingNotification: Boolean + recentlyViewedArtworkIds: [String]! + + # A list of the current user’s recently viewed artworks. + recentlyViewedArtworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + secondFactors(kinds: [SecondFactorKind]): [SecondFactor] + type: String + + # The count of conversations with unread messages. + unreadConversationCount: Int! + + # A count of unread notifications. + unreadNotificationsCount: Int! +} + +# A message in a conversation. +type Message implements Node { + attachments: [Attachment] + + # Unaltered text if possible, otherwise `body`: a parsed/sanitized version from Sendgrid. + body: String + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + deliveries: [Delivery] + from: MessageInitiator + + # A globally unique ID. + id: ID! + + # Impulse message id. + impulseID: String! @deprecated(reason: "Prefer internalID") + + # A type-specific ID likely used as a database ID. + internalID: ID! + invoice: Invoice + @deprecated( + reason: "Payment Request was deprecated. The field was kept for legacy client support. [Will be removed in v2]" + ) + + # True if message is the first in the conversation. + isFirstMessage: Boolean + + # True if message is from the user to the partner. + isFromUser: Boolean + + # True if message is an invoice message + isInvoice: Boolean + @deprecated( + reason: "Payment Request was deprecated. The field was kept for legacy client support. [Will be removed in v2]" + ) +} + +# A connection to a list of items. +type MessageConnection { + # A list of edges. + edges: [MessageEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type MessageEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Message +} + +# The participant who sent the message. +type MessageInitiator { + email: String + name: String +} + +type MetaphysicsService { + environment: String! + heapDumps: Boolean! + queryTracing: Boolean! + stitching: Boolean! + stitchingConvection: Boolean! + stitchingExchange: Boolean! + stitchingGravity: Boolean! + stitchingKaws: Boolean! +} + +type Money { + # The ISO-4217 alphabetic currency code, as per https://en.wikipedia.org/wiki/ISO_4217 + currencyCode: String! + + # A pre-formatted price. + display: String + + # An amount of money expressed in major units (like dollars). + major( + # ISO-4217 code of a destination currency for conversion + convertTo: String + ): Float! + + # An amount of money expressed in minor units (like cents). + minor: Int! +} + +# A money object with amount in minor currency and a currency code, or an error object +union MoneyOrErrorUnion = Error + +type Mutation { + addAssetToConsignmentSubmission( + input: AddAssetToConsignmentSubmissionInput! + ): AddAssetToConsignmentSubmissionPayload + captureHold(input: CaptureHoldInput!): CaptureHoldPayload + commerceAddInitialOfferToOrder( + input: CommerceAddInitialOfferToOrderInput! + ): CommerceAddInitialOfferToOrderPayload + commerceApproveOrder( + input: CommerceApproveOrderInput! + ): CommerceApproveOrderPayload + commerceBuyerAcceptOffer( + input: CommerceBuyerAcceptOfferInput! + ): CommerceBuyerAcceptOfferPayload + commerceBuyerCounterOffer( + input: CommerceBuyerCounterOfferInput! + ): CommerceBuyerCounterOfferPayload + commerceBuyerRejectOffer( + input: CommerceBuyerRejectOfferInput! + ): CommerceBuyerRejectOfferPayload + commerceConfirmFulfillment( + input: CommerceConfirmFulfillmentInput! + ): CommerceConfirmFulfillmentPayload + commerceConfirmPickup( + input: CommerceConfirmPickupInput! + ): CommerceConfirmPickupPayload + commerceCreateOfferOrderWithArtwork( + input: CommerceCreateOfferOrderWithArtworkInput! + ): CommerceCreateOfferOrderWithArtworkPayload + commerceCreateOrderWithArtwork( + input: CommerceCreateOrderWithArtworkInput! + ): CommerceCreateOrderWithArtworkPayload + commerceFixFailedPayment( + input: CommerceFixFailedPaymentInput! + ): CommerceFixFailedPaymentPayload + + # Fulfill an order with one Fulfillment, it sets this fulfillment to each line item in order + commerceFulfillAtOnce( + input: CommerceFulfillAtOnceInput! + ): CommerceFulfillAtOncePayload + commerceRejectOrder( + input: CommerceRejectOrderInput! + ): CommerceRejectOrderPayload + commerceSellerAcceptOffer( + input: CommerceSellerAcceptOfferInput! + ): CommerceSellerAcceptOfferPayload + commerceSellerCounterOffer( + input: CommerceSellerCounterOfferInput! + ): CommerceSellerCounterOfferPayload + commerceSellerRejectOffer( + input: CommerceSellerRejectOfferInput! + ): CommerceSellerRejectOfferPayload + commerceSetPayment(input: CommerceSetPaymentInput!): CommerceSetPaymentPayload + commerceSetShipping( + input: CommerceSetShippingInput! + ): CommerceSetShippingPayload + commerceSubmitOrder( + input: CommerceSubmitOrderInput! + ): CommerceSubmitOrderPayload + commerceSubmitOrderWithOffer( + input: CommerceSubmitOrderWithOfferInput! + ): CommerceSubmitOrderWithOfferPayload + commerceSubmitPendingOffer( + input: CommerceSubmitPendingOfferInput! + ): CommerceSubmitPendingOfferPayload + confirmPassword(input: ConfirmPasswordInput!): ConfirmPasswordPayload + + # Create an account request + createAccountRequest( + input: CreateAccountRequestMutationInput! + ): CreateAccountRequestMutationPayload + createAppSecondFactor( + input: CreateAppSecondFactorInput! + ): CreateAppSecondFactorPayload + createBackupSecondFactors( + input: CreateBackupSecondFactorsInput! + ): CreateBackupSecondFactorsPayload + + # Create a bidder + createBidder(input: CreateBidderInput!): CreateBidderPayload + + # Creates a bidder position + createBidderPosition(input: BidderPositionInput!): BidderPositionPayload + createConsignmentOffer( + input: CreateOfferMutationInput! + ): CreateOfferMutationPayload + createConsignmentSubmission( + input: CreateSubmissionMutationInput! + ): CreateSubmissionMutationPayload + + # Create a credit card + createCreditCard(input: CreditCardInput!): CreditCardPayload + + # Attach an gemini asset to a consignment submission + createGeminiEntryForAsset( + input: CreateGeminiEntryForAssetInput! + ): CreateGeminiEntryForAssetPayload + createImage(input: CreateImageInput!): CreateImagePayload + createSmsSecondFactor( + input: CreateSmsSecondFactorInput! + ): CreateSmsSecondFactorPayload + createViewingRoom(input: CreateViewingRoomInput!): CreateViewingRoomPayload + + # Remove a credit card + deleteCreditCard(input: DeleteCreditCardInput!): DeleteCreditCardPayload + deleteViewingRoom(input: DeleteViewingRoomInput!): DeleteViewingRoomPayload + deliverSecondFactor( + input: DeliverSecondFactorInput! + ): DeliverSecondFactorPayload + disableSecondFactor( + input: DisableSecondFactorInput! + ): DisableSecondFactorPayload + enableSecondFactor(input: EnableSecondFactorInput!): EnableSecondFactorPayload + + # Mark sale as ended. + endSale(input: EndSaleInput!): EndSalePayload + + # Follow (or unfollow) an artist + followArtist(input: FollowArtistInput!): FollowArtistPayload + + # Follow (or unfollow) an gene + followGene(input: FollowGeneInput!): FollowGenePayload + + # Follow (or unfollow) a profile + followProfile(input: FollowProfileInput!): FollowProfilePayload + + # Follow (or unfollow) a show + followShow(input: FollowShowInput!): FollowShowPayload + holdInventory(input: HoldInventoryInput!): HoldInventoryPayload + + # Create an artwork in my collection + myCollectionCreateArtwork( + input: MyCollectionCreateArtworkInput! + ): MyCollectionCreateArtworkPayload + + # Deletes an artwork from my collection + myCollectionDeleteArtwork( + input: MyCollectionDeleteArtworkInput! + ): MyCollectionDeleteArtworkPayload + + # Update an artwork in my collection + myCollectionUpdateArtwork( + input: MyCollectionUpdateArtworkInput! + ): MyCollectionUpdateArtworkPayload + publishViewingRoom(input: PublishViewingRoomInput!): PublishViewingRoomPayload + recordArtworkView(input: RecordArtworkViewInput!): RecordArtworkViewPayload + requestConditionReport( + input: RequestConditionReportInput! + ): RequestConditionReportPayload + + # Attach an gemini asset to a consignment submission + requestCredentialsForAssetUpload( + input: RequestCredentialsForAssetUploadInput! + ): RequestCredentialsForAssetUploadPayload + + # Save (or remove) an artwork to (from) a users default collection. + saveArtwork(input: SaveArtworkInput!): SaveArtworkPayload + + # Send a confirmation email + sendConfirmationEmail( + input: SendConfirmationEmailMutationInput! + ): SendConfirmationEmailMutationPayload + + # Appending a message to a conversation thread + sendConversationMessage( + input: SendConversationMessageMutationInput! + ): SendConversationMessageMutationPayload + + # Send a feedback message + sendFeedback(input: SendFeedbackMutationInput!): SendFeedbackMutationPayload + + # Start an identity verification flow for a pending identity verification + startIdentityVerification( + input: startIdentityVerificationMutationInput! + ): startIdentityVerificationMutationPayload + + # Create an artwork inquiry request + submitInquiryRequestMutation( + input: SubmitInquiryRequestMutationInput! + ): SubmitInquiryRequestMutationPayload + unpublishViewingRoom( + input: UnpublishViewingRoomInput! + ): UnpublishViewingRoomPayload + updateAppSecondFactor( + input: UpdateAppSecondFactorInput! + ): UpdateAppSecondFactorPayload + + # Updating a collector profile (loyalty applicant status). + updateCollectorProfile( + input: UpdateCollectorProfileInput! + ): UpdateCollectorProfilePayload + updateConsignmentSubmission( + input: UpdateSubmissionMutationInput! + ): UpdateSubmissionMutationPayload + + # Update a conversation. + updateConversation( + input: UpdateConversationMutationInput! + ): UpdateConversationMutationPayload + + # Update the current logged in user. + updateMyUserProfile(input: UpdateMyProfileInput!): UpdateMyProfilePayload + updateSmsSecondFactor( + input: UpdateSmsSecondFactorInput! + ): UpdateSmsSecondFactorPayload + updateViewingRoom(input: UpdateViewingRoomInput!): UpdateViewingRoomPayload + updateViewingRoomArtworks( + input: UpdateViewingRoomArtworksInput! + ): UpdateViewingRoomArtworksPayload + updateViewingRoomSubsections( + input: UpdateViewingRoomSubsectionsInput! + ): UpdateViewingRoomSubsectionsPayload +} + +type MyCollectionArtworkMutationDeleteSuccess { + success: Boolean +} + +type MyCollectionArtworkMutationFailure { + mutationError: GravityMutationError +} + +type MyCollectionArtworkMutationSuccess { + artwork: Artwork + artworkEdge: MyCollectionEdge +} + +union MyCollectionArtworkMutationType = + MyCollectionArtworkMutationDeleteSuccess + | MyCollectionArtworkMutationFailure + | MyCollectionArtworkMutationSuccess + +enum MyCollectionArtworkSorts { + CREATED_AT_ASC + CREATED_AT_DESC + POSITION_ASC + POSITION_DESC +} + +# A connection to a list of items. +type MyCollectionConnection { + default: Boolean! + description: String! + + # A list of edges. + edges: [MyCollectionEdge] + name: String! + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + private: Boolean! + totalCount: Int +} + +input MyCollectionCreateArtworkInput { + artistIds: [String]! + category: String + clientMutationId: String + costCurrencyCode: String + costMinor: Int + date: String + depth: String + editionNumber: String + editionSize: String + externalImageUrls: [String] + height: String + medium: String! + metric: String + title: String + width: String +} + +type MyCollectionCreateArtworkPayload { + artworkOrError: MyCollectionArtworkMutationType + clientMutationId: String +} + +input MyCollectionDeleteArtworkInput { + artworkId: String! + clientMutationId: String +} + +type MyCollectionDeleteArtworkPayload { + artworkOrError: MyCollectionArtworkMutationType + clientMutationId: String +} + +# An edge in a connection. +type MyCollectionEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Artwork +} + +input MyCollectionUpdateArtworkInput { + artistIds: [String] + artworkId: String! + category: String + clientMutationId: String + costCurrencyCode: String + costMinor: Int + date: String + depth: String + editionNumber: String + editionSize: String + externalImageUrls: [String] + height: String + medium: String + metric: String + title: String + width: String +} + +type MyCollectionUpdateArtworkPayload { + artworkOrError: MyCollectionArtworkMutationType + clientMutationId: String +} + +input Near { + lat: Float! + lng: Float! + maxDistance: Float +} + +# An object with a Globally Unique ID +interface Node { + # A globally unique ID. + id: ID! +} + +type OpeningHoursArray { + schedules: [FormattedDaySchedules] +} + +type OpeningHoursText { + text: String +} + +union OpeningHoursUnion = OpeningHoursArray | OpeningHoursText + +type OrderedSet { + cached: Int + description(format: Format): String + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + items: [OrderedSetItem] + + # Returns a connection of the items. Only Artwork supported right now. + itemsConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + @deprecated(reason: "Utilize `orderedItemsConnection` for union type") + itemType: String + key: String + layout: OrderedSetLayouts! + name: String + orderedItemsConnection( + after: String + before: String + first: Int + last: Int + ): OrderedSetItemConnection! +} + +# A connection to a list of items. +type OrderedSetConnection { + # A list of edges. + edges: [OrderedSetEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type OrderedSetEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: OrderedSet +} + +union OrderedSetItem = Artist | Artwork | FeaturedLink | Gene | Sale | Show + +# A connection to a list of items. +type OrderedSetItemConnection { + # A list of edges. + edges: [OrderedSetItemEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type OrderedSetItemEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: OrderedSetItem +} + +enum OrderedSetLayouts { + DEFAULT + FULL +} + +enum OrderedSetSorts { + CREATED_AT_ASC + CREATED_AT_DESC + ID_ASC + ID_DESC + INTERNAL_NAME_ASC + INTERNAL_NAME_DESC + ITEM_TYPE_ASC + ITEM_TYPE_DESC + KEY_ASC + KEY_DESC + NAME_ASC + NAME_DESC + OWNER_ID_ASC + OWNER_ID_DESC + OWNER_TYPE_ASC + OWNER_TYPE_DESC +} + +union OrderParty = Partner | User + +type organizer { + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + profile: Profile + profileID: ID + + # A slug ID. + slug: ID! + website: String +} + +type PageCursor { + # first cursor on the page + cursor: String! + + # is this the current page? + isCurrent: Boolean! + + # page number out of totalPages + page: Int! +} + +type PageCursors { + around: [PageCursor!]! + + # optional, may be included in field around + first: PageCursor + + # optional, may be included in field around + last: PageCursor + previous: PageCursor +} + +# Information about pagination in a connection. +type PageInfo { + # When paginating forwards, the cursor to continue. + endCursor: String + + # When paginating forwards, are there more items? + hasNextPage: Boolean! + + # When paginating backwards, are there more items? + hasPreviousPage: Boolean! + + # When paginating backwards, the cursor to continue. + startCursor: String +} + +type Partner implements Node { + analytics: AnalyticsPartnerStats + + # A connection of artists at a partner. + artistsConnection( + after: String + before: String + first: Int + last: Int + representedBy: Boolean + sort: ArtistSorts + ): ArtistPartnerConnection + + # A connection of artworks from a Partner. + artworksConnection( + after: String + before: String + exclude: [String] + first: Int + forSale: Boolean + last: Int + sort: ArtworkSorts + ): ArtworkConnection + cached: Int + categories: [PartnerCategory] + + # A list of the partners unique city locations + cities(size: Int = 25): [String] + collectingInstitution: String + counts: PartnerCounts + defaultProfileID: String + hasFairPartnership: Boolean + href: String + + # A globally unique ID. + id: ID! + initials(length: Int = 3): String + + # A type-specific ID likely used as a database ID. + internalID: ID! + isDefaultProfilePublic: Boolean + isLinkable: Boolean + isPreQualify: Boolean + + # Indicates the partner is a trusted seller on Artsy + isVerifiedSeller: Boolean + + # This field is deprecated and is being used in Eigen release predating the 6.0 release + locations(size: Int = 25): [Location] + @deprecated( + reason: "Prefer to use `locationsConnection`. [Will be removed in v2]" + ) + + # A connection of locations from a Partner. + locationsConnection( + after: String + before: String + first: Int + last: Int + ): LocationConnection + name: String + profile: Profile + + # A connection of shows from a Partner. + showsConnection( + after: String + before: String + + # Only used when status is CLOSING_SOON or UPCOMING. Number of days used to filter upcoming and closing soon shows + dayThreshold: Int + first: Int + last: Int + sort: ShowSorts + + # Filter shows by chronological event status + status: EventStatus + ): ShowConnection + + # A slug ID. + slug: ID! + type: String + viewingRoomsConnection( + after: String + first: Int + published: Boolean = true + statuses: [ViewingRoomStatusEnum!] + ): ViewingRoomsConnection + + # The gallery partner's web address + website: String +} + +type PartnerArtist { + artist: Artist + biography: String + counts: PartnerArtistCounts + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + isDisplayOnPartnerProfile: Boolean + isUseDefaultBiography: Boolean + partner: Partner + representedBy: Boolean + sortableID: String +} + +# A connection to a list of items. +type PartnerArtistConnection { + # A list of edges. + edges: [PartnerArtistEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +type PartnerArtistCounts { + artworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + forSaleArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +# An edge in a connection. +type PartnerArtistEdge { + artist: Artist + biography: String + counts: PartnerArtistCounts + + # A cursor for use in pagination + cursor: String! + + # A globally unique ID. + id: ID! + + # A type-specific ID. + internalID: ID! + isDisplayOnPartnerProfile: Boolean + isUseDefaultBiography: Boolean + + # The item at the end of the edge + node: Partner + partner: Partner + representedBy: Boolean + sortableID: String +} + +type PartnerArtworkGrid implements ArtworkContextGrid { + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + ctaHref: String + ctaTitle: String + title: String +} + +type PartnerCategory { + cached: Int + categoryType: PartnerCategoryType + + # A globally unique ID. + id: ID! + internal: Boolean + + # A type-specific ID likely used as a database ID. + internalID: ID! + name: String + partners( + defaultProfilePublic: Boolean + eligibleForCarousel: Boolean + + # Indicates an active subscription + eligibleForListing: Boolean + + # Indicates tier 1/2 for gallery, 1 for institution + eligibleForPrimaryBucket: Boolean + + # Indicates tier 3/4 for gallery, 2 for institution + eligibleForSecondaryBucket: Boolean + hasFullProfile: Boolean + ids: [String] + + # Coordinates to find partners closest to + near: String + page: Int + + # + # Only return partners of the specified partner categories. + # Accepts list of slugs. + # + partnerCategories: [String] + size: Int + sort: PartnersSortType + + # term used for searching Partners + term: String + type: [PartnerClassification] + ): [Partner] + + # A slug ID. + slug: ID! +} + +enum PartnerCategoryType { + GALLERY + INSTITUTION +} + +enum PartnerClassification { + AUCTION + BRAND + DEMO + GALLERY + INSTITUTION + INSTITUTIONAL_SELLER + PRIVATE_COLLECTOR + PRIVATE_DEALER +} + +# A connection to a list of items. +type PartnerConnection { + # A list of edges. + edges: [PartnerEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +type PartnerCounts { + artistDocuments( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + artists( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + artworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + currentDisplayableShows( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + displayableShows( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + eligibleArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + partnerArtists( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + partnerShowDocuments( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + publishedForSaleArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + publishedNotForSaleArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber + shows( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +# An edge in a connection. +type PartnerEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Partner +} + +enum PartnerShowPartnerType { + GALLERY + MUSEUM +} + +enum PartnersSortType { + CREATED_AT_ASC + CREATED_AT_DESC + PUBLISHED_AT_DESC + RANDOM_SCORE_DESC + RELATIVE_SIZE_ASC + RELATIVE_SIZE_DESC + SORTABLE_ID_ASC + SORTABLE_ID_DESC +} + +union PartnerTypes = ExternalPartner | Partner + +# The connection type for MarketPriceInsights. +type PriceInsightConnection { + # A list of edges. + edges: [PriceInsightEdge] + + # A list of nodes. + nodes: [MarketPriceInsights] + pageCursors: PageCursors + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int + totalPages: Int +} + +# An edge in a connection. +type PriceInsightEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: MarketPriceInsights +} + +enum PriceInsightSort { + # sort by annual_lots_sold in ascending order + ANNUAL_LOTS_SOLD_ASC + + # sort by annual_lots_sold in descending order + ANNUAL_LOTS_SOLD_DESC + + # sort by annual_value_sold_cents in ascending order + ANNUAL_VALUE_SOLD_CENTS_ASC + + # sort by annual_value_sold_cents in descending order + ANNUAL_VALUE_SOLD_CENTS_DESC + + # sort by artist_id in ascending order + ARTIST_ID_ASC + + # sort by artist_id in descending order + ARTIST_ID_DESC + + # sort by artist_name in ascending order + ARTIST_NAME_ASC + + # sort by artist_name in descending order + ARTIST_NAME_DESC + + # sort by artsy_q_inventory in ascending order + ARTSY_Q_INVENTORY_ASC + + # sort by artsy_q_inventory in descending order + ARTSY_Q_INVENTORY_DESC + + # sort by created_at in ascending order + CREATED_AT_ASC + + # sort by created_at in descending order + CREATED_AT_DESC + + # sort by demand_rank in ascending order + DEMAND_RANK_ASC + + # sort by demand_rank in descending order + DEMAND_RANK_DESC + + # sort by demand_trend in ascending order + DEMAND_TREND_ASC + + # sort by demand_trend in descending order + DEMAND_TREND_DESC + + # sort by high_range_cents in ascending order + HIGH_RANGE_CENTS_ASC + + # sort by high_range_cents in descending order + HIGH_RANGE_CENTS_DESC + + # sort by id in ascending order + ID_ASC + + # sort by id in descending order + ID_DESC + + # sort by large_high_range_cents in ascending order + LARGE_HIGH_RANGE_CENTS_ASC + + # sort by large_high_range_cents in descending order + LARGE_HIGH_RANGE_CENTS_DESC + + # sort by large_low_range_cents in ascending order + LARGE_LOW_RANGE_CENTS_ASC + + # sort by large_low_range_cents in descending order + LARGE_LOW_RANGE_CENTS_DESC + + # sort by large_mid_range_cents in ascending order + LARGE_MID_RANGE_CENTS_ASC + + # sort by large_mid_range_cents in descending order + LARGE_MID_RANGE_CENTS_DESC + + # sort by liquidity_rank in ascending order + LIQUIDITY_RANK_ASC + + # sort by liquidity_rank in descending order + LIQUIDITY_RANK_DESC + + # sort by low_range_cents in ascending order + LOW_RANGE_CENTS_ASC + + # sort by low_range_cents in descending order + LOW_RANGE_CENTS_DESC + + # sort by median_sale_to_estimate_ratio in ascending order + MEDIAN_SALE_TO_ESTIMATE_RATIO_ASC + + # sort by median_sale_to_estimate_ratio in descending order + MEDIAN_SALE_TO_ESTIMATE_RATIO_DESC + + # sort by medium in ascending order + MEDIUM_ASC + + # sort by medium in descending order + MEDIUM_DESC + + # sort by medium_high_range_cents in ascending order + MEDIUM_HIGH_RANGE_CENTS_ASC + + # sort by medium_high_range_cents in descending order + MEDIUM_HIGH_RANGE_CENTS_DESC + + # sort by medium_low_range_cents in ascending order + MEDIUM_LOW_RANGE_CENTS_ASC + + # sort by medium_low_range_cents in descending order + MEDIUM_LOW_RANGE_CENTS_DESC + + # sort by medium_mid_range_cents in ascending order + MEDIUM_MID_RANGE_CENTS_ASC + + # sort by medium_mid_range_cents in descending order + MEDIUM_MID_RANGE_CENTS_DESC + + # sort by mid_range_cents in ascending order + MID_RANGE_CENTS_ASC + + # sort by mid_range_cents in descending order + MID_RANGE_CENTS_DESC + + # sort by sell_through_rate in ascending order + SELL_THROUGH_RATE_ASC + + # sort by sell_through_rate in descending order + SELL_THROUGH_RATE_DESC + + # sort by small_high_range_cents in ascending order + SMALL_HIGH_RANGE_CENTS_ASC + + # sort by small_high_range_cents in descending order + SMALL_HIGH_RANGE_CENTS_DESC + + # sort by small_low_range_cents in ascending order + SMALL_LOW_RANGE_CENTS_ASC + + # sort by small_low_range_cents in descending order + SMALL_LOW_RANGE_CENTS_DESC + + # sort by small_mid_range_cents in ascending order + SMALL_MID_RANGE_CENTS_ASC + + # sort by small_mid_range_cents in descending order + SMALL_MID_RANGE_CENTS_DESC + + # sort by updated_at in ascending order + UPDATED_AT_ASC + + # sort by updated_at in descending order + UPDATED_AT_DESC +} + +type PriceRange { + display: String + maxPrice: Money + minPrice: Money +} + +type Profile { + bio: String + cached: Int + counts: ProfileCounts + href: String + icon: Image + + # A globally unique ID. + id: ID! + image: Image + initials(length: Int = 3): String + + # A type-specific ID likely used as a database ID. + internalID: ID! + isFollowed: Boolean + isPubliclyVisible: Boolean + isPublished: Boolean + name: String + + # A slug ID. + slug: ID! +} + +type ProfileCounts { + follows( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +# Autogenerated input type of PublishViewingRoom +input PublishViewingRoomInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoomID: ID! +} + +# Autogenerated return type of PublishViewingRoom +type PublishViewingRoomPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoom: ViewingRoom! +} + +type Query { + # Do not use (only used internally for stitching) + _do_not_use_image: Image + + # Lot standings for a user + _unused_auctionsLotStandingConnection( + after: String + before: String + first: Int + last: Int + userId: ID! + ): AuctionsLotStandingConnection! + + # Autocomplete resolvers. + _unused_gravity_match_partners( + match_type: String + page: Int = 1 + size: Int = 5 + term: String! + ): [DoNotUseThisPartner!] @deprecated(reason: "Use matchPartners") + + # Autocomplete resolvers. + _unused_gravity_matchPartners( + matchType: String + page: Int = 1 + size: Int = 5 + term: String! + ): [DoNotUseThisPartner!] + + # Find partners by IDs + _unused_gravity_partners(ids: [ID!]!): [DoNotUseThisPartner!] + + # List enabled Two-Factor Authentication factors + _unused_gravity_secondFactors( + kinds: [SecondFactorKind!] = [app, sms, backup] + ): [SecondFactor!]! + + # List viewing rooms + _unused_gravity_viewingRoomsConnection( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + featured: Boolean + + # Returns the first _n_ elements from the list. + first: Int + ids: [ID!] + + # Returns the last _n_ elements from the list. + last: Int + partnerID: ID + + # (Deprecated) Use statuses + published: Boolean + + # Returns only viewing rooms with these statuses + statuses: [ViewingRoomStatusEnum!] = [live] + ): ViewingRoomsConnection + + # Last updated timestamp + analyticsLastUpdatedAt: AnalyticsDateTime + + # Find PartnerStats + analyticsPartnerStats(partnerId: String!): AnalyticsPartnerStats + + # Query UserStats + analyticsUserStats(userId: String!): AnalyticsUserStats + + # An Article + article( + # The ID of the Article + id: String! + ): Article + + # A list of Articles + articles( + auctionID: String + + # + # Only return articles matching specified ids. + # Accepts list of ids. + # + ids: [String] + published: Boolean = true + showID: String + sort: ArticleSorts + ): [Article] + + # An Artist + artist( + # The slug or ID of the Artist + id: String! + ): Artist + + # A list of Artists + artists( + # + # Only return artists matching specified ids. + # Accepts list of ids. + # + ids: [String] + page: Int = 1 + size: Int + + # + # Only return artists matching specified slugs. + # Accepts list of slugs. (e.g. 'andy-warhol', 'banksy') + # + slugs: [String] + sort: ArtistSorts + ): [Artist] + + # Find an artist series by ID + artistSeries(id: ID!): ArtistSeries + + # List all artist series, optionally filtered by artist or artwork + artistSeriesConnection( + # Returns the elements in the list that come after the specified cursor. + after: String + + # ID of the artist by which to filter results + artistID: ID + + # ID of the artwork by which to filter results + artworkID: ID + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Array of IDs of artist series that should be excluded from results + excludeIDs: [ID!] + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + ): ArtistSeriesConnection + + # An Artwork + artwork( + # The slug or ID of the Artwork + id: String! + + # Include unlisted artwork or not + includeUnlisted: Boolean + ): Artwork + + # List of all artwork attribution classes + artworkAttributionClasses: [AttributionClass] + + # A list of Artworks + artworks( + after: String + before: String + first: Int + ids: [String] + last: Int + respectParamsOrder: Boolean = false + ): ArtworkConnection + @deprecated( + reason: "This is only for use in resolving stitched queries, not for first-class client use." + ) + + # Artworks Elastic Search results + artworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + + # A city-based entry point for local discovery + city( + # A point which will be used to locate the nearest local discovery city within a threshold + near: Near + + # A slug for the city, conforming to Gravity's city slug naming conventions + slug: String + ): City + + # Find list of competing orders + commerceCompetingOrders( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + orderId: ID! + ): CommerceOrderConnectionWithTotalCount + commerceLineItems( + # Returns the elements in the list that come after the specified cursor. + after: String + artworkId: String + + # Returns the elements in the list that come before the specified cursor. + before: String + editionSetId: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + orderStates: [CommerceOrderStateEnum!] + ): CommerceLineItemConnection + + # Return my orders + commerceMyOrders( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + mode: CommerceOrderModeEnum + sellerId: String + sort: CommerceOrderConnectionSortEnum + states: [CommerceOrderStateEnum!] + ): CommerceOrderConnectionWithTotalCount + + # Find an order by ID + commerceOrder(code: String, id: ID): CommerceOrder + + # Find list of orders + commerceOrders( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + buyerId: String + buyerType: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + mode: CommerceOrderModeEnum + sellerId: String + sellerType: String + sort: CommerceOrderConnectionSortEnum + state: CommerceOrderStateEnum + ): CommerceOrderConnectionWithTotalCount + + # Sold or bought-in consignments + consignments( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Return sold or bought-in consignments for the given partner + gravityPartnerId: ID! + + # Returns the last _n_ elements from the list. + last: Int + + # Return consignments sorted by input (default sort by id) + sort: ConsignmentSort + ): ConsignmentConnection + + # A user's credit card + creditCard( + # The ID of the Credit Card + id: String! + ): CreditCard + + # A Fair + fair( + # The slug or ID of the Fair + id: String! + ): Fair + + # A list of Fairs + fairs( + fairOrganizerID: String + hasFullFeature: Boolean + hasHomepageSection: Boolean + hasListing: Boolean + + # + # Only return fairs matching specified ids. + # Accepts list of ids. + # + ids: [String] + near: Near + page: Int + size: Int + sort: FairSorts + status: EventStatus + ): [Fair] + + # A Feature + feature( + # The slug or ID of the Feature + id: ID + ): Feature + gene( + # The slug or ID of the Gene + id: String! + ): Gene + + # A list of Gene Families + geneFamiliesConnection( + after: String + before: String + first: Int + last: Int + ): GeneFamilyConnection + + # A list of Genes + genes( + size: Int + + # + # Only return genes matching specified slugs. + # Accepts list of slugs. + # + slugs: [String] + ): [Gene] + highlights: Highlights + + # Home screen content + homePage: HomePage + marketingCategories: [MarketingCollectionCategory!]! + marketingCollection(slug: String!): MarketingCollection + marketingCollections( + artistID: String + category: String + isFeaturedArtistContent: Boolean + randomizationSeed: String + showOnEditorial: Boolean + size: Int + slugs: [String!] + ): [MarketingCollection!]! + marketingHubCollections: [MarketingCollection!]! + + # Get price insights for a market. + marketPriceInsights(artistId: ID!, medium: String!): MarketPriceInsights + me: Me + + # Fetches an object given its globally unique ID. + node( + # The globally unique ID of the node. + id: ID! + ): Node + + # Get an Offer + offer( + # Return offers for the given partner + gravityPartnerId: ID! + id: ID! + ): ConsignmentOffer + + # List offers + offers( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Return offers for the given partner + gravityPartnerId: ID! + + # Returns the last _n_ elements from the list. + last: Int + + # Return offers sorted this way + sort: ConsignmentOfferSort + + # Return only offers with matching states + states: [String!] + ): ConsignmentOfferConnection + + # An OrderedSet + orderedSet( + # The ID of the OrderedSet + id: String! + ): OrderedSet + + # A collection of OrderedSets + orderedSets( + # Key to the OrderedSet or group of OrderedSets + key: String! + public: Boolean = true + ): [OrderedSet] + + # A Partner + partner( + # The slug or ID of the Partner + id: String! + ): Partner + + # A list of Artworks for a partner + partnerArtworks( + after: String + before: String + first: Int + last: Int + partnerID: String! + private: Boolean + viewingRoomID: String + ): ArtworkConnection + @deprecated( + reason: "This is only for use in resolving stitched queries, not for first-class client use." + ) + + # A list of Partners + partnersConnection( + after: String + before: String + first: Int + ids: [String] + last: Int + ): PartnerConnection + + # Get all price insights for an artist. + priceInsights( + # Returns the elements in the list that come after the specified cursor. + after: String + artistId: ID! + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + + # Return price insights sorted this way + sort: PriceInsightSort + ): PriceInsightConnection + + # A Sale + sale( + # The slug or ID of the Sale + id: String! + ): Sale + + # A Sale Artwork + saleArtwork( + # The slug or ID of the SaleArtwork + id: String! + ): SaleArtwork + + # Sale Artworks search results + saleArtworksConnection( + after: String + + # Please make sure to supply the TOTAL aggregation if you will be setting any aggregations + aggregations: [SaleArtworkAggregation] + artistIDs: [String] + before: String + estimateRange: String + first: Int + geneIDs: [String] + + # When called under the Me field, this defaults to true. Otherwise it defaults to false + includeArtworksByFollowedArtists: Boolean + isAuction: Boolean + last: Int + liveSale: Boolean + page: Int + saleID: ID + size: Int + sort: String + ): SaleArtworksConnection + + # A list of Sales + salesConnection( + after: String + before: String + first: Int + + # + # Only return sales matching specified ids. + # Accepts list of ids. + # + ids: [String] + + # Limit by auction. + isAuction: Boolean = true + last: Int + + # Limit by live status. + live: Boolean = true + + # Limit by published status. + published: Boolean = true + + # Returns sales the user has registered for if true, returns sales the user has not registered for if false. + registered: Boolean + sort: SaleSorts + ): SaleConnection + + # Global search + searchConnection( + after: String + aggregations: [SearchAggregation] + before: String + + # Entities to include in search. Default: [ARTIST, ARTWORK]. + entities: [SearchEntity] + first: Int + last: Int + + # Mode of search to execute. Default: SITE. + mode: SearchMode + + # If present, will be used for pagination instead of cursors. + page: Int + + # Search query to perform. Required. + query: String! + ): SearchableConnection + + # A Show + show( + # The slug or ID of the Show + id: String! + ): Show + + # A list of Shows + showsConnection( + after: String + before: String + first: Int + ids: [String] + last: Int + ): ShowConnection + + # Content for a specific page or view + staticContent( + # The slug or id for the view + id: String! + ): StaticContent + + # Get a Submission + submission(id: ID): ConsignmentSubmission + + # Filter all submission + submissions( + # Returns the elements in the list that come after the specified cursor. + after: String + + # If true return only available submissions + available: Boolean + + # Returns the elements in the list that come before the specified cursor. + before: String + + # Get submissions filtered by category + filterByCategory: ConsignmentSubmissionCategoryAggregation + + # Returns the first _n_ elements from the list. + first: Int + + # Get all submissions with these IDs + ids: [ID!] + + # Returns the last _n_ elements from the list. + last: Int + + # Return submissions sorted this way + sort: ConsignmentSubmissionSort + + # Get all submissions with these user IDs + userId: [ID!] + ): ConsignmentSubmissionConnection + + # Fields related to internal systems. + system: System + tag( + # The slug or ID of the Tag + id: String! + ): Tag + targetSupply: TargetSupply + user( + # Email to search for user by + email: String + + # ID of the user + id: String + ): User + + # A list of Users + usersConnection( + after: String + before: String + first: Int + ids: [String] + last: Int + ): UserConnection + + # A Partner or Fair + vanityURLEntity( + # The slug or ID of the Profile to get a partner or fair for + id: String! + ): VanityURLEntityType + + # A wildcard used to support complex root queries in Relay + viewer: Viewer + + # Find a viewing room by ID + viewingRoom(id: ID!): ViewingRoom + + # (Deprecate) use viewingRoomsConnection + viewingRooms( + # Returns the elements in the list that come after the specified cursor. + after: String + + # Returns the elements in the list that come before the specified cursor. + before: String + featured: Boolean + + # Returns the first _n_ elements from the list. + first: Int + + # Returns the last _n_ elements from the list. + last: Int + partnerID: ID + + # (Deprecated) Use statuses + published: Boolean + + # Returns only viewing rooms with these statuses + statuses: [ViewingRoomStatusEnum!] = [live] + ): ViewingRoomConnection @deprecated(reason: "Use viewingRoomsConnection") +} + +# Autogenerated input type of RecordArtworkView +input RecordArtworkViewInput { + artwork_id: String! + + # A unique identifier for the client performing the mutation. + clientMutationId: String +} + +# Autogenerated return type of RecordArtworkView +type RecordArtworkViewPayload { + # Id of viewed artwork + artwork_id: String! @deprecated(reason: "Use artworkId") + + # Id of viewed artwork + artworkId: String! + + # A unique identifier for the client performing the mutation. + clientMutationId: String +} + +enum RelatedArtistsKind { + CONTEMPORARY + MAIN +} + +type RelatedArtworkGrid implements ArtworkContextGrid { + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + ctaHref: String + ctaTitle: String + title: String +} + +# Autogenerated input type of RequestConditionReport +input RequestConditionReportInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + + # ID of the sale artwork. + saleArtworkID: String! +} + +# Autogenerated return type of RequestConditionReport +type RequestConditionReportPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + conditionReportRequest: ConditionReportRequest! +} + +input RequestCredentialsForAssetUploadInput { + # The desired access control + acl: String! + clientMutationId: String + + # The gemini template you want to request + name: String! +} + +type RequestCredentialsForAssetUploadPayload { + asset: Credentials + clientMutationId: String +} + +type ResizedImageUrl { + factor: Float! + height: Int + src: String! + srcSet: String! + url: String! + width: Int +} + +enum Role { + OPERATOR + PARTICIPANT +} + +# The conditions for uploading assets to media.artsy.net +type S3PolicyConditionsType { + # The assigned access control + acl: String! + + # The bucket to upload to. + bucket: String! + + # A key which is prefixed on your file + geminiKey: String! + + # The returned status code, currently always 201 + successActionStatus: String! +} + +# An policy for uploading assets to media.artsy.net +type S3PolicyDocumentType { + # The details for the upload + conditions: S3PolicyConditionsType! + + # An expiration date string. + expiration: String! +} + +type Sale implements Node { + # Returns a connection of artworks for a sale. + artworksConnection( + after: String + before: String + + # List of artwork IDs to exclude from the response (irrespective of size) + exclude: [String] + first: Int + last: Int + ): ArtworkConnection + associatedSale: Sale + + # A bid increment policy that explains minimum bids in ranges. + bidIncrements: [BidIncrement] + + # Auction's buyer's premium policy. + buyersPremium: [BuyersPremium] + cached: Int + collectPayments: Boolean! + coverImage: Image + currency: String + description: String + displayTimelyAt: String + eligibleSaleArtworksCount: Int + endAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + eventEndAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + eventStartAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # A formatted description of when the auction starts or ends or if it has ended + formattedStartDateTime: String + href: String + + # A globally unique ID. + id: ID! + initials(length: Int = 3): String + + # A type-specific ID likely used as a database ID. + internalID: ID! + isArtsyLicensed: Boolean! + isAuction: Boolean + isAuctionPromo: Boolean + isBenefit: Boolean + isClosed: Boolean + isGalleryAuction: Boolean + isLiveOpen: Boolean + isLotConditionsReportEnabled: Boolean + isOpen: Boolean + isPreliminary: Boolean + isPreview: Boolean + isRegistrationClosed: Boolean + isWithBuyersPremium: Boolean + liveStartAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # Returns a live auctions url if the sale is open and start time is after now + liveURLIfOpen: String + name: String + partner: Partner + profile: Profile + promotedSale: Sale + registrationEndsAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # A registration for this sale or null + registrationStatus: Bidder + requireBidderApproval: Boolean + requireIdentityVerification: Boolean + saleArtwork(id: String!): SaleArtwork + saleArtworksConnection( + after: String + all: Boolean = false + before: String + first: Int + + # List of sale artwork internal IDs to fetch + internalIDs: [ID] + last: Int + ): SaleArtworkConnection + saleType: String + + # A slug ID. + slug: ID! + startAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + status: String + symbol: String + timeZone: String + + # True if the current user needs to undergo identity verification for this sale, false otherwise + userNeedsIdentityVerification: Boolean +} + +type SaleArtwork implements ArtworkEdgeInterface & Node { + artwork: Artwork + cached: Int + calculatedCost( + # Max bid price for the sale artwork + bidAmountMinor: Int! + ): CalculatedCost + counts: SaleArtworkCounts + + # Currency abbreviation (e.g. "USD") + currency: String + currentBid: SaleArtworkCurrentBid + cursor: String + estimate: String + + # Singular estimate field, if specified + estimateCents: Int + highestBid: SaleArtworkHighestBid + highEstimate: SaleArtworkHighEstimate + + # A globally unique ID. + id: ID! + increments( + # Whether or not to start the increments at the user's latest bid + useMyMaxBid: Boolean + ): [BidIncrementsFormatted] + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Can bids be placed on the artwork? + isBiddable: Boolean + isBidOn: Boolean + isWithReserve: Boolean + lotLabel: String + lowEstimate: SaleArtworkLowEstimate + minimumNextBid: SaleArtworkMinimumNextBid + node: Artwork + openingBid: SaleArtworkOpeningBid + position: Float + reserve: SaleArtworkReserve + reserveMessage: String + reserveStatus: String + sale: Sale + saleID: String + + # A slug ID. + slug: ID! + + # Currency symbol (e.g. "$") + symbol: String +} + +enum SaleArtworkAggregation { + ARTIST + FOLLOWED_ARTISTS + MEDIUM + TOTAL +} + +# A connection to a list of items. +type SaleArtworkConnection { + # A list of edges. + edges: [SaleArtworkEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +type SaleArtworkCounts { + bidderPositions( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +type SaleArtworkCurrentBid { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +# An edge in a connection. +type SaleArtworkEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: SaleArtwork +} + +type SaleArtworkHighestBid { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + cents: Int + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + display: String + isCancelled: Boolean +} + +type SaleArtworkHighEstimate { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +type SaleArtworkLowEstimate { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +type SaleArtworkMinimumNextBid { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +type SaleArtworkOpeningBid { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +type SaleArtworkReserve { + # A formatted price with various currency formatting options. + amount( + decimal: String = "." + + # Allows control of symbol position (%v = value, %s = symbol) + format: String = "%s%v" + precision: Int = 0 + symbol: String + thousand: String = "," + ): String + + # An amount of money expressed in cents. + cents: Float + + # A pre-formatted price. + display: String +} + +# The results for one of the requested aggregations +type SaleArtworksAggregationResults { + counts: [AggregationCount] + slice: SaleArtworkAggregation +} + +# A connection to a list of items. +type SaleArtworksConnection implements ArtworkConnectionInterface { + # Returns aggregation counts for the given filter query. + aggregations: [SaleArtworksAggregationResults] + counts: FilterSaleArtworksCounts + + # A list of edges. + edges: [SaleArtwork] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# A connection to a list of items. +type SaleConnection { + # A list of edges. + edges: [SaleEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type SaleEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Sale +} + +enum SaleSorts { + _ID_ASC + _ID_DESC + CREATED_AT_ASC + CREATED_AT_DESC + ELIGIBLE_SALE_ARTWORKS_COUNT_ASC + ELIGIBLE_SALE_ARTWORKS_COUNT_DESC + END_AT_ASC + END_AT_DESC + NAME_ASC + NAME_DESC + START_AT_ASC + START_AT_DESC + TIMELY_AT_NAME_ASC + TIMELY_AT_NAME_DESC +} + +input SaveArtworkInput { + artworkID: String + clientMutationId: String + remove: Boolean +} + +type SaveArtworkPayload { + artwork: Artwork + clientMutationId: String +} + +# A connection to a list of items. +type SavedArtworksConnection { + default: Boolean! + description: String! + + # A list of edges. + edges: [SavedArtworksEdge] + name: String! + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + private: Boolean! + totalCount: Int +} + +# An edge in a connection. +type SavedArtworksEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Artwork +} + +# An object that may be searched for +interface Searchable { + displayLabel: String + href: String + imageUrl: String +} + +# A connection to a list of items. +type SearchableConnection { + # Returns aggregation counts for the given filter query. + aggregations: [SearchAggregationResults] + + # A list of edges. + edges: [SearchableEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type SearchableEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Searchable +} + +type SearchableItem implements Node & Searchable { + description: String + displayLabel: String + displayType: String + href: String + + # A globally unique ID. + id: ID! + imageUrl: String + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # A slug ID. + slug: ID! +} + +enum SearchAggregation { + TYPE +} + +# The results for a requested aggregations +type SearchAggregationResults { + counts: [AggregationCount] + slice: SearchAggregation +} + +enum SearchEntity { + ARTICLE + ARTIST + ARTIST_SERIES + ARTWORK + CITY + COLLECTION + FAIR + FEATURE + GALLERY + GENE + INSTITUTION + PAGE + PROFILE + SALE + SHOW + TAG + VIEWING_ROOM +} + +enum SearchMode { + AUTOSUGGEST + SITE +} + +interface SecondFactor { + createdAt: ISO8601DateTime! + disabledAt: ISO8601DateTime + enabled: Boolean! + enabledAt: ISO8601DateTime + internalID: ID! + kind: SecondFactorKind! + updatedAt: ISO8601DateTime! +} + +# Two-Factor Authentication (2FA) Method +enum SecondFactorKind { + # App authenticator 2FA method + app + + # Backup 2FA method + backup + + # SMS 2FA method + sms +} + +# A second factor or errors +union SecondFactorOrErrorsUnion = AppSecondFactor | Errors | SmsSecondFactor + +# A piece that can be sold +interface Sellable { + dimensions: dimensions + editionOf: String + + # Whether a piece can be purchased through e-commerce + isAcquireable: Boolean + isForSale: Boolean + + # Whether a user can make an offer on the work + isOfferable: Boolean + isSold: Boolean + saleMessage: String +} + +type SendConfirmationEmailMutationFailure { + mutationError: GravityMutationError +} + +input SendConfirmationEmailMutationInput { + clientMutationId: String +} + +type SendConfirmationEmailMutationPayload { + clientMutationId: String + confirmationOrError: SendConfirmationEmailMutationType +} + +type SendConfirmationEmailMutationSuccess { + confirmationSentAt: String + unconfirmedEmail: String +} + +union SendConfirmationEmailMutationType = + SendConfirmationEmailMutationFailure + | SendConfirmationEmailMutationSuccess + +input SendConversationMessageMutationInput { + bodyText: String! + clientMutationId: String + + # The email address of the message sender + from: String! + + # The id of the conversation to be updated + id: String! + + # The message being replied to + replyToMessageID: String! +} + +type SendConversationMessageMutationPayload { + clientMutationId: String + conversation: Conversation + messageEdge: MessageEdge +} + +type SendFeedbackMutationFailure { + mutationError: GravityMutationError +} + +input SendFeedbackMutationInput { + clientMutationId: String + + # Email to associate with message (only used if logged out). + email: String + + # Message to be sent. + message: String! + + # Name to associate with message (only used if logged out). + name: String + + # URL of page where feedback originated. + url: String +} + +type SendFeedbackMutationPayload { + clientMutationId: String + feedbackOrError: SendFeedbackMutationType +} + +type SendFeedbackMutationSuccess { + feedback: Feedback +} + +union SendFeedbackMutationType = + SendFeedbackMutationFailure + | SendFeedbackMutationSuccess + +type Services { + convection: ConvectionService! + metaphysics: MetaphysicsService! +} + +type Show implements EntityWithFilterArtworksConnectionInterface & Node { + # The Artists presenting in this show + artists: [Artist] + + # Artists in the show grouped by last name + artistsGroupedByName: [ArtistGroup] + + # Artists inside the show who do not have artworks present + artistsWithoutArtworks: [Artist] + + # The artworks featured in the show + artworksConnection( + after: String + before: String + + # List of artwork IDs to exclude from the response (irrespective of size) + exclude: [String] + first: Int + forSale: Boolean = false + last: Int + published: Boolean = true + ): ArtworkConnection + cached: Int + + # The general city, derived from a fair location, a show location or a potential city + city: String + + # An object that represents some of the numbers you might want to highlight + counts: ShowCounts + + # The image you should use to represent this show + coverImage: Image + createdAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # A description of the show + description: String + endAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # Events from the partner that runs this show + events: [ShowEventType] + + # A formatted description of the start to end dates + exhibitionPeriod: String + + # If the show is in a Fair, then that fair + fair: Fair + + # Artworks Elastic Search results + filterArtworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + + # A Connection of followed artists by current user for this show + followedArtistsConnection( + after: String + before: String + first: Int + last: Int + ): ShowFollowArtistConnection + + # Flag showing if show has any location. + hasLocation: Boolean + + # A path to the show on Artsy + href: String + + # A globally unique ID. + id: ID! + + # Images that represent the show, you may be interested in meta_image or cover_image for a definitive thumbnail + images( + # Pass true/false to include cover or not + default: Boolean + page: Int + + # Number of images to return + size: Int + ): [Image] + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # Gravity doesn’t expose the `active` flag. Temporarily re-state its logic. + isActive: Boolean + + # Is this something we can display to the front-end? + isDisplayable: Boolean + + # Does the show exist as a fair booth? + isFairBooth: Boolean + + # Is the user following this show + isFollowed: Boolean + + # Is it a show provided for historical reference? + isReference: Boolean + + # Is it an outsourced local discovery stub show? + isStubShow: Boolean + + # Whether the show is in a fair, group or solo + kind: String + + # Where the show is located (Could also be a fair location) + location: Location + + # An image representing the show, or a sharable image from an artwork in the show + metaImage: Image + + # The exhibition title + name: String + + # Shows that are near (~75km) from this show + nearbyShowsConnection( + after: String + before: String + + # Whether to include local discovery stubs as well as displayable shows + discoverable: Boolean + first: Int + last: Int + sort: ShowSorts + + # By default show only current shows + status: EventStatus = CURRENT + ): ShowConnection + + # Alternate Markdown-supporting free text representation of the opening reception event’s date/time + openingReceptionText: String + + # The partner that represents this show, could be a non-Artsy partner + partner: PartnerTypes + + # The press release for this show + pressRelease(format: Format): String + + # Link to the press release for this show + pressReleaseUrl: String + + # A slug ID. + slug: ID! + + # When this show starts + startAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + + # Is this show running, upcoming or closed? + status: String + + # A formatted update on upcoming status changes + statusUpdate( + # Before this many days no update will be generated + maxDays: Int + ): String + + # Is it a fair booth or a show? + type: String + viewingRoomIDs: [String!]! + viewingRoomsConnection: ViewingRoomsConnection +} + +type ShowArtworkGrid implements ArtworkContextGrid { + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + ctaHref: String + ctaTitle: String + title: String +} + +# A connection to a list of items. +type ShowConnection { + # A list of edges. + edges: [ShowEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +type ShowCounts { + artists: Int + artworks( + # The slug or ID of an artist in the show. + artistID: String + ): Int + eligibleArtworks( + # Returns a `String` when format is specified. e.g.`'0,0.0000''` + format: String + label: String + ): FormattedNumber +} + +# An edge in a connection. +type ShowEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: Show +} + +type ShowEventType { + # A formatted description of the dates with hours + dateTimeRange: String + description: String + endAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + eventType: String + + # A formatted description of the start to end dates + exhibitionPeriod: String + startAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + title: String +} + +type ShowFollowArtist { + artist: Artist +} + +# A connection to a list of items. +type ShowFollowArtistConnection { + # A list of edges. + edges: [ShowFollowArtistEdge] + + # Information to aid in pagination. + pageInfo: PageInfo! +} + +# An edge in a connection. +type ShowFollowArtistEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: ShowFollowArtist +} + +enum ShowSorts { + END_AT_ASC + END_AT_DESC + FEATURED_ASC + FEATURED_DESC + NAME_ASC + NAME_DESC + PARTNER_ASC + SORTABLE_NAME_ASC + SORTABLE_NAME_DESC + START_AT_ASC + START_AT_DESC + UPDATED_AT_ASC + UPDATED_AT_DESC +} + +# SMS Two-Factor Authentication factor +type SmsSecondFactor implements SecondFactor { + countryCode: String + createdAt: ISO8601DateTime! + disabledAt: ISO8601DateTime + enabled: Boolean! + enabledAt: ISO8601DateTime + formattedPhoneNumber: String + internalID: ID! + kind: SecondFactorKind! + lastDeliveredAt: ISO8601DateTime + maskedPhone: String @deprecated(reason: "Use formattedPhoneNumber instead") + phoneNumber: String + updatedAt: ISO8601DateTime! +} + +# SMS second factor input attributes +input SmsSecondFactorAttributes { + # ISO 3166 country code for the SMS second factor + countryCode: String + + # Phone number of the SMS second factor + phoneNumber: String +} + +# An SMS second factor or errors +union SmsSecondFactorOrErrorsUnion = Errors | SmsSecondFactor + +enum sort { + ASC + DESC +} + +type StartIdentityVerificationFailure { + mutationError: GravityMutationError +} + +input startIdentityVerificationMutationInput { + clientMutationId: String + + # Primary ID of the identity verification to be started + identityVerificationId: String! +} + +type startIdentityVerificationMutationPayload { + clientMutationId: String + startIdentityVerificationResponseOrError: StartIdentityVerificationResponseOrError +} + +union StartIdentityVerificationResponseOrError = + StartIdentityVerificationFailure + | StartIdentityVerificationSuccess + +type StartIdentityVerificationSuccess { + # URL that hosts the user-facing identity verification flow (Jumio) + identityVerificationFlowUrl: String + + # Primary ID of the started identity verification + identityVerificationId: String +} + +type StaticContent { + content: String + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + name: String + + # A slug ID. + slug: ID! +} + +# An edge in a connection. +type SubmissionEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: ConsignmentSubmission +} + +input SubmitInquiryRequestMutationInput { + clientMutationId: String + + # The inquireable object id (Artwork ID or Show ID) + inquireableID: String! + + # The type of inquireable object (Artwork or Show) + inquireableType: String! + + # Optional inquiry message + message: String + + # List of structured inquiry questions + questions: [InquiryQuestionInput] +} + +type SubmitInquiryRequestMutationPayload { + clientMutationId: String + + # Artwork Inquiry request + inquiryRequest: InquiryRequest +} + +type System { + # Creates, and authorizes, a JWT custom for Causality + causalityJWT( + role: Role + + # The id of the auction to participate in + saleID: String! + ): String + + # The schema for difference micro-service settings + services: Services + + # Gravity system time, necessary for synchronizing device clocks. + time: SystemTime +} + +type SystemTime { + day: Int + dst: Boolean + hour: Int + iso8601: String + min: Int + month: Int + sec: Int + unix: Int + utcOffset: Int + wday: Int + year: Int + zone: String +} + +type Tag implements Node { + cached: Int + count: Int + description: String + + # Artworks Elastic Search results + filterArtworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + href: String + + # A globally unique ID. + id: ID! + image: Image + + # A type-specific ID likely used as a database ID. + internalID: ID! + name: String + + # A slug ID. + slug: ID! +} + +type TargetSupply { + microfunnel: [TargetSupplyMicrofunnelItem] +} + +type TargetSupplyMicrofunnelItem { + artist: Artist + + # A list of recently sold artworks. + artworksConnection( + after: String + before: String + first: Int + last: Int + + # Randomize the order of artworks for display purposes. + randomize: Boolean + ): ArtworkConnection + metadata: TargetSupplyMicrofunnelMetadata +} + +type TargetSupplyMicrofunnelMetadata { + highestRealized: String + realized: String + recentlySoldArtworkIDs: [String] + roundedUniqueVisitors: String + roundedViews: String + str: String + uniqueVisitors: String + views: String +} + +type TrendingArtists { + artists: [Artist] +} + +union UnderlyingCurrentEvent = Sale | Show + +# Autogenerated input type of UnpublishViewingRoom +input UnpublishViewingRoomInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoomID: ID! +} + +# Autogenerated return type of UnpublishViewingRoom +type UnpublishViewingRoomPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoom: ViewingRoom! +} + +# Autogenerated input type of UpdateAppSecondFactor +input UpdateAppSecondFactorInput { + attributes: AppSecondFactorAttributes! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorID: ID! +} + +# Autogenerated return type of UpdateAppSecondFactor +type UpdateAppSecondFactorPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorOrErrors: AppSecondFactorOrErrorsUnion! +} + +input UpdateCollectorProfileInput { + clientMutationId: String + intents: [Intents] + loyaltyApplicant: Boolean + professionalBuyer: Boolean + selfReportedPurchases: String +} + +type UpdateCollectorProfilePayload { + clientMutationId: String + collectorLevel: Int + confirmedBuyerAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + email: String + + # A globally unique ID. + id: ID! + intents: [String] + + # A type-specific ID likely used as a database ID. + internalID: ID! + loyaltyApplicantAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + name: String + professionalBuyerAppliedAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + professionalBuyerAt( + format: String + + # A tz database time zone, otherwise falls back to `X-TIMEZONE` header + timezone: String + ): String + selfReportedPurchases: String +} + +input UpdateConversationMutationInput { + clientMutationId: String + + # The id of the conversation to be updated. + conversationId: String! + + # The message id to mark as read. + fromLastViewedMessageId: String! +} + +type UpdateConversationMutationPayload { + clientMutationId: String + conversation: Conversation +} + +input UpdateMyProfileInput { + clientMutationId: String + + # The collector level for the user + collectorLevel: Int + + # The given email of the user. + email: String + + # The given location of the user as structured data + location: EditableLocation + + # The given name of the user. + name: String + + # The given phone number of the user. + phone: String + + # The maximum price collector has selected + priceRangeMax: Float + + # The minimum price collector has selected + priceRangeMin: Int + + # This user should receive lot opening notifications + receiveLotOpeningSoonNotification: Boolean + + # This user should receive new sales notifications + receiveNewSalesNotification: Boolean + + # This user should receive new works notifications + receiveNewWorksNotification: Boolean + + # This user should receive outbid notifications + receiveOutbidNotification: Boolean + + # This user should receive promotional notifications + receivePromotionNotification: Boolean + + # This user should receive purchase notifications + receivePurchaseNotification: Boolean + + # This user should receive sale opening/closing notifications + receiveSaleOpeningClosingNotification: Boolean +} + +type UpdateMyProfilePayload { + clientMutationId: String + me: Me + user: User +} + +# Autogenerated input type of UpdateSmsSecondFactor +input UpdateSmsSecondFactorInput { + attributes: SmsSecondFactorAttributes! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorID: ID! +} + +# Autogenerated return type of UpdateSmsSecondFactor +type UpdateSmsSecondFactorPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + secondFactorOrErrors: SmsSecondFactorOrErrorsUnion! +} + +# Autogenerated input type of UpdateSubmissionMutation +input UpdateSubmissionMutationInput { + additionalInfo: String + artistID: String + authenticityCertificate: Boolean + category: ConsignmentSubmissionCategoryAggregation + + # A unique identifier for the client performing the mutation. + clientMutationId: String + currency: String + depth: String + dimensionsMetric: String + edition: Boolean + editionNumber: String + editionSize: Int + height: String + id: ID! + locationCity: String + locationCountry: String + locationState: String + medium: String + minimumPriceDollars: Int + provenance: String + signature: Boolean + state: ConsignmentSubmissionStateAggregation + title: String + width: String + year: String +} + +# Autogenerated return type of UpdateSubmissionMutation +type UpdateSubmissionMutationPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + consignmentSubmission: ConsignmentSubmission +} + +# Autogenerated input type of UpdateViewingRoomArtworks +input UpdateViewingRoomArtworksInput { + artworks: [ViewingRoomArtworkInput!]! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoomID: String! +} + +# Autogenerated return type of UpdateViewingRoomArtworks +type UpdateViewingRoomArtworksPayload { + artworkIDs: [String!]! + + # A unique identifier for the client performing the mutation. + clientMutationId: String +} + +# Autogenerated input type of UpdateViewingRoom +input UpdateViewingRoomInput { + attributes: ViewingRoomAttributes! + + # A unique identifier for the client performing the mutation. + clientMutationId: String + image: ARImageInput + viewingRoomID: String! +} + +# Autogenerated return type of UpdateViewingRoom +type UpdateViewingRoomPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + viewingRoomOrErrors: ViewingRoomOrErrorsUnion! +} + +# Autogenerated input type of UpdateViewingRoomSubsections +input UpdateViewingRoomSubsectionsInput { + # A unique identifier for the client performing the mutation. + clientMutationId: String + subsections: [ViewingRoomSubsectionInput!]! + viewingRoomID: ID! +} + +# Autogenerated return type of UpdateViewingRoomSubsections +type UpdateViewingRoomSubsectionsPayload { + # A unique identifier for the client performing the mutation. + clientMutationId: String + subsections: [ViewingRoomSubsection!]! +} + +type User { + analytics: AnalyticsUserStats + cached: Int + + # The given email of the user. + email: String! + + # A globally unique ID. + id: ID! + + # A type-specific ID likely used as a database ID. + internalID: ID! + + # The given location of the user as structured data + location: Location + + # The given name of the user. + name: String! + + # The paddle number of the user + paddleNumber: String + + # The given phone number of the user. + phone: String + + # Pin for bidding at an auction + pin: String + + # The price range the collector has selected + priceRange: String + + # This user should receive lot opening notifications + receiveLotOpeningSoonNotification: Boolean + + # This user should receive new sales notifications + receiveNewSalesNotification: Boolean + + # This user should receive new works notifications + receiveNewWorksNotification: Boolean + + # This user should receive outbid notifications + receiveOutbidNotification: Boolean + + # This user should receive promotional notifications + receivePromotionNotification: Boolean + + # This user should receive purchase notifications + receivePurchaseNotification: Boolean + + # This user should receive sale opening/closing notifications + receiveSaleOpeningClosingNotification: Boolean + + # Check whether a user exists by email address before creating an account. + userAlreadyExists: Boolean +} + +# A connection to a list of items. +type UserConnection { + # A list of edges. + edges: [UserEdge] + pageCursors: PageCursors! + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int +} + +# An edge in a connection. +type UserEdge { + # A cursor for use in pagination + cursor: String! + + # The item at the end of the edge + node: User +} + +union VanityURLEntityType = Fair | Partner + +# A wildcard used to support complex root queries in Relay +type Viewer { + # Do not use (only used internally for stitching) + _do_not_use_image: Image + + # An Article + article( + # The ID of the Article + id: String! + ): Article + + # A list of Articles + articles( + auctionID: String + + # + # Only return articles matching specified ids. + # Accepts list of ids. + # + ids: [String] + published: Boolean = true + showID: String + sort: ArticleSorts + ): [Article] + + # An Artist + artist( + # The slug or ID of the Artist + id: String! + ): Artist + + # A list of Artists + artists( + # + # Only return artists matching specified ids. + # Accepts list of ids. + # + ids: [String] + page: Int = 1 + size: Int + + # + # Only return artists matching specified slugs. + # Accepts list of slugs. (e.g. 'andy-warhol', 'banksy') + # + slugs: [String] + sort: ArtistSorts + ): [Artist] + + # An Artwork + artwork( + # The slug or ID of the Artwork + id: String! + + # Include unlisted artwork or not + includeUnlisted: Boolean + ): Artwork + + # List of all artwork attribution classes + artworkAttributionClasses: [AttributionClass] + + # A list of Artworks + artworks( + after: String + before: String + first: Int + ids: [String] + last: Int + respectParamsOrder: Boolean = false + ): ArtworkConnection + @deprecated( + reason: "This is only for use in resolving stitched queries, not for first-class client use." + ) + + # Artworks Elastic Search results + artworksConnection( + acquireable: Boolean + after: String + aggregationPartnerCities: [String] + aggregations: [ArtworkAggregation] + artistID: String + artistIDs: [String] + artistSeriesID: String + atAuction: Boolean + attributionClass: [String] + before: String + color: String + dimensionRange: String + excludeArtworkIDs: [String] + extraAggregationGeneIDs: [String] + first: Int + forSale: Boolean + geneID: String + geneIDs: [String] + height: String + includeArtworksByFollowedArtists: Boolean + includeMediumFilterInAggregation: Boolean + inquireableOnly: Boolean + keyword: String + + # When true, will only return exact keyword match + keywordMatchExact: Boolean + last: Int + majorPeriods: [String] + + # When true, will only return `marketable` works (not nude or provocative). + marketable: Boolean + + # A string from the list of allocations, or * to denote all mediums + medium: String + offerable: Boolean + page: Int + partnerCities: [String] + partnerID: ID + period: String + periods: [String] + priceRange: String + saleID: ID + size: Int + + # Filter results by Artwork sizes + sizes: [ArtworkSizes] + sort: String + tagID: String + width: String + ): FilterArtworksConnection + + # A city-based entry point for local discovery + city( + # A point which will be used to locate the nearest local discovery city within a threshold + near: Near + + # A slug for the city, conforming to Gravity's city slug naming conventions + slug: String + ): City + + # A user's credit card + creditCard( + # The ID of the Credit Card + id: String! + ): CreditCard + + # A Fair + fair( + # The slug or ID of the Fair + id: String! + ): Fair + + # A list of Fairs + fairs( + fairOrganizerID: String + hasFullFeature: Boolean + hasHomepageSection: Boolean + hasListing: Boolean + + # + # Only return fairs matching specified ids. + # Accepts list of ids. + # + ids: [String] + near: Near + page: Int + size: Int + sort: FairSorts + status: EventStatus + ): [Fair] + + # A Feature + feature( + # The slug or ID of the Feature + id: ID + ): Feature + gene( + # The slug or ID of the Gene + id: String! + ): Gene + + # A list of Gene Families + geneFamiliesConnection( + after: String + before: String + first: Int + last: Int + ): GeneFamilyConnection + + # A list of Genes + genes( + size: Int + + # + # Only return genes matching specified slugs. + # Accepts list of slugs. + # + slugs: [String] + ): [Gene] + highlights: Highlights + + # Home screen content + homePage: HomePage + marketingCollections( + artistID: String + category: String + isFeaturedArtistContent: Boolean + randomizationSeed: String + showOnEditorial: Boolean + size: Int + slugs: [String!] + ): [MarketingCollection] + me: Me + + # Fetches an object given its globally unique ID. + node( + # The globally unique ID of the node. + id: ID! + ): Node + + # An OrderedSet + orderedSet( + # The ID of the OrderedSet + id: String! + ): OrderedSet + + # A collection of OrderedSets + orderedSets( + # Key to the OrderedSet or group of OrderedSets + key: String! + public: Boolean = true + ): [OrderedSet] + + # A Partner + partner( + # The slug or ID of the Partner + id: String! + ): Partner + + # A list of Artworks for a partner + partnerArtworks( + after: String + before: String + first: Int + last: Int + partnerID: String! + private: Boolean + viewingRoomID: String + ): ArtworkConnection + @deprecated( + reason: "This is only for use in resolving stitched queries, not for first-class client use." + ) + + # A list of Partners + partnersConnection( + after: String + before: String + first: Int + ids: [String] + last: Int + ): PartnerConnection + + # A Sale + sale( + # The slug or ID of the Sale + id: String! + ): Sale + + # A Sale Artwork + saleArtwork( + # The slug or ID of the SaleArtwork + id: String! + ): SaleArtwork + + # Sale Artworks search results + saleArtworksConnection( + after: String + + # Please make sure to supply the TOTAL aggregation if you will be setting any aggregations + aggregations: [SaleArtworkAggregation] + artistIDs: [String] + before: String + estimateRange: String + first: Int + geneIDs: [String] + + # When called under the Me field, this defaults to true. Otherwise it defaults to false + includeArtworksByFollowedArtists: Boolean + isAuction: Boolean + last: Int + liveSale: Boolean + page: Int + saleID: ID + size: Int + sort: String + ): SaleArtworksConnection + + # A list of Sales + salesConnection( + after: String + before: String + first: Int + + # + # Only return sales matching specified ids. + # Accepts list of ids. + # + ids: [String] + + # Limit by auction. + isAuction: Boolean = true + last: Int + + # Limit by live status. + live: Boolean = true + + # Limit by published status. + published: Boolean = true + + # Returns sales the user has registered for if true, returns sales the user has not registered for if false. + registered: Boolean + sort: SaleSorts + ): SaleConnection + + # Global search + searchConnection( + after: String + aggregations: [SearchAggregation] + before: String + + # Entities to include in search. Default: [ARTIST, ARTWORK]. + entities: [SearchEntity] + first: Int + last: Int + + # Mode of search to execute. Default: SITE. + mode: SearchMode + + # If present, will be used for pagination instead of cursors. + page: Int + + # Search query to perform. Required. + query: String! + ): SearchableConnection + + # A Show + show( + # The slug or ID of the Show + id: String! + ): Show + + # A list of Shows + showsConnection( + after: String + before: String + first: Int + ids: [String] + last: Int + ): ShowConnection + + # Content for a specific page or view + staticContent( + # The slug or id for the view + id: String! + ): StaticContent + + # Fields related to internal systems. + system: System + tag( + # The slug or ID of the Tag + id: String! + ): Tag + targetSupply: TargetSupply + user( + # Email to search for user by + email: String + + # ID of the user + id: String + ): User + + # A list of Users + usersConnection( + after: String + before: String + first: Int + ids: [String] + last: Int + ): UserConnection + + # A Partner or Fair + vanityURLEntity( + # The slug or ID of the Profile to get a partner or fair for + id: String! + ): VanityURLEntityType + viewingRoomsConnection( + after: String + first: Int + partnerID: ID + published: Boolean = true + statuses: [ViewingRoomStatusEnum!] + ): ViewingRoomsConnection +} + +# An artwork viewing room +type ViewingRoom { + artworkIDs: [String!]! + artworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + + # Body copy + body: String + distanceToClose(short: Boolean! = false): String + distanceToOpen(short: Boolean! = false): String + + # Datetime after which the viewing room is no longer viewable + endAt: ISO8601DateTime + heroImageURL: String @deprecated(reason: "Use image field instead") + href: String + image: ARImage + + # Unique ID for this room + internalID: ID! + + # Introductory paragraph + introStatement: String + partner: Partner + partnerArtworksConnection( + after: String + before: String + first: Int + last: Int + ): ArtworkConnection + + # ID of the partner associated with this viewing room + partnerID: String! + published: Boolean! + pullQuote: String + slug: String! + + # Datetime when the viewing room is viewable + startAt: ISO8601DateTime + + # Calculated field to reflect visibility and state of this viewing room + status: String! + subsections: [ViewingRoomSubsection!]! + timeZone: String + + # Viewing room name + title: String! + viewingRoomArtworks: [ViewingRoomArtwork!]! +} + +# Relationship between a Viewing Room and an Artwork +type ViewingRoomArtwork { + artworkID: ID! + internalID: ID! + published: Boolean! +} + +# An input type for a Viewing Room artwork +input ViewingRoomArtworkInput { + artworkID: ID! + delete: Boolean = false + internalID: ID + position: Int +} + +# Basic viewing room attributes +input ViewingRoomAttributes { + body: String + + # Datetime (in UTC) when Viewing Room closes + endAt: ISO8601DateTime + introStatement: String + pullQuote: String + + # Datetime (in UTC) when Viewing Room opens + startAt: ISO8601DateTime + + # Time zone (tz database format, e.g. America/New_York) in which start_at/end_at attributes were input + timeZone: String + + # Title + title: String +} + +# The connection type for ViewingRoom. +type ViewingRoomConnection { + # A list of edges. + edges: [ViewingRoomEdge] + + # A list of nodes. + nodes: [ViewingRoom] + + # Information to aid in pagination. + pageInfo: PageInfo! + + # Total count of matching nodes, before pagination + totalCount: Int! +} + +# An edge in a connection. +type ViewingRoomEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: ViewingRoom +} + +# A viewing room or errors object +union ViewingRoomOrErrorsUnion = Errors | ViewingRoom + +# The connection type for ViewingRoom. +type ViewingRoomsConnection { + # A list of edges. + edges: [ViewingRoomsEdge] + + # A list of nodes. + nodes: [ViewingRoom] + pageCursors: PageCursors + + # Information to aid in pagination. + pageInfo: PageInfo! + totalCount: Int + totalPages: Int +} + +# An edge in a connection. +type ViewingRoomsEdge { + # A cursor for use in pagination. + cursor: String! + + # The item at the end of the edge. + node: ViewingRoom +} + +enum ViewingRoomStatusEnum { + closed + draft + live + scheduled +} + +# Title, image, text, and caption for a viewing room section +type ViewingRoomSubsection { + # Body copy + body: String + + # Image caption + caption: String + image: ARImage + + # Image URL + imageURL: String + + # Unique ID for this subsection + internalID: ID! + + # Section header + title: String +} + +# Attributes for creating or updating a viewing room subsection +input ViewingRoomSubsectionAttributes { + body: String + caption: String + title: String +} + +# An input type for the creation of viewing room subsections +input ViewingRoomSubsectionInput { + attributes: ViewingRoomSubsectionAttributes + + # If true, delete this subsection from the database + delete: Boolean = false + image: ARImageInput + internalID: ID +} + +type YearRange { + # The last year of the year range + endAt: Int + + # The first year of the year range + startAt: Int +} diff --git a/package.json b/package.json index 28f88f8..a149d8e 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,17 @@ "license": "MIT", "version": "1.0.0", "scripts": { - "dev": "next dev", "build": "next build", - "start": "next start", - "type-check": "tsc --pretty --noEmit", + "dev": "next dev", "format": "prettier --write .", "lint": "eslint . --ext ts --ext tsx --ext js", + "relay:causality": "relay-compiler --src ./src --schema ./gql/causality.graphql --extensions ts tsx --artifactDirectory './gql/__generated__' --exclude '**/.next/**' '**/node_modules/**' '**/test/**' '**/__generated__/**' --exclude '**/gql/**' ", + "relay:metaphysics": "echo 'hmmm... how to get 2 relay compilers running nicely together ... '", + "watch": "concurrently --kill-others 'yarn type-check --watch' 'yarn relay:causality --watch' 'yarn relay:metaphysics'", + "start": "next start", + "test-all": "yarn lint && yarn type-check && yarn test", "test": "jest", - "test-all": "yarn lint && yarn type-check && yarn test" + "type-check": "tsc --pretty --noEmit" }, "husky": { "hooks": { @@ -32,6 +35,10 @@ "next": "latest", "react": "^16.13.1", "react-dom": "^16.13.1", + "react-relay": "^10.0.1", + "react-relay-network-modern": "^5.0.1", + "react-relay-network-modern-ssr": "^1.4.0", + "relay-hooks": "^3.7.0", "styled-components": "^4", "swr": "^0.3.8" }, @@ -40,17 +47,23 @@ "@types/jest": "^25.1.4", "@types/node": "^13.9.5", "@types/react": "^16.9.27", + "@types/react-relay": "^7.0.17", "@typescript-eslint/eslint-plugin": "^2.25.0", "@typescript-eslint/parser": "^2.25.0", "babel-jest": "^25.2.3", + "babel-plugin-relay": "^10.0.1", + "concurrently": "^5.3.0", "eslint": "^6.8.0", "eslint-config-prettier": "^6.10.1", "eslint-plugin-react": "^7.19.0", + "graphql": "^15.4.0", "husky": "^4.2.3", "jest": "^25.2.3", "jest-watch-typeahead": "^0.5.0", "lint-staged": "^10.0.10", "prettier": "^2.0.2", - "typescript": "^3.8.3" + "relay-compiler": "^10.0.1", + "typescript": "^3.8.3", + "watchman": "^1.0.0" } } diff --git a/src/lib/auth/user.ts b/src/lib/auth/user.ts index 4420f20..8b35833 100644 --- a/src/lib/auth/user.ts +++ b/src/lib/auth/user.ts @@ -10,10 +10,12 @@ export interface UserSessionData { export async function findUser({ username, password, otp }) { const accessToken = await getGravityAccessToken({ username, password, otp }) const userProfile = await getUserProfile(accessToken) + // const causalityJwt = await getCausalityJwt(accessToken) return { ...userProfile, accessToken, + // causalityJwt, } } diff --git a/src/lib/causality/createEnvironment/client.ts b/src/lib/causality/createEnvironment/client.ts new file mode 100644 index 0000000..cef4e4b --- /dev/null +++ b/src/lib/causality/createEnvironment/client.ts @@ -0,0 +1,44 @@ +import { + RelayNetworkLayer, + cacheMiddleware, + authMiddleware, + urlMiddleware, +} from 'react-relay-network-modern/node8' +import RelaySSR from 'react-relay-network-modern-ssr/node8/client' +import { Environment, RecordSource, Store } from 'relay-runtime' +import { fetchJwt } from './fetchJwt' + +const source = new RecordSource() +const store = new Store(source) + +let storeEnvironment = null + +export default { + createEnvironment: (relayData) => { + if (storeEnvironment) return storeEnvironment + + storeEnvironment = new Environment({ + store, + + network: new RelayNetworkLayer([ + urlMiddleware({ + url: `${process.env.NEXT_PUBLIC_CAUSALITY_URL}/graphql`, + method: 'POST', + headers: { + Authorization: `Bearer ${process.env.NEXT_PUBLIC_CAUSALITY_TEMP_JWT}`, + 'content-type': 'application/json', + }, + }), + cacheMiddleware({ + size: 100, + ttl: 60 * 1000, + }), + new RelaySSR(relayData).getMiddleware({ + lookup: false, + }), + ]), + }) + + return storeEnvironment + }, +} diff --git a/src/lib/causality/createEnvironment/fetchJwt.ts b/src/lib/causality/createEnvironment/fetchJwt.ts new file mode 100644 index 0000000..c4b7a55 --- /dev/null +++ b/src/lib/causality/createEnvironment/fetchJwt.ts @@ -0,0 +1,10 @@ +import { metaphysicsFetcher } from 'lib/auth/hooks/metaphysics' + +export const fetchJwt = (): Promise<string> => + metaphysicsFetcher( + ` + query client_JwtQuery { + causalityJwt + } + ` + ).then((res) => res.data.causalityJwt) diff --git a/src/lib/causality/createEnvironment/index.ts b/src/lib/causality/createEnvironment/index.ts new file mode 100644 index 0000000..217178c --- /dev/null +++ b/src/lib/causality/createEnvironment/index.ts @@ -0,0 +1,5 @@ +export const { initEnvironment, createEnvironment } = (typeof window === +'undefined' + ? require('./server') + : require('./client') +).default diff --git a/src/lib/causality/createEnvironment/server.ts b/src/lib/causality/createEnvironment/server.ts new file mode 100644 index 0000000..314062e --- /dev/null +++ b/src/lib/causality/createEnvironment/server.ts @@ -0,0 +1,46 @@ +import { + authMiddleware, + RelayNetworkLayer, + urlMiddleware, +} from 'react-relay-network-modern/node8' +import RelaySSR from 'react-relay-network-modern-ssr/node8/server' +import { Network, Environment, RecordSource, Store } from 'relay-runtime' +// import { fetchJwt } from './fetchJwt' + +export default { + initEnvironment: () => { + const source = new RecordSource() + const store = new Store(source) + const relaySSR = new RelaySSR() + + return { + relaySSR, + + environment: new Environment({ + store, + network: new RelayNetworkLayer([ + urlMiddleware({ + url: `${process.env.NEXT_PUBLIC_CAUSALITY_URL}/graphql`, + method: 'POST', + headers: { + // FIXME: This hard-coded admin jwt cannot be used on client, how to add it from the user? Set it in cookie with access token? + Authorization: `Bearer ${process.env.NEXT_PUBLIC_CAUSALITY_TEMP_JWT}`, + 'content-type': 'application/json', + }, + }), + + relaySSR.getMiddleware(), + ]), + }), + } + }, + createEnvironment: (relayData) => { + const source = new RecordSource() + const store = new Store(source) + + return new Environment({ + store, + network: Network.create(() => relayData?.[0][1] || Promise.resolve()), + }) + }, +} diff --git a/src/lib/causality/index.ts b/src/lib/causality/index.ts new file mode 100644 index 0000000..5e84192 --- /dev/null +++ b/src/lib/causality/index.ts @@ -0,0 +1,21 @@ +import { GraphQLTaggedNode } from 'react-relay' +import { RenderProps, useQuery } from 'relay-hooks' +import { OperationType } from 'relay-runtime' + +export async function useCausality<RP extends OperationType>({ + jwt = null, + query, + variables = {}, +}: { + jwt: string | null + query: GraphQLTaggedNode + variables: object +}): Promise<RenderProps<RP>> { + if (!jwt) { + jwt = await getJwt() + } + + return useQuery(query, variables, {}) +} + +const getJwt = () => 'foo' diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index da92e14..ba6060f 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,10 +1,23 @@ import { Theme } from '@artsy/palette' +import { createEnvironment } from 'lib/causality/createEnvironment' +import React from 'react' +import { RelayEnvironmentProvider } from 'relay-hooks' import '../styles.css' export default function App({ Component, pageProps }) { + console.log({ pageProps }) return ( - <Theme> - <Component {...pageProps} /> - </Theme> + /* Our causality relay environment */ + /* + */ + <RelayEnvironmentProvider + environment={createEnvironment(pageProps.relayData)} + > + <Theme> + <Component {...pageProps} /> + </Theme> + </RelayEnvironmentProvider> + /* + */ ) } diff --git a/src/pages/auctions/[id].tsx b/src/pages/auctions/[id].tsx index b93e3c7..c5914dd 100644 --- a/src/pages/auctions/[id].tsx +++ b/src/pages/auctions/[id].tsx @@ -1,10 +1,47 @@ import React from 'react' import { metaphysicsFetcher } from 'lib/auth/hooks/metaphysics' +import { graphql } from 'react-relay' +import { useQuery } from 'relay-hooks' +import { Box, Flex, Text } from '@artsy/palette' +import { Layout } from 'components/Layout' + +const auctionDataQuery = graphql` + query Id_auctionDataQuery($saleId: ID!) { + sale(id: $saleId) { + lots { + id + } + } + } +` + +const Debug = ({ value }): JSX.Element => ( + <Flex borderRadius={4} style={{ overflow: 'scroll' }} px={1} bg="black10"> + <Text height="300px" as="pre" fontFamily="courier"> + {JSON.stringify(value, null, 2)} + </Text> + </Flex> +) export default function Auction(props) { - console.log(props) + console.warn('FFFF ' + process.env.NEXT_PUBLIC_CAUSALITY_TEMP_JWT) + if (!props?.sale?.internalID) return null + console.log({ props }) + const { error, props: auctionData } = useQuery(auctionDataQuery, { + saleId: props.sale.internalID, + }) + if (error) return <div>{error.message}</div> + + if (!auctionData) return <div>Loading</div> + // console.log({ auctionData }) + // debugger return ( - <h1>test</h1> + <Layout> + <Box p={4}> + <h1>test</h1> + <Debug value={{ props }} /> + </Box> + </Layout> ) } @@ -101,9 +138,9 @@ export const getStaticProps = async ({ params: { id } }) => { // notFound: !res.status(200) } } catch (error) { - console.error(error) + console.error({ error }) return { - notFound: true + notFound: true, } } // const auction = await res.json() diff --git a/yarn.lock b/yarn.lock index 5cceb43..593e4e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -115,7 +115,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.7.5": +"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.7.5": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== @@ -137,7 +137,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.12.5", "@babel/generator@^7.7.7": +"@babel/generator@^7.12.1", "@babel/generator@^7.12.5", "@babel/generator@^7.5.0", "@babel/generator@^7.7.7": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== @@ -373,7 +373,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.7.7": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5", "@babel/parser@^7.7.7": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== @@ -395,7 +395,7 @@ "@babel/helper-create-class-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-proposal-class-properties@^7.10.4": +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== @@ -476,7 +476,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.11.0": +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.11.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== @@ -532,7 +532,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== @@ -553,6 +553,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.1.tgz#a77670d9abe6d63e8acadf4c31bb1eb5a506bbdd" + integrity sha512-1lBLLmtxrwpm4VKmtVFselI/P3pX+G63fAtUUt6b2Nzgao77KNDwyuRt90Mj2/9pKobtt68FdvjfqohZjg/FCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -574,7 +581,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.12.1": +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== @@ -602,7 +609,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -637,7 +644,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.10.4": +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== @@ -653,21 +660,21 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-remap-async-to-generator" "^7.12.1" -"@babel/plugin-transform-block-scoped-functions@^7.10.4": +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-block-scoping@^7.10.4": +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz#f0ee727874b42a208a48a586b84c3d222c2bbef1" integrity sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-classes@^7.10.4": +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== @@ -681,14 +688,14 @@ "@babel/helper-split-export-declaration" "^7.10.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.10.4": +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-destructuring@^7.10.4": +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== @@ -718,14 +725,22 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-for-of@^7.10.4": +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz#8430decfa7eb2aea5414ed4a3fa6e1652b7d77c4" + integrity sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-flow" "^7.12.1" + +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-function-name@^7.10.4": +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== @@ -733,14 +748,14 @@ "@babel/helper-function-name" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-literals@^7.10.4": +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.10.4": +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== @@ -766,7 +781,7 @@ "@babel/helper-simple-access" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.10.4": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== @@ -809,7 +824,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-object-super@^7.10.4": +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== @@ -817,21 +832,21 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-replace-supers" "^7.12.1" -"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.12.1": +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-property-literals@^7.10.4": +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-display-name@^7.10.4": +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== @@ -861,7 +876,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-react-jsx@^7.10.4": +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.10.4": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.5.tgz#39ede0e30159770561b6963be143e40af3bde00c" integrity sha512-2xkcPqqrYiOQgSlM/iwto1paPijjsDbUynN13tI6bosDz/jOW3CRzYguIE8wKX32h+msbBM22Dv5fwrFkUOZjQ== @@ -903,14 +918,14 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.10.4": +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.11.0": +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.11.0": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== @@ -926,7 +941,7 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/helper-regex" "^7.10.4" -"@babel/plugin-transform-template-literals@^7.10.4": +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.10.4": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== @@ -1085,7 +1100,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -1426,6 +1441,14 @@ dependencies: mkdirp "^1.0.4" +"@restart/hooks@^0.3.1": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.25.tgz#11004139ad1c70d2f5965a8939dcb5aeb96aa652" + integrity sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w== + dependencies: + lodash "^4.17.15" + lodash-es "^4.17.15" + "@sinonjs/commons@^1.7.0": version "1.8.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" @@ -1672,7 +1695,15 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/react@^16.9.27": +"@types/react-relay@^7.0.17": + version "7.0.17" + resolved "https://registry.yarnpkg.com/@types/react-relay/-/react-relay-7.0.17.tgz#83f6b85c41b5fd3bb27d04d759fa4c0e4dd6a8d4" + integrity sha512-cJqOFIbp3M3/QkRpxlL4pwWRWB0lPGHevJFW8unuebkkITre8ptgknkGhAKe5IlA6ENTRJqVQXMuNdyLxl+0cQ== + dependencies: + "@types/react" "*" + "@types/relay-runtime" "*" + +"@types/react@*", "@types/react@^16.9.27": version "16.9.56" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.56.tgz#ea25847b53c5bec064933095fc366b1462e2adf0" integrity sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ== @@ -1680,6 +1711,11 @@ "@types/prop-types" "*" csstype "^3.0.2" +"@types/relay-runtime@*": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-10.0.10.tgz#b7c2ed282c62d7291cfb662b0e940ca4e193be4b" + integrity sha512-mVB6a63uzZ0PRu19A4WiGFUFww8u7cjTE6HHoKy94pUzRfQ/l3qsfjgJlzr7fA/HCM0I4spPpaUunDbp83N9uQ== + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -2272,6 +2308,22 @@ babel-plugin-jest-hoist@^25.5.0: "@babel/types" "^7.3.3" "@types/babel__traverse" "^7.0.6" +babel-plugin-macros@^2.0.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + +babel-plugin-relay@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-relay/-/babel-plugin-relay-10.0.1.tgz#7e0e12768018ed48f22c623cc1db456989c92647" + integrity sha512-0tNZFLVitUbNIHb/PuLYCqW3IvxQK8m5MomrOd5fRy4ljG86fV0KLARjedUQhwRQf32ELU7ODgXFazLza4yZYQ== + dependencies: + babel-plugin-macros "^2.0.0" + "babel-plugin-styled-components@>= 1", babel-plugin-styled-components@^1.10.0: version "1.11.1" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.11.1.tgz#5296a9e557d736c3186be079fff27c6665d63d76" @@ -2287,6 +2339,11 @@ babel-plugin-syntax-jsx@6.18.0, babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + babel-plugin-transform-define@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.0.tgz#79c3536635f899aabaf830b194b25519465675a4" @@ -2317,6 +2374,39 @@ babel-preset-current-node-syntax@^0.1.2: "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +babel-preset-fbjs@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" + integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + babel-preset-jest@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49" @@ -2870,6 +2960,15 @@ clipboard@^1.5.5: select "^1.1.2" tiny-emitter "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -3023,6 +3122,21 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" +concurrently@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" + integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== + dependencies: + chalk "^2.4.2" + date-fns "^2.0.1" + lodash "^4.17.15" + read-pkg "^4.0.1" + rxjs "^6.5.2" + spawn-command "^0.0.2-1" + supports-color "^6.1.0" + tree-kill "^1.2.2" + yargs "^13.3.0" + console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -3085,6 +3199,11 @@ core-js-pure@^3.0.0: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.7.0.tgz#28a57c861d5698e053f0ff36905f7a3301b4191e" integrity sha512-EZD2ckZysv8MMt4J6HSvS9K2GdtlZtdBncKAmF9lr2n0c9dJUaUN88PSTjvgwCgQPWKTkERXITgS6JJRAnljtg== +core-js@3: + version "3.7.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.7.0.tgz#b0a761a02488577afbf97179e4681bf49568520f" + integrity sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA== + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -3100,6 +3219,17 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + cosmiconfig@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" @@ -3359,6 +3489,11 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" +date-fns@^2.0.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b" + integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== + debounce@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" @@ -4109,6 +4244,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-files@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-5.0.1.tgz#c9492a8410be643e260a376f0151361993d5f659" + integrity sha512-qRW6y9eKF0VbCyOoOEtFhzJ3uykAw8GKwQVXyAIqwocyEWW4m+v+evec34RwtUkkxxHh7NKBLJ6AnXM8W4dH5w== + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -4141,6 +4281,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + fbjs@^0.8.0: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" @@ -4154,6 +4299,20 @@ fbjs@^0.8.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" + integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== + dependencies: + core-js "^2.4.1" + fbjs-css-vars "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -4486,6 +4645,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.4 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graphql@^15.4.0: + version "15.4.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347" + integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -4709,7 +4873,12 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -import-fresh@^3.0.0, import-fresh@^3.2.1: +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks= + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== @@ -4876,7 +5045,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.0.0: +is-core-module@^2.0.0, is-core-module@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== @@ -5589,7 +5758,7 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -5800,6 +5969,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash-es@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" + integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -6392,7 +6566,7 @@ normalize-html-whitespace@1.0.0: resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34" integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA== -normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -6438,6 +6612,11 @@ npmlog@^4.0.1, npmlog@^4.1.2: gauge "~2.7.3" set-blocking "~2.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -6656,6 +6835,14 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-json@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" @@ -6747,6 +6934,11 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -7243,6 +7435,29 @@ react-refresh@0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-relay-network-modern-ssr@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/react-relay-network-modern-ssr/-/react-relay-network-modern-ssr-1.4.0.tgz#a5e4b60e69e14769c7266a1a0f5002430c815fe1" + integrity sha512-sCIiwjzDPV9eBPOb7VcT/dmZkwrqcNpAK5eHkwjvC3Xw+RShtgB/uCSVgCUzMZpOR8iUSkzaceC/HMZdnKxF3w== + +react-relay-network-modern@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-relay-network-modern/-/react-relay-network-modern-5.0.1.tgz#bf2e900828289ada5c94e83b25a415e40447c1c0" + integrity sha512-zo5wePzKIYEZ8uzbO4LAUAOGJuNlvWAxmcpV0TJKa1iimtspSEOA34VnAAdHLpcbBx0Mj7KSa9dV390p411mqg== + dependencies: + core-js "3" + extract-files "^5.0.1" + +react-relay@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/react-relay/-/react-relay-10.0.1.tgz#7b7bf7dd9752165ab99ae0302db4b3e56c143970" + integrity sha512-zgafqWphSGFPSJ/h23zPpFGZ4tzKyj8eQPLTeZEwdbtmqAFsAIjPS0zSCo2DcsaeylEgSrQDShttpKYyEUtRAg== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^1.0.0" + nullthrows "^1.1.1" + relay-runtime "10.0.1" + react-remove-scroll-bar@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.1.0.tgz#edafe9b42a42c0dad9bdd10712772a1f9a39d7b9" @@ -7297,6 +7512,15 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -7441,6 +7665,44 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" +relay-compiler@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-10.0.1.tgz#d3029a5121cad52e1e55073210365b827cee5f3b" + integrity sha512-hrTqh81XXxPB4EgvxPmvojICr0wJnRoumxOsMZnS9dmhDHSqcBAT7+C3+rdGm5sSdNH8mbMcZM7YSPDh8ABxQw== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/parser" "^7.0.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.3.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^1.0.0" + glob "^7.1.1" + immutable "~3.7.6" + nullthrows "^1.1.1" + relay-runtime "10.0.1" + signedsource "^1.0.0" + yargs "^15.3.1" + +relay-hooks@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/relay-hooks/-/relay-hooks-3.7.0.tgz#4ed95494c5bfb82142507d1dc66d856288bc7e2e" + integrity sha512-tZnS2rjeOvWpMAKIGS0w09InX//yigtyNg2ic43aAAZaLnjnp6iCJyn7HXwPx3SO/5tCymjgF/hMBicipZJnTw== + dependencies: + "@restart/hooks" "^0.3.1" + fbjs "^1.0.0" + +relay-runtime@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-10.0.1.tgz#c83bd7e6e37234ece2a62a254e37dd199a4f74f9" + integrity sha512-sPYiuosq+5gQ7zXs2EKg2O8qRSsF8vmMYo6SIHEi4juBLg1HrdTEvqcaNztc2ZFmUc4vYZpTbbS4j/TZCtHuyA== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^1.0.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -7559,6 +7821,14 @@ resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8. is-core-module "^2.0.0" path-parse "^1.0.6" +resolve@^1.12.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -7631,7 +7901,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.0, rxjs@^6.6.3: +rxjs@^6.5.2, rxjs@^6.6.0, rxjs@^6.6.3: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== @@ -7856,6 +8126,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo= + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -8009,6 +8284,11 @@ sourcemap-codec@^1.4.4: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -8176,7 +8456,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -8266,7 +8546,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -8630,6 +8910,11 @@ traverse@0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + trunc-html@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/trunc-html/-/trunc-html-1.1.2.tgz#1e97d51f67d470b67662b1a670e6d0ea7a8edafe" @@ -8954,6 +9239,11 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" +watchman@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/watchman/-/watchman-1.0.0.tgz#a800f815957952ed9229c54610fb4a26897d2c21" + integrity sha512-f7sP6DSVQzNUAXIBctvYyJyq6/j/FtWoEn6yh/Ot/E14a3am7JMH0tygWt6iE+T+DT+BNOUAT3hM/gZ7W9Ycmw== + watchpack-chokidar2@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" @@ -9096,6 +9386,15 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -9162,11 +9461,19 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -9175,6 +9482,22 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"