# Nexus

[![trunk](https://github.com/graphql-nexus/nexus/workflows/trunk/badge.svg)](https://github.com/graphql-nexus/nexus/actions/workflows/trunk.yml) [![npm version](https://badge.fury.io/js/%40nexus%2Fschema.svg)](https://badge.fury.io/js/%40nexus%2Fschema)

Declarative, code-first and strongly typed GraphQL schema construction for TypeScript & JavaScript.

## Installation

```
npm install nexus graphql
```

Note you must also add `graphql`. Nexus pins to it as a [peer dependency](https://nodejs.org/en/blog/npm/peer-dependencies/).

## Features

* **Expressive, declarative API for building schemas**
* **Full type-safety for free**
* **Powerful plugin system**
* **No need to re-declare interface fields per-object**
* **Optionally possible to reference types by name (with autocomplete)**\
  Rather than needing to import every single piece of the schema
* **Interoperable with vanilla `graphql-js` types, and it's&#x20;*****just*****&#x20;a** [**`GraphQLSchema`**](https://graphql.org/graphql-js/type/#graphqlschema)\
  So it fits in just fine with existing community solutions of `apollo-server`, `graphql-middleware`, etc.
* **Inline function resolvers**\
  For when you need to do simple field aliasing
* **Auto-generated graphql SDL schema**\
  Great for when seeing how any code changes affected the schema
* **DRY-up schema design**\
  Create higher level "functions" which wrap common fields

## Example

```ts
import { queryType, stringArg, makeSchema } from 'nexus'
import { GraphQLServer } from 'graphql-yoga'

const Query = queryType({
  definition(t) {
    t.string('hello', {
      args: { name: stringArg() },
      resolve: (parent, { name }) => `Hello ${name || 'World'}!`,
    })
  },
})

const schema = makeSchema({
  types: [Query],
  outputs: {
    schema: __dirname + '/generated/schema.graphql',
    typegen: __dirname + '/generated/typings.ts',
  },
})

const server = new GraphQLServer({
  schema,
})

server.start(() => `Server is running on http://localhost:4000`)
```

More examples can be found in the [`/examples`](https://github.com/pingponglabs/mediamagic-platform/blob/main/services/graphql-gateway/node_modules/nexus/examples/README.md) directory:

* [githunt-api](https://github.com/pingponglabs/mediamagic-platform/blob/main/services/graphql-gateway/node_modules/nexus/examples/githunt-api/README.md)
* [ts-ast-reader](https://github.com/pingponglabs/mediamagic-platform/blob/main/services/graphql-gateway/node_modules/nexus/examples/ts-ast-reader/README.md)
* [apollo-fullstack](https://github.com/pingponglabs/mediamagic-platform/blob/main/services/graphql-gateway/node_modules/nexus/examples/apollo-fullstack/README.md)
* [star-wars](https://github.com/pingponglabs/mediamagic-platform/blob/main/services/graphql-gateway/node_modules/nexus/examples/star-wars/README.md)
* [kitchen-sink](https://github.com/pingponglabs/mediamagic-platform/blob/main/services/graphql-gateway/node_modules/nexus/examples/kitchen-sink/README.md)

## Documentation

You can find the docs for Nexus [here](http://nexusjs.org/).

## Migrate from SDL

If you've been following an [SDL-first](https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3/) approach to build your GraphQL server and want to see what your code looks like when written with GraphQL Nexus, you can use the [**SDL converter**](https://nexus.js.org/converter).
