diff --git a/README.md b/README.md index 270d85c..fba2c82 100644 --- a/README.md +++ b/README.md @@ -1,271 +1,754 @@ # graphbrainz -GraphQL server for the MusicBrainz API +GraphQL server for accessing the MusicBrainz API. ## Schema ```graphql - -schema { - query: RootQuery -} - +# [Aliases](https://musicbrainz.org/doc/Aliases) are variant +# names that are mostly used as search help: if a search matches an entity’s +# alias, the entity will be given as a result – even if the actual name wouldn’t +# be. They are available for artists, labels, and works. type Alias { + # The aliased name of the entity. name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). sortName: String + + # The locale (language and/or country) in which the alias is + # used. locale: String + + # Whether this is the main alias for the entity in the + # specified locale (this could mean the most recent or the most common). primary: Boolean + + # The type or purpose of the alias – whether it is a variant, + # search hint, etc. type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID } -type Area implements Entity { - id: MBID! +# [Areas](https://musicbrainz.org/doc/Area) are geographic regions +# or settlements (countries, cities, or the like). +type Area implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). sortName: String + + # A comment used to help distinguish identically named entitites. disambiguation: String isoCodes: [String] - artists(limit: Int, offset: Int): [Artist] - events(limit: Int, offset: Int): [Event] - labels(limit: Int, offset: Int): [Label] - places(limit: Int, offset: Int): [Place] - releases(limit: Int, - offset: Int, - type: ReleaseGroupType, - types: [ReleaseGroupType], - status: ReleaseStatus, - statuses: [ReleaseStatus]): [Release] + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of event entities linked to this entity. + events(after: String, first: Int): EventConnection + + # A list of label entities linked to this entity. + labels(after: String, first: Int): LabelConnection + + # A list of place entities linked to this entity. + places(after: String, first: Int): PlaceConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection } +# A connection to a list of items. type AreaConnection { - count: Int! - offset: Int! - created: Date - results: [Area]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [AreaEdge] } -type Artist implements Entity { - id: MBID! +# An edge in a connection. +type AreaEdge { + # The item at the end of the edge + node: Area + + # A cursor for use in pagination + cursor: String! +} + +# An [artist](https://musicbrainz.org/doc/Artist) is generally a +# musician, group of musicians, or other music professional (like a producer or +# engineer). Occasionally, it can also be a non-musical person (like a +# photographer, an illustrator, or a poet whose writings are set to music), or +# even a fictional character. +type Artist implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). sortName: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # [Aliases](https://musicbrainz.org/doc/Aliases) are used to + # store alternate names or misspellings. aliases: [Alias] country: String + + # The area with which an artist is primarily identified. It + # is often, but not always, its birth/formation country. area: Area beginArea: Area endArea: Area + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. lifeSpan: LifeSpan + + # Whether a person or character identifies as male, female or + # neither. Groups do not have genders. gender: String + + # The MBID associated with the + # value of the `gender` field. genderID: MBID + + # Whether an artist is a person, a group, or something else. type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID - recordings(limit: Int, offset: Int): [Recording] - releases(limit: Int, - offset: Int, - type: ReleaseGroupType, - types: [ReleaseGroupType], - status: ReleaseStatus, - statuses: [ReleaseStatus]): [Release] - releaseGroups(limit: Int, - offset: Int, - type: ReleaseGroupType, - types: [ReleaseGroupType]): [ReleaseGroup] - works(limit: Int, offset: Int): [Work] + + # A list of recording entities linked to this entity. + recordings(after: String, first: Int): RecordingConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection + + # A list of release group entities linked to this entity. + releaseGroups(after: String, first: Int, type: ReleaseGroupType, types: [ReleaseGroupType]): ReleaseGroupConnection + + # A list of work entities linked to this entity. + works(after: String, first: Int): WorkConnection + + # Relations between this entity and other entitites. relations: Relations } +# A connection to a list of items. +type ArtistConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [ArtistEdge] +} + +# [Artist credits](https://musicbrainz.org/doc/Artist_Credits) +# indicate who is the main credited artist (or artists) for releases, release +# groups, tracks and recordings, and how they are credited. They consist of +# artists, with (optionally) their names as credited in the specific release, +# track, etc., and join phrases between them. type ArtistCredit { + # The entity representing the artist referenced in the + # credits. artist: Artist + + # The name of the artist as credited in the specific release, + # track, etc. name: String + + # Join phrases might include words and/or punctuation to + # separate artist names as they appear on the release, track, etc. joinPhrase: String } -type ArtistConnection { - count: Int! - offset: Int! - created: Date - results: [Artist]! +# An edge in a connection. +type ArtistEdge { + # The item at the end of the edge + node: Artist + + # A cursor for use in pagination + cursor: String! } +# A query for all MusicBrainz entities directly linked to another +# entity. type BrowseQuery { - artists(limit: Int, - offset: Int, - area: MBID, - recording: MBID, - release: MBID, - releaseGroup: MBID, - work: MBID): ArtistConnection - events(limit: Int, - offset: Int, - area: MBID, - artist: MBID, - place: MBID): EventConnection - labels(limit: Int, - offset: Int, - area: MBID, - release: MBID): LabelConnection - places(limit: Int, - offset: Int, - area: MBID): PlaceConnection - recordings(limit: Int, - offset: Int, - artist: MBID, - release: MBID): RecordingConnection - releases(limit: Int, - offset: Int, - area: MBID, - artist: MBID, - label: MBID, - track: MBID, - trackArtist: MBID, - recording: MBID, - releaseGroup: MBID): ReleaseConnection - releaseGroups(limit: Int, - offset: Int, - artist: MBID, - release: MBID): ReleaseGroupConnection - works(limit: Int, - offset: Int, - artist: MBID): WorkConnection - urls(limit: Int, - offset: Int, - resource: URLString): URLConnection + # Browse artist entities linked to the given arguments. + artists( + after: String + first: Int + + # The MBID of an Area to which the entity is linked. + area: MBID + + # The MBID of a Recording to which the entity is linked. + recording: MBID + + # The MBID of a Release to which the entity is linked. + release: MBID + + # The MBID of a Release Group to which the entity is linked. + releaseGroup: MBID + + # The MBID of a Work to which the Artist is linked. + work: MBID + ): ArtistConnection + + # Browse event entities linked to the given arguments. + events( + after: String + first: Int + + # The MBID of an Area to which the entity is linked. + area: MBID + + # The MBID of an Artist to which the entity is linked. + artist: MBID + + # The MBID of a Place to which the Event is linked. + place: MBID + ): EventConnection + + # Browse label entities linked to the given arguments. + labels( + after: String + first: Int + + # The MBID of an Area to which the entity is linked. + area: MBID + + # The MBID of a Release to which the entity is linked. + release: MBID + ): LabelConnection + + # Browse place entities linked to the given arguments. + places( + after: String + first: Int + + # The MBID of an Area to which the entity is linked. + area: MBID + ): PlaceConnection + + # Browse recording entities linked to the given arguments. + recordings( + after: String + first: Int + + # The MBID of an Artist to which the entity is linked. + artist: MBID + + # The MBID of a Release to which the entity is linked. + release: MBID + ): RecordingConnection + + # Browse release entities linked to the given arguments. + releases( + after: String + first: Int + + # The MBID of an Area to which the entity is linked. + area: MBID + + # The MBID of an Artist to which the entity is linked. + artist: MBID + + # The MBID of a Label to which the Release is linked. + label: MBID + + # The MBID of a Track that is included in the Release. + track: MBID + + # The MBID of an Artist that appears on a Track in the + # release, but is not included in the credits for the Release itself. + trackArtist: MBID + + # The MBID of a Recording to which the entity is linked. + recording: MBID + + # The MBID of a Release Group to which the entity is linked. + releaseGroup: MBID + ): ReleaseConnection + + # Browse release group entities linked to the given arguments. + releaseGroups( + after: String + first: Int + + # The MBID of an Artist to which the entity is linked. + artist: MBID + + # The MBID of a Release to which the entity is linked. + release: MBID + ): ReleaseGroupConnection + + # Browse work entities linked to the given arguments. + works( + after: String + first: Int + + # The MBID of an Artist to which the entity is linked. + artist: MBID + ): WorkConnection + + # Browse URL entities linked to the given arguments. + urls( + after: String + first: Int + + # The web address for which to browse URL entities. + resource: URLString + ): URLConnection } +# Geographic coordinates described with latitude and longitude. type Coordinates { + # The north–south position of a point on the Earth’s surface. latitude: Degrees + + # The east–west position of a point on the Earth’s surface. longitude: Degrees } +# Year, month (optional), and day (optional) in YYYY-MM-DD format. scalar Date +# Decimal degrees, used for latitude and longitude. scalar Degrees +# An entity in the MusicBrainz schema. interface Entity { - id: MBID! + # The MBID of the entity. + mbid: MBID! } -type Event implements Entity { - id: MBID! +# An [event](https://musicbrainz.org/doc/Event) refers to an +# organised event which people can attend, and is relevant to MusicBrainz. +# Generally this means live performances, like concerts and festivals. +type Event implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. name: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. lifeSpan: LifeSpan time: Time cancelled: Boolean setlist: String type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID } +# A connection to a list of items. type EventConnection { - count: Int! - offset: Int! - created: Date - results: [Event]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [EventEdge] } -type Instrument implements Entity { - id: MBID! +# An edge in a connection. +type EventEdge { + # The item at the end of the edge + node: Event + + # A cursor for use in pagination + cursor: String! +} + +# [Instruments](https://musicbrainz.org/doc/Instrument) are +# devices created or adapted to make musical sounds. Instruments are primarily +# used in relationships between two other entities. +type Instrument implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. name: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # A brief description of the main characteristics of the + # instrument. description: String + + # The type categorises the instrument by the way the sound is + # created, similar to the [Hornbostel-Sachs](https://en.wikipedia.org/wiki/Hornbostel%E2%80%93Sachs) + # classification. type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID } +# An [IPI](https://musicbrainz.org/doc/IPI) (interested party +# information) code is an identifying number assigned by the CISAC database for +# musical rights management. scalar IPI -type Label implements Entity { - id: MBID! +# [Labels](https://musicbrainz.org/doc/Label) represent mostly +# (but not only) imprints. To a lesser extent, a label entity may be created to +# represent a record company. +type Label implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). sortName: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # The country of origin for the label. country: String + + # The area in which the label is based. area: Area + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. lifeSpan: LifeSpan + + # The [“LC” code](https://musicbrainz.org/doc/Label/Label_Code) + # of the label. labelCode: Int + + # List of IPI (interested party information) codes for the + # label. ipis: [IPI] + + # A type describing the main activity of the label, e.g. + # imprint, production, distributor, rights society, etc. type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID - releases(limit: Int, - offset: Int, - type: ReleaseGroupType, - types: [ReleaseGroupType], - status: ReleaseStatus, - statuses: [ReleaseStatus]): [Release] + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection } +# A connection to a list of items. type LabelConnection { - count: Int! - offset: Int! - created: Date - results: [Label]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [LabelEdge] } +# An edge in a connection. +type LabelEdge { + # The item at the end of the edge + node: Label + + # A cursor for use in pagination + cursor: String! +} + +# Fields indicating the begin and end date of an entity’s +# lifetime, including whether it has ended (even if the date is unknown). type LifeSpan { begin: Date end: Date ended: Boolean } +# A lookup of an individual MusicBrainz entity by its MBID. type LookupQuery { - area(id: MBID!): Area - artist(id: MBID!): Artist - event(id: MBID!): Event - instrument(id: MBID!): Instrument - label(id: MBID!): Label - place(id: MBID!): Place - recording(id: MBID!): Recording - release(id: MBID!): Release - releaseGroup(id: MBID!): ReleaseGroup - url(id: MBID!): URL - work(id: MBID!): Work + # Look up a specific area by its MBID. + area( + # The MBID of the entity. + mbid: MBID! + ): Area + + # Look up a specific artist by its MBID. + artist( + # The MBID of the entity. + mbid: MBID! + ): Artist + + # Look up a specific event by its MBID. + event( + # The MBID of the entity. + mbid: MBID! + ): Event + + # Look up a specific instrument by its MBID. + instrument( + # The MBID of the entity. + mbid: MBID! + ): Instrument + + # Look up a specific label by its MBID. + label( + # The MBID of the entity. + mbid: MBID! + ): Label + + # Look up a specific place by its MBID. + place( + # The MBID of the entity. + mbid: MBID! + ): Place + + # Look up a specific recording by its MBID. + recording( + # The MBID of the entity. + mbid: MBID! + ): Recording + + # Look up a specific release by its MBID. + release( + # The MBID of the entity. + mbid: MBID! + ): Release + + # Look up a specific release group by its MBID. + releaseGroup( + # The MBID of the entity. + mbid: MBID! + ): ReleaseGroup + + # Look up a specific series by its MBID. + series( + # The MBID of the entity. + mbid: MBID! + ): Series + + # Look up a specific URL by its MBID. + url( + # The MBID of the entity. + mbid: MBID! + ): URL + + # Look up a specific work by its MBID. + work( + # The MBID of the entity. + mbid: MBID! + ): Work } +# The MBID scalar represents MusicBrainz identifiers, which are +# 36-character UUIDs. scalar MBID -type Place implements Entity { - id: MBID! +# An object with an ID +interface Node { + # The id of the object. + id: ID! +} + +# 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 +} + +# A [place](https://musicbrainz.org/doc/Place) is a venue, studio +# or other place where music is performed, recorded, engineered, etc. +type Place implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. name: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # The address describes the location of the place using the + # standard addressing format for the country it is located in. address: String + + # The area entity representing the area, such as the city, in + # which the place is located. area: Area + + # The geographic coordinates of the place. coordinates: Coordinates + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. lifeSpan: LifeSpan + + # The type categorises the place based on its primary + # function. type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID - events(limit: Int, offset: Int): [Event] + + # A list of event entities linked to this entity. + events(after: String, first: Int): EventConnection } +# A connection to a list of items. type PlaceConnection { - count: Int! - offset: Int! - created: Date - results: [Place]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [PlaceEdge] } -type Recording implements Entity { - id: MBID! +# An edge in a connection. +type PlaceEdge { + # The item at the end of the edge + node: Place + + # A cursor for use in pagination + cursor: String! +} + +# The query root, from which multiple types of MusicBrainz +# requests can be made. +type Query { + # Fetches an object given its ID + node( + # The ID of an object + id: ID! + ): Node + + # Perform a lookup of a MusicBrainz entity by its MBID. + lookup: LookupQuery + + # Browse all MusicBrainz entities directly linked to another + # entity. + browse: BrowseQuery + + # Search for MusicBrainz entities using Lucene query + # syntax. + search: SearchQuery +} + +# A [recording](https://musicbrainz.org/doc/Recording) is an +# entity in MusicBrainz which can be linked to tracks on releases. Each track must +# always be associated with a single recording, but a recording can be linked to +# any number of tracks. +# +# A recording represents distinct audio that has been used to produce at least one +# released track through copying or mastering. A recording itself is never +# produced solely through copying or mastering. +# +# Generally, the audio represented by a recording corresponds to the audio at a +# stage in the production process before any final mastering but after any editing +# or mixing. +type Recording implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. title: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # The main credited artist(s). artistCredit: [ArtistCredit] + + # An approximation to the length of the recording, calculated + # from the lengths of the tracks using it. length: Int + + # Whether this is a video recording. video: Boolean - artists(limit: Int, offset: Int): [Artist] - releases(limit: Int, - offset: Int, - type: ReleaseGroupType, - types: [ReleaseGroupType], - status: ReleaseStatus, - statuses: [ReleaseStatus]): [Release] + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection + + # Relations between this entity and other entitites. relations: Relations } +# A connection to a list of items. type RecordingConnection { - count: Int! - offset: Int! - created: Date - results: [Recording]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [RecordingEdge] +} + +# An edge in a connection. +type RecordingEdge { + # The item at the end of the edge + node: Recording + + # A cursor for use in pagination + cursor: String! } type Relation { @@ -279,212 +762,465 @@ type Relation { ended: Boolean attributes: [String] type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID } -type Relations { - area(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - artist(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - event(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - instrument(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - label(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - place(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - recording(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - release(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - releaseGroup(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - series(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - url(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] - work(limit: Int, - offset: Int, - direction: String, - type: String, - typeID: MBID): [Relation] +# A connection to a list of items. +type RelationConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [RelationEdge] } -type Release implements Entity { - id: MBID! +# An edge in a connection. +type RelationEdge { + # The item at the end of the edge + node: Relation + + # A cursor for use in pagination + cursor: String! +} + +# Related entities. +type Relations { + area(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + artist(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + event(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + instrument(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + label(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + place(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + recording(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + release(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + releaseGroup(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + series(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + url(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection + work(after: String, first: Int, before: String, last: Int, direction: String, type: String, typeID: MBID): RelationConnection +} + +# A [release](https://musicbrainz.org/doc/Release) represents the +# unique release (i.e. issuing) of a product on a specific date with specific +# release information such as the country, label, barcode, packaging, etc. If you +# walk into a store and purchase an album or single, they’re each represented in +# MusicBrainz as one release. +type Release implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. title: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # The main credited artist(s). artistCredit: [ArtistCredit] + + # The release event for this release. releaseEvents: [ReleaseEvent] + + # The [release date](https://musicbrainz.org/doc/Release/Date) + # is the date in which a release was made available through some sort of + # distribution mechanism. date: Date + + # The country in which the release was issued. country: String + + # The [barcode](https://en.wikipedia.org/wiki/Barcode), if the + # release has one. The most common types found on releases are 12-digit + # [UPCs](https://en.wikipedia.org/wiki/Universal_Product_Code) and 13-digit + # [EANs](https://en.wikipedia.org/wiki/International_Article_Number). barcode: String - status: String + + # The status describes how “official” a release is. + status: ReleaseStatus + + # The MBID associated with the + # value of the `status` field. statusID: MBID + + # The physical packaging that accompanies the release. See + # the [list of packaging](https://musicbrainz.org/doc/Release/Packaging) for more + # information. packaging: String + + # The MBID associated with the + # value of the `packaging` field. packagingID: MBID + + # Data quality indicates how good the data for a release is. + # It is not a mark of how good or bad the music itself is – for that, use + # [ratings](https://musicbrainz.org/doc/Rating_System). quality: String - artists(limit: Int, offset: Int): [Artist] - labels(limit: Int, offset: Int): [Label] - recordings(limit: Int, offset: Int): [Recording] - releaseGroups(limit: Int, - offset: Int, - type: ReleaseGroupType, - types: [ReleaseGroupType]): [ReleaseGroup] + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of label entities linked to this entity. + labels(after: String, first: Int): LabelConnection + + # A list of recording entities linked to this entity. + recordings(after: String, first: Int): RecordingConnection + + # A list of release group entities linked to this entity. + releaseGroups(after: String, first: Int, type: ReleaseGroupType, types: [ReleaseGroupType]): ReleaseGroupConnection + + # Relations between this entity and other entitites. relations: Relations } +# A connection to a list of items. +type ReleaseConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [ReleaseEdge] +} + +# An edge in a connection. +type ReleaseEdge { + # The item at the end of the edge + node: Release + + # A cursor for use in pagination + cursor: String! +} + +# Date on which a release was released in a country/region with a +# particular label, catalog number, barcode, and what release format was used. type ReleaseEvent { area: Area date: Date } -type ReleaseGroup implements Entity { - id: MBID! +# A [release group](https://musicbrainz.org/doc/Release_Group) is +# used to group several different releases into a single logical entity. Every +# release belongs to one, and only one release group. +# +# Both release groups and releases are “albums” in a general sense, but with an +# important difference: a release is something you can buy as media such as a CD +# or a vinyl record, while a release group embraces the overall concept of an +# album – it doesn’t matter how many CDs or editions/versions it had. +type ReleaseGroup implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. title: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # The main credited artist(s). artistCredit: [ArtistCredit] + + # The date of the earliest release in the group. firstReleaseDate: Date - primaryType: String + + # The [type](https://musicbrainz.org/doc/Release_Group/Type) + # of a release group describes what kind of releases the release group represents, + # e.g. album, single, soundtrack, compilation, etc. A release group can have a + # “main” type and an unspecified number of additional types. + primaryType: ReleaseGroupType + + # The MBID associated with the + # value of the `primaryType` field. primaryTypeID: MBID - secondaryTypes: [String] + + # Additional [types](https://musicbrainz.org/doc/Release_Group/Type) + # that apply to this release group. + secondaryTypes: [ReleaseGroupType] + + # The MBIDs associated with the + # values of the `secondaryTypes` field. secondaryTypeIDs: [MBID] - artists(limit: Int, offset: Int): [Artist] - releases(limit: Int, - offset: Int, - type: ReleaseGroupType, - types: [ReleaseGroupType], - status: ReleaseStatus, - statuses: [ReleaseStatus]): [Release] + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection + + # Relations between this entity and other entitites. relations: Relations } +# A connection to a list of items. type ReleaseGroupConnection { - count: Int! - offset: Int! - created: Date - results: [ReleaseGroup]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [ReleaseGroupEdge] +} + +# An edge in a connection. +type ReleaseGroupEdge { + # The item at the end of the edge + node: ReleaseGroup + + # A cursor for use in pagination + cursor: String! } enum ReleaseGroupType { + # An album, perhaps better defined as a “Long Play” (LP) + # release, generally consists of previously unreleased material (unless this type + # is combined with secondary types which change that, such as “Compilation”). This + # includes album re-issues, with or without bonus tracks. ALBUM + + # A single typically has one main song and possibly a handful + # of additional tracks or remixes of the main track. A single is usually named + # after its main song. SINGLE + + # An EP is a so-called “Extended Play” release and often + # contains the letters EP in the title. Generally an EP will be shorter than a + # full length release (an LP or “Long Play”) and the tracks are usually exclusive + # to the EP, in other words the tracks don’t come from a previously issued + # release. EP is fairly difficult to define; usually it should only be assumed + # that a release is an EP if the artist defines it as such. EP + + # Any release that does not fit any of the other categories. OTHER + + # An episodic release that was originally broadcast via radio, + # television, or the Internet, including podcasts. BROADCAST + + # A compilation is a collection of previously released tracks + # by one or more artists. COMPILATION + + # A soundtrack is the musical score to a movie, TV series, + # stage show, computer game etc. SOUNDTRACK + + # A non-music spoken word release. SPOKENWORD + + # An interview release contains an interview, generally with + # an artist. INTERVIEW + + # An audiobook is a book read by a narrator without music. AUDIOBOOK + + # A release that was recorded live. LIVE + + # A release that was (re)mixed from previously released + # material. REMIX + + # A DJ-mix is a sequence of several recordings played one + # after the other, each one modified so that they blend together into a continuous + # flow of music. A DJ mix release requires that the recordings be modified in some + # manner, and the DJ who does this modification is usually (although not always) + # credited in a fairly prominent way. DJMIX + + # Promotional in nature (but not necessarily free), mixtapes + # and street albums are often released by artists to promote new artists, or + # upcoming studio albums by prominent artists. They are also sometimes used to + # keep fans’ attention between studio releases and are most common in rap & hip + # hop genres. They are often not sanctioned by the artist’s label, may lack proper + # sample or song clearances and vary widely in production and recording quality. + # While mixtapes are generally DJ-mixed, they are distinct from commercial DJ + # mixes (which are usually deemed compilations) and are defined by having a + # significant proportion of new material, including original production or + # original vocals over top of other artists’ instrumentals. They are distinct from + # demos in that they are designed for release directly to the public and fans; not + # to labels. MIXTAPE + + # A release that was recorded for limited circulation or + # reference use rather than for general public release. DEMO + + # A non-album track (special case). NAT } -type ReleaseConnection { - count: Int! - offset: Int! - created: Date - results: [Release]! -} - enum ReleaseStatus { + # Any release officially sanctioned by the artist and/or their + # record company. (Most releases will fit into this category.) OFFICIAL + + # A giveaway release or a release intended to promote an + # upcoming official release. (e.g. prerelease albums or releases included with a + # magazine) PROMOTION + + # An unofficial/underground release that was not sanctioned by + # the artist and/or the record company. BOOTLEG + + # A pseudo-release is a duplicate release for + # translation/transliteration purposes. PSEUDORELEASE } -type RootQuery { - lookup: LookupQuery - browse: BrowseQuery - search: SearchQuery -} - +# A search for MusicBrainz entities using Lucene query syntax. type SearchQuery { - areas(query: String!, limit: Int, offset: Int): AreaConnection - artists(query: String!, limit: Int, offset: Int): ArtistConnection - labels(query: String!, limit: Int, offset: Int): LabelConnection - places(query: String!, limit: Int, offset: Int): PlaceConnection - recordings(query: String!, limit: Int, offset: Int): RecordingConnection - releases(query: String!, limit: Int, offset: Int): ReleaseConnection - releaseGroups(query: String!, limit: Int, offset: Int): ReleaseGroupConnection - works(query: String!, limit: Int, offset: Int): WorkConnection + # Search for area entities matching the given query. + areas(query: String!, after: String, first: Int): AreaConnection + + # Search for artist entities matching the given query. + artists(query: String!, after: String, first: Int): ArtistConnection + + # Search for label entities matching the given query. + labels(query: String!, after: String, first: Int): LabelConnection + + # Search for place entities matching the given query. + places(query: String!, after: String, first: Int): PlaceConnection + + # Search for recording entities matching the given query. + recordings(query: String!, after: String, first: Int): RecordingConnection + + # Search for release entities matching the given query. + releases(query: String!, after: String, first: Int): ReleaseConnection + + # Search for release group entities matching the given query. + releaseGroups(query: String!, after: String, first: Int): ReleaseGroupConnection + + # Search for work entities matching the given query. + works(query: String!, after: String, first: Int): WorkConnection } +# A [series](https://musicbrainz.org/doc/Series) is a sequence of +# separate release groups, releases, recordings, works or events with a common +# theme. +type Series implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The type primarily describes what type of entity the series + # contains. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID +} + +# A time of day, in 24-hour hh:mm notation. scalar Time -type URL implements Entity { - id: MBID! +# A [URL](https://musicbrainz.org/doc/URL) pointing to a resource +# external to MusicBrainz, i.e. an official homepage, a site where music can be +# acquired, an entry in another database, etc. +type URL implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The actual URL string. resource: URLString! + + # Relations between this entity and other entitites. relations: Relations } +# A connection to a list of items. type URLConnection { - count: Int! - offset: Int! - created: Date - results: [URL]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [URLEdge] } +# An edge in a connection. +type URLEdge { + # The item at the end of the edge + node: URL + + # A cursor for use in pagination + cursor: String! +} + +# A web address. scalar URLString -type Work implements Entity { - id: MBID! +# A [work](https://musicbrainz.org/doc/Work) is a distinct +# intellectual or artistic creation, which can be expressed in the form of one or +# more audio recordings. +type Work implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. title: String + + # A comment used to help distinguish identically named entitites. disambiguation: String + + # A list of [ISWCs](https://musicbrainz.org/doc/ISWC) assigned + # to the work by copyright collecting agencies. iswcs: [String] + + # The language in which the work was originally written. language: String + + # The type of work. type: String + + # The MBID associated with the + # value of the `type` field. typeID: MBID - artists(limit: Int, offset: Int): [Artist] + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # Relations between this entity and other entitites. relations: Relations } +# A connection to a list of items. type WorkConnection { - count: Int! - offset: Int! - created: Date - results: [Work]! + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [WorkEdge] +} + +# An edge in a connection. +type WorkEdge { + # The item at the end of the edge + node: Work + + # A cursor for use in pagination + cursor: String! } ``` diff --git a/package.json b/package.json index 8cd727b..b35f725 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,12 @@ "version": "1.0.0", "description": "", "main": "lib/index.js", + "files": [ + "lib", + "scripts", + "Procfile", + "schema.json" + ], "engines": { "node": "^4.3.0", "npm": "^3.10.5" @@ -17,11 +23,14 @@ "lint": "standard --verbose | snazzy", "prepublish": "npm run clean && npm run check && npm run build", "print-schema": "babel-node scripts/print-schema.js", - "print-schema:json": "babel-node scripts/print-schema.js --json", + "print-schema:json": "npm run print-schema -- --json", + "print-schema:md": "printf '```graphql\\n%s\\n```' \"$(npm run -s print-schema)\"", "start": "node lib/index.js", "start:dev": "nodemon --exec babel-node src/index.js", "test": "mocha --compilers js:babel-register", - "update-schema": "npm run -s print-schema:json > schema.json" + "update-schema": "npm run update-schema:json && npm run update-schema:md", + "update-schema:json": "npm run -s print-schema:json > schema.json", + "update-schema:md": "printf '# GraphQL Schema\\n\\n%s' \"$(npm run -s print-schema:md)\" > schema.md" }, "keywords": [], "homepage": "https://github.com/exogen/graphbrainz", @@ -37,29 +46,33 @@ "license": "MIT", "dependencies": { "chalk": "^1.1.3", + "compression": "^1.6.2", "dashify": "^0.2.2", "dataloader": "^1.2.0", - "es6-error": "^3.0.1", + "debug": "^2.3.3", + "dotenv": "^2.0.0", + "es6-error": "^4.0.0", "express": "^4.14.0", - "express-graphql": "^0.5.3", - "graphql": "^0.6.2", - "graphql-relay": "^0.4.2", + "express-graphql": "^0.6.1", + "graphql": "^0.8.2", + "graphql-relay": "^0.4.4", + "lru-cache": "^4.0.1", "pascalcase": "^0.1.1", - "qs": "^6.2.1", - "request": "^2.74.0", + "qs": "^6.3.0", + "request": "^2.79.0", "retry": "^0.10.0" }, "devDependencies": { - "babel-cli": "^6.11.4", - "babel-eslint": "^6.1.2", - "babel-preset-es2015": "^6.13.2", - "babel-preset-stage-2": "^6.13.0", - "babel-register": "^6.11.6", + "babel-cli": "^6.18.0", + "babel-eslint": "^7.1.1", + "babel-preset-es2015": "^6.18.0", + "babel-preset-stage-2": "^6.18.0", + "babel-register": "^6.18.0", "chai": "^3.5.0", - "mocha": "^3.0.1", - "nodemon": "^1.10.2", - "snazzy": "^4.0.1", - "standard": "^8.0.0" + "mocha": "^3.2.0", + "nodemon": "^1.11.0", + "snazzy": "^5.0.0", + "standard": "^8.6.0" }, "standard": { "parser": "babel-eslint" diff --git a/schema.json b/schema.json index b69a33f..3479da4 100644 --- a/schema.json +++ b/schema.json @@ -2,15 +2,15 @@ "data": { "__schema": { "queryType": { - "name": "RootQuery" + "name": "Query" }, "mutationType": null, "subscriptionType": null, "types": [ { "kind": "OBJECT", - "name": "RootQuery", - "description": null, + "name": "Query", + "description": "The query root, from which multiple types of MusicBrainz\nrequests can be made.", "fields": [ { "name": "node", @@ -41,7 +41,7 @@ }, { "name": "lookup", - "description": null, + "description": "Perform a lookup of a MusicBrainz entity by its MBID.", "args": [], "type": { "kind": "OBJECT", @@ -53,7 +53,7 @@ }, { "name": "browse", - "description": null, + "description": "Browse all MusicBrainz entities directly linked to another\nentity.", "args": [], "type": { "kind": "OBJECT", @@ -65,7 +65,7 @@ }, { "name": "search", - "description": null, + "description": "Search for MusicBrainz entities using Lucene query\nsyntax.", "args": [], "type": { "kind": "OBJECT", @@ -167,6 +167,11 @@ "name": "Instrument", "ofType": null }, + { + "kind": "OBJECT", + "name": "Series", + "ofType": null + }, { "kind": "OBJECT", "name": "URL", @@ -177,21 +182,21 @@ { "kind": "OBJECT", "name": "LookupQuery", - "description": "You can perform a lookup of an entity when you have the MBID for that entity.", + "description": "A lookup of an individual MusicBrainz entity by its MBID.", "fields": [ { "name": "area", - "description": "Look up a specific Area by its MBID.", + "description": "Look up a specific area by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -208,17 +213,17 @@ }, { "name": "artist", - "description": "Look up a specific Artist by its MBID.", + "description": "Look up a specific artist by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -235,17 +240,17 @@ }, { "name": "event", - "description": "Look up a specific Event by its MBID.", + "description": "Look up a specific event by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -262,17 +267,17 @@ }, { "name": "instrument", - "description": "Look up a specific Instrument by its MBID.", + "description": "Look up a specific instrument by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -289,17 +294,17 @@ }, { "name": "label", - "description": "Look up a specific Label by its MBID.", + "description": "Look up a specific label by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -316,17 +321,17 @@ }, { "name": "place", - "description": "Look up a specific Place by its MBID.", + "description": "Look up a specific place by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -343,17 +348,17 @@ }, { "name": "recording", - "description": "Look up a specific Recording by its MBID.", + "description": "Look up a specific recording by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -370,17 +375,17 @@ }, { "name": "release", - "description": "Look up a specific Release by its MBID.", + "description": "Look up a specific release by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -397,17 +402,17 @@ }, { "name": "releaseGroup", - "description": "Look up a specific ReleaseGroup by its MBID.", + "description": "Look up a specific release group by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -423,18 +428,45 @@ "deprecationReason": null }, { - "name": "url", - "description": "Look up a specific URL by its MBID.", + "name": "series", + "description": "Look up a specific series by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "Series", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "url", + "description": "Look up a specific URL by its MBID.", + "args": [ + { + "name": "mbid", + "description": "The MBID of the entity.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", "ofType": null } }, @@ -451,17 +483,17 @@ }, { "name": "work", - "description": "Look up a specific Work by its MBID.", + "description": "Look up a specific work by its MBID.", "args": [ { - "name": "id", - "description": "The ID of an object", + "name": "mbid", + "description": "The MBID of the entity.", "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "MBID", "ofType": null } }, @@ -482,10 +514,20 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "SCALAR", + "name": "MBID", + "description": "The MBID scalar represents MusicBrainz identifiers, which are\n36-character UUIDs.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "Area", - "description": "A country, region, city or the like.", + "description": "[Areas](https://musicbrainz.org/doc/Area) are geographic regions\nor settlements (countries, cities, or the like).", "fields": [ { "name": "id", @@ -505,7 +547,7 @@ }, { "name": "mbid", - "description": null, + "description": "The MBID of the entity.", "args": [], "type": { "kind": "NON_NULL", @@ -521,7 +563,7 @@ }, { "name": "name", - "description": null, + "description": "The official name of the entity.", "args": [], "type": { "kind": "SCALAR", @@ -533,7 +575,7 @@ }, { "name": "sortName", - "description": null, + "description": "The string to use for the purpose of ordering by name (for\nexample, by moving articles like ‘the’ to the end or a person’s last name to\nthe front).", "args": [], "type": { "kind": "SCALAR", @@ -545,7 +587,7 @@ }, { "name": "disambiguation", - "description": null, + "description": "A comment used to help distinguish identically named entitites.", "args": [], "type": { "kind": "SCALAR", @@ -557,7 +599,7 @@ }, { "name": "isoCodes", - "description": null, + "description": "[ISO 3166 codes](https://en.wikipedia.org/wiki/ISO_3166) are\nthe codes assigned by ISO to countries and subdivisions.", "args": [], "type": { "kind": "LIST", @@ -573,20 +615,20 @@ }, { "name": "artists", - "description": null, + "description": "A list of artist entities linked to this entity.", "args": [ { - "name": "limit", + "name": "after", "description": null, "type": { "kind": "SCALAR", - "name": "Int", + "name": "String", "ofType": null }, "defaultValue": null }, { - "name": "offset", + "name": "first", "description": null, "type": { "kind": "SCALAR", @@ -597,33 +639,29 @@ } ], "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Artist", - "ofType": null - } + "kind": "OBJECT", + "name": "ArtistConnection", + "ofType": null }, "isDeprecated": false, "deprecationReason": null }, { "name": "events", - "description": null, + "description": "A list of event entities linked to this entity.", "args": [ { - "name": "limit", + "name": "after", "description": null, "type": { "kind": "SCALAR", - "name": "Int", + "name": "String", "ofType": null }, "defaultValue": null }, { - "name": "offset", + "name": "first", "description": null, "type": { "kind": "SCALAR", @@ -634,33 +672,29 @@ } ], "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Event", - "ofType": null - } + "kind": "OBJECT", + "name": "EventConnection", + "ofType": null }, "isDeprecated": false, "deprecationReason": null }, { "name": "labels", - "description": null, + "description": "A list of label entities linked to this entity.", "args": [ { - "name": "limit", + "name": "after", "description": null, "type": { "kind": "SCALAR", - "name": "Int", + "name": "String", "ofType": null }, "defaultValue": null }, { - "name": "offset", + "name": "first", "description": null, "type": { "kind": "SCALAR", @@ -671,33 +705,29 @@ } ], "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Label", - "ofType": null - } + "kind": "OBJECT", + "name": "LabelConnection", + "ofType": null }, "isDeprecated": false, "deprecationReason": null }, { "name": "places", - "description": null, + "description": "A list of place entities linked to this entity.", "args": [ { - "name": "limit", + "name": "after", "description": null, "type": { "kind": "SCALAR", - "name": "Int", + "name": "String", "ofType": null }, "defaultValue": null }, { - "name": "offset", + "name": "first", "description": null, "type": { "kind": "SCALAR", @@ -708,33 +738,29 @@ } ], "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Place", - "ofType": null - } + "kind": "OBJECT", + "name": "PlaceConnection", + "ofType": null }, "isDeprecated": false, "deprecationReason": null }, { "name": "releases", - "description": null, + "description": "A list of release entities linked to this entity.", "args": [ { - "name": "limit", + "name": "after", "description": null, "type": { "kind": "SCALAR", - "name": "Int", + "name": "String", "ofType": null }, "defaultValue": null }, { - "name": "offset", + "name": "first", "description": null, "type": { "kind": "SCALAR", @@ -746,16 +772,6 @@ { "name": "type", "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "types", - "description": null, "type": { "kind": "LIST", "name": null, @@ -770,16 +786,6 @@ { "name": "status", "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "statuses", - "description": null, "type": { "kind": "LIST", "name": null, @@ -793,13 +799,9 @@ } ], "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Release", - "ofType": null - } + "kind": "OBJECT", + "name": "ReleaseConnection", + "ofType": null }, "isDeprecated": false, "deprecationReason": null @@ -828,7 +830,7 @@ "fields": [ { "name": "mbid", - "description": null, + "description": "The MBID of the entity.", "args": [], "type": { "kind": "NON_NULL", @@ -897,6 +899,11 @@ "name": "Instrument", "ofType": null }, + { + "kind": "OBJECT", + "name": "Series", + "ofType": null + }, { "kind": "OBJECT", "name": "URL", @@ -904,16 +911,6 @@ } ] }, - { - "kind": "SCALAR", - "name": "MBID", - "description": "The `MBID` scalar represents MusicBrainz identifiers, which are 36-character UUIDs.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, { "kind": "SCALAR", "name": "String", @@ -934,4336 +931,6 @@ "enumValues": null, "possibleTypes": null }, - { - "kind": "OBJECT", - "name": "Artist", - "description": "An artist is generally a musician, a group of musicians, or another music professional (composer, engineer, illustrator, producer, etc.)", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sortName", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "aliases", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Alias", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "country", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "area", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Area", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "beginArea", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Area", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "endArea", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Area", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "lifeSpan", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "LifeSpan", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "gender", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "genderID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "recordings", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Recording", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releases", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "types", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - } - }, - "defaultValue": null - }, - { - "name": "status", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "statuses", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Release", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releaseGroups", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "types", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ReleaseGroup", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "works", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Work", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "relations", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Relations", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Alias", - "description": null, - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sortName", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "locale", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "primary", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Boolean", - "description": "The `Boolean` scalar type represents `true` or `false`.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "LifeSpan", - "description": "Begin and end date of an entity that may have a finite lifetime.", - "fields": [ - { - "name": "begin", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Date", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "end", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Date", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ended", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Date", - "description": "Year, month (optional), and day (optional) in YYYY-MM-DD format.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Recording", - "description": "Represents a unique mix or edit. Has title, artist credit, duration, list of PUIDs and ISRCs.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "title", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artistCredit", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ArtistCredit", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "length", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "video", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artists", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Artist", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releases", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "types", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - } - }, - "defaultValue": null - }, - { - "name": "status", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "statuses", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Release", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "relations", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Relations", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ArtistCredit", - "description": "Artist, variation of artist name and piece of text to join the artist name to the next.", - "fields": [ - { - "name": "artist", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Artist", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "joinPhrase", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "ReleaseGroupType", - "description": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "ALBUM", - "description": "An album, perhaps better defined as a “Long Play” (LP) release, generally consists of previously unreleased material (unless this type is combined with secondary types which change that, such as “Compilation”). This includes album re-issues, with or without bonus tracks.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SINGLE", - "description": "A single typically has one main song and possibly a handful of additional tracks or remixes of the main track. A single is usually named after its main song.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "EP", - "description": "An EP is a so-called “Extended Play” release and often contains the letters EP in the title. Generally an EP will be shorter than a full length release (an LP or “Long Play”) and the tracks are usually exclusive to the EP, in other words the tracks don’t come from a previously issued release. EP is fairly difficult to define; usually it should only be assumed that a release is an EP if the artist defines it as such.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "OTHER", - "description": "Any release that does not fit any of the other categories.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "BROADCAST", - "description": "An episodic release that was originally broadcast via radio, television, or the Internet, including podcasts.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "COMPILATION", - "description": "A compilation is a collection of previously released tracks by one or more artists.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SOUNDTRACK", - "description": "A soundtrack is the musical score to a movie, TV series, stage show, computer game etc.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SPOKENWORD", - "description": "A non-music spoken word release.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INTERVIEW", - "description": "An interview release contains an interview, generally with an artist.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "AUDIOBOOK", - "description": "An audiobook is a book read by a narrator without music.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "LIVE", - "description": "A release that was recorded live.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "REMIX", - "description": "A release that was (re)mixed from previously released material.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "DJMIX", - "description": "A DJ-mix is a sequence of several recordings played one after the other, each one modified so that they blend together into a continuous flow of music. A DJ mix release requires that the recordings be modified in some manner, and the DJ who does this modification is usually (although not always) credited in a fairly prominent way.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "MIXTAPE", - "description": "Promotional in nature (but not necessarily free), mixtapes and street albums are often released by artists to promote new artists, or upcoming studio albums by prominent artists. They are also sometimes used to keep fans’ attention between studio releases and are most common in rap & hip hop genres. They are often not sanctioned by the artist’s label, may lack proper sample or song clearances and vary widely in production and recording quality. While mixtapes are generally DJ-mixed, they are distinct from commercial DJ mixes (which are usually deemed compilations) and are defined by having a significant proportion of new material, including original production or original vocals over top of other artists’ instrumentals. They are distinct from demos in that they are designed for release directly to the public and fans; not to labels.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "DEMO", - "description": "A release that was recorded for limited circulation or reference use rather than for general public release.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "NAT", - "description": "A non-album track (special case).", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "ReleaseStatus", - "description": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "OFFICIAL", - "description": "Any release officially sanctioned by the artist and/or their record company. (Most releases will fit into this category.)", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "PROMOTION", - "description": "A giveaway release or a release intended to promote an upcoming official release. (e.g. prerelease albums or releases included with a magazine)", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "BOOTLEG", - "description": "An unofficial/underground release that was not sanctioned by the artist and/or the record company.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "PSEUDORELEASE", - "description": "A pseudo-release is a duplicate release for translation/transliteration purposes.", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Release", - "description": "Real-world release object you can buy in your music store. It has release date and country, list of catalog number and label pairs, packaging type and release status.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "title", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artistCredit", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ArtistCredit", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releaseEvents", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ReleaseEvent", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "date", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Date", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "country", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "barcode", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "status", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "statusID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "packaging", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "packagingID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "quality", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artists", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Artist", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "labels", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Label", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "recordings", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Recording", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releaseGroups", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "types", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ReleaseGroup", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "relations", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Relations", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ReleaseEvent", - "description": "Date on which a release was released in a country/region with a particular label, catalog number, barcode, and what release format was used.", - "fields": [ - { - "name": "area", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Area", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "date", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Date", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Label", - "description": "Labels represent mostly (but not only) imprints.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sortName", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "country", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "area", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Area", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "lifeSpan", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "LifeSpan", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "labelCode", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ipis", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "IPI", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releases", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "types", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - } - }, - "defaultValue": null - }, - { - "name": "status", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "statuses", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Release", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "IPI", - "description": "An IPI (interested party information) code is an identifying number assigned by the CISAC database for musical rights management.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ReleaseGroup", - "description": "Represents an abstract \"album\" (or \"single\", or \"EP\") entity. Technically it’s a group of releases, with a specified type.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "title", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artistCredit", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ArtistCredit", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "firstReleaseDate", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Date", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "primaryType", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "primaryTypeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "secondaryTypes", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "secondaryTypeIDs", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artists", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Artist", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releases", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "types", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseGroupType", - "ofType": null - } - }, - "defaultValue": null - }, - { - "name": "status", - "description": null, - "type": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "statuses", - "description": null, - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "ReleaseStatus", - "ofType": null - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Release", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "relations", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Relations", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Relations", - "description": null, - "fields": [ - { - "name": "area", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artist", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "event", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "instrument", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "label", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "place", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "recording", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "release", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releaseGroup", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "series", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "url", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "work", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "direction", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "type", - "description": null, - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "typeID", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Relation", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Relation", - "description": null, - "fields": [ - { - "name": "target", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "direction", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "targetType", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sourceCredit", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "targetCredit", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "begin", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Date", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "end", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Date", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ended", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "attributes", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Work", - "description": "A distinct intellectual or artistic creation, which can be expressed in the form of one or more audio recordings", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "title", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "iswcs", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "language", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "artists", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Artist", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "relations", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Relations", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Event", - "description": "An organized event which people can attend, usually live performances like concerts and festivals.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "lifeSpan", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "LifeSpan", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "time", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Time", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "cancelled", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "setlist", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Time", - "description": "A time of day, in 24-hour hh:mm notation.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Place", - "description": "A venue, studio or other place where music is performed, recorded, engineered, etc.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "address", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "area", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Area", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "coordinates", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Coordinates", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "lifeSpan", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "LifeSpan", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "events", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "Event", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Coordinates", - "description": "Geographic coordinates with latitude and longitude.", - "fields": [ - { - "name": "latitude", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Degrees", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "longitude", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Degrees", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Degrees", - "description": "Decimal degrees, used for latitude and longitude.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Instrument", - "description": "Instruments are devices created or adapted to make musical sounds.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disambiguation", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "typeID", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "URL", - "description": "A URL pointing to a resource external to MusicBrainz, i.e. an official homepage, a site where music can be acquired, an entry in another database, etc.", - "fields": [ - { - "name": "id", - "description": "The ID of an object", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "ID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mbid", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "resource", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "URLString", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "relations", - "description": null, - "args": [], - "type": { - "kind": "OBJECT", - "name": "Relations", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [ - { - "kind": "INTERFACE", - "name": "Node", - "ofType": null - }, - { - "kind": "INTERFACE", - "name": "Entity", - "ofType": null - } - ], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "URLString", - "description": "Description", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "BrowseQuery", - "description": "Browse requests are a direct lookup of all the entities directly linked to another entity.", - "fields": [ - { - "name": "artists", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "area", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "recording", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "release", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "releaseGroup", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "work", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "ArtistConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "events", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "area", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "artist", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "place", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "EventConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "labels", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "area", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "release", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "LabelConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "places", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "area", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "PlaceConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "recordings", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "artist", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "release", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "RecordingConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releases", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "area", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "artist", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "label", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "track", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "trackArtist", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "recording", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "releaseGroup", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "ReleaseConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "releaseGroups", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "artist", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "release", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "ReleaseGroupConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "works", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "artist", - "description": null, - "type": { - "kind": "SCALAR", - "name": "MBID", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "WorkConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "urls", - "description": null, - "args": [ - { - "name": "limit", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "offset", - "description": null, - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "resource", - "description": null, - "type": { - "kind": "SCALAR", - "name": "URLString", - "ofType": null - }, - "defaultValue": null - } - ], - "type": { - "kind": "OBJECT", - "name": "URLConnection", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, { "kind": "OBJECT", "name": "ArtistConnection", @@ -5374,6 +1041,16 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "SCALAR", + "name": "Boolean", + "description": "The `Boolean` scalar type represents `true` or `false`.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "ArtistEdge", @@ -5415,7 +1092,547 @@ }, { "kind": "OBJECT", - "name": "EventConnection", + "name": "Artist", + "description": "An [artist](https://musicbrainz.org/doc/Artist) is generally a\nmusician, group of musicians, or other music professional (like a producer or\nengineer). Occasionally, it can also be a non-musical person (like a\nphotographer, an illustrator, or a poet whose writings are set to music), or\neven a fictional character.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": "The official name of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sortName", + "description": "The string to use for the purpose of ordering by name (for\nexample, by moving articles like ‘the’ to the end or a person’s last name to\nthe front).", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "aliases", + "description": "[Aliases](https://musicbrainz.org/doc/Aliases) are used to\nstore alternate names or misspellings.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "Alias", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "country", + "description": "The country with which an artist is primarily identified. It\nis often, but not always, its birth/formation country.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "area", + "description": "The area with which an artist is primarily identified. It\nis often, but not always, its birth/formation country.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Area", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "beginArea", + "description": "The area in which an artist began their career (or where\nwere born, if the artist is a person).", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Area", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "endArea", + "description": "The area in which an artist ended their career (or where\nthey died, if the artist is a person).", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Area", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lifeSpan", + "description": "The begin and end dates of the entity’s existence. Its exact\nmeaning depends on the type of entity.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "LifeSpan", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gender", + "description": "Whether a person or character identifies as male, female, or\nneither. Groups do not have genders.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "genderID", + "description": "The MBID associated with the\nvalue of the `gender` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "Whether an artist is a person, a group, or something else.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "recordings", + "description": "A list of recording entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RecordingConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releases", + "description": "A list of release entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "status", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseStatus", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releaseGroups", + "description": "A list of release group entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseGroupConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "works", + "description": "A list of work entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "WorkConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "relationships", + "description": "Relationships between this entity and other entitites.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Relationships", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Alias", + "description": "[Aliases](https://musicbrainz.org/doc/Aliases) are variant names\nthat are mostly used as search help: if a search matches an entity’s alias, the\nentity will be given as a result – even if the actual name wouldn’t be. They are\navailable for artists, labels, and works.", + "fields": [ + { + "name": "name", + "description": "The aliased name of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sortName", + "description": "The string to use for the purpose of ordering by name (for\nexample, by moving articles like ‘the’ to the end or a person’s last name to\nthe front).", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "locale", + "description": "The locale (language and/or country) in which the alias is\nused.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "primary", + "description": "Whether this is the main alias for the entity in the\nspecified locale (this could mean the most recent or the most common).", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "The type or purpose of the alias – whether it is a variant,\nsearch hint, etc.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "LifeSpan", + "description": "Fields indicating the begin and end date of an entity’s\nlifetime, including whether it has ended (even if the date is unknown).", + "fields": [ + { + "name": "begin", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "end", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ended", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Date", + "description": "Year, month (optional), and day (optional) in YYYY-MM-DD format.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "RecordingConnection", "description": "A connection to a list of items.", "fields": [ { @@ -5443,7 +1660,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "EventEdge", + "name": "RecordingEdge", "ofType": null } }, @@ -5458,7 +1675,7 @@ }, { "kind": "OBJECT", - "name": "EventEdge", + "name": "RecordingEdge", "description": "An edge in a connection.", "fields": [ { @@ -5467,7 +1684,7 @@ "args": [], "type": { "kind": "OBJECT", - "name": "Event", + "name": "Recording", "ofType": null }, "isDeprecated": false, @@ -5495,6 +1712,900 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "Recording", + "description": "A [recording](https://musicbrainz.org/doc/Recording) is an\nentity in MusicBrainz which can be linked to tracks on releases. Each track must\nalways be associated with a single recording, but a recording can be linked to\nany number of tracks.\n\nA recording represents distinct audio that has been used to produce at least one\nreleased track through copying or mastering. A recording itself is never\nproduced solely through copying or mastering.\n\nGenerally, the audio represented by a recording corresponds to the audio at a\nstage in the production process before any final mastering but after any editing\nor mixing.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "title", + "description": "The official title of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artistCredit", + "description": "The main credited artist(s).", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ArtistCredit", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "length", + "description": "An approximation to the length of the recording, calculated\nfrom the lengths of the tracks using it.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "video", + "description": "Whether this is a video recording.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artists", + "description": "A list of artist entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ArtistConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releases", + "description": "A list of release entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "status", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseStatus", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "relationships", + "description": "Relationships between this entity and other entitites.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Relationships", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "ArtistCredit", + "description": "[Artist credits](https://musicbrainz.org/doc/Artist_Credits)\nindicate who is the main credited artist (or artists) for releases, release\ngroups, tracks and recordings, and how they are credited. They consist of\nartists, with (optionally) their names as credited in the specific release,\ntrack, etc., and join phrases between them.", + "fields": [ + { + "name": "artist", + "description": "The entity representing the artist referenced in the\ncredits.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Artist", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": "The name of the artist as credited in the specific release,\ntrack, etc.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "joinPhrase", + "description": "Join phrases might include words and/or punctuation to\nseparate artist names as they appear on the release, track, etc.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "ReleaseGroupType", + "description": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "ALBUM", + "description": "An album, perhaps better defined as a “Long Play” (LP)\nrelease, generally consists of previously unreleased material (unless this type\nis combined with secondary types which change that, such as “Compilation”). This\nincludes album re-issues, with or without bonus tracks.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SINGLE", + "description": "A single typically has one main song and possibly a handful\nof additional tracks or remixes of the main track. A single is usually named\nafter its main song.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "EP", + "description": "An EP is a so-called “Extended Play” release and often\ncontains the letters EP in the title. Generally an EP will be shorter than a\nfull length release (an LP or “Long Play”) and the tracks are usually exclusive\nto the EP, in other words the tracks don’t come from a previously issued\nrelease. EP is fairly difficult to define; usually it should only be assumed\nthat a release is an EP if the artist defines it as such.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OTHER", + "description": "Any release that does not fit any of the other categories.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BROADCAST", + "description": "An episodic release that was originally broadcast via radio,\ntelevision, or the Internet, including podcasts.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "COMPILATION", + "description": "A compilation is a collection of previously released tracks\nby one or more artists.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SOUNDTRACK", + "description": "A soundtrack is the musical score to a movie, TV series,\nstage show, computer game etc.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SPOKENWORD", + "description": "A non-music spoken word release.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INTERVIEW", + "description": "An interview release contains an interview, generally with\nan artist.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "AUDIOBOOK", + "description": "An audiobook is a book read by a narrator without music.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LIVE", + "description": "A release that was recorded live.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "REMIX", + "description": "A release that was (re)mixed from previously released\nmaterial.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DJMIX", + "description": "A DJ-mix is a sequence of several recordings played one\nafter the other, each one modified so that they blend together into a continuous\nflow of music. A DJ mix release requires that the recordings be modified in some\nmanner, and the DJ who does this modification is usually (although not always)\ncredited in a fairly prominent way.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MIXTAPE", + "description": "Promotional in nature (but not necessarily free), mixtapes\nand street albums are often released by artists to promote new artists, or\nupcoming studio albums by prominent artists. They are also sometimes used to\nkeep fans’ attention between studio releases and are most common in rap & hip\nhop genres. They are often not sanctioned by the artist’s label, may lack proper\nsample or song clearances and vary widely in production and recording quality.\nWhile mixtapes are generally DJ-mixed, they are distinct from commercial DJ\nmixes (which are usually deemed compilations) and are defined by having a\nsignificant proportion of new material, including original production or\noriginal vocals over top of other artists’ instrumentals. They are distinct from\ndemos in that they are designed for release directly to the public and fans; not\nto labels.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DEMO", + "description": "A release that was recorded for limited circulation or\nreference use rather than for general public release.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NAT", + "description": "A non-album track (special case).", + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "ReleaseStatus", + "description": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "OFFICIAL", + "description": "Any release officially sanctioned by the artist and/or their\nrecord company. (Most releases will fit into this category.)", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PROMOTION", + "description": "A giveaway release or a release intended to promote an\nupcoming official release. (e.g. prerelease albums or releases included with a\nmagazine)", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "BOOTLEG", + "description": "An unofficial/underground release that was not sanctioned by\nthe artist and/or the record company.", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PSEUDORELEASE", + "description": "A pseudo-release is a duplicate release for\ntranslation/transliteration purposes.", + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "ReleaseConnection", + "description": "A connection to a list of items.", + "fields": [ + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "edges", + "description": "A list of edges.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ReleaseEdge", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "ReleaseEdge", + "description": "An edge in a connection.", + "fields": [ + { + "name": "node", + "description": "The item at the end of the edge", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Release", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "cursor", + "description": "A cursor for use in pagination", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Release", + "description": "A [release](https://musicbrainz.org/doc/Release) represents the\nunique release (i.e. issuing) of a product on a specific date with specific\nrelease information such as the country, label, barcode, packaging, etc. If you\nwalk into a store and purchase an album or single, they’re each represented in\nMusicBrainz as one release.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "title", + "description": "The official title of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artistCredit", + "description": "The main credited artist(s).", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ArtistCredit", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releaseEvents", + "description": "The release events for this release.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ReleaseEvent", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "date", + "description": "The [release date](https://musicbrainz.org/doc/Release/Date)\nis the date in which a release was made available through some sort of\ndistribution mechanism.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "country", + "description": "The country in which the release was issued.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "barcode", + "description": "The [barcode](https://en.wikipedia.org/wiki/Barcode), if the\nrelease has one. The most common types found on releases are 12-digit\n[UPCs](https://en.wikipedia.org/wiki/Universal_Product_Code) and 13-digit\n[EANs](https://en.wikipedia.org/wiki/International_Article_Number).", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "status", + "description": "The status describes how “official” a release is.", + "args": [], + "type": { + "kind": "ENUM", + "name": "ReleaseStatus", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "statusID", + "description": "The MBID associated with the\nvalue of the `status` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "packaging", + "description": "The physical packaging that accompanies the release. See\nthe [list of packaging](https://musicbrainz.org/doc/Release/Packaging) for more\ninformation.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "packagingID", + "description": "The MBID associated with the\nvalue of the `packaging` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "quality", + "description": "Data quality indicates how good the data for a release is.\nIt is not a mark of how good or bad the music itself is – for that, use\n[ratings](https://musicbrainz.org/doc/Rating_System).", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artists", + "description": "A list of artist entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ArtistConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "labels", + "description": "A list of label entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "LabelConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "recordings", + "description": "A list of recording entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RecordingConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releaseGroups", + "description": "A list of release group entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseGroupConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "relationships", + "description": "Relationships between this entity and other entitites.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Relationships", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "ReleaseEvent", + "description": "Date on which a release was released in a country/region with a\nparticular label, catalog number, barcode, and what release format was used.", + "fields": [ + { + "name": "area", + "description": null, + "args": [], + "type": { + "kind": "OBJECT", + "name": "Area", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "date", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "LabelConnection", @@ -5579,101 +2690,19 @@ }, { "kind": "OBJECT", - "name": "PlaceConnection", - "description": "A connection to a list of items.", + "name": "Label", + "description": "[Labels](https://musicbrainz.org/doc/Label) represent mostly\n(but not only) imprints. To a lesser extent, a label entity may be created to\nrepresent a record company.", "fields": [ { - "name": "pageInfo", - "description": "Information to aid in pagination.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "PageInfo", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "edges", - "description": "A list of edges.", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "PlaceEdge", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "PlaceEdge", - "description": "An edge in a connection.", - "fields": [ - { - "name": "node", - "description": "The item at the end of the edge", - "args": [], - "type": { - "kind": "OBJECT", - "name": "Place", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "cursor", - "description": "A cursor for use in pagination", + "name": "id", + "description": "The ID of an object", "args": [], "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "RecordingConnection", - "description": "A connection to a list of items.", - "fields": [ - { - "name": "pageInfo", - "description": "Information to aid in pagination.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "PageInfo", + "name": "ID", "ofType": null } }, @@ -5681,81 +2710,15 @@ "deprecationReason": null }, { - "name": "edges", - "description": "A list of edges.", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "RecordingEdge", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "RecordingEdge", - "description": "An edge in a connection.", - "fields": [ - { - "name": "node", - "description": "The item at the end of the edge", - "args": [], - "type": { - "kind": "OBJECT", - "name": "Recording", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "cursor", - "description": "A cursor for use in pagination", + "name": "mbid", + "description": "The MBID of the entity.", "args": [], "type": { "kind": "NON_NULL", "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ReleaseConnection", - "description": "A connection to a list of items.", - "fields": [ - { - "name": "pageInfo", - "description": "Information to aid in pagination.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "PageInfo", + "name": "MBID", "ofType": null } }, @@ -5763,63 +2726,214 @@ "deprecationReason": null }, { - "name": "edges", - "description": "A list of edges.", + "name": "name", + "description": "The official name of the entity.", "args": [], "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "ReleaseEdge", - "ofType": null - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ReleaseEdge", - "description": "An edge in a connection.", - "fields": [ - { - "name": "node", - "description": "The item at the end of the edge", - "args": [], - "type": { - "kind": "OBJECT", - "name": "Release", + "kind": "SCALAR", + "name": "String", "ofType": null }, "isDeprecated": false, "deprecationReason": null }, { - "name": "cursor", - "description": "A cursor for use in pagination", + "name": "sortName", + "description": "The string to use for the purpose of ordering by name (for\nexample, by moving articles like ‘the’ to the end or a person’s last name to\nthe front).", "args": [], "type": { - "kind": "NON_NULL", + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "country", + "description": "The country of origin for the label.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "area", + "description": "The area in which the label is based.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Area", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lifeSpan", + "description": "The begin and end dates of the entity’s existence. Its exact\nmeaning depends on the type of entity.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "LifeSpan", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "labelCode", + "description": "The [“LC” code](https://musicbrainz.org/doc/Label/Label_Code)\nof the label.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ipis", + "description": "List of IPI (interested party information) codes for the\nlabel.", + "args": [], + "type": { + "kind": "LIST", "name": null, "ofType": { "kind": "SCALAR", - "name": "String", + "name": "IPI", "ofType": null } }, "isDeprecated": false, "deprecationReason": null + }, + { + "name": "type", + "description": "A type describing the main activity of the label, e.g.\nimprint, production, distributor, rights society, etc.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releases", + "description": "A list of release entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "status", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseStatus", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null } ], "inputFields": null, - "interfaces": [], + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "IPI", + "description": "An [IPI](https://musicbrainz.org/doc/IPI) (interested party\ninformation) code is an identifying number assigned by the CISAC database for\nmusical rights management.", + "fields": null, + "inputFields": null, + "interfaces": null, "enumValues": null, "possibleTypes": null }, @@ -5905,6 +3019,1522 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "ReleaseGroup", + "description": "A [release group](https://musicbrainz.org/doc/Release_Group) is\nused to group several different releases into a single logical entity. Every\nrelease belongs to one, and only one release group.\n\nBoth release groups and releases are “albums” in a general sense, but with an\nimportant difference: a release is something you can buy as media such as a CD\nor a vinyl record, while a release group embraces the overall concept of an\nalbum – it doesn’t matter how many CDs or editions/versions it had.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "title", + "description": "The official title of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artistCredit", + "description": "The main credited artist(s).", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "ArtistCredit", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "firstReleaseDate", + "description": "The date of the earliest release in the group.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "primaryType", + "description": "The [type](https://musicbrainz.org/doc/Release_Group/Type)\nof a release group describes what kind of releases the release group represents,\ne.g. album, single, soundtrack, compilation, etc. A release group can have a\n“main” type and an unspecified number of additional types.", + "args": [], + "type": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "primaryTypeID", + "description": "The MBID associated with the\nvalue of the `primaryType` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "secondaryTypes", + "description": "Additional [types](https://musicbrainz.org/doc/Release_Group/Type)\nthat apply to this release group.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "secondaryTypeIDs", + "description": "The MBIDs associated with the\nvalues of the `secondaryTypes` field.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artists", + "description": "A list of artist entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ArtistConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releases", + "description": "A list of release entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseGroupType", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "status", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "ReleaseStatus", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "relationships", + "description": "Relationships between this entity and other entitites.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Relationships", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Relationships", + "description": "Lists of entity relationships for each entity type.", + "fields": [ + { + "name": "areas", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artists", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "events", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "instruments", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "labels", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "places", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "recordings", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releases", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releaseGroups", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "series", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "urls", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "works", + "description": "A list of relationships between these two entity types.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "before", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "last", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "direction", + "description": "Filter by the relationship direction.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "type", + "description": "Filter by the relationship type.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RelationshipConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "RelationshipConnection", + "description": "A connection to a list of items.", + "fields": [ + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "edges", + "description": "A list of edges.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "RelationshipEdge", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "RelationshipEdge", + "description": "An edge in a connection.", + "fields": [ + { + "name": "node", + "description": "The item at the end of the edge", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Relationship", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "cursor", + "description": "A cursor for use in pagination", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Relationship", + "description": "[Relationships](https://musicbrainz.org/doc/Relationships) are a\nway to represent all the different ways in which entities are connected to each\nother and to URLs outside MusicBrainz.", + "fields": [ + { + "name": "target", + "description": "The target entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "direction", + "description": "The direction of the relationship.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "targetType", + "description": "The type of entity on the receiving end of the relationship.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sourceCredit", + "description": "How the source entity was actually credited, if different\nfrom its main (performance) name.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "targetCredit", + "description": "How the target entity was actually credited, if different\nfrom its main (performance) name.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "begin", + "description": "The date on which the relationship became applicable.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "end", + "description": "The date on which the relationship became no longer applicable.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Date", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ended", + "description": "Whether the relationship still applies.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "attributes", + "description": "Attributes which modify the relationship. There is a [list\nof all attributes](https://musicbrainz.org/relationship-attributes), but the\nattributes which are available, and how they should be used, depends on the\nrelationship type.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "The type of relationship.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "WorkConnection", @@ -5987,6 +4617,1589 @@ "enumValues": null, "possibleTypes": null }, + { + "kind": "OBJECT", + "name": "Work", + "description": "A [work](https://musicbrainz.org/doc/Work) is a distinct\nintellectual or artistic creation, which can be expressed in the form of one or\nmore audio recordings.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "title", + "description": "The official title of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "iswcs", + "description": "A list of [ISWCs](https://musicbrainz.org/doc/ISWC) assigned\nto the work by copyright collecting agencies.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "language", + "description": "The language in which the work was originally written.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "The type of work.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "artists", + "description": "A list of artist entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ArtistConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "relationships", + "description": "Relationships between this entity and other entitites.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Relationships", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "EventConnection", + "description": "A connection to a list of items.", + "fields": [ + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "edges", + "description": "A list of edges.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "EventEdge", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "EventEdge", + "description": "An edge in a connection.", + "fields": [ + { + "name": "node", + "description": "The item at the end of the edge", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Event", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "cursor", + "description": "A cursor for use in pagination", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Event", + "description": "An [event](https://musicbrainz.org/doc/Event) refers to an\norganised event which people can attend, and is relevant to MusicBrainz.\nGenerally this means live performances, like concerts and festivals.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": "The official name of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lifeSpan", + "description": "The begin and end dates of the entity’s existence. Its exact\nmeaning depends on the type of entity.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "LifeSpan", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "time", + "description": "The start time of the event.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Time", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "cancelled", + "description": "Whether or not the event took place.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "setlist", + "description": "A list of songs performed, optionally including links to\nartists and works. See the [setlist documentation](https://musicbrainz.org/doc/Event/Setlist)\nfor syntax and examples.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "What kind of event the event is, e.g. concert, festival, etc.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Time", + "description": "A time of day, in 24-hour hh:mm notation.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "PlaceConnection", + "description": "A connection to a list of items.", + "fields": [ + { + "name": "pageInfo", + "description": "Information to aid in pagination.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "edges", + "description": "A list of edges.", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PlaceEdge", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "PlaceEdge", + "description": "An edge in a connection.", + "fields": [ + { + "name": "node", + "description": "The item at the end of the edge", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Place", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "cursor", + "description": "A cursor for use in pagination", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Place", + "description": "A [place](https://musicbrainz.org/doc/Place) is a venue, studio\nor other place where music is performed, recorded, engineered, etc.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": "The official name of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "address", + "description": "The address describes the location of the place using the\nstandard addressing format for the country it is located in.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "area", + "description": "The area entity representing the area, such as the city, in\nwhich the place is located.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Area", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "coordinates", + "description": "The geographic coordinates of the place.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Coordinates", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lifeSpan", + "description": "The begin and end dates of the entity’s existence. Its exact\nmeaning depends on the type of entity.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "LifeSpan", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "The type categorises the place based on its primary\nfunction.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "events", + "description": "A list of event entities linked to this entity.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "EventConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Coordinates", + "description": "Geographic coordinates described with latitude and longitude.", + "fields": [ + { + "name": "latitude", + "description": "The north–south position of a point on the Earth’s surface.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Degrees", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "longitude", + "description": "The east–west position of a point on the Earth’s surface.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Degrees", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Degrees", + "description": "Decimal degrees, used for latitude and longitude.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Instrument", + "description": "[Instruments](https://musicbrainz.org/doc/Instrument) are\ndevices created or adapted to make musical sounds. Instruments are primarily\nused in relationships between two other entities.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": "The official name of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "description": "A brief description of the main characteristics of the\ninstrument.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "The type categorises the instrument by the way the sound is\ncreated, similar to the [Hornbostel-Sachs](https://en.wikipedia.org/wiki/Hornbostel%E2%80%93Sachs)\nclassification.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "Series", + "description": "A [series](https://musicbrainz.org/doc/Series) is a sequence of\nseparate release groups, releases, recordings, works or events with a common\ntheme.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": "The official name of the entity.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "disambiguation", + "description": "A comment used to help distinguish identically named entitites.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "description": "The type primarily describes what type of entity the series\ncontains.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "typeID", + "description": "The MBID associated with the\nvalue of the `type` field.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "URL", + "description": "A [URL](https://musicbrainz.org/doc/URL) pointing to a resource\nexternal to MusicBrainz, i.e. an official homepage, a site where music can be\nacquired, an entry in another database, etc.", + "fields": [ + { + "name": "id", + "description": "The ID of an object", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mbid", + "description": "The MBID of the entity.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "resource", + "description": "The actual URL string.", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "URLString", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "relationships", + "description": "Relationships between this entity and other entitites.", + "args": [], + "type": { + "kind": "OBJECT", + "name": "Relationships", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + { + "kind": "INTERFACE", + "name": "Node", + "ofType": null + }, + { + "kind": "INTERFACE", + "name": "Entity", + "ofType": null + } + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "URLString", + "description": "A web address.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "BrowseQuery", + "description": "A query for all MusicBrainz entities directly linked to another\nentity.", + "fields": [ + { + "name": "artists", + "description": "Browse artist entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "area", + "description": "The MBID of an area to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "recording", + "description": "The MBID of a recording to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "release", + "description": "The MBID of a release to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "releaseGroup", + "description": "The MBID of a release group to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "work", + "description": "The MBID of a work to which the artist is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ArtistConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "events", + "description": "Browse event entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "area", + "description": "The MBID of an area to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "artist", + "description": "The MBID of an artist to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "place", + "description": "The MBID of a place to which the event is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "EventConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "labels", + "description": "Browse label entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "area", + "description": "The MBID of an area to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "release", + "description": "The MBID of a release to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "LabelConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "places", + "description": "Browse place entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "area", + "description": "The MBID of an area to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "PlaceConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "recordings", + "description": "Browse recording entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "artist", + "description": "The MBID of an artist to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "release", + "description": "The MBID of a release to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "RecordingConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releases", + "description": "Browse release entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "area", + "description": "The MBID of an area to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "artist", + "description": "The MBID of an artist to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "label", + "description": "The MBID of a label to which the release is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "track", + "description": "The MBID of a track that is included in the release.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "trackArtist", + "description": "The MBID of an artist that appears on a track in the\nrelease, but is not included in the credits for the release itself.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "recording", + "description": "The MBID of a recording to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "releaseGroup", + "description": "The MBID of a release group to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "releaseGroups", + "description": "Browse release group entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "artist", + "description": "The MBID of an artist to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "release", + "description": "The MBID of a release to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "ReleaseGroupConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "works", + "description": "Browse work entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "artist", + "description": "The MBID of an artist to which the entity is linked.", + "type": { + "kind": "SCALAR", + "name": "MBID", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "WorkConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "urls", + "description": "Browse URL entities linked to the given arguments.", + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "resource", + "description": "The web address for which to browse URL entities.", + "type": { + "kind": "SCALAR", + "name": "URLString", + "ofType": null + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "URLConnection", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, { "kind": "OBJECT", "name": "URLConnection", @@ -6072,11 +6285,11 @@ { "kind": "OBJECT", "name": "SearchQuery", - "description": "Search queries provide a way to search for MusicBrainz entities using Lucene query syntax.", + "description": "A search for MusicBrainz entities using Lucene query syntax.", "fields": [ { "name": "areas", - "description": null, + "description": "Search for area entities matching the given query.", "args": [ { "name": "query", @@ -6123,7 +6336,7 @@ }, { "name": "artists", - "description": null, + "description": "Search for artist entities matching the given query.", "args": [ { "name": "query", @@ -6170,7 +6383,7 @@ }, { "name": "labels", - "description": null, + "description": "Search for label entities matching the given query.", "args": [ { "name": "query", @@ -6217,7 +6430,7 @@ }, { "name": "places", - "description": null, + "description": "Search for place entities matching the given query.", "args": [ { "name": "query", @@ -6264,7 +6477,7 @@ }, { "name": "recordings", - "description": null, + "description": "Search for recording entities matching the given query.", "args": [ { "name": "query", @@ -6311,7 +6524,7 @@ }, { "name": "releases", - "description": null, + "description": "Search for release entities matching the given query.", "args": [ { "name": "query", @@ -6358,7 +6571,7 @@ }, { "name": "releaseGroups", - "description": null, + "description": "Search for release group entities matching the given query.", "args": [ { "name": "query", @@ -6405,7 +6618,7 @@ }, { "name": "works", - "description": null, + "description": "Search for work entities matching the given query.", "args": [ { "name": "query", diff --git a/schema.md b/schema.md new file mode 100644 index 0000000..969a1d8 --- /dev/null +++ b/schema.md @@ -0,0 +1,1473 @@ +# GraphQL Schema + +```graphql +# [Aliases](https://musicbrainz.org/doc/Aliases) are variant names +# that are mostly used as search help: if a search matches an entity’s alias, the +# entity will be given as a result – even if the actual name wouldn’t be. They are +# available for artists, labels, and works. +type Alias { + # The aliased name of the entity. + name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). + sortName: String + + # The locale (language and/or country) in which the alias is + # used. + locale: String + + # Whether this is the main alias for the entity in the + # specified locale (this could mean the most recent or the most common). + primary: Boolean + + # The type or purpose of the alias – whether it is a variant, + # search hint, etc. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID +} + +# [Areas](https://musicbrainz.org/doc/Area) are geographic regions +# or settlements (countries, cities, or the like). +type Area implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). + sortName: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # [ISO 3166 codes](https://en.wikipedia.org/wiki/ISO_3166) are + # the codes assigned by ISO to countries and subdivisions. + isoCodes: [String] + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of event entities linked to this entity. + events(after: String, first: Int): EventConnection + + # A list of label entities linked to this entity. + labels(after: String, first: Int): LabelConnection + + # A list of place entities linked to this entity. + places(after: String, first: Int): PlaceConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection +} + +# A connection to a list of items. +type AreaConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [AreaEdge] +} + +# An edge in a connection. +type AreaEdge { + # The item at the end of the edge + node: Area + + # A cursor for use in pagination + cursor: String! +} + +# An [artist](https://musicbrainz.org/doc/Artist) is generally a +# musician, group of musicians, or other music professional (like a producer or +# engineer). Occasionally, it can also be a non-musical person (like a +# photographer, an illustrator, or a poet whose writings are set to music), or +# even a fictional character. +type Artist implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). + sortName: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # [Aliases](https://musicbrainz.org/doc/Aliases) are used to + # store alternate names or misspellings. + aliases: [Alias] + + # The country with which an artist is primarily identified. It + # is often, but not always, its birth/formation country. + country: String + + # The area with which an artist is primarily identified. It + # is often, but not always, its birth/formation country. + area: Area + + # The area in which an artist began their career (or where + # were born, if the artist is a person). + beginArea: Area + + # The area in which an artist ended their career (or where + # they died, if the artist is a person). + endArea: Area + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. + lifeSpan: LifeSpan + + # Whether a person or character identifies as male, female, or + # neither. Groups do not have genders. + gender: String + + # The MBID associated with the + # value of the `gender` field. + genderID: MBID + + # Whether an artist is a person, a group, or something else. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + + # A list of recording entities linked to this entity. + recordings(after: String, first: Int): RecordingConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection + + # A list of release group entities linked to this entity. + releaseGroups(after: String, first: Int, type: [ReleaseGroupType]): ReleaseGroupConnection + + # A list of work entities linked to this entity. + works(after: String, first: Int): WorkConnection + + # Relationships between this entity and other entitites. + relationships: Relationships +} + +# A connection to a list of items. +type ArtistConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [ArtistEdge] +} + +# [Artist credits](https://musicbrainz.org/doc/Artist_Credits) +# indicate who is the main credited artist (or artists) for releases, release +# groups, tracks and recordings, and how they are credited. They consist of +# artists, with (optionally) their names as credited in the specific release, +# track, etc., and join phrases between them. +type ArtistCredit { + # The entity representing the artist referenced in the + # credits. + artist: Artist + + # The name of the artist as credited in the specific release, + # track, etc. + name: String + + # Join phrases might include words and/or punctuation to + # separate artist names as they appear on the release, track, etc. + joinPhrase: String +} + +# An edge in a connection. +type ArtistEdge { + # The item at the end of the edge + node: Artist + + # A cursor for use in pagination + cursor: String! +} + +# A query for all MusicBrainz entities directly linked to another +# entity. +type BrowseQuery { + # Browse artist entities linked to the given arguments. + artists( + after: String + first: Int + + # The MBID of an area to which the entity is linked. + area: MBID + + # The MBID of a recording to which the entity is linked. + recording: MBID + + # The MBID of a release to which the entity is linked. + release: MBID + + # The MBID of a release group to which the entity is linked. + releaseGroup: MBID + + # The MBID of a work to which the artist is linked. + work: MBID + ): ArtistConnection + + # Browse event entities linked to the given arguments. + events( + after: String + first: Int + + # The MBID of an area to which the entity is linked. + area: MBID + + # The MBID of an artist to which the entity is linked. + artist: MBID + + # The MBID of a place to which the event is linked. + place: MBID + ): EventConnection + + # Browse label entities linked to the given arguments. + labels( + after: String + first: Int + + # The MBID of an area to which the entity is linked. + area: MBID + + # The MBID of a release to which the entity is linked. + release: MBID + ): LabelConnection + + # Browse place entities linked to the given arguments. + places( + after: String + first: Int + + # The MBID of an area to which the entity is linked. + area: MBID + ): PlaceConnection + + # Browse recording entities linked to the given arguments. + recordings( + after: String + first: Int + + # The MBID of an artist to which the entity is linked. + artist: MBID + + # The MBID of a release to which the entity is linked. + release: MBID + ): RecordingConnection + + # Browse release entities linked to the given arguments. + releases( + after: String + first: Int + + # The MBID of an area to which the entity is linked. + area: MBID + + # The MBID of an artist to which the entity is linked. + artist: MBID + + # The MBID of a label to which the release is linked. + label: MBID + + # The MBID of a track that is included in the release. + track: MBID + + # The MBID of an artist that appears on a track in the + # release, but is not included in the credits for the release itself. + trackArtist: MBID + + # The MBID of a recording to which the entity is linked. + recording: MBID + + # The MBID of a release group to which the entity is linked. + releaseGroup: MBID + ): ReleaseConnection + + # Browse release group entities linked to the given arguments. + releaseGroups( + after: String + first: Int + + # The MBID of an artist to which the entity is linked. + artist: MBID + + # The MBID of a release to which the entity is linked. + release: MBID + ): ReleaseGroupConnection + + # Browse work entities linked to the given arguments. + works( + after: String + first: Int + + # The MBID of an artist to which the entity is linked. + artist: MBID + ): WorkConnection + + # Browse URL entities linked to the given arguments. + urls( + after: String + first: Int + + # The web address for which to browse URL entities. + resource: URLString + ): URLConnection +} + +# Geographic coordinates described with latitude and longitude. +type Coordinates { + # The north–south position of a point on the Earth’s surface. + latitude: Degrees + + # The east–west position of a point on the Earth’s surface. + longitude: Degrees +} + +# Year, month (optional), and day (optional) in YYYY-MM-DD format. +scalar Date + +# Decimal degrees, used for latitude and longitude. +scalar Degrees + +# An entity in the MusicBrainz schema. +interface Entity { + # The MBID of the entity. + mbid: MBID! +} + +# An [event](https://musicbrainz.org/doc/Event) refers to an +# organised event which people can attend, and is relevant to MusicBrainz. +# Generally this means live performances, like concerts and festivals. +type Event implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. + lifeSpan: LifeSpan + + # The start time of the event. + time: Time + + # Whether or not the event took place. + cancelled: Boolean + + # A list of songs performed, optionally including links to + # artists and works. See the [setlist documentation](https://musicbrainz.org/doc/Event/Setlist) + # for syntax and examples. + setlist: String + + # What kind of event the event is, e.g. concert, festival, etc. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID +} + +# A connection to a list of items. +type EventConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [EventEdge] +} + +# An edge in a connection. +type EventEdge { + # The item at the end of the edge + node: Event + + # A cursor for use in pagination + cursor: String! +} + +# [Instruments](https://musicbrainz.org/doc/Instrument) are +# devices created or adapted to make musical sounds. Instruments are primarily +# used in relationships between two other entities. +type Instrument implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # A brief description of the main characteristics of the + # instrument. + description: String + + # The type categorises the instrument by the way the sound is + # created, similar to the [Hornbostel-Sachs](https://en.wikipedia.org/wiki/Hornbostel%E2%80%93Sachs) + # classification. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID +} + +# An [IPI](https://musicbrainz.org/doc/IPI) (interested party +# information) code is an identifying number assigned by the CISAC database for +# musical rights management. +scalar IPI + +# [Labels](https://musicbrainz.org/doc/Label) represent mostly +# (but not only) imprints. To a lesser extent, a label entity may be created to +# represent a record company. +type Label implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # The string to use for the purpose of ordering by name (for + # example, by moving articles like ‘the’ to the end or a person’s last name to + # the front). + sortName: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The country of origin for the label. + country: String + + # The area in which the label is based. + area: Area + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. + lifeSpan: LifeSpan + + # The [“LC” code](https://musicbrainz.org/doc/Label/Label_Code) + # of the label. + labelCode: Int + + # List of IPI (interested party information) codes for the + # label. + ipis: [IPI] + + # A type describing the main activity of the label, e.g. + # imprint, production, distributor, rights society, etc. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection +} + +# A connection to a list of items. +type LabelConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [LabelEdge] +} + +# An edge in a connection. +type LabelEdge { + # The item at the end of the edge + node: Label + + # A cursor for use in pagination + cursor: String! +} + +# Fields indicating the begin and end date of an entity’s +# lifetime, including whether it has ended (even if the date is unknown). +type LifeSpan { + begin: Date + end: Date + ended: Boolean +} + +# A lookup of an individual MusicBrainz entity by its MBID. +type LookupQuery { + # Look up a specific area by its MBID. + area( + # The MBID of the entity. + mbid: MBID! + ): Area + + # Look up a specific artist by its MBID. + artist( + # The MBID of the entity. + mbid: MBID! + ): Artist + + # Look up a specific event by its MBID. + event( + # The MBID of the entity. + mbid: MBID! + ): Event + + # Look up a specific instrument by its MBID. + instrument( + # The MBID of the entity. + mbid: MBID! + ): Instrument + + # Look up a specific label by its MBID. + label( + # The MBID of the entity. + mbid: MBID! + ): Label + + # Look up a specific place by its MBID. + place( + # The MBID of the entity. + mbid: MBID! + ): Place + + # Look up a specific recording by its MBID. + recording( + # The MBID of the entity. + mbid: MBID! + ): Recording + + # Look up a specific release by its MBID. + release( + # The MBID of the entity. + mbid: MBID! + ): Release + + # Look up a specific release group by its MBID. + releaseGroup( + # The MBID of the entity. + mbid: MBID! + ): ReleaseGroup + + # Look up a specific series by its MBID. + series( + # The MBID of the entity. + mbid: MBID! + ): Series + + # Look up a specific URL by its MBID. + url( + # The MBID of the entity. + mbid: MBID! + ): URL + + # Look up a specific work by its MBID. + work( + # The MBID of the entity. + mbid: MBID! + ): Work +} + +# The MBID scalar represents MusicBrainz identifiers, which are +# 36-character UUIDs. +scalar MBID + +# An object with an ID +interface Node { + # The id of the object. + id: ID! +} + +# 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 +} + +# A [place](https://musicbrainz.org/doc/Place) is a venue, studio +# or other place where music is performed, recorded, engineered, etc. +type Place implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The address describes the location of the place using the + # standard addressing format for the country it is located in. + address: String + + # The area entity representing the area, such as the city, in + # which the place is located. + area: Area + + # The geographic coordinates of the place. + coordinates: Coordinates + + # The begin and end dates of the entity’s existence. Its exact + # meaning depends on the type of entity. + lifeSpan: LifeSpan + + # The type categorises the place based on its primary + # function. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + + # A list of event entities linked to this entity. + events(after: String, first: Int): EventConnection +} + +# A connection to a list of items. +type PlaceConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [PlaceEdge] +} + +# An edge in a connection. +type PlaceEdge { + # The item at the end of the edge + node: Place + + # A cursor for use in pagination + cursor: String! +} + +# The query root, from which multiple types of MusicBrainz +# requests can be made. +type Query { + # Fetches an object given its ID + node( + # The ID of an object + id: ID! + ): Node + + # Perform a lookup of a MusicBrainz entity by its MBID. + lookup: LookupQuery + + # Browse all MusicBrainz entities directly linked to another + # entity. + browse: BrowseQuery + + # Search for MusicBrainz entities using Lucene query + # syntax. + search: SearchQuery +} + +# A [recording](https://musicbrainz.org/doc/Recording) is an +# entity in MusicBrainz which can be linked to tracks on releases. Each track must +# always be associated with a single recording, but a recording can be linked to +# any number of tracks. +# +# A recording represents distinct audio that has been used to produce at least one +# released track through copying or mastering. A recording itself is never +# produced solely through copying or mastering. +# +# Generally, the audio represented by a recording corresponds to the audio at a +# stage in the production process before any final mastering but after any editing +# or mixing. +type Recording implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. + title: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The main credited artist(s). + artistCredit: [ArtistCredit] + + # An approximation to the length of the recording, calculated + # from the lengths of the tracks using it. + length: Int + + # Whether this is a video recording. + video: Boolean + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection + + # Relationships between this entity and other entitites. + relationships: Relationships +} + +# A connection to a list of items. +type RecordingConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [RecordingEdge] +} + +# An edge in a connection. +type RecordingEdge { + # The item at the end of the edge + node: Recording + + # A cursor for use in pagination + cursor: String! +} + +# [Relationships](https://musicbrainz.org/doc/Relationships) are a +# way to represent all the different ways in which entities are connected to each +# other and to URLs outside MusicBrainz. +type Relationship { + # The target entity. + target: Entity! + + # The direction of the relationship. + direction: String! + + # The type of entity on the receiving end of the relationship. + targetType: String! + + # How the source entity was actually credited, if different + # from its main (performance) name. + sourceCredit: String + + # How the target entity was actually credited, if different + # from its main (performance) name. + targetCredit: String + + # The date on which the relationship became applicable. + begin: Date + + # The date on which the relationship became no longer applicable. + end: Date + + # Whether the relationship still applies. + ended: Boolean + + # Attributes which modify the relationship. There is a [list + # of all attributes](https://musicbrainz.org/relationship-attributes), but the + # attributes which are available, and how they should be used, depends on the + # relationship type. + attributes: [String] + + # The type of relationship. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID +} + +# A connection to a list of items. +type RelationshipConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [RelationshipEdge] +} + +# An edge in a connection. +type RelationshipEdge { + # The item at the end of the edge + node: Relationship + + # A cursor for use in pagination + cursor: String! +} + +# Lists of entity relationships for each entity type. +type Relationships { + # A list of relationships between these two entity types. + areas( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + artists( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + events( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + instruments( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + labels( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + places( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + recordings( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + releases( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + releaseGroups( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + series( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + urls( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection + + # A list of relationships between these two entity types. + works( + after: String + first: Int + before: String + last: Int + + # Filter by the relationship direction. + direction: String + + # Filter by the relationship type. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + ): RelationshipConnection +} + +# A [release](https://musicbrainz.org/doc/Release) represents the +# unique release (i.e. issuing) of a product on a specific date with specific +# release information such as the country, label, barcode, packaging, etc. If you +# walk into a store and purchase an album or single, they’re each represented in +# MusicBrainz as one release. +type Release implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. + title: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The main credited artist(s). + artistCredit: [ArtistCredit] + + # The release events for this release. + releaseEvents: [ReleaseEvent] + + # The [release date](https://musicbrainz.org/doc/Release/Date) + # is the date in which a release was made available through some sort of + # distribution mechanism. + date: Date + + # The country in which the release was issued. + country: String + + # The [barcode](https://en.wikipedia.org/wiki/Barcode), if the + # release has one. The most common types found on releases are 12-digit + # [UPCs](https://en.wikipedia.org/wiki/Universal_Product_Code) and 13-digit + # [EANs](https://en.wikipedia.org/wiki/International_Article_Number). + barcode: String + + # The status describes how “official” a release is. + status: ReleaseStatus + + # The MBID associated with the + # value of the `status` field. + statusID: MBID + + # The physical packaging that accompanies the release. See + # the [list of packaging](https://musicbrainz.org/doc/Release/Packaging) for more + # information. + packaging: String + + # The MBID associated with the + # value of the `packaging` field. + packagingID: MBID + + # Data quality indicates how good the data for a release is. + # It is not a mark of how good or bad the music itself is – for that, use + # [ratings](https://musicbrainz.org/doc/Rating_System). + quality: String + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of label entities linked to this entity. + labels(after: String, first: Int): LabelConnection + + # A list of recording entities linked to this entity. + recordings(after: String, first: Int): RecordingConnection + + # A list of release group entities linked to this entity. + releaseGroups(after: String, first: Int, type: [ReleaseGroupType]): ReleaseGroupConnection + + # Relationships between this entity and other entitites. + relationships: Relationships +} + +# A connection to a list of items. +type ReleaseConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [ReleaseEdge] +} + +# An edge in a connection. +type ReleaseEdge { + # The item at the end of the edge + node: Release + + # A cursor for use in pagination + cursor: String! +} + +# Date on which a release was released in a country/region with a +# particular label, catalog number, barcode, and what release format was used. +type ReleaseEvent { + area: Area + date: Date +} + +# A [release group](https://musicbrainz.org/doc/Release_Group) is +# used to group several different releases into a single logical entity. Every +# release belongs to one, and only one release group. +# +# Both release groups and releases are “albums” in a general sense, but with an +# important difference: a release is something you can buy as media such as a CD +# or a vinyl record, while a release group embraces the overall concept of an +# album – it doesn’t matter how many CDs or editions/versions it had. +type ReleaseGroup implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. + title: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The main credited artist(s). + artistCredit: [ArtistCredit] + + # The date of the earliest release in the group. + firstReleaseDate: Date + + # The [type](https://musicbrainz.org/doc/Release_Group/Type) + # of a release group describes what kind of releases the release group represents, + # e.g. album, single, soundtrack, compilation, etc. A release group can have a + # “main” type and an unspecified number of additional types. + primaryType: ReleaseGroupType + + # The MBID associated with the + # value of the `primaryType` field. + primaryTypeID: MBID + + # Additional [types](https://musicbrainz.org/doc/Release_Group/Type) + # that apply to this release group. + secondaryTypes: [ReleaseGroupType] + + # The MBIDs associated with the + # values of the `secondaryTypes` field. + secondaryTypeIDs: [MBID] + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # A list of release entities linked to this entity. + releases(after: String, first: Int, type: [ReleaseGroupType], status: [ReleaseStatus]): ReleaseConnection + + # Relationships between this entity and other entitites. + relationships: Relationships +} + +# A connection to a list of items. +type ReleaseGroupConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [ReleaseGroupEdge] +} + +# An edge in a connection. +type ReleaseGroupEdge { + # The item at the end of the edge + node: ReleaseGroup + + # A cursor for use in pagination + cursor: String! +} + +enum ReleaseGroupType { + # An album, perhaps better defined as a “Long Play” (LP) + # release, generally consists of previously unreleased material (unless this type + # is combined with secondary types which change that, such as “Compilation”). This + # includes album re-issues, with or without bonus tracks. + ALBUM + + # A single typically has one main song and possibly a handful + # of additional tracks or remixes of the main track. A single is usually named + # after its main song. + SINGLE + + # An EP is a so-called “Extended Play” release and often + # contains the letters EP in the title. Generally an EP will be shorter than a + # full length release (an LP or “Long Play”) and the tracks are usually exclusive + # to the EP, in other words the tracks don’t come from a previously issued + # release. EP is fairly difficult to define; usually it should only be assumed + # that a release is an EP if the artist defines it as such. + EP + + # Any release that does not fit any of the other categories. + OTHER + + # An episodic release that was originally broadcast via radio, + # television, or the Internet, including podcasts. + BROADCAST + + # A compilation is a collection of previously released tracks + # by one or more artists. + COMPILATION + + # A soundtrack is the musical score to a movie, TV series, + # stage show, computer game etc. + SOUNDTRACK + + # A non-music spoken word release. + SPOKENWORD + + # An interview release contains an interview, generally with + # an artist. + INTERVIEW + + # An audiobook is a book read by a narrator without music. + AUDIOBOOK + + # A release that was recorded live. + LIVE + + # A release that was (re)mixed from previously released + # material. + REMIX + + # A DJ-mix is a sequence of several recordings played one + # after the other, each one modified so that they blend together into a continuous + # flow of music. A DJ mix release requires that the recordings be modified in some + # manner, and the DJ who does this modification is usually (although not always) + # credited in a fairly prominent way. + DJMIX + + # Promotional in nature (but not necessarily free), mixtapes + # and street albums are often released by artists to promote new artists, or + # upcoming studio albums by prominent artists. They are also sometimes used to + # keep fans’ attention between studio releases and are most common in rap & hip + # hop genres. They are often not sanctioned by the artist’s label, may lack proper + # sample or song clearances and vary widely in production and recording quality. + # While mixtapes are generally DJ-mixed, they are distinct from commercial DJ + # mixes (which are usually deemed compilations) and are defined by having a + # significant proportion of new material, including original production or + # original vocals over top of other artists’ instrumentals. They are distinct from + # demos in that they are designed for release directly to the public and fans; not + # to labels. + MIXTAPE + + # A release that was recorded for limited circulation or + # reference use rather than for general public release. + DEMO + + # A non-album track (special case). + NAT +} + +enum ReleaseStatus { + # Any release officially sanctioned by the artist and/or their + # record company. (Most releases will fit into this category.) + OFFICIAL + + # A giveaway release or a release intended to promote an + # upcoming official release. (e.g. prerelease albums or releases included with a + # magazine) + PROMOTION + + # An unofficial/underground release that was not sanctioned by + # the artist and/or the record company. + BOOTLEG + + # A pseudo-release is a duplicate release for + # translation/transliteration purposes. + PSEUDORELEASE +} + +# A search for MusicBrainz entities using Lucene query syntax. +type SearchQuery { + # Search for area entities matching the given query. + areas(query: String!, after: String, first: Int): AreaConnection + + # Search for artist entities matching the given query. + artists(query: String!, after: String, first: Int): ArtistConnection + + # Search for label entities matching the given query. + labels(query: String!, after: String, first: Int): LabelConnection + + # Search for place entities matching the given query. + places(query: String!, after: String, first: Int): PlaceConnection + + # Search for recording entities matching the given query. + recordings(query: String!, after: String, first: Int): RecordingConnection + + # Search for release entities matching the given query. + releases(query: String!, after: String, first: Int): ReleaseConnection + + # Search for release group entities matching the given query. + releaseGroups(query: String!, after: String, first: Int): ReleaseGroupConnection + + # Search for work entities matching the given query. + works(query: String!, after: String, first: Int): WorkConnection +} + +# A [series](https://musicbrainz.org/doc/Series) is a sequence of +# separate release groups, releases, recordings, works or events with a common +# theme. +type Series implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official name of the entity. + name: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # The type primarily describes what type of entity the series + # contains. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID +} + +# A time of day, in 24-hour hh:mm notation. +scalar Time + +# A [URL](https://musicbrainz.org/doc/URL) pointing to a resource +# external to MusicBrainz, i.e. an official homepage, a site where music can be +# acquired, an entry in another database, etc. +type URL implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The actual URL string. + resource: URLString! + + # Relationships between this entity and other entitites. + relationships: Relationships +} + +# A connection to a list of items. +type URLConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [URLEdge] +} + +# An edge in a connection. +type URLEdge { + # The item at the end of the edge + node: URL + + # A cursor for use in pagination + cursor: String! +} + +# A web address. +scalar URLString + +# A [work](https://musicbrainz.org/doc/Work) is a distinct +# intellectual or artistic creation, which can be expressed in the form of one or +# more audio recordings. +type Work implements Node, Entity { + # The ID of an object + id: ID! + + # The MBID of the entity. + mbid: MBID! + + # The official title of the entity. + title: String + + # A comment used to help distinguish identically named entitites. + disambiguation: String + + # A list of [ISWCs](https://musicbrainz.org/doc/ISWC) assigned + # to the work by copyright collecting agencies. + iswcs: [String] + + # The language in which the work was originally written. + language: String + + # The type of work. + type: String + + # The MBID associated with the + # value of the `type` field. + typeID: MBID + + # A list of artist entities linked to this entity. + artists(after: String, first: Int): ArtistConnection + + # Relationships between this entity and other entitites. + relationships: Relationships +} + +# A connection to a list of items. +type WorkConnection { + # Information to aid in pagination. + pageInfo: PageInfo! + + # A list of edges. + edges: [WorkEdge] +} + +# An edge in a connection. +type WorkEdge { + # The item at the end of the edge + node: Work + + # A cursor for use in pagination + cursor: String! +} +``` \ No newline at end of file diff --git a/src/api.js b/src/api.js index 6bc326c..fca54e4 100644 --- a/src/api.js +++ b/src/api.js @@ -6,6 +6,8 @@ import ExtendableError from 'es6-error' import RateLimit from './rate-limit' import pkg from '../package.json' +const debug = require('debug')('graphbrainz:api') + // If the `request` callback returns an error, it indicates a failure at a lower // level than the HTTP response itself. If it's any of the following error // codes, we should retry. @@ -28,45 +30,39 @@ export class MusicBrainzError extends ExtendableError { } export default class MusicBrainz { - constructor (options = {}) { - options = { - baseURL: 'http://musicbrainz.org/ws/2/', - userAgent: `${pkg.name}/${pkg.version} ` + - `( ${pkg.homepage || pkg.author.url || pkg.author.email} )`, - timeout: 60000, - // MusicBrainz API requests are limited to an *average* of 1 req/sec. - // That means if, for example, we only need to make a few API requests to - // fulfill a query, we might as well make them all at once - as long as - // we then wait a few seconds before making more. In practice this can - // seemingly be set to about 5 requests every 5 seconds before we're - // considered to exceed the rate limit. - limit: 5, - limitPeriod: 5000, - concurrency: 10, - retries: 10, - // It's OK for `retryDelayMin` to be less than one second, even 0, because - // `RateLimit` will already make sure we don't exceed the API rate limit. - // We're not doing exponential backoff because it will help with being - // rate limited, but rather to be chill in case MusicBrainz is returning - // some other error or our network is failing. - retryDelayMin: 100, - retryDelayMax: 60000, - randomizeRetry: true, - ...options - } - this.baseURL = options.baseURL - this.userAgent = options.userAgent - this.timeout = options.timeout - this.limiter = new RateLimit({ - limit: options.limit, - period: options.limitPeriod, - concurrency: options.concurrency - }) + constructor ({ + baseURL = process.env.MUSICBRAINZ_BASE_URL || 'http://musicbrainz.org/ws/2/', + userAgent = `${pkg.name}/${pkg.version} ` + + `( ${pkg.homepage || pkg.author.url || pkg.author.email} )`, + timeout = 60000, + // MusicBrainz API requests are limited to an *average* of 1 req/sec. + // That means if, for example, we only need to make a few API requests to + // fulfill a query, we might as well make them all at once - as long as + // we then wait a few seconds before making more. In practice this can + // seemingly be set to about 5 requests every 5 seconds before we're + // considered to exceed the rate limit. + limit = 5, + period = 5000, + concurrency = 10, + retries = 10, + // It's OK for `retryDelayMin` to be less than one second, even 0, because + // `RateLimit` will already make sure we don't exceed the API rate limit. + // We're not doing exponential backoff because it will help with being + // rate limited, but rather to be chill in case MusicBrainz is returning + // some other error or our network is failing. + retryDelayMin = 100, + retryDelayMax = 60000, + randomizeRetry = true + } = {}) { + this.baseURL = baseURL + this.userAgent = userAgent + this.timeout = timeout + this.limiter = new RateLimit({ limit, period, concurrency }) this.retryOptions = { - retries: options.retries, - minTimeout: options.retryDelayMin, - maxTimeout: options.retryDelayMax, - randomize: options.randomizeRetry + retries, + minTimeout: retryDelayMin, + maxTimeout: retryDelayMax, + randomize: randomizeRetry } } @@ -98,8 +94,7 @@ export default class MusicBrainz { timeout: this.timeout } - const attempt = `(attempt #${info.currentAttempt})` - console.log('GET:', path, info.currentAttempt > 1 ? attempt : '') + debug(path, info.currentAttempt > 1 ? `(attempt #${info.currentAttempt})` : '') request(options, (err, response, body) => { if (err) { diff --git a/src/index.js b/src/index.js index 3b3a799..6eab425 100644 --- a/src/index.js +++ b/src/index.js @@ -1,24 +1,37 @@ import express from 'express' import graphqlHTTP from 'express-graphql' +import compression from 'compression' +import MusicBrainz from './api' import schema from './schema' -import { lookupLoader, browseLoader, searchLoader } from './loaders' +import createLoaders from './loaders' -const app = express() - -app.use('/graphql', graphqlHTTP({ - schema, - context: { lookupLoader, browseLoader, searchLoader }, - pretty: true, - graphiql: true, - formatError: error => ({ - message: error.message, - locations: error.locations, - stack: error.stack - }) -})) - -app.get('/graphiql', (req, res) => { - res.redirect(`/graph${req.url.slice(7)}`) +const formatError = (err) => ({ + message: err.message, + locations: err.locations, + stack: err.stack }) -app.listen(process.env.PORT || 3001) +const middleware = ({ client = new MusicBrainz(), ...options } = {}) => { + const DEV = process.env.NODE_ENV !== 'production' + const loaders = createLoaders(client) + return graphqlHTTP({ + schema, + context: { client, loaders }, + pretty: DEV, + graphiql: DEV, + formatError: DEV ? formatError : undefined, + ...options + }) +} + +export default middleware + +if (require.main === module) { + require('dotenv').config({ silent: true }) + const app = express() + const port = process.env.PORT || 3000 + const route = process.env.GRAPHBRAINZ_PATH || '/' + app.use(compression()) + app.use(route, middleware()) + app.listen(port) +} diff --git a/src/loaders.js b/src/loaders.js index 181d9c8..05e7107 100644 --- a/src/loaders.js +++ b/src/loaders.js @@ -1,48 +1,64 @@ import DataLoader from 'dataloader' -import MusicBrainz from './api' +import LRUCache from 'lru-cache' +import { toPlural } from './types/helpers' -const client = new MusicBrainz() +const debug = require('debug')('graphbrainz:loaders') -export const lookupLoader = new DataLoader(keys => { - return Promise.all(keys.map(key => { - const [ entityType, id, params ] = key - return client.lookup(entityType, id, params).then(entity => { - if (entity) { - entity.entityType = entityType - } - return entity - }) - })) -}, { - cacheKeyFn: (key) => client.getLookupURL(...key) -}) +export default function createLoaders (client) { + const cache = LRUCache({ + max: 8192, + maxAge: 24 * 60 * 60 * 1000, // 1 day. + dispose (key) { + debug(`Removed '${key}' from cache.`) + } + }) + cache.delete = cache.del + cache.clear = cache.reset -export const browseLoader = new DataLoader(keys => { - return Promise.all(keys.map(key => { - const [ entityType, params ] = key - const pluralName = entityType.endsWith('s') ? entityType : `${entityType}s` - return client.browse(entityType, params).then(list => { - list[pluralName].forEach(entity => { - entity.entityType = entityType + const lookup = new DataLoader(keys => { + return Promise.all(keys.map(key => { + const [ entityType, id, params ] = key + return client.lookup(entityType, id, params).then(entity => { + if (entity) { + entity.entityType = entityType + } + return entity }) - return list - }) - })) -}, { - cacheKeyFn: (key) => client.getBrowseURL(...key) -}) + })) + }, { + cacheKeyFn: (key) => client.getLookupURL(...key), + cacheMap: cache + }) -export const searchLoader = new DataLoader(keys => { - return Promise.all(keys.map(key => { - const [ entityType, query, params ] = key - const pluralName = entityType.endsWith('s') ? entityType : `${entityType}s` - return client.search(entityType, query, params).then(list => { - list[pluralName].forEach(entity => { - entity.entityType = entityType + const browse = new DataLoader(keys => { + return Promise.all(keys.map(key => { + const [ entityType, params ] = key + return client.browse(entityType, params).then(list => { + list[toPlural(entityType)].forEach(entity => { + entity.entityType = entityType + }) + return list }) - return list - }) - })) -}, { - cacheKeyFn: (key) => client.getSearchURL(...key) -}) + })) + }, { + cacheKeyFn: (key) => client.getBrowseURL(...key), + cacheMap: cache + }) + + const search = new DataLoader(keys => { + return Promise.all(keys.map(key => { + const [ entityType, query, params ] = key + return client.search(entityType, query, params).then(list => { + list[toPlural(entityType)].forEach(entity => { + entity.entityType = entityType + }) + return list + }) + })) + }, { + cacheKeyFn: (key) => client.getSearchURL(...key), + cacheMap: cache + }) + + return { lookup, browse, search } +} diff --git a/src/queries/browse.js b/src/queries/browse.js index 4e7f677..8bbc11c 100644 --- a/src/queries/browse.js +++ b/src/queries/browse.js @@ -14,10 +14,34 @@ import { URLConnection, WorkConnection } from '../types' +import { toWords } from '../types/helpers' + +const area = { + type: MBID, + description: 'The MBID of an area to which the entity is linked.' +} +const artist = { + type: MBID, + description: 'The MBID of an artist to which the entity is linked.' +} +const recording = { + type: MBID, + description: 'The MBID of a recording to which the entity is linked.' +} +const release = { + type: MBID, + description: 'The MBID of a release to which the entity is linked.' +} +const releaseGroup = { + type: MBID, + description: 'The MBID of a release group to which the entity is linked.' +} function browseQuery (connectionType, args) { + const typeName = toWords(connectionType.name.slice(0, -10)) return { type: connectionType, + description: `Browse ${typeName} entities linked to the given arguments.`, args: { ...forwardConnectionArgs, ...args @@ -28,51 +52,69 @@ function browseQuery (connectionType, args) { export default new GraphQLObjectType({ name: 'BrowseQuery', - description: - 'Browse requests are a direct lookup of all the entities directly linked ' + - 'to another entity.', + description: `A query for all MusicBrainz entities directly linked to another +entity.`, fields: { artists: browseQuery(ArtistConnection, { - area: { type: MBID }, - recording: { type: MBID }, - release: { type: MBID }, - releaseGroup: { type: MBID }, - work: { type: MBID } + area, + recording, + release, + releaseGroup, + work: { + type: MBID, + description: 'The MBID of a work to which the artist is linked.' + } }), events: browseQuery(EventConnection, { - area: { type: MBID }, - artist: { type: MBID }, - place: { type: MBID } + area, + artist, + place: { + type: MBID, + description: 'The MBID of a place to which the event is linked.' + } }), labels: browseQuery(LabelConnection, { - area: { type: MBID }, - release: { type: MBID } + area, + release }), places: browseQuery(PlaceConnection, { - area: { type: MBID } + area }), recordings: browseQuery(RecordingConnection, { - artist: { type: MBID }, - release: { type: MBID } + artist, + release }), releases: browseQuery(ReleaseConnection, { - area: { type: MBID }, - artist: { type: MBID }, - label: { type: MBID }, - track: { type: MBID }, - trackArtist: { type: MBID }, - recording: { type: MBID }, - releaseGroup: { type: MBID } + area, + artist, + label: { + type: MBID, + description: 'The MBID of a label to which the release is linked.' + }, + track: { + type: MBID, + description: 'The MBID of a track that is included in the release.' + }, + trackArtist: { + type: MBID, + description: `The MBID of an artist that appears on a track in the +release, but is not included in the credits for the release itself.` + }, + recording, + releaseGroup }), releaseGroups: browseQuery(ReleaseGroupConnection, { - artist: { type: MBID }, - release: { type: MBID } + artist, + release }), works: browseQuery(WorkConnection, { - artist: { type: MBID } + artist }), urls: browseQuery(URLConnection, { - resource: { type: URLString } + resource: { + type: URLString, + description: 'The web address for which to browse URL entities.' + } }) } }) diff --git a/src/queries/lookup.js b/src/queries/lookup.js index a1b8af7..b3ca639 100644 --- a/src/queries/lookup.js +++ b/src/queries/lookup.js @@ -1,6 +1,6 @@ import { GraphQLObjectType } from 'graphql' import { lookupResolver } from '../resolvers' -import { mbid } from '../types/helpers' +import { mbid, toWords } from '../types/helpers' import { Area, Artist, @@ -17,9 +17,10 @@ import { } from '../types' function lookupQuery (entity) { + const typeName = toWords(entity.name) return { type: entity, - description: `Look up a specific ${entity.name} by its MBID.`, + description: `Look up a specific ${typeName} by its MBID.`, args: { mbid }, resolve: lookupResolver() } @@ -27,9 +28,7 @@ function lookupQuery (entity) { export default new GraphQLObjectType({ name: 'LookupQuery', - description: - 'You can perform a lookup of an entity when you have the MBID for that ' + - 'entity.', + description: 'A lookup of an individual MusicBrainz entity by its MBID.', fields: { area: lookupQuery(Area), artist: lookupQuery(Artist), diff --git a/src/queries/search.js b/src/queries/search.js index 4ec9c55..dc2c168 100644 --- a/src/queries/search.js +++ b/src/queries/search.js @@ -11,10 +11,13 @@ import { ReleaseGroupConnection, WorkConnection } from '../types' +import { toWords } from '../types/helpers' function searchQuery (connectionType) { + const typeName = toWords(connectionType.name.slice(0, -10)) return { type: connectionType, + description: `Search for ${typeName} entities matching the given query.`, args: { query: { type: new GraphQLNonNull(GraphQLString) }, ...forwardConnectionArgs @@ -25,9 +28,7 @@ function searchQuery (connectionType) { export default new GraphQLObjectType({ name: 'SearchQuery', - description: - 'Search queries provide a way to search for MusicBrainz entities using ' + - 'Lucene query syntax.', + description: 'A search for MusicBrainz entities using Lucene query syntax.', fields: { areas: searchQuery(AreaConnection), artists: searchQuery(ArtistConnection), diff --git a/src/rate-limit.js b/src/rate-limit.js index 73e2e10..14bfd9e 100644 --- a/src/rate-limit.js +++ b/src/rate-limit.js @@ -1,16 +1,14 @@ export default class RateLimit { - constructor (options = {}) { - options = { - limit: 1, - period: 1000, - concurrency: options.limit || 1, - defaultPriority: 1, - ...options - } - this.limit = options.limit - this.period = options.period - this.defaultPriority = options.defaultPriority - this.concurrency = options.concurrency + constructor ({ + limit = 1, + period = 1000, + concurrency = limit || 1, + defaultPriority = 1 + } = {}) { + this.limit = limit + this.period = period + this.defaultPriority = defaultPriority + this.concurrency = concurrency this.queues = [] this.numPending = 0 this.periodStart = null diff --git a/src/resolvers.js b/src/resolvers.js index 724858c..1838003 100644 --- a/src/resolvers.js +++ b/src/resolvers.js @@ -1,4 +1,4 @@ -import { toEntityType } from './types/helpers' +import { toDashed, toSingular } from './types/helpers' import { getOffsetWithDefault, connectionFromArray, @@ -6,18 +6,20 @@ import { } from 'graphql-relay' import { getFields, extendIncludes } from './util' -export function includeRelations (params, info) { +export function includeRelationships (params, info) { let fields = getFields(info) - if (info.fieldName !== 'relations') { - if (fields.relations) { - fields = getFields(fields.relations) + if (info.fieldName !== 'relationships') { + if (fields.relationships) { + fields = getFields(fields.relationships) } else { return params } } if (fields) { - const relations = Object.keys(fields) - const includeRels = relations.map(key => `${toEntityType(key)}-rels`) + const relationships = Object.keys(fields) + const includeRels = relationships.map(field => { + return `${toDashed(toSingular(field))}-rels` + }) if (includeRels.length) { params = { ...params, @@ -40,43 +42,30 @@ export function includeSubqueries (params, info) { } export function lookupResolver () { - return (root, { mbid }, { lookupLoader }, info) => { - const entityType = toEntityType(info.fieldName) - const params = includeRelations({}, info) - return lookupLoader.load([entityType, mbid, params]) + return (root, { mbid }, { loaders }, info) => { + const entityType = toDashed(info.fieldName) + const params = includeRelationships({}, info) + return loaders.lookup.load([entityType, mbid, params]) } } export function browseResolver () { - return (source, { first = 25, after, ...args }, { browseLoader }, info) => { - const pluralName = toEntityType(info.fieldName) - let singularName = pluralName - if (pluralName.endsWith('s')) { - singularName = pluralName.slice(0, -1) - } - const { type, types, status, statuses, ...moreParams } = args + return (source, { first = 25, after, type = [], status = [], ...args }, { loaders }, info) => { + const pluralName = toDashed(info.fieldName) + const singularName = toSingular(pluralName) let params = { - ...moreParams, - type: [], - status: [], + ...args, + type, + status, limit: first, offset: getOffsetWithDefault(after, 0) } params = includeSubqueries(params, info) - params = includeRelations(params, info) - if (type) { - params.type.push(type) - } - if (types) { - params.type.push(...types) - } - if (status) { - params.status.push(status) - } - if (statuses) { - params.status.push(...statuses) - } - return browseLoader.load([singularName, params]).then(list => { + params = includeRelationships(params, info) + const formatValue = value => value.toLowerCase().replace(/ /g, '') + params.type = params.type.map(formatValue) + params.status = params.status.map(formatValue) + return loaders.browse.load([singularName, params]).then(list => { const { [pluralName]: arraySlice, [`${singularName}-offset`]: sliceStart, @@ -89,16 +78,13 @@ export function browseResolver () { } export function searchResolver () { - return (source, { first = 25, after, ...args }, { searchLoader }, info) => { - const pluralName = toEntityType(info.fieldName) - let singularName = pluralName - if (pluralName.endsWith('s')) { - singularName = pluralName.slice(0, -1) - } + return (source, { first = 25, after, ...args }, { loaders }, info) => { + const pluralName = toDashed(info.fieldName) + const singularName = toSingular(pluralName) const { query, ...params } = args params.limit = first params.offset = getOffsetWithDefault(after, 0) - return searchLoader.load([singularName, query, params]).then(list => { + return loaders.search.load([singularName, query, params]).then(list => { const { [pluralName]: arraySlice, offset: sliceStart, @@ -110,31 +96,31 @@ export function searchResolver () { } } -export function relationResolver () { +export function relationshipResolver () { return (source, args, context, info) => { - const targetType = toEntityType(info.fieldName).replace('-', '_') - const relations = source.filter(relation => { - if (relation['target-type'] !== targetType) { + const targetType = toDashed(toSingular(info.fieldName)).replace('-', '_') + const relationships = source.filter(rel => { + if (rel['target-type'] !== targetType) { return false } - if (args.direction != null && relation.direction !== args.direction) { + if (args.direction != null && rel.direction !== args.direction) { return false } - if (args.type != null && relation.type !== args.type) { + if (args.type != null && rel.type !== args.type) { return false } - if (args.typeID != null && relation['type-id'] !== args.typeID) { + if (args.typeID != null && rel['type-id'] !== args.typeID) { return false } return true }) - return connectionFromArray(relations, args) + return connectionFromArray(relationships, args) } } export function linkedResolver () { return (source, args, context, info) => { - const parentEntity = toEntityType(info.parentType.name) + const parentEntity = toDashed(info.parentType.name) args = { ...args, [parentEntity]: source.id } return browseResolver()(source, args, context, info) } diff --git a/src/schema.js b/src/schema.js index 6db22e7..428ba7a 100644 --- a/src/schema.js +++ b/src/schema.js @@ -4,12 +4,28 @@ import { nodeField } from './types/node' export default new GraphQLSchema({ query: new GraphQLObjectType({ - name: 'RootQuery', + name: 'Query', + description: `The query root, from which multiple types of MusicBrainz +requests can be made.`, fields: () => ({ node: nodeField, - lookup: { type: LookupQuery, resolve: () => ({}) }, - browse: { type: BrowseQuery, resolve: () => ({}) }, - search: { type: SearchQuery, resolve: () => ({}) } + lookup: { + type: LookupQuery, + description: 'Perform a lookup of a MusicBrainz entity by its MBID.', + resolve: () => ({}) + }, + browse: { + type: BrowseQuery, + description: `Browse all MusicBrainz entities directly linked to another +entity.`, + resolve: () => ({}) + }, + search: { + type: SearchQuery, + description: `Search for MusicBrainz entities using Lucene query +syntax.`, + resolve: () => ({}) + } }) }) }) diff --git a/src/types/alias.js b/src/types/alias.js index 689e21b..b175e40 100644 --- a/src/types/alias.js +++ b/src/types/alias.js @@ -3,17 +3,33 @@ import { GraphQLString, GraphQLBoolean } from 'graphql/type' -import { MBID } from './scalars' -import { getHyphenated } from './helpers' +import { name, sortName, fieldWithID } from './helpers' export default new GraphQLObjectType({ name: 'Alias', + description: `[Aliases](https://musicbrainz.org/doc/Aliases) are variant names +that are mostly used as search help: if a search matches an entity’s alias, the +entity will be given as a result – even if the actual name wouldn’t be. They are +available for artists, labels, and works.`, fields: () => ({ - name: { type: GraphQLString }, - sortName: { type: GraphQLString, resolve: getHyphenated }, - locale: { type: GraphQLString }, - primary: { type: GraphQLBoolean }, - type: { type: GraphQLString }, - typeID: { type: MBID, resolve: getHyphenated } + name: { + ...name, + description: 'The aliased name of the entity.' + }, + sortName, + locale: { + type: GraphQLString, + description: `The locale (language and/or country) in which the alias is +used.` + }, + primary: { + type: GraphQLBoolean, + description: `Whether this is the main alias for the entity in the +specified locale (this could mean the most recent or the most common).` + }, + ...fieldWithID('type', { + description: `The type or purpose of the alias – whether it is a variant, +search hint, etc.` + }) }) }) diff --git a/src/types/area.js b/src/types/area.js index ee628c7..a7e7ad3 100644 --- a/src/types/area.js +++ b/src/types/area.js @@ -17,7 +17,8 @@ import { const Area = new GraphQLObjectType({ name: 'Area', - description: 'A country, region, city or the like.', + description: `[Areas](https://musicbrainz.org/doc/Area) are geographic regions +or settlements (countries, cities, or the like).`, interfaces: () => [Node, Entity], fields: () => ({ id, @@ -27,6 +28,8 @@ const Area = new GraphQLObjectType({ disambiguation, isoCodes: { type: new GraphQLList(GraphQLString), + description: `[ISO 3166 codes](https://en.wikipedia.org/wiki/ISO_3166) are +the codes assigned by ISO to countries and subdivisions.`, resolve: data => data['iso-3166-1-codes'] }, artists, diff --git a/src/types/artist-credit.js b/src/types/artist-credit.js index a47a66d..a539ede 100644 --- a/src/types/artist-credit.js +++ b/src/types/artist-credit.js @@ -1,22 +1,36 @@ import { GraphQLObjectType, GraphQLString } from 'graphql/type' import Artist from './artist' -import { name } from './helpers' export default new GraphQLObjectType({ name: 'ArtistCredit', - description: - 'Artist, variation of artist name and piece of text to join the artist ' + - 'name to the next.', + description: `[Artist credits](https://musicbrainz.org/doc/Artist_Credits) +indicate who is the main credited artist (or artists) for releases, release +groups, tracks and recordings, and how they are credited. They consist of +artists, with (optionally) their names as credited in the specific release, +track, etc., and join phrases between them.`, fields: () => ({ artist: { type: Artist, + description: `The entity representing the artist referenced in the +credits.`, resolve: (source) => { const { artist } = source - artist.entityType = 'artist' + if (artist) { + artist.entityType = 'artist' + } return artist } }, - name, - joinPhrase: { type: GraphQLString, resolve: data => data['joinphrase'] } + name: { + type: GraphQLString, + description: `The name of the artist as credited in the specific release, +track, etc.` + }, + joinPhrase: { + type: GraphQLString, + description: `Join phrases might include words and/or punctuation to +separate artist names as they appear on the release, track, etc.`, + resolve: data => data['joinphrase'] + } }) }) diff --git a/src/types/artist.js b/src/types/artist.js index c515916..b7e4351 100644 --- a/src/types/artist.js +++ b/src/types/artist.js @@ -17,14 +17,16 @@ import { releases, releaseGroups, works, - relations + relationships } from './helpers' const Artist = new GraphQLObjectType({ name: 'Artist', - description: - 'An artist is generally a musician, a group of musicians, or another ' + - 'music professional (composer, engineer, illustrator, producer, etc.)', + description: `An [artist](https://musicbrainz.org/doc/Artist) is generally a +musician, group of musicians, or other music professional (like a producer or +engineer). Occasionally, it can also be a non-musical person (like a +photographer, an illustrator, or a poet whose writings are set to music), or +even a fictional character.`, interfaces: () => [Node, Entity], fields: () => ({ id, @@ -34,37 +36,56 @@ const Artist = new GraphQLObjectType({ disambiguation, aliases: { type: new GraphQLList(Alias), - resolve: (source, args, { lookupLoader }, info) => { + description: `[Aliases](https://musicbrainz.org/doc/Aliases) are used to +store alternate names or misspellings.`, + resolve: (source, args, { loaders }, info) => { const key = 'aliases' if (key in source) { return source[key] } else { const { entityType, id } = source const params = { inc: ['aliases'] } - return lookupLoader.load([entityType, id, params]).then(entity => { + return loaders.lookup.load([entityType, id, params]).then(entity => { return entity[key] }) } } }, - country: { type: GraphQLString }, - area: { type: Area }, + country: { + type: GraphQLString, + description: `The country with which an artist is primarily identified. It +is often, but not always, its birth/formation country.` + }, + area: { + type: Area, + description: `The area with which an artist is primarily identified. It +is often, but not always, its birth/formation country.` + }, beginArea: { type: Area, + description: `The area in which an artist began their career (or where +were born, if the artist is a person).`, resolve: getFallback(['begin-area', 'begin_area']) }, endArea: { type: Area, + description: `The area in which an artist ended their career (or where +they died, if the artist is a person).`, resolve: getFallback(['end-area', 'end_area']) }, lifeSpan, - ...fieldWithID('gender'), - ...fieldWithID('type'), + ...fieldWithID('gender', { + description: `Whether a person or character identifies as male, female, or +neither. Groups do not have genders.` + }), + ...fieldWithID('type', { + description: 'Whether an artist is a person, a group, or something else.' + }), recordings, releases, releaseGroups, works, - relations + relationships }) }) diff --git a/src/types/enums.js b/src/types/enums.js index a4fafb6..8b6ea30 100644 --- a/src/types/enums.js +++ b/src/types/enums.js @@ -1,199 +1,186 @@ import { GraphQLEnumType } from 'graphql/type' -/* -ReleaseStatus { - OFFICIAL - PROMOTION - BOOTLEG - PSEUDORELEASE -} -*/ +export const ArtistType = new GraphQLEnumType({ + name: 'ArtistType', + values: { + PERSON: { + name: 'Person', + description: 'This indicates an individual person.', + value: 'Person' + }, + GROUP: { + name: 'Group', + description: `This indicates a group of people that may or may not have a +distinctive name.`, + value: 'Group' + }, + ORCHESTRA: { + name: 'Orchestra', + description: 'This indicates an orchestra (a large instrumental ensemble).', + value: 'Orchestra' + }, + CHOIR: { + name: 'Choir', + description: 'This indicates a choir/chorus (a large vocal ensemble).', + value: 'Choir' + }, + CHARACTER: { + name: 'Character', + description: 'This indicates an individual fictional character.', + value: 'Character' + }, + OTHER: { + name: 'Other', + description: 'An artist which does not fit into the other categories.', + value: 'Other' + } + } +}) + export const ReleaseStatus = new GraphQLEnumType({ name: 'ReleaseStatus', values: { OFFICIAL: { name: 'Official', - description: - 'Any release officially sanctioned by the artist and/or their record ' + - 'company. (Most releases will fit into this category.)', - value: 'official' + description: `Any release officially sanctioned by the artist and/or their +record company. (Most releases will fit into this category.)`, + value: 'Official' }, PROMOTION: { name: 'Promotion', - description: - 'A giveaway release or a release intended to promote an upcoming ' + - 'official release. (e.g. prerelease albums or releases included ' + - 'with a magazine)', - value: 'promotion' + description: `A giveaway release or a release intended to promote an +upcoming official release. (e.g. prerelease albums or releases included with a +magazine)`, + value: 'Promotion' }, BOOTLEG: { name: 'Bootleg', - description: - 'An unofficial/underground release that was not sanctioned by the ' + - 'artist and/or the record company.', - value: 'bootleg' + description: `An unofficial/underground release that was not sanctioned by +the artist and/or the record company.`, + value: 'Bootleg' }, PSEUDORELEASE: { name: 'Pseudo-Release', - description: - 'A pseudo-release is a duplicate release for translation/' + - 'transliteration purposes.', - value: 'pseudo-release' + description: `A pseudo-release is a duplicate release for +translation/transliteration purposes.`, + value: 'Pseudo-Release' } } }) -/* -enum ReleaseGroupType { - # Primary types - ALBUM - SINGLE - EP - OTHER - BROADCAST - - # Secondary types - COMPILATION - SOUNDTRACK - SPOKEN_WORD - INTERVIEW - AUDIOBOOK - LIVE - REMIX - DJMIX - MIXTAPE - DEMO - NAT -} -*/ export const ReleaseGroupType = new GraphQLEnumType({ name: 'ReleaseGroupType', values: { ALBUM: { name: 'Album', - description: - 'An album, perhaps better defined as a “Long Play” (LP) release, ' + - 'generally consists of previously unreleased material (unless this ' + - 'type is combined with secondary types which change that, such as ' + - '“Compilation”). This includes album re-issues, with or without ' + - 'bonus tracks.', - value: 'album' + description: `An album, perhaps better defined as a “Long Play” (LP) +release, generally consists of previously unreleased material (unless this type +is combined with secondary types which change that, such as “Compilation”). This +includes album re-issues, with or without bonus tracks.`, + value: 'Album' }, SINGLE: { name: 'Single', - description: - 'A single typically has one main song and possibly a handful of ' + - 'additional tracks or remixes of the main track. A single is usually ' + - 'named after its main song.', - value: 'single' + description: `A single typically has one main song and possibly a handful +of additional tracks or remixes of the main track. A single is usually named +after its main song.`, + value: 'Single' }, EP: { name: 'EP', - description: - 'An EP is a so-called “Extended Play” release and often contains the ' + - 'letters EP in the title. Generally an EP will be shorter than a ' + - 'full length release (an LP or “Long Play”) and the tracks are ' + - 'usually exclusive to the EP, in other words the tracks don’t come ' + - 'from a previously issued release. EP is fairly difficult to define; ' + - 'usually it should only be assumed that a release is an EP if the ' + - 'artist defines it as such.', - value: 'ep' + description: `An EP is a so-called “Extended Play” release and often +contains the letters EP in the title. Generally an EP will be shorter than a +full length release (an LP or “Long Play”) and the tracks are usually exclusive +to the EP, in other words the tracks don’t come from a previously issued +release. EP is fairly difficult to define; usually it should only be assumed +that a release is an EP if the artist defines it as such.`, + value: 'EP' }, OTHER: { name: 'Other', - description: - 'Any release that does not fit any of the other categories.', - value: 'other' + description: 'Any release that does not fit any of the other categories.', + value: 'Other' }, BROADCAST: { name: 'Broadcast', - description: - 'An episodic release that was originally broadcast via radio, ' + - 'television, or the Internet, including podcasts.', - value: 'broadcast' + description: `An episodic release that was originally broadcast via radio, +television, or the Internet, including podcasts.`, + value: 'Broadcast' }, COMPILATION: { name: 'Compilation', - description: - 'A compilation is a collection of previously released tracks by one ' + - 'or more artists.', - value: 'compilation' + description: `A compilation is a collection of previously released tracks +by one or more artists.`, + value: 'Compilation' }, SOUNDTRACK: { name: 'Soundtrack', - description: - 'A soundtrack is the musical score to a movie, TV series, stage ' + - 'show, computer game etc.', - value: 'soundtrack' + description: `A soundtrack is the musical score to a movie, TV series, +stage show, computer game etc.`, + value: 'Soundtrack' }, SPOKENWORD: { name: 'Spoken Word', description: 'A non-music spoken word release.', - value: 'spokenword' + value: 'Spoken Word' }, INTERVIEW: { name: 'Interview', - description: - 'An interview release contains an interview, generally with an artist.', - value: 'interview' + description: `An interview release contains an interview, generally with +an artist.`, + value: 'Interview' }, AUDIOBOOK: { name: 'Audiobook', description: 'An audiobook is a book read by a narrator without music.', - value: 'audiobook' + value: 'Audiobook' }, LIVE: { name: 'Live', description: 'A release that was recorded live.', - value: 'live' + value: 'Live' }, REMIX: { name: 'Remix', - description: - 'A release that was (re)mixed from previously released material.', - value: 'remix' + description: `A release that was (re)mixed from previously released +material.`, + value: 'Remix' }, DJMIX: { name: 'DJ-mix', - description: - 'A DJ-mix is a sequence of several recordings played one after the ' + - 'other, each one modified so that they blend together into a ' + - 'continuous flow of music. A DJ mix release requires that the ' + - 'recordings be modified in some manner, and the DJ who does this ' + - 'modification is usually (although not always) credited in a fairly ' + - 'prominent way.', - value: 'dj-mix' + description: `A DJ-mix is a sequence of several recordings played one +after the other, each one modified so that they blend together into a continuous +flow of music. A DJ mix release requires that the recordings be modified in some +manner, and the DJ who does this modification is usually (although not always) +credited in a fairly prominent way.`, + value: 'DJ-mix' }, MIXTAPE: { name: 'Mixtape/Street', - description: - 'Promotional in nature (but not necessarily free), mixtapes and ' + - 'street albums are often released by artists to promote new artists, ' + - 'or upcoming studio albums by prominent artists. They are also ' + - 'sometimes used to keep fans’ attention between studio releases and ' + - 'are most common in rap & hip hop genres. They are often not ' + - 'sanctioned by the artist’s label, may lack proper sample or song ' + - 'clearances and vary widely in production and recording quality. ' + - 'While mixtapes are generally DJ-mixed, they are distinct from ' + - 'commercial DJ mixes (which are usually deemed compilations) and are ' + - 'defined by having a significant proportion of new material, ' + - 'including original production or original vocals over top of other ' + - 'artists’ instrumentals. They are distinct from demos in that they ' + - 'are designed for release directly to the public and fans; not ' + - 'to labels.', - value: 'mixtape/street' + description: `Promotional in nature (but not necessarily free), mixtapes +and street albums are often released by artists to promote new artists, or +upcoming studio albums by prominent artists. They are also sometimes used to +keep fans’ attention between studio releases and are most common in rap & hip +hop genres. They are often not sanctioned by the artist’s label, may lack proper +sample or song clearances and vary widely in production and recording quality. +While mixtapes are generally DJ-mixed, they are distinct from commercial DJ +mixes (which are usually deemed compilations) and are defined by having a +significant proportion of new material, including original production or +original vocals over top of other artists’ instrumentals. They are distinct from +demos in that they are designed for release directly to the public and fans; not +to labels.`, + value: 'Mixtape/Street' }, DEMO: { name: 'Demo', - description: - 'A release that was recorded for limited circulation or reference ' + - 'use rather than for general public release.', - value: 'demo' + description: `A release that was recorded for limited circulation or +reference use rather than for general public release.`, + value: 'Demo' }, NAT: { name: 'Non-Album Track', description: 'A non-album track (special case).', - value: 'nat' + value: 'NAT' } } }) diff --git a/src/types/event.js b/src/types/event.js index 3a96ca3..981327e 100644 --- a/src/types/event.js +++ b/src/types/event.js @@ -14,9 +14,9 @@ import { const Event = new GraphQLObjectType({ name: 'Event', - description: - 'An organized event which people can attend, usually live performances ' + - 'like concerts and festivals.', + description: `An [event](https://musicbrainz.org/doc/Event) refers to an +organised event which people can attend, and is relevant to MusicBrainz. +Generally this means live performances, like concerts and festivals.`, interfaces: () => [Node, Entity], fields: () => ({ id, @@ -24,10 +24,23 @@ const Event = new GraphQLObjectType({ name, disambiguation, lifeSpan, - time: { type: Time }, - cancelled: { type: GraphQLBoolean }, - setlist: { type: GraphQLString }, - ...fieldWithID('type') + time: { + type: Time, + description: 'The start time of the event.' + }, + cancelled: { + type: GraphQLBoolean, + description: 'Whether or not the event took place.' + }, + setlist: { + type: GraphQLString, + description: `A list of songs performed, optionally including links to +artists and works. See the [setlist documentation](https://musicbrainz.org/doc/Event/Setlist) +for syntax and examples.` + }, + ...fieldWithID('type', { + description: 'What kind of event the event is, e.g. concert, festival, etc.' + }) }) }) diff --git a/src/types/helpers.js b/src/types/helpers.js index 2091ecb..8236b75 100644 --- a/src/types/helpers.js +++ b/src/types/helpers.js @@ -20,18 +20,34 @@ import { LabelConnection } from './label' import LifeSpan from './life-span' import { PlaceConnection } from './place' import { RecordingConnection } from './recording' -import Relation from './relation' +import { RelationshipConnection } from './relationship' import { ReleaseConnection } from './release' import { ReleaseGroupConnection } from './release-group' import { WorkConnection } from './work' import { linkedResolver, - relationResolver, - includeRelations + relationshipResolver, + includeRelationships } from '../resolvers' -export const toNodeType = pascalCase -export const toEntityType = dashify +export const toPascal = pascalCase +export const toDashed = dashify + +export function toPlural (name) { + return name.endsWith('s') ? name : name + 's' +} + +export function toSingular (name) { + return name.endsWith('s') && !/series/i.test(name) ? name.slice(0, -1) : name +} + +export function toWords (name) { + return toPascal(name).replace(/([^A-Z])?([A-Z]+)/g, (match, tail, head) => { + tail = tail ? tail + ' ' : '' + head = head.length > 1 ? head : head.toLowerCase() + return `${tail}${head}` + }) +} export function fieldWithID (name, config = {}) { config = { @@ -40,10 +56,12 @@ export function fieldWithID (name, config = {}) { ...config } const isPlural = config.type instanceof GraphQLList - const singularName = isPlural && name.endsWith('s') ? name.slice(0, -1) : name + const singularName = isPlural ? toSingular(name) : name const idName = isPlural ? `${singularName}IDs` : `${name}ID` const idConfig = { type: isPlural ? new GraphQLList(MBID) : MBID, + description: `The MBID${isPlural ? 's' : ''} associated with the +value${isPlural ? 's' : ''} of the \`${name}\` field.`, resolve: getHyphenated } return { @@ -74,15 +92,37 @@ export const mbid = { description: 'The MBID of the entity.', resolve: source => source.id } -export const name = { type: GraphQLString } -export const sortName = { type: GraphQLString, resolve: getHyphenated } -export const title = { type: GraphQLString } -export const disambiguation = { type: GraphQLString } -export const lifeSpan = { type: LifeSpan, resolve: getHyphenated } +export const name = { + type: GraphQLString, + description: 'The official name of the entity.' +} +export const sortName = { + type: GraphQLString, + description: `The string to use for the purpose of ordering by name (for +example, by moving articles like ‘the’ to the end or a person’s last name to +the front).`, + resolve: getHyphenated +} +export const title = { + type: GraphQLString, + description: 'The official title of the entity.' +} +export const disambiguation = { + type: GraphQLString, + description: 'A comment used to help distinguish identically named entitites.' +} +export const lifeSpan = { + type: LifeSpan, + description: `The begin and end dates of the entity’s existence. Its exact +meaning depends on the type of entity.`, + resolve: getHyphenated +} function linkedQuery (connectionType, args) { + const typeName = toWords(connectionType.name.slice(0, -10)) return { type: connectionType, + description: `A list of ${typeName} entities linked to this entity.`, args: { ...forwardConnectionArgs, ...args @@ -91,43 +131,50 @@ function linkedQuery (connectionType, args) { } } -export const relation = { - type: new GraphQLList(Relation), +export const relationship = { + type: RelationshipConnection, + description: 'A list of relationships between these two entity types.', args: { ...connectionArgs, - direction: { type: GraphQLString }, - type: { type: GraphQLString }, - typeID: { type: MBID } + direction: { + type: GraphQLString, + description: 'Filter by the relationship direction.' + }, + ...fieldWithID('type', { + description: 'Filter by the relationship type.' + }) }, - resolve: relationResolver() + resolve: relationshipResolver() } -export const relations = { +export const relationships = { type: new GraphQLObjectType({ - name: 'Relations', + name: 'Relationships', + description: 'Lists of entity relationships for each entity type.', fields: () => ({ - area: relation, - artist: relation, - event: relation, - instrument: relation, - label: relation, - place: relation, - recording: relation, - release: relation, - releaseGroup: relation, - series: relation, - url: relation, - work: relation + areas: relationship, + artists: relationship, + events: relationship, + instruments: relationship, + labels: relationship, + places: relationship, + recordings: relationship, + releases: relationship, + releaseGroups: relationship, + series: relationship, + urls: relationship, + works: relationship }) }), - resolve: (source, args, { lookupLoader }, info) => { + description: 'Relationships between this entity and other entitites.', + resolve: (source, args, { loaders }, info) => { if (source.relations != null) { return source.relations } - const entityType = toEntityType(info.parentType.name) + const entityType = toDashed(info.parentType.name) const id = source.id - const params = includeRelations({}, info) - return lookupLoader.load([entityType, id, params]).then(entity => { + const params = includeRelationships({}, info) + return loaders.lookup.load([entityType, id, params]).then(entity => { return entity.relations }) } @@ -135,14 +182,15 @@ export const relations = { export const artistCredit = { type: new GraphQLList(ArtistCredit), - resolve: (source, args, { lookupLoader }, info) => { + description: 'The main credited artist(s).', + resolve: (source, args, { loaders }, info) => { const key = 'artist-credit' if (key in source) { return source[key] } else { const { entityType, id } = source const params = { inc: ['artists'] } - return lookupLoader.load([entityType, id, params]).then(entity => { + return loaders.lookup.load([entityType, id, params]).then(entity => { return entity[key] }) } @@ -154,17 +202,11 @@ export const events = linkedQuery(EventConnection) export const labels = linkedQuery(LabelConnection) export const places = linkedQuery(PlaceConnection) export const recordings = linkedQuery(RecordingConnection) - export const releases = linkedQuery(ReleaseConnection, { - type: { type: ReleaseGroupType }, - types: { type: new GraphQLList(ReleaseGroupType) }, - status: { type: ReleaseStatus }, - statuses: { type: new GraphQLList(ReleaseStatus) } + type: { type: new GraphQLList(ReleaseGroupType) }, + status: { type: new GraphQLList(ReleaseStatus) } }) - export const releaseGroups = linkedQuery(ReleaseGroupConnection, { - type: { type: ReleaseGroupType }, - types: { type: new GraphQLList(ReleaseGroupType) } + type: { type: new GraphQLList(ReleaseGroupType) } }) - export const works = linkedQuery(WorkConnection) diff --git a/src/types/instrument.js b/src/types/instrument.js index c753417..e2a12e0 100644 --- a/src/types/instrument.js +++ b/src/types/instrument.js @@ -11,16 +11,25 @@ import { const Instrument = new GraphQLObjectType({ name: 'Instrument', - description: - 'Instruments are devices created or adapted to make musical sounds.', + description: `[Instruments](https://musicbrainz.org/doc/Instrument) are +devices created or adapted to make musical sounds. Instruments are primarily +used in relationships between two other entities.`, interfaces: () => [Node, Entity], fields: () => ({ id, mbid, name, disambiguation, - description: { type: GraphQLString }, - ...fieldWithID('type') + description: { + type: GraphQLString, + description: `A brief description of the main characteristics of the +instrument.` + }, + ...fieldWithID('type', { + description: `The type categorises the instrument by the way the sound is +created, similar to the [Hornbostel-Sachs](https://en.wikipedia.org/wiki/Hornbostel%E2%80%93Sachs) +classification.` + }) }) }) diff --git a/src/types/label.js b/src/types/label.js index ee223bf..50de1bc 100644 --- a/src/types/label.js +++ b/src/types/label.js @@ -22,7 +22,9 @@ import { const Label = new GraphQLObjectType({ name: 'Label', - description: 'Labels represent mostly (but not only) imprints.', + description: `[Labels](https://musicbrainz.org/doc/Label) represent mostly +(but not only) imprints. To a lesser extent, a label entity may be created to +represent a record company.`, interfaces: () => [Node, Entity], fields: () => ({ id, @@ -30,12 +32,29 @@ const Label = new GraphQLObjectType({ name, sortName, disambiguation, - country: { type: GraphQLString }, - area: { type: Area }, + country: { + type: GraphQLString, + description: 'The country of origin for the label.' + }, + area: { + type: Area, + description: 'The area in which the label is based.' + }, lifeSpan, - labelCode: { type: GraphQLInt }, - ipis: { type: new GraphQLList(IPI) }, - ...fieldWithID('type'), + labelCode: { + type: GraphQLInt, + description: `The [“LC” code](https://musicbrainz.org/doc/Label/Label_Code) +of the label.` + }, + ipis: { + type: new GraphQLList(IPI), + description: `List of IPI (interested party information) codes for the +label.` + }, + ...fieldWithID('type', { + description: `A type describing the main activity of the label, e.g. +imprint, production, distributor, rights society, etc.` + }), releases }) }) diff --git a/src/types/life-span.js b/src/types/life-span.js index 4898bb9..a6a05c3 100644 --- a/src/types/life-span.js +++ b/src/types/life-span.js @@ -3,8 +3,8 @@ import { DateType } from './scalars' export default new GraphQLObjectType({ name: 'LifeSpan', - description: - 'Begin and end date of an entity that may have a finite lifetime.', + description: `Fields indicating the begin and end date of an entity’s +lifetime, including whether it has ended (even if the date is unknown).`, fields: () => ({ begin: { type: DateType }, end: { type: DateType }, diff --git a/src/types/node.js b/src/types/node.js index a14eaf7..14ebdcc 100644 --- a/src/types/node.js +++ b/src/types/node.js @@ -1,14 +1,14 @@ import { nodeDefinitions, fromGlobalId } from 'graphql-relay' -import { lookupLoader } from '../loaders' -import { toEntityType } from './helpers' +import { toDashed } from './helpers' const { nodeInterface, nodeField } = nodeDefinitions( - (globalID) => { + (globalID, { loaders }) => { const { type, id } = fromGlobalId(globalID) - const entityType = toEntityType(type) - return lookupLoader.load([entityType, id]) + const entityType = toDashed(type) + return loaders.lookup.load([entityType, id]) }, (obj) => { + console.log(obj.entityType) try { return require(`./${obj.entityType}`).default } catch (err) { diff --git a/src/types/place.js b/src/types/place.js index d116b37..4abf618 100644 --- a/src/types/place.js +++ b/src/types/place.js @@ -16,29 +16,48 @@ import { export const Coordinates = new GraphQLObjectType({ name: 'Coordinates', - description: 'Geographic coordinates with latitude and longitude.', + description: 'Geographic coordinates described with latitude and longitude.', fields: () => ({ - latitude: { type: Degrees }, - longitude: { type: Degrees } + latitude: { + type: Degrees, + description: 'The north–south position of a point on the Earth’s surface.' + }, + longitude: { + type: Degrees, + description: 'The east–west position of a point on the Earth’s surface.' + } }) }) const Place = new GraphQLObjectType({ name: 'Place', - description: - 'A venue, studio or other place where music is performed, recorded, ' + - 'engineered, etc.', + description: `A [place](https://musicbrainz.org/doc/Place) is a venue, studio +or other place where music is performed, recorded, engineered, etc.`, interfaces: () => [Node, Entity], fields: () => ({ id, mbid, name, disambiguation, - address: { type: GraphQLString }, - area: { type: Area }, - coordinates: { type: Coordinates }, + address: { + type: GraphQLString, + description: `The address describes the location of the place using the +standard addressing format for the country it is located in.` + }, + area: { + type: Area, + description: `The area entity representing the area, such as the city, in +which the place is located.` + }, + coordinates: { + type: Coordinates, + description: 'The geographic coordinates of the place.' + }, lifeSpan, - ...fieldWithID('type'), + ...fieldWithID('type', { + description: `The type categorises the place based on its primary +function.` + }), events }) }) diff --git a/src/types/recording.js b/src/types/recording.js index 62a0c23..e8a8bf5 100644 --- a/src/types/recording.js +++ b/src/types/recording.js @@ -10,14 +10,23 @@ import { artistCredit, artists, releases, - relations + relationships } from './helpers' const Recording = new GraphQLObjectType({ name: 'Recording', - description: - 'Represents a unique mix or edit. Has title, artist credit, duration, ' + - 'list of PUIDs and ISRCs.', + description: `A [recording](https://musicbrainz.org/doc/Recording) is an +entity in MusicBrainz which can be linked to tracks on releases. Each track must +always be associated with a single recording, but a recording can be linked to +any number of tracks. + +A recording represents distinct audio that has been used to produce at least one +released track through copying or mastering. A recording itself is never +produced solely through copying or mastering. + +Generally, the audio represented by a recording corresponds to the audio at a +stage in the production process before any final mastering but after any editing +or mixing.`, interfaces: () => [Node, Entity], fields: () => ({ id, @@ -25,11 +34,18 @@ const Recording = new GraphQLObjectType({ title, disambiguation, artistCredit, - length: { type: GraphQLInt }, - video: { type: GraphQLBoolean }, + length: { + type: GraphQLInt, + description: `An approximation to the length of the recording, calculated +from the lengths of the tracks using it.` + }, + video: { + type: GraphQLBoolean, + description: 'Whether this is a video recording.' + }, artists, releases, - relations + relationships }) }) diff --git a/src/types/relation.js b/src/types/relation.js deleted file mode 100644 index 650c9c8..0000000 --- a/src/types/relation.js +++ /dev/null @@ -1,43 +0,0 @@ -import { - GraphQLObjectType, - GraphQLNonNull, - GraphQLString, - GraphQLList, - GraphQLBoolean -} from 'graphql/type' -import { DateType } from './scalars' -import Entity from './entity' -import { - getHyphenated, - fieldWithID -} from './helpers' - -const Relation = new GraphQLObjectType({ - name: 'Relation', - fields: () => ({ - target: { - type: new GraphQLNonNull(Entity), - resolve: source => { - const targetType = source['target-type'] - const target = source[targetType] - target.entityType = targetType.replace('_', '-') - return target - } - }, - direction: { type: new GraphQLNonNull(GraphQLString) }, - targetType: { - type: new GraphQLNonNull(GraphQLString), - resolve: getHyphenated - }, - sourceCredit: { type: GraphQLString, resolve: getHyphenated }, - targetCredit: { type: GraphQLString, resolve: getHyphenated }, - begin: { type: DateType }, - end: { type: DateType }, - ended: { type: GraphQLBoolean }, - attributes: { type: new GraphQLList(GraphQLString) }, - // attributeValues: {}, - ...fieldWithID('type') - }) -}) - -export default Relation diff --git a/src/types/relationship.js b/src/types/relationship.js new file mode 100644 index 0000000..462181c --- /dev/null +++ b/src/types/relationship.js @@ -0,0 +1,83 @@ +import { + GraphQLObjectType, + GraphQLNonNull, + GraphQLString, + GraphQLList, + GraphQLBoolean +} from 'graphql/type' +import { connectionDefinitions } from 'graphql-relay' +import { DateType } from './scalars' +import Entity from './entity' +import { + getHyphenated, + fieldWithID +} from './helpers' + +const Relationship = new GraphQLObjectType({ + name: 'Relationship', + description: `[Relationships](https://musicbrainz.org/doc/Relationships) are a +way to represent all the different ways in which entities are connected to each +other and to URLs outside MusicBrainz.`, + fields: () => ({ + target: { + type: new GraphQLNonNull(Entity), + description: 'The target entity.', + resolve: source => { + const targetType = source['target-type'] + const target = source[targetType] + target.entityType = targetType.replace('_', '-') + return target + } + }, + direction: { + type: new GraphQLNonNull(GraphQLString), + description: 'The direction of the relationship.' + }, + targetType: { + type: new GraphQLNonNull(GraphQLString), + description: 'The type of entity on the receiving end of the relationship.', + resolve: getHyphenated + }, + sourceCredit: { + type: GraphQLString, + description: `How the source entity was actually credited, if different +from its main (performance) name.`, + resolve: getHyphenated + }, + targetCredit: { + type: GraphQLString, + description: `How the target entity was actually credited, if different +from its main (performance) name.`, + resolve: getHyphenated + }, + begin: { + type: DateType, + description: 'The date on which the relationship became applicable.' + }, + end: { + type: DateType, + description: 'The date on which the relationship became no longer applicable.' + }, + ended: { + type: GraphQLBoolean, + description: 'Whether the relationship still applies.' + }, + attributes: { + type: new GraphQLList(GraphQLString), + description: `Attributes which modify the relationship. There is a [list +of all attributes](https://musicbrainz.org/relationship-attributes), but the +attributes which are available, and how they should be used, depends on the +relationship type.` + }, + // There doesn't seem to be any documentation for the `attribute-values` + // field. + // attributeValues: {}, + ...fieldWithID('type', { + description: 'The type of relationship.' + }) + }) +}) + +const { connectionType: RelationshipConnection } = connectionDefinitions({ nodeType: Relationship }) +export { RelationshipConnection } +export default Relationship diff --git a/src/types/release-event.js b/src/types/release-event.js index 9cb4512..db0f6dc 100644 --- a/src/types/release-event.js +++ b/src/types/release-event.js @@ -4,10 +4,8 @@ import Area from './area' export default new GraphQLObjectType({ name: 'ReleaseEvent', - description: - 'Date on which a release was released in a country/region with a ' + - 'particular label, catalog number, barcode, and what release format ' + - 'was used.', + description: `Date on which a release was released in a country/region with a +particular label, catalog number, barcode, and what release format was used.`, fields: () => ({ area: { type: Area }, date: { type: DateType } diff --git a/src/types/release-group.js b/src/types/release-group.js index 501fb6b..e1f59cf 100644 --- a/src/types/release-group.js +++ b/src/types/release-group.js @@ -1,8 +1,9 @@ -import { GraphQLObjectType, GraphQLString, GraphQLList } from 'graphql/type' +import { GraphQLObjectType, GraphQLList } from 'graphql/type' import { connectionDefinitions } from 'graphql-relay' import Node from './node' import Entity from './entity' import { DateType } from './scalars' +import { ReleaseGroupType } from './enums' import { id, mbid, @@ -11,16 +12,21 @@ import { artistCredit, artists, releases, - relations, + relationships, getHyphenated, fieldWithID } from './helpers' const ReleaseGroup = new GraphQLObjectType({ name: 'ReleaseGroup', - description: - 'Represents an abstract "album" (or "single", or "EP") entity. ' + - 'Technically it’s a group of releases, with a specified type.', + description: `A [release group](https://musicbrainz.org/doc/Release_Group) is +used to group several different releases into a single logical entity. Every +release belongs to one, and only one release group. + +Both release groups and releases are “albums” in a general sense, but with an +important difference: a release is something you can buy as media such as a CD +or a vinyl record, while a release group embraces the overall concept of an +album – it doesn’t matter how many CDs or editions/versions it had.`, interfaces: () => [Node, Entity], fields: () => ({ id, @@ -28,12 +34,26 @@ const ReleaseGroup = new GraphQLObjectType({ title, disambiguation, artistCredit, - firstReleaseDate: { type: DateType, resolve: getHyphenated }, - ...fieldWithID('primaryType'), - ...fieldWithID('secondaryTypes', { type: new GraphQLList(GraphQLString) }), + firstReleaseDate: { + type: DateType, + description: 'The date of the earliest release in the group.', + resolve: getHyphenated + }, + ...fieldWithID('primaryType', { + type: ReleaseGroupType, + description: `The [type](https://musicbrainz.org/doc/Release_Group/Type) +of a release group describes what kind of releases the release group represents, +e.g. album, single, soundtrack, compilation, etc. A release group can have a +“main” type and an unspecified number of additional types.` + }), + ...fieldWithID('secondaryTypes', { + type: new GraphQLList(ReleaseGroupType), + description: `Additional [types](https://musicbrainz.org/doc/Release_Group/Type) +that apply to this release group.` + }), artists, releases, - relations + relationships }) }) diff --git a/src/types/release.js b/src/types/release.js index b5b2e65..93ecd57 100644 --- a/src/types/release.js +++ b/src/types/release.js @@ -3,6 +3,7 @@ import { connectionDefinitions } from 'graphql-relay' import Node from './node' import Entity from './entity' import { DateType } from './scalars' +import { ReleaseStatus } from './enums' import ReleaseEvent from './release-event' import { id, @@ -14,17 +15,18 @@ import { labels, recordings, releaseGroups, - relations, + relationships, getHyphenated, fieldWithID } from './helpers' const Release = new GraphQLObjectType({ name: 'Release', - description: - 'Real-world release object you can buy in your music store. It has ' + - 'release date and country, list of catalog number and label pairs, ' + - 'packaging type and release status.', + description: `A [release](https://musicbrainz.org/doc/Release) represents the +unique release (i.e. issuing) of a product on a specific date with specific +release information such as the country, label, barcode, packaging, etc. If you +walk into a store and purchase an album or single, they’re each represented in +MusicBrainz as one release.`, interfaces: () => [Node, Entity], fields: () => ({ id, @@ -34,19 +36,46 @@ const Release = new GraphQLObjectType({ artistCredit, releaseEvents: { type: new GraphQLList(ReleaseEvent), + description: 'The release events for this release.', resolve: getHyphenated }, - date: { type: DateType }, - country: { type: GraphQLString }, - barcode: { type: GraphQLString }, - ...fieldWithID('status'), - ...fieldWithID('packaging'), - quality: { type: GraphQLString }, + date: { + type: DateType, + description: `The [release date](https://musicbrainz.org/doc/Release/Date) +is the date in which a release was made available through some sort of +distribution mechanism.` + }, + country: { + type: GraphQLString, + description: 'The country in which the release was issued.' + }, + barcode: { + type: GraphQLString, + description: `The [barcode](https://en.wikipedia.org/wiki/Barcode), if the +release has one. The most common types found on releases are 12-digit +[UPCs](https://en.wikipedia.org/wiki/Universal_Product_Code) and 13-digit +[EANs](https://en.wikipedia.org/wiki/International_Article_Number).` + }, + ...fieldWithID('status', { + type: ReleaseStatus, + description: 'The status describes how “official” a release is.' + }), + ...fieldWithID('packaging', { + description: `The physical packaging that accompanies the release. See +the [list of packaging](https://musicbrainz.org/doc/Release/Packaging) for more +information.` + }), + quality: { + type: GraphQLString, + description: `Data quality indicates how good the data for a release is. +It is not a mark of how good or bad the music itself is – for that, use +[ratings](https://musicbrainz.org/doc/Rating_System).` + }, artists, labels, recordings, releaseGroups, - relations + relationships }) }) diff --git a/src/types/scalars.js b/src/types/scalars.js index bd3d899..0e3b4e2 100644 --- a/src/types/scalars.js +++ b/src/types/scalars.js @@ -17,9 +17,6 @@ function validatePositive (value) { throw new TypeError(`Expected positive value: ${value}`) } -/* -scalar Date -*/ export const DateType = new GraphQLScalarType({ name: 'Date', description: @@ -34,9 +31,6 @@ export const DateType = new GraphQLScalarType({ } }) -/* -scalar Degrees -*/ export const Degrees = new GraphQLScalarType({ name: 'Degrees', description: 'Decimal degrees, used for latitude and longitude.', @@ -50,9 +44,6 @@ export const Degrees = new GraphQLScalarType({ } }) -/* -scalar Duration -*/ export const Duration = new GraphQLScalarType({ name: 'Duration', description: 'A length of time, in milliseconds.', @@ -66,14 +57,11 @@ export const Duration = new GraphQLScalarType({ } }) -/* -scalar IPI -*/ export const IPI = new GraphQLScalarType({ name: 'IPI', - description: - 'An IPI (interested party information) code is an identifying number ' + - 'assigned by the CISAC database for musical rights management.', + description: `An [IPI](https://musicbrainz.org/doc/IPI) (interested party +information) code is an identifying number assigned by the CISAC database for +musical rights management.`, serialize: value => value, parseValue: value => value, parseLiteral (ast) { @@ -84,15 +72,11 @@ export const IPI = new GraphQLScalarType({ } }) -/* -scalar ISNI -*/ export const ISNI = new GraphQLScalarType({ name: 'ISNI', - description: - 'The International Standard Name Identifier (ISNI) is an ISO standard ' + - 'for uniquely identifying the public identities of contributors to ' + - 'media content.', + description: `The [International Standard Name Identifier](https://musicbrainz.org/doc/ISNI) +(ISNI) is an ISO standard for uniquely identifying the public identities of +contributors to media content.`, serialize: value => value, parseValue: value => value, parseLiteral (ast) { @@ -103,14 +87,11 @@ export const ISNI = new GraphQLScalarType({ } }) -/* -scalar ISWC -*/ export const ISWC = new GraphQLScalarType({ name: 'ISWC', - description: - 'The International Standard Musical Work Code (ISWC) is an ISO standard ' + - 'similar to ISBNs for identifying musical works / compositions.', + description: `The [International Standard Musical Work Code](https://musicbrainz.org/doc/ISWC) +(ISWC) is an ISO standard similar to ISBNs for identifying musical works / +compositions.`, serialize: value => value, parseValue: value => value, parseLiteral (ast) { @@ -121,9 +102,6 @@ export const ISWC = new GraphQLScalarType({ } }) -/* -scalar Locale -*/ export const Locale = new GraphQLScalarType({ name: 'Locale', description: 'Language code, optionally with country and encoding.', @@ -137,9 +115,6 @@ export const Locale = new GraphQLScalarType({ } }) -/* -scalar Time -*/ export const Time = new GraphQLScalarType({ name: 'Time', description: 'A time of day, in 24-hour hh:mm notation.', @@ -153,12 +128,9 @@ export const Time = new GraphQLScalarType({ } }) -/* -scalar URLString -*/ export const URLString = new GraphQLScalarType({ name: 'URLString', - description: 'Description', + description: 'A web address.', serialize: value => value, parseValue: value => value, parseLiteral (ast) { @@ -169,14 +141,10 @@ export const URLString = new GraphQLScalarType({ } }) -/* -scalar MBID -*/ export const MBID = new GraphQLScalarType({ name: 'MBID', - description: - 'The `MBID` scalar represents MusicBrainz identifiers, which are ' + - '36-character UUIDs.', + description: `The MBID scalar represents MusicBrainz identifiers, which are +36-character UUIDs.`, serialize: validateMBID, parseValue: validateMBID, parseLiteral (ast) { diff --git a/src/types/series.js b/src/types/series.js index da5d714..5c853fa 100644 --- a/src/types/series.js +++ b/src/types/series.js @@ -2,26 +2,23 @@ import { GraphQLObjectType } from 'graphql/type' import { connectionDefinitions } from 'graphql-relay' import Node from './node' import Entity from './entity' -import { - id, - mbid, - name, - disambiguation, - fieldWithID -} from './helpers' +import { id, mbid, name, disambiguation, fieldWithID } from './helpers' const Series = new GraphQLObjectType({ name: 'Series', - description: - 'A series is a sequence of separate release groups, releases, ' + - 'recordings, works or events with a common theme.', + description: `A [series](https://musicbrainz.org/doc/Series) is a sequence of +separate release groups, releases, recordings, works or events with a common +theme.`, interfaces: () => [Node, Entity], fields: () => ({ id, mbid, name, disambiguation, - ...fieldWithID('type') + ...fieldWithID('type', { + description: `The type primarily describes what type of entity the series +contains.` + }) }) }) diff --git a/src/types/url.js b/src/types/url.js index 1c46396..198583c 100644 --- a/src/types/url.js +++ b/src/types/url.js @@ -3,20 +3,22 @@ import { connectionDefinitions } from 'graphql-relay' import Node from './node' import Entity from './entity' import { URLString } from './scalars' -import { id, mbid, relations } from './helpers' +import { id, mbid, relationships } from './helpers' const URL = new GraphQLObjectType({ name: 'URL', - description: - 'A URL pointing to a resource external to MusicBrainz, i.e. an official ' + - 'homepage, a site where music can be acquired, an entry in another ' + - 'database, etc.', + description: `A [URL](https://musicbrainz.org/doc/URL) pointing to a resource +external to MusicBrainz, i.e. an official homepage, a site where music can be +acquired, an entry in another database, etc.`, interfaces: () => [Node, Entity], fields: () => ({ id, mbid, - resource: { type: new GraphQLNonNull(URLString) }, - relations + resource: { + type: new GraphQLNonNull(URLString), + description: 'The actual URL string.' + }, + relationships }) }) diff --git a/src/types/work.js b/src/types/work.js index 6dcf16a..6dfbcd3 100644 --- a/src/types/work.js +++ b/src/types/work.js @@ -8,26 +8,35 @@ import { title, disambiguation, artists, - relations, + relationships, fieldWithID } from './helpers' const Work = new GraphQLObjectType({ name: 'Work', - description: - 'A distinct intellectual or artistic creation, which can be expressed in ' + - 'the form of one or more audio recordings', + description: `A [work](https://musicbrainz.org/doc/Work) is a distinct +intellectual or artistic creation, which can be expressed in the form of one or +more audio recordings.`, interfaces: () => [Node, Entity], fields: () => ({ id, mbid, title, disambiguation, - iswcs: { type: new GraphQLList(GraphQLString) }, - language: { type: GraphQLString }, - ...fieldWithID('type'), + iswcs: { + type: new GraphQLList(GraphQLString), + description: `A list of [ISWCs](https://musicbrainz.org/doc/ISWC) assigned +to the work by copyright collecting agencies.` + }, + language: { + type: GraphQLString, + description: 'The language in which the work was originally written.' + }, + ...fieldWithID('type', { + description: 'The type of work.' + }), artists, - relations + relationships }) }) diff --git a/src/util.js b/src/util.js index 0b847e6..bfcc46e 100644 --- a/src/util.js +++ b/src/util.js @@ -2,7 +2,7 @@ import util from 'util' export function getFields (info) { if (info.kind !== 'Field') { - info = info.fieldASTs[0] + info = info.fieldNodes[0] } const selections = info.selectionSet.selections return selections.reduce((fields, selection) => { diff --git a/test/rate-limit.spec.js b/test/rate-limit.spec.js index 61f034b..30faeed 100644 --- a/test/rate-limit.spec.js +++ b/test/rate-limit.spec.js @@ -8,4 +8,11 @@ describe('RateLimit', () => { expect(limiter.limit).to.equal(1) expect(limiter.period).to.equal(1000) }) + + it('concurrency defaults to limit', () => { + let limiter = new RateLimit() + expect(limiter.concurrency).to.equal(1) + limiter = new RateLimit({ limit: 5 }) + expect(limiter.concurrency).to.equal(5) + }) }) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..57c1ebb --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3072 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@^1.3.0, accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" + +ajv-keywords@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" + +ajv@^4.7.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.0.tgz#5a358085747b134eb567d6d15e015f1d7802f45c" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-cli@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.18.0.tgz#92117f341add9dead90f6fa7d0a97c0cc08ec186" + dependencies: + babel-core "^6.18.0" + babel-polyfill "^6.16.0" + babel-register "^6.18.0" + babel-runtime "^6.9.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^5.0.5" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.0.0" + +babel-code-frame@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^2.0.0" + +babel-core@^6.18.0: + version "6.18.2" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" + dependencies: + babel-code-frame "^6.16.0" + babel-generator "^6.18.0" + babel-helpers "^6.16.0" + babel-messages "^6.8.0" + babel-register "^6.18.0" + babel-runtime "^6.9.1" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-eslint@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.1.1.tgz#8a6a884f085aa7060af69cfc77341c2f99370fb2" + dependencies: + babel-code-frame "^6.16.0" + babel-traverse "^6.15.0" + babel-types "^6.15.0" + babylon "^6.13.0" + lodash.pickby "^4.6.0" + +babel-generator@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.19.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-helper-bindify-decorators@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" + dependencies: + babel-helper-explode-assignable-expression "^6.18.0" + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-call-delegate@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" + dependencies: + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-explode-class@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" + dependencies: + babel-helper-bindify-decorators "^6.18.0" + babel-runtime "^6.0.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" + dependencies: + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-get-function-arity@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-hoist-variables@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-optimise-call-expression@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-helper-regex@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" + dependencies: + babel-helper-function-name "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" + dependencies: + babel-helper-optimise-call-expression "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-helpers@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" + dependencies: + babel-runtime "^6.0.0" + babel-template "^6.16.0" + +babel-messages@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-check-es2015-constants@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.3.13: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" + +babel-plugin-transform-async-generator-functions@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" + dependencies: + babel-helper-remap-async-to-generator "^6.16.2" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-async-to-generator@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" + dependencies: + babel-helper-remap-async-to-generator "^6.16.0" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-class-properties@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" + dependencies: + babel-helper-function-name "^6.18.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.9.1" + babel-template "^6.15.0" + +babel-plugin-transform-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" + dependencies: + babel-helper-define-map "^6.8.0" + babel-helper-explode-class "^6.8.0" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + babel-types "^6.13.0" + +babel-plugin-transform-es2015-arrow-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-block-scoping@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" + dependencies: + babel-runtime "^6.9.0" + babel-template "^6.15.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" + dependencies: + babel-helper-define-map "^6.18.0" + babel-helper-function-name "^6.18.0" + babel-helper-optimise-call-expression "^6.18.0" + babel-helper-replace-supers "^6.18.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-template "^6.14.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-computed-properties@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" + dependencies: + babel-helper-define-map "^6.8.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-destructuring@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" + dependencies: + babel-runtime "^6.9.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-for-of@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-function-name@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" + dependencies: + babel-helper-function-name "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.9.0" + +babel-plugin-transform-es2015-literals@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-modules-amd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" + dependencies: + babel-plugin-transform-strict-mode "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.16.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" + dependencies: + babel-helper-hoist-variables "^6.18.0" + babel-runtime "^6.11.6" + babel-template "^6.14.0" + +babel-plugin-transform-es2015-modules-umd@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-runtime "^6.0.0" + babel-template "^6.8.0" + +babel-plugin-transform-es2015-object-super@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" + dependencies: + babel-helper-replace-supers "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-parameters@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" + dependencies: + babel-helper-call-delegate "^6.18.0" + babel-helper-get-function-arity "^6.18.0" + babel-runtime "^6.9.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-shorthand-properties@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-plugin-transform-es2015-spread@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-sticky-regex@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + babel-types "^6.8.0" + +babel-plugin-transform-es2015-template-literals@^6.6.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" + dependencies: + babel-runtime "^6.0.0" + +babel-plugin-transform-es2015-unicode-regex@^6.3.13: + version "6.11.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" + dependencies: + babel-helper-regex "^6.8.0" + babel-runtime "^6.0.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.3.13: + version "6.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-object-rest-spread@^6.16.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz#f6ac428ee3cb4c6aa00943ed1422ce813603b34c" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.0.0" + +babel-plugin-transform-regenerator@^6.16.0: + version "6.16.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" + dependencies: + babel-runtime "^6.9.0" + babel-types "^6.16.0" + private "~0.1.5" + +babel-plugin-transform-strict-mode@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" + dependencies: + babel-runtime "^6.0.0" + babel-types "^6.18.0" + +babel-polyfill@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" + dependencies: + babel-runtime "^6.9.1" + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-preset-es2015@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" + dependencies: + babel-plugin-check-es2015-constants "^6.3.13" + babel-plugin-transform-es2015-arrow-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" + babel-plugin-transform-es2015-block-scoping "^6.18.0" + babel-plugin-transform-es2015-classes "^6.18.0" + babel-plugin-transform-es2015-computed-properties "^6.3.13" + babel-plugin-transform-es2015-destructuring "^6.18.0" + babel-plugin-transform-es2015-duplicate-keys "^6.6.0" + babel-plugin-transform-es2015-for-of "^6.18.0" + babel-plugin-transform-es2015-function-name "^6.9.0" + babel-plugin-transform-es2015-literals "^6.3.13" + babel-plugin-transform-es2015-modules-amd "^6.18.0" + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-plugin-transform-es2015-modules-systemjs "^6.18.0" + babel-plugin-transform-es2015-modules-umd "^6.18.0" + babel-plugin-transform-es2015-object-super "^6.3.13" + babel-plugin-transform-es2015-parameters "^6.18.0" + babel-plugin-transform-es2015-shorthand-properties "^6.18.0" + babel-plugin-transform-es2015-spread "^6.3.13" + babel-plugin-transform-es2015-sticky-regex "^6.3.13" + babel-plugin-transform-es2015-template-literals "^6.6.0" + babel-plugin-transform-es2015-typeof-symbol "^6.18.0" + babel-plugin-transform-es2015-unicode-regex "^6.3.13" + babel-plugin-transform-regenerator "^6.16.0" + +babel-preset-stage-2@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz#9eb7bf9a8e91c68260d5ba7500493caaada4b5b5" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.18.0" + babel-plugin-transform-decorators "^6.13.0" + babel-preset-stage-3 "^6.17.0" + +babel-preset-stage-3@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.3.13" + babel-plugin-transform-async-generator-functions "^6.17.0" + babel-plugin-transform-async-to-generator "^6.16.0" + babel-plugin-transform-exponentiation-operator "^6.3.13" + babel-plugin-transform-object-rest-spread "^6.16.0" + +babel-register@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" + dependencies: + babel-core "^6.18.0" + babel-runtime "^6.11.6" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" + dependencies: + babel-runtime "^6.9.0" + babel-traverse "^6.16.0" + babel-types "^6.16.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.18.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" + dependencies: + babel-code-frame "^6.16.0" + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.19.0" + babylon "^6.11.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.13.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.19.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" + dependencies: + babel-runtime "^6.9.1" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0: + version "6.14.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +bytes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +chai@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.0.0, chokidar@^1.4.3: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +circular-json@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0, commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +compressible@~2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.9.tgz#6daab4e2b599c2770dd9e21e7a891b1c5a755425" + dependencies: + mime-db ">= 1.24.0 < 2" + +compression@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + dependencies: + accepts "~1.3.3" + bytes "2.3.0" + compressible "~2.0.8" + debug "~2.2.0" + on-headers "~1.0.1" + vary "~1.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.6, concat-stream@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +configstore@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +content-disposition@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" + +content-type@^1.0.0, content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dashify@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dashify/-/dashify-0.2.2.tgz#6a07415a01c91faf4a32e38d9dfba71f61cb20fe" + +dataloader@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.2.0.tgz#3f73ea657c492c860c1633348adc55ca9bf2107e" + +debug-log@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@^2.1.1, debug@^2.2.0, debug@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +deglob@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" + dependencies: + find-root "^1.0.0" + glob "^7.0.5" + ignore "^3.0.9" + pkg-config "^1.1.0" + run-parallel "^1.1.2" + uniq "^1.0.1" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dotenv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +end-of-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: + version "0.10.12" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.0.0.tgz#f094c7041f662599bb12720da059d6b9c7ff0f40" + +es6-iterator@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" + dependencies: + d "^0.1.1" + es5-ext "^0.10.7" + es6-symbol "3" + +es6-map@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-set "~0.1.3" + es6-symbol "~3.1.0" + event-emitter "~0.3.4" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + +es6-set@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-symbol "3" + event-emitter "~0.3.4" + +es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + +es6-weak-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" + dependencies: + d "^0.1.1" + es5-ext "^0.10.8" + es6-iterator "2" + es6-symbol "3" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-standard-jsx@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz#c240e26ed919a11a42aa4de8059472b38268d620" + +eslint-config-standard@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz#d3a68aafc7191639e7ee441e7348739026354292" + +eslint-plugin-promise@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.4.0.tgz#6ba9048c2df57be77d036e0c68918bc9b4fc4195" + +eslint-plugin-react@~6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz#1af96aea545856825157d97c1b50d5a8fb64a5a7" + dependencies: + doctrine "^1.2.2" + jsx-ast-utils "^1.3.3" + +eslint-plugin-standard@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz#3589699ff9c917f2c25f76a916687f641c369ff3" + +eslint@~3.10.2: + version "3.10.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.10.2.tgz#c9a10e8bf6e9d65651204778c503341f1eac3ce7" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.2" + escope "^3.6.0" + espree "^3.3.1" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.2.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~1.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" + dependencies: + acorn "^4.0.1" + acorn-jsx "^3.0.0" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +event-emitter@~0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.7" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express-graphql@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/express-graphql/-/express-graphql-0.6.1.tgz#cd9d144ac4d191b34a4261ac3a56fa407d5e19e8" + dependencies: + accepts "^1.3.0" + content-type "^1.0.0" + http-errors "^1.3.0" + raw-body "^2.1.0" + +express@^4.14.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.1" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "~2.2.0" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + finalhandler "0.5.0" + fresh "0.3.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.2" + qs "6.2.0" + range-parser "~1.2.0" + send "0.14.1" + serve-static "~1.11.1" + type-is "~1.6.13" + utils-merge "1.0.0" + vary "~1.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fast-levenshtein@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +find-root@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" + +flat-cache@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" + dependencies: + circular-json "^0.3.0" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +from@~0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.15" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.1.tgz#388473894fe8be5e13ffcdb8b93e4ed0616428c7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@7.0.5, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.5: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0, globals@^9.2.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" + dependencies: + duplexify "^3.2.0" + infinity-agent "^2.0.0" + is-redirect "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + nested-error-stacks "^1.0.0" + object-assign "^3.0.0" + prepend-http "^1.0.0" + read-all-stream "^3.0.0" + timed-out "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +graphql-relay@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/graphql-relay/-/graphql-relay-0.4.4.tgz#876a654445b6af4539f81cb9befd5cd7ead129dd" + +graphql@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.8.2.tgz#eb1bb524b38104bbf2c9157f9abc67db2feba7d2" + dependencies: + iterall "1.0.2" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +http-errors@^1.3.0, http-errors@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" + dependencies: + inherits "2.0.3" + setprototypeof "1.0.2" + statuses ">= 1.3.1 < 2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +ignore@^3.0.9, ignore@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +infinity-agent@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-stream@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +iterall@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.0.2.tgz#41a2e96ce9eda5e61c767ee5dc312373bb046e91" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" + +js-yaml@^3.5.1: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jsx-ast-utils@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.4.tgz#0257ed1cc4b1e65b39d7d9940f9fb4f20f7ba0a9" + dependencies: + acorn-jsx "^3.0.1" + object-assign "^4.1.0" + +kind-of@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" + dependencies: + is-buffer "^1.0.2" + +latest-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" + dependencies: + package-json "^1.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.defaults@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" + dependencies: + lodash.assign "^3.0.0" + lodash.restparam "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.pickby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +loose-envify@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" + dependencies: + js-tokens "^2.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.24.0 < 2", mime-db@~1.25.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: + version "2.1.13" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" + dependencies: + mime-db "~1.25.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.5" + glob "7.0.5" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +nested-error-stacks@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +node-pre-gyp@^0.6.29: + version "0.6.31" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.0" + rc "~1.1.6" + request "^2.75.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +nodemon@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" + dependencies: + chokidar "^1.4.3" + debug "^2.2.0" + es6-promise "^3.0.2" + ignore-by-default "^1.0.0" + lodash.defaults "^3.1.2" + minimatch "^3.0.0" + ps-tree "^1.0.1" + touch "1.0.0" + undefsafe "0.0.3" + update-notifier "0.5.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +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" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0, once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +package-json@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + dependencies: + got "^3.2.0" + registry-url "^3.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-config@^1.0.1, pkg-config@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" + dependencies: + debug-log "^1.0.0" + find-root "^1.0.0" + xtend "^4.0.1" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6, private@~0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +proxy-addr@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.1.1" + +ps-tree@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +pseudomap@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" + +qs@^6.3.0, qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +randomatic@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@^2.1.0: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +rc@^1.0.1, rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.9.5: + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-url@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.75.0, request@^2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +retry@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.0.tgz#649e15ca408422d98318161935e7f7d652d435dd" + +rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +run-parallel@^1.1.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.5.0" + mime "1.3.4" + ms "0.7.1" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.0" + +serve-static@~1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.14.1" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setprototypeof@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" + +shelljs@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +snazzy@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/snazzy/-/snazzy-5.0.0.tgz#22a0a8da8f1311f681316c51c3a54ab138786800" + dependencies: + chalk "^1.1.0" + inherits "^2.0.1" + minimist "^1.1.1" + readable-stream "^2.0.6" + standard "*" + standard-json "^1.0.0" + text-table "^0.2.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" + dependencies: + source-map "^0.5.3" + +source-map@^0.5.0, source-map@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +standard-engine@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-5.2.0.tgz#400660ae5acce8afd4db60ff2214a9190ad790a3" + dependencies: + deglob "^2.0.0" + find-root "^1.0.0" + get-stdin "^5.0.1" + home-or-tmp "^2.0.0" + minimist "^1.1.0" + pkg-config "^1.0.1" + +standard-json@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/standard-json/-/standard-json-1.0.1.tgz#75dd5952c59bb6cb358b136af0633ae3d7f35b6b" + dependencies: + concat-stream "^1.5.0" + +standard@*, standard@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/standard/-/standard-8.6.0.tgz#635132be7bfb567c2921005f30f9e350e4752aad" + dependencies: + eslint "~3.10.2" + eslint-config-standard "6.2.1" + eslint-config-standard-jsx "3.2.0" + eslint-plugin-promise "~3.4.0" + eslint-plugin-react "~6.7.1" + eslint-plugin-standard "~2.0.1" + standard-engine "~5.2.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@2, through@^2.3.6, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +touch@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" + dependencies: + nopt "~1.0.10" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + +type-is@~1.6.13: + version "1.6.14" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.13" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +update-notifier@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" + dependencies: + chalk "^1.0.0" + configstore "^1.0.0" + is-npm "^1.0.0" + latest-version "^1.0.0" + repeating "^1.1.2" + semver-diff "^2.0.0" + string-length "^1.0.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" + +v8flags@^2.0.10: + version "2.0.11" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" + dependencies: + user-home "^1.1.1" + +vary@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yallist@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4"