# 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).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mediamagic.dev/product-docs/services/graphql-gateway/node_modules/nexus.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
