{"action":"created","comment":{"url":"https://api.github.com/repos/apollographql/apollo-server/pulls/comments/183891871","pull_request_review_id":114979331,"id":183891871,"diff_hunk":"@@ -0,0 +1,383 @@\n+import { makeExecutableSchema } from 'graphql-tools';\n+import { Server as HttpServer } from 'http';\n+import {\n+  execute,\n+  GraphQLSchema,\n+  subscribe,\n+  ExecutionResult,\n+  GraphQLError,\n+  GraphQLResolveInfo,\n+  ValidationContext,\n+  FieldDefinitionNode,\n+} from 'graphql';\n+import { CacheControlExtensionOptions } from 'apollo-cache-control';\n+import { formatError, GraphQLOptions, LogFunction } from 'apollo-server-core';\n+import { ApolloEngine as Engine } from 'apollo-engine';\n+import {\n+  SubscriptionServer,\n+  ExecutionParams,\n+} from 'subscriptions-transport-ws';\n+\n+import { CorsOptions } from 'cors';\n+import {\n+  Config,\n+  ListenOptions,\n+  MiddlewareOptions,\n+  MiddlewareRegistrationOptions,\n+  ServerInfo,\n+  Context,\n+  ContextFunction,\n+} from './types';\n+\n+export {\n+  LogFunction,\n+  ValidationContext,\n+  CacheControlExtensionOptions,\n+  GraphQLResolveInfo,\n+};\n+\n+// taken from engine\n+export function joinHostPort(host: string, port: number) {\n+  if (host.includes(':')) host = `[${host}]`;\n+  return `${host}:${port}`;\n+}\n+\n+const env = process.env.NODE_ENV;\n+const isDev = env !== 'production' && env !== 'test';\n+\n+const NoIntrospection = (context: ValidationContext) => ({\n+  Field(node: FieldDefinitionNode) {\n+    if (node.name.value === '__schema' || node.name.value === '__type') {\n+      context.reportError(\n+        new GraphQLError(\n+          'GraphQL introspection is not allowed by Apollo Server, but the query containted __schema or __type. To enable introspection, pass introspection: true to ApolloServer in production',\n+          [node],\n+        ),\n+      );\n+    }\n+  },\n+});\n+\n+export class ApolloServerBase<\n+  Server = HttpServer,\n+  Request = any,\n+  Cors = CorsOptions\n+> {\n+  app?: Server;\n+  schema: GraphQLSchema;\n+  private context?: Context | ContextFunction;\n+  private engine?: Engine;\n+  private appCreated: boolean = false;\n+  private middlewareRegistered: boolean = false;\n+  private http?: HttpServer;\n+  private subscriptions?: any;\n+  private graphqlEndpoint: string = '/graphql';\n+  private cors?: Cors;\n+  private engineEnabled: boolean = false;\n+  private requestOptions: Partial<GraphQLOptions<any>>;\n+  private disableTools: boolean = !isDev;\n+\n+  constructor(config: Config<Server, Request, Cors>) {\n+    const {\n+      app,\n+      context,\n+      cors,\n+      engine,\n+      engineInRequestPath,\n+      resolvers,\n+      schema,\n+      schemaDirectives,\n+      subscriptions,\n+      typeDefs,\n+      introspection,\n+      ...requestOptions\n+    } = config;\n+\n+    if (introspection === false || !isDev) {\n+      this.disableTools = true;\n+      const noIntro = [NoIntrospection];\n+      requestOptions.validationRules = requestOptions.validationRules\n+        ? requestOptions.validationRules.concat(noIntro)\n+        : noIntro;\n+    }\n+\n+    this.requestOptions = requestOptions;\n+    this.context = context;\n+    // XXX should we move this to the `start` call? This would make hot\n+    // reloading eaiser but may not be worth it?\n+    this.schema = schema\n+      ? schema\n+      : makeExecutableSchema({\n+          typeDefs: Array.isArray(typeDefs)\n+            ? typeDefs.reduce((prev, next) => prev + '\\n' + next)\n+            : typeDefs,\n+          schemaDirectives,\n+          resolvers,\n+        });\n+\n+    this.subscriptions = subscriptions;\n+    this.cors = cors;\n+\n+    if (app) {\n+      this.app = app;\n+    } else {\n+      this.app = this.createApp();\n+      this.appCreated = true;\n+    }\n+\n+    // only access this onces as its slower on node\n+    const { ENGINE_API_KEY, ENGINE_CONFIG } = process.env;\n+    const shouldLoadEngine = ENGINE_API_KEY || ENGINE_CONFIG || engine;\n+    if (engine === false && shouldLoadEngine) {\n+      console.warn(\n+        'engine is set to false when creating ApolloServer but either ENGINE_CONFIG or ENGINE_API_KEY were found in the environment',\n+      );\n+    }\n+    let ApolloEngine;\n+    if (engine) {\n+      // detect engine if it is set to true or has a config, and possibly load it\n+      try {\n+        ApolloEngine = require('apollo-engine').ApolloEngine;\n+      } catch (e) {\n+        if (shouldLoadEngine) {\n+          console.warn(`ApolloServer was unable to load Apollo Engine and found either environment variables that seem like you want it to be running or engine was configured on the options when creating this ApolloServer? To fix this, run the following command:\n+\n+  npm install apollo-engine --save\n+`);\n+        }\n+      }\n+\n+      if (!shouldLoadEngine) {\n+        throw new Error(`\n+\n+ApolloServer was unable to load the configuration for Apollo Engine. Please verify that you are either passing in an engine config to the new ApolloServer call, or have set ENGINE_CONFIG or ENGINE_API_KEY in your environment\n+\n+          `);\n+      }\n+      this.engine = new ApolloEngine(\n+        typeof engine === 'boolean' ? undefined : engine,\n+      );\n+    }\n+\n+    // XXX should this allow for header overrides from graphql-playground?\n+    if (this.engine || engineInRequestPath) this.engineEnabled = true;\n+  }\n+\n+  public applyMiddleware(opts: MiddlewareOptions = {}) {\n+    if (this.appCreated) {\n+      throw new Error(`It looks like server.applyMiddleware was called when app was not passed into ApolloServer. To use middlware, you need to create an ApolloServer from a variant package and pass in your app:\n+    const { ApolloServer } = require('apollo-server/express');\n+    const express = require('express');\n+\n+    const app = express();\n+    const server = new ApolloServer({ app, resolvers, typeDefs });\n+    // then when you want to add the middleware\n+    server.applyMiddleware();\n+    // then start the server\n+    server.listen()\n+`);\n+    }\n+\n+    const registerOptions: MiddlewareRegistrationOptions<\n+      Server,\n+      Request,\n+      Cors\n+    > = {\n+      endpoint: this.graphqlEndpoint,\n+      cors: this.cors,\n+      subscriptions: true,\n+      ...opts,\n+      graphiql:\n+        opts.graphiql === false || this.disableTools\n+          ? null\n+          : `${opts.graphiql || '/graphiql'}`,\n+      app: this.app,\n+      request: this.request.bind(this),\n+    };\n+\n+    this.graphqlEndpoint = registerOptions.endpoint;\n+    // this function can either mutate the app (normal)\n+    // or some frameworks maj need to return a new one\n+    const possiblyNewServer = this.registerMiddleware(registerOptions);\n+    this.middlewareRegistered = true;\n+    if (possiblyNewServer) this.app = possiblyNewServer;\n+  }\n+\n+  public listen(opts: ListenOptions = {}): Promise<ServerInfo> {\n+    if (!this.appCreated && !this.middlewareRegistered) {\n+      throw new Error(\n+        `It looks like you are trying to run ApolloServer without applying the middleware. This error is thrown when using a variant of ApolloServer (i.e. require('apollo-server/variant')) and passing in a custom app. To fix this, before you call server.listen, you need to call server.applyMiddleware():\n+  \n+  const app = express();\n+  const server = new ApolloServer({ app, resolvers, typeDefs });\n+\n+  // XXX this part is missing currently!\n+  server.applyMiddleware();\n+\n+  server.listen();\n+`,\n+      );\n+    }\n+\n+    const options = {\n+      port: process.env.PORT || 4000,\n+      ...opts,\n+    };\n+\n+    this.http = this.getHttpServer(this.app);\n+    if (this.subscriptions !== false) {\n+      const config =\n+        this.subscriptions === true || typeof this.subscriptions === 'undefined'\n+          ? {\n+              path: this.graphqlEndpoint,\n+            }\n+          : this.subscriptions;\n+      this.createSubscriptionServer(this.http, config);\n+    }\n+\n+    return new Promise((s, f) => {\n+      if (this.engine) {\n+        this.engine.listen(\n+          Object.assign({}, options.engine, {\n+            graphqlPaths: [this.graphqlEndpoint],\n+            port: options.port,\n+            httpServer: this.http,\n+          }),\n+          () => s(this.engine.engineListeningAddress),\n+        );\n+        this.engine.on('error', f);\n+        return;\n+      }\n+\n+      this.http.listen(options.port, () => {\n+        const la: any = this.http.address();\n+        // Convert IPs which mean \"any address\" (IPv4 or IPv6) into localhost\n+        // corresponding loopback ip. Note that the url field we're setting is\n+        // primarily for consumption by our test suite. If this heuristic is\n+        // wrong for your use case, explicitly specify a frontend host (in the\n+        // `frontends.host` field in your engine config, or in the `host`\n+        // option to ApolloEngine.listen).\n+        let hostForUrl = la.address;\n+        if (la.address === '' || la.address === '::') hostForUrl = 'localhost';\n+        la.url = `http://${joinHostPort(hostForUrl, la.port)}`;\n+        s(la);\n+      });\n+    });\n+  }\n+\n+  public async stop() {\n+    if (this.engine) await this.engine.stop();\n+    if (this.http) await new Promise(s => this.http.close(s));\n+  }\n+\n+  private createSubscriptionServer(server: HttpServer, config: ListenOptions) {\n+    const { onDisconnect, onConnect, keepAlive } = config;\n+    SubscriptionServer.create(\n+      {\n+        schema: this.schema,\n+        execute,\n+        subscribe,\n+        onConnect: onConnect\n+          ? onConnect\n+          : (connectionParams: Object) => ({ ...connectionParams }),\n+        onDisconnect: onDisconnect,\n+        onOperation: async (_: string, connection: ExecutionParams) => {\n+          connection.formatResponse = (value: ExecutionResult) => ({\n+            ...value,\n+            errors: value.errors && value.errors.map(err => formatError(err)),\n+          });\n+          let context: Context = this.context ? this.context : { connection };\n+\n+          try {\n+            context =\n+              typeof this.context === 'function'\n+                ? await this.context({ connection })\n+                : context;\n+          } catch (e) {\n+            console.error(e);\n+            throw e;\n+          }\n+\n+          return { ...connection, context };\n+        },\n+        keepAlive,\n+      },\n+      {\n+        server,\n+        path: this.graphqlEndpoint,\n+      },\n+    );\n+  }\n+\n+  async request(request: Request) {\n+    if (!this) {\n+      throw new Error(`It looks like you tried to call this.request but didn't bind it to the parent class. To fix this,","path":"packages/apollo-server/src/utils/ApolloServer.ts","position":329,"original_position":314,"commit_id":"33ea0c92a1e4e76c8915ff08806f15dae391e1f0","original_commit_id":"39eff9503dc8369642eea76945fa143fd867dfb6","user":{"login":"glasser","id":16724,"avatar_url":"https://avatars3.githubusercontent.com/u/16724?v=4","gravatar_id":"","url":"https://api.github.com/users/glasser","html_url":"https://github.com/glasser","followers_url":"https://api.github.com/users/glasser/followers","following_url":"https://api.github.com/users/glasser/following{/other_user}","gists_url":"https://api.github.com/users/glasser/gists{/gist_id}","starred_url":"https://api.github.com/users/glasser/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/glasser/subscriptions","organizations_url":"https://api.github.com/users/glasser/orgs","repos_url":"https://api.github.com/users/glasser/repos","events_url":"https://api.github.com/users/glasser/events{/privacy}","received_events_url":"https://api.github.com/users/glasser/received_events","type":"User","site_admin":false},"body":"I feel like the error messages aimed at implementors and at end users could be different then? Like this error message makes it feel like this is an important method worth calling, not an internal detail.  And the error should be more like \"you called this method directly on the class but you're only supposed to use it as an option in registerMiddleware\", not \"you should have bound it\"?\r\n\r\nRe public vs private, is this what `protected` is for?","created_at":"2018-04-24T21:53:00Z","updated_at":"2018-04-24T21:53:00Z","html_url":"https://github.com/apollographql/apollo-server/pull/979#discussion_r183891871","pull_request_url":"https://api.github.com/repos/apollographql/apollo-server/pulls/979","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apollographql/apollo-server/pulls/comments/183891871"},"html":{"href":"https://github.com/apollographql/apollo-server/pull/979#discussion_r183891871"},"pull_request":{"href":"https://api.github.com/repos/apollographql/apollo-server/pulls/979"}},"in_reply_to_id":183500558},"pull_request":{"url":"https://api.github.com/repos/apollographql/apollo-server/pulls/979","id":183469859,"html_url":"https://github.com/apollographql/apollo-server/pull/979","diff_url":"https://github.com/apollographql/apollo-server/pull/979.diff","patch_url":"https://github.com/apollographql/apollo-server/pull/979.patch","issue_url":"https://api.github.com/repos/apollographql/apollo-server/issues/979","number":979,"state":"open","locked":false,"title":"Apollo Server 2.0","user":{"login":"jbaxleyiii","id":4967600,"avatar_url":"https://avatars2.githubusercontent.com/u/4967600?v=4","gravatar_id":"","url":"https://api.github.com/users/jbaxleyiii","html_url":"https://github.com/jbaxleyiii","followers_url":"https://api.github.com/users/jbaxleyiii/followers","following_url":"https://api.github.com/users/jbaxleyiii/following{/other_user}","gists_url":"https://api.github.com/users/jbaxleyiii/gists{/gist_id}","starred_url":"https://api.github.com/users/jbaxleyiii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jbaxleyiii/subscriptions","organizations_url":"https://api.github.com/users/jbaxleyiii/orgs","repos_url":"https://api.github.com/users/jbaxleyiii/repos","events_url":"https://api.github.com/users/jbaxleyiii/events{/privacy}","received_events_url":"https://api.github.com/users/jbaxleyiii/received_events","type":"User","site_admin":false},"body":"This PR intends to land the revival of the `apollo-server` package as a new entry point for building GraphQL servers. Unlike `apollo-server-framework`, which provides http related utilities for working with a prexisting schema, `apollo-server` seeks to take an opinionated approach to building GraphQL services.\r\n\r\nIt provides the tooling from graphql-tools and graphql-subscriptions, includes custom schema and service runtime additions (initially production validation rules for turning off introspection and more guidance around error handling).\r\n\r\nThis is the kickoff of a new generation of work on building production ready GraphQL services ♥️ ","created_at":"2018-04-23T15:20:25Z","updated_at":"2018-04-24T21:53:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b11b5f2bed3c45dea94f462552af60f0b5f643a9","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apollographql/apollo-server/pulls/979/commits","review_comments_url":"https://api.github.com/repos/apollographql/apollo-server/pulls/979/comments","review_comment_url":"https://api.github.com/repos/apollographql/apollo-server/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apollographql/apollo-server/issues/979/comments","statuses_url":"https://api.github.com/repos/apollographql/apollo-server/statuses/33ea0c92a1e4e76c8915ff08806f15dae391e1f0","head":{"label":"apollographql:new-apollo-server","ref":"new-apollo-server","sha":"33ea0c92a1e4e76c8915ff08806f15dae391e1f0","user":{"login":"apollographql","id":17189275,"avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"repo":{"id":56760633,"name":"apollo-server","full_name":"apollographql/apollo-server","owner":{"login":"apollographql","id":17189275,"avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apollographql/apollo-server","description":":earth_africa: GraphQL server for Express, Connect, Hapi, Koa and more","fork":false,"url":"https://api.github.com/repos/apollographql/apollo-server","forks_url":"https://api.github.com/repos/apollographql/apollo-server/forks","keys_url":"https://api.github.com/repos/apollographql/apollo-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apollographql/apollo-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apollographql/apollo-server/teams","hooks_url":"https://api.github.com/repos/apollographql/apollo-server/hooks","issue_events_url":"https://api.github.com/repos/apollographql/apollo-server/issues/events{/number}","events_url":"https://api.github.com/repos/apollographql/apollo-server/events","assignees_url":"https://api.github.com/repos/apollographql/apollo-server/assignees{/user}","branches_url":"https://api.github.com/repos/apollographql/apollo-server/branches{/branch}","tags_url":"https://api.github.com/repos/apollographql/apollo-server/tags","blobs_url":"https://api.github.com/repos/apollographql/apollo-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apollographql/apollo-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apollographql/apollo-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/apollographql/apollo-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apollographql/apollo-server/statuses/{sha}","languages_url":"https://api.github.com/repos/apollographql/apollo-server/languages","stargazers_url":"https://api.github.com/repos/apollographql/apollo-server/stargazers","contributors_url":"https://api.github.com/repos/apollographql/apollo-server/contributors","subscribers_url":"https://api.github.com/repos/apollographql/apollo-server/subscribers","subscription_url":"https://api.github.com/repos/apollographql/apollo-server/subscription","commits_url":"https://api.github.com/repos/apollographql/apollo-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/apollographql/apollo-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/apollographql/apollo-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/apollographql/apollo-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/apollographql/apollo-server/contents/{+path}","compare_url":"https://api.github.com/repos/apollographql/apollo-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apollographql/apollo-server/merges","archive_url":"https://api.github.com/repos/apollographql/apollo-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apollographql/apollo-server/downloads","issues_url":"https://api.github.com/repos/apollographql/apollo-server/issues{/number}","pulls_url":"https://api.github.com/repos/apollographql/apollo-server/pulls{/number}","milestones_url":"https://api.github.com/repos/apollographql/apollo-server/milestones{/number}","notifications_url":"https://api.github.com/repos/apollographql/apollo-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apollographql/apollo-server/labels{/name}","releases_url":"https://api.github.com/repos/apollographql/apollo-server/releases{/id}","deployments_url":"https://api.github.com/repos/apollographql/apollo-server/deployments","created_at":"2016-04-21T09:26:01Z","updated_at":"2018-04-24T18:36:23Z","pushed_at":"2018-04-24T19:39:30Z","git_url":"git://github.com/apollographql/apollo-server.git","ssh_url":"git@github.com:apollographql/apollo-server.git","clone_url":"https://github.com/apollographql/apollo-server.git","svn_url":"https://github.com/apollographql/apollo-server","homepage":"https://www.apollographql.com/docs/apollo-server/","size":1842,"stargazers_count":3714,"watchers_count":3714,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":384,"mirror_url":null,"archived":false,"open_issues_count":112,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":384,"open_issues":112,"watchers":3714,"default_branch":"master"}},"base":{"label":"apollographql:master","ref":"master","sha":"5d7e281aa1c88d46304ccea0b25c8d3828e7d19f","user":{"login":"apollographql","id":17189275,"avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"repo":{"id":56760633,"name":"apollo-server","full_name":"apollographql/apollo-server","owner":{"login":"apollographql","id":17189275,"avatar_url":"https://avatars0.githubusercontent.com/u/17189275?v=4","gravatar_id":"","url":"https://api.github.com/users/apollographql","html_url":"https://github.com/apollographql","followers_url":"https://api.github.com/users/apollographql/followers","following_url":"https://api.github.com/users/apollographql/following{/other_user}","gists_url":"https://api.github.com/users/apollographql/gists{/gist_id}","starred_url":"https://api.github.com/users/apollographql/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apollographql/subscriptions","organizations_url":"https://api.github.com/users/apollographql/orgs","repos_url":"https://api.github.com/users/apollographql/repos","events_url":"https://api.github.com/users/apollographql/events{/privacy}","received_events_url":"https://api.github.com/users/apollographql/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apollographql/apollo-server","description":":earth_africa: GraphQL server for Express, Connect, Hapi, Koa and more","fork":false,"url":"https://api.github.com/repos/apollographql/apollo-server","forks_url":"https://api.github.com/repos/apollographql/apollo-server/forks","keys_url":"https://api.github.com/repos/apollographql/apollo-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apollographql/apollo-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apollographql/apollo-server/teams","hooks_url":"https://api.github.com/repos/apollographql/apollo-server/hooks","issue_events_url":"https://api.github.com/repos/apollographql/apollo-server/issues/events{/number}","events_url":"https://api.github.com/repos/apollographql/apollo-server/events","assignees_url":"https://api.github.com/repos/apollographql/apollo-server/assignees{/user}","branches_url":"https://api.github.com/repos/apollographql/apollo-server/branches{/branch}","tags_url":"https://api.github.com/repos/apollographql/apollo-server/tags","blobs_url":"https://api.github.com/repos/apollographql/apollo-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apollographql/apollo-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apollographql/apollo-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/apollographql/apollo-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apollographql/apollo-server/statuses/{sha}","languages_url":"https://api.github.com/repos/apollographql/apollo-server/languages","stargazers_url":"https://api.github.com/repos/apollographql/apollo-server/stargazers","contributors_url":"https://api.github.com/repos/apollographql/apollo-server/contributors","subscribers_url":"https://api.github.com/repos/apollographql/apollo-server/subscribers","subscription_url":"https://api.github.com/repos/apollographql/apollo-server/subscription","commits_url":"https://api.github.com/repos/apollographql/apollo-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/apollographql/apollo-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/apollographql/apollo-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/apollographql/apollo-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/apollographql/apollo-server/contents/{+path}","compare_url":"https://api.github.com/repos/apollographql/apollo-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apollographql/apollo-server/merges","archive_url":"https://api.github.com/repos/apollographql/apollo-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apollographql/apollo-server/downloads","issues_url":"https://api.github.com/repos/apollographql/apollo-server/issues{/number}","pulls_url":"https://api.github.com/repos/apollographql/apollo-server/pulls{/number}","milestones_url":"https://api.github.com/repos/apollographql/apollo-server/milestones{/number}","notifications_url":"https://api.github.com/repos/apollographql/apollo-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apollographql/apollo-server/labels{/name}","releases_url":"https://api.github.com/repos/apollographql/apollo-server/releases{/id}","deployments_url":"https://api.github.com/repos/apollographql/apollo-server/deployments","created_at":"2016-04-21T09:26:01Z","updated_at":"2018-04-24T18:36:23Z","pushed_at":"2018-04-24T19:39:30Z","git_url":"git://github.com/apollographql/apollo-server.git","ssh_url":"git@github.com:apollographql/apollo-server.git","clone_url":"https://github.com/apollographql/apollo-server.git","svn_url":"https://github.com/apollographql/apollo-server","homepage":"https://www.apollographql.com/docs/apollo-server/","size":1842,"stargazers_count":3714,"watchers_count":3714,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":384,"mirror_url":null,"archived":false,"open_issues_count":112,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":384,"open_issues":112,"watchers":3714,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apollographql/apollo-server/pulls/979"},"html":{"href":"https://github.com/apollographql/apollo-server/pull/979"},"issue":{"href":"https://api.github.com/repos/apollographql/apollo-server/issues/979"},"comments":{"href":"https://api.github.com/repos/apollographql/apollo-server/issues/979/comments"},"review_comments":{"href":"https://api.github.com/repos/apollographql/apollo-server/pulls/979/comments"},"review_comment":{"href":"https://api.github.com/repos/apollographql/apollo-server/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apollographql/apollo-server/pulls/979/commits"},"statuses":{"href":"https://api.github.com/repos/apollographql/apollo-server/statuses/33ea0c92a1e4e76c8915ff08806f15dae391e1f0"}},"author_association":"OWNER"}}
{"actor":{"display_login":"glasser"}}