graphqldoc
Version:
Generate GraphQL docs from schema.
304 lines (303 loc) • 8.99 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Copyright (c) 2015, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
const graphql_1 = require("graphql");
/**
* This is designed to be an end-to-end test, demonstrating
* the full GraphQL stack.
*
* We will create a GraphQL schema that describes the major
* characters in the original Star Wars trilogy.
*
* NOTE: This may contain spoilers for the original Star
* Wars trilogy.
*/
/**
* Using our shorthand to describe type systems, the type system for our
* Star Wars example is:
*
* enum Episode { NEWHOPE, EMPIRE, JEDI }
*
* interface Character {
* id: ID
* name: String
* friends: [Character]
* appearsIn: [Episode]
* }
*
* type Human : Character {
* id: ID
* name: String
* friends: [Character]
* appearsIn: [Episode]
* homePlanet: String
* }
*
* type Droid : Character {
* id: ID
* name: String
* friends: [Character]
* appearsIn: [Episode]
* primaryFunction: String
* }
*
* type Query {
* hero(episode: Episode): Character
* human(id: ID): Human
* droid(id: ID): Droid
* }
*
* We begin by setting up our schema.
*/
/**
* The original trilogy consists of three movies.
*
* This implements the following type system shorthand:
* enum Episode { NEWHOPE, EMPIRE, JEDI }
*/
const episodeEnum = new graphql_1.GraphQLEnumType({
name: 'Episode',
description: 'One of the films in the Star Wars Trilogy',
values: {
NEWHOPE: {
value: 4,
description: 'Released in 1977.',
},
EMPIRE: {
value: 5,
description: 'Released in 1980.',
},
JEDI: {
value: 6,
description: 'Released in 1983.',
},
}
});
/**
* Characters in the Star Wars trilogy are either humans or droids.
*
* This implements the following type system shorthand:
* interface Character {
* id: ID
* name: String
* friends: [Character]
* appearsIn: [Episode]
* secretBackstory: String
* }
*/
const characterInterface = new graphql_1.GraphQLInterfaceType({
name: 'Character',
description: 'A character in the Star Wars Trilogy',
fields: () => ({
id: {
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID),
description: 'The id of the character.',
},
name: {
type: graphql_1.GraphQLString,
description: 'The name of the character.',
},
friends: {
type: new graphql_1.GraphQLList(characterInterface),
description: 'The friends of the character, or an empty list if they ' +
'have none.',
},
appearsIn: {
type: new graphql_1.GraphQLList(episodeEnum),
description: 'Which movies they appear in.',
},
secretBackstory: {
type: graphql_1.GraphQLString,
description: 'All secrets about their past.',
},
}),
resolveType: _ => humanType,
});
/**
* We define our human type, which implements the character interface.
*
* This implements the following type system shorthand:
* type Human : Character {
* id: ID
* name: String
* friends: [Character]
* appearsIn: [Episode]
* secretBackstory: String
* }
*/
const humanType = new graphql_1.GraphQLObjectType({
name: 'Human',
description: 'A humanoid creature in the Star Wars universe.',
fields: () => ({
id: {
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID),
description: 'The id of the human.',
},
name: {
type: graphql_1.GraphQLString,
description: 'The name of the human.',
},
friends: {
type: new graphql_1.GraphQLList(characterInterface),
description: 'The friends of the human, or an empty list if they ' +
'have none.',
resolve: human => human,
},
appearsIn: {
type: new graphql_1.GraphQLList(episodeEnum),
description: 'Which movies they appear in.',
},
homePlanet: {
type: graphql_1.GraphQLString,
description: 'The home planet of the human, or null if unknown.',
},
secretBackstory: {
type: graphql_1.GraphQLString,
description: 'Where are they from and how they came to be who they are.',
resolve: () => {
throw new Error('secretBackstory is secret.');
},
},
}),
interfaces: [characterInterface]
});
/**
* The other type of character in Star Wars is a droid.
*
* This implements the following type system shorthand:
* type Droid : Character {
* id: ID
* name: String
* friends: [Character]
* appearsIn: [Episode]
* secretBackstory: String
* primaryFunction: String
* }
*/
const droidType = new graphql_1.GraphQLObjectType({
name: 'Droid',
description: 'A mechanical creature in the Star Wars universe.',
fields: () => ({
id: {
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID),
description: 'The id of the droid.',
},
name: {
type: graphql_1.GraphQLString,
description: 'The name of the droid.',
},
friends: {
type: new graphql_1.GraphQLList(characterInterface),
description: 'The friends of the droid, or an empty list if they ' +
'have none.',
resolve: droid => droid,
},
appearsIn: {
type: new graphql_1.GraphQLList(episodeEnum),
description: 'Which movies they appear in.',
},
secretBackstory: {
type: graphql_1.GraphQLString,
description: 'Construction date and the name of the designer.',
resolve: () => {
throw new Error('secretBackstory is secret.');
},
},
primaryFunction: {
type: graphql_1.GraphQLString,
description: 'The primary function of the droid.',
},
}),
interfaces: [characterInterface]
});
/**
* This is the type that will be the root of our query, and the
* entry point into our schema. It gives us the ability to fetch
* objects by their IDs, as well as to fetch the undisputed hero
* of the Star Wars trilogy, R2-D2, directly.
*
* This implements the following type system shorthand:
* type Query {
* hero(episode: Episode): Character
* human(id: ID): Human
* droid(id: ID): Droid
* }
*
*/
const queryType = new graphql_1.GraphQLObjectType({
name: 'Query',
description: 'Root query',
fields: () => ({
hero: {
type: characterInterface,
description: 'Return the hero by episode.',
args: {
episode: {
description: 'If omitted, returns the hero of the whole saga. If ' +
'provided, returns the hero of that particular episode.',
type: episodeEnum
}
},
resolve: () => null,
},
human: {
type: humanType,
description: 'Return the Human by ID.',
args: {
id: {
description: 'id of the human',
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID),
}
},
resolve: () => null,
},
droid: {
type: droidType,
description: 'Return the Droid by ID.',
args: {
id: {
description: 'id of the droid',
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID),
}
},
resolve: () => null,
},
})
});
/**
* type Mutation {
* favorite(episode: Episode!): Episode
* }
*/
const mutationType = new graphql_1.GraphQLObjectType({
name: 'Mutation',
description: 'Root Mutation',
fields: () => ({
favorite: {
type: episodeEnum,
description: 'Save the favorite episode.',
args: {
episode: {
type: new graphql_1.GraphQLNonNull(episodeEnum),
description: 'Favorite episode.'
}
},
resolve: (_, { episode }) => episode,
},
})
});
/**
* Finally, we construct our schema (whose starting query type is the query
* type we defined above) and export it.
*/
exports.StarWarsSchema = new graphql_1.GraphQLSchema({
query: queryType,
mutation: mutationType
});