Skip to content

Commit

Permalink
Don't accept an object of typeDefs and resolvers (#1753)
Browse files Browse the repository at this point in the history
* Don't accept an object of typeDefs and resolvers

* chore(dependencies): updated changesets for modified dependencies

* Update .changeset/fifty-elephants-provide.md

Co-authored-by: Saihajpreet Singh <saihajpreet.singh@gmail.com>

* Update changeset

* Rebase

* chore(dependencies): updated changesets for modified dependencies

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Saihajpreet Singh <saihajpreet.singh@gmail.com>
  • Loading branch information
3 people committed Sep 20, 2022
1 parent e1596e3 commit eeaced0
Show file tree
Hide file tree
Showing 18 changed files with 93 additions and 156 deletions.
5 changes: 5 additions & 0 deletions .changeset/fifty-elephants-provide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'graphql-yoga': major
---

`schema` no longer accepts an object of `typeDefs` and `resolvers` but instead you can use `createSchema` to create a GraphQL schema.
7 changes: 7 additions & 0 deletions .changeset/graphql-yoga-1753-dependencies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"graphql-yoga": patch
---

dependencies updates:

- Removed dependency [`@graphql-tools/utils@^8.8.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/null) (from `dependencies`)
6 changes: 3 additions & 3 deletions examples/defer-stream/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createYoga } from 'graphql-yoga'
import { createSchema, createYoga } from 'graphql-yoga'
import { createServer } from 'http'

const wait = (time: number) =>
Expand Down Expand Up @@ -84,10 +84,10 @@ const resolvers = {
}

const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs,
resolvers,
},
}),
graphiql: {
defaultQuery: /* GraphQL */ `
# Slow alphabet
Expand Down
6 changes: 3 additions & 3 deletions examples/graphql-armor/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createYoga } from 'graphql-yoga'
import { createSchema, createYoga } from 'graphql-yoga'
import { EnvelopArmor } from '@escape.tech/graphql-armor'
import { createServer } from 'http'

Expand All @@ -18,7 +18,7 @@ const booksStore = [

const yoga = createYoga({
plugins: [...enhancements.plugins],
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Book {
title: String
Expand All @@ -33,7 +33,7 @@ const yoga = createYoga({
books: () => booksStore,
},
},
},
}),
})

const server = createServer(yoga)
Expand Down
10 changes: 5 additions & 5 deletions examples/hello-world/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,12 @@ The server returns the following response:
This is what the [implementation](./index.js) looks like:

```js
import { createServer } from 'http'
import { createServer, createSchema } from 'http'
import { createYoga } from 'graphql-yoga'
// ... or using `require()`
// const { createServer } = require('graphql-yoga')
// const { createServer, createSchema } = require('graphql-yoga')

const typeDefs = `
const typeDefs = /* GraphQL */ `
type Query {
hello(name: String): String!
}
Expand All @@ -81,10 +81,10 @@ const resolvers = {
}

const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs,
resolvers,
},
}),
})

const server = createServer(yoga)
Expand Down
24 changes: 12 additions & 12 deletions packages/graphql-yoga/__tests__/http-extensions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ describe('GraphQLError.extensions.http', () => {

it('picks the highest status code and headers for GraphQLErrors thrown within multiple resolvers', async () => {
const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Query {
a: String
Expand Down Expand Up @@ -71,7 +71,7 @@ describe('GraphQLError.extensions.http', () => {
},
},
},
},
}),
})

const response = await yoga.fetch('http://yoga/graphql', {
Expand Down Expand Up @@ -103,7 +103,7 @@ describe('GraphQLError.extensions.http', () => {

it('picks the header of the last GraphQLError when multiple errors are thrown within multiple resolvers', async () => {
const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Query {
a: String
Expand Down Expand Up @@ -136,7 +136,7 @@ describe('GraphQLError.extensions.http', () => {
},
},
},
},
}),
})

let response = await yoga.fetch('http://yoga/graphql', {
Expand All @@ -158,7 +158,7 @@ describe('GraphQLError.extensions.http', () => {

it('should not contain the http extensions in response result', async () => {
const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Query {
a: String
Expand All @@ -180,7 +180,7 @@ describe('GraphQLError.extensions.http', () => {
},
},
},
},
}),
})

let response = await yoga.fetch('http://yoga/graphql', {
Expand All @@ -197,13 +197,13 @@ describe('GraphQLError.extensions.http', () => {

it('should respect http extensions status consistently on parsing fail', async () => {
const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Query {
_: String
}
`,
},
}),
})

let response = await yoga.fetch('http://yoga/graphql', {
Expand All @@ -223,13 +223,13 @@ describe('GraphQLError.extensions.http', () => {

it('should respect http extensions status consistently on validation fail', async () => {
const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Query {
_: String
}
`,
},
}),
})

let response = await yoga.fetch('http://yoga/graphql', {
Expand All @@ -249,13 +249,13 @@ describe('GraphQLError.extensions.http', () => {

it('should respond with status 500 when error without http extension is thrown', async () => {
const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Query {
_: String
}
`,
},
}),
context: () => {
throw new GraphQLError('No http status extension', {
extensions: { http: { headers: { 'x-foo': 'bar' } } },
Expand Down
1 change: 0 additions & 1 deletion packages/graphql-yoga/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
"@envelop/validation-cache": "^4.6.0",
"@graphql-typed-document-node/core": "^3.1.1",
"@graphql-tools/schema": "^9.0.0",
"@graphql-tools/utils": "^8.8.0",
"@graphql-yoga/subscription": "^2.2.2",
"@whatwg-node/fetch": "0.4.4",
"@whatwg-node/server": "0.4.5",
Expand Down
67 changes: 3 additions & 64 deletions packages/graphql-yoga/src/plugins/useSchema.ts
Original file line number Diff line number Diff line change
@@ -1,80 +1,19 @@
import { PromiseOrValue } from '@envelop/core'
import { makeExecutableSchema } from '@graphql-tools/schema'
import { IResolvers, TypeSource } from '@graphql-tools/utils'
import { GraphQLError, GraphQLSchema, isSchema } from 'graphql'
import { GraphQLSchemaWithContext, YogaInitialContext } from '../types'
import { Plugin } from './types'

// TODO: Will be removed later
type TypeDefsAndResolvers<TContext, TRootValue = {}> = {
typeDefs: TypeSource
resolvers?:
| IResolvers<TRootValue, TContext>
| Array<IResolvers<TRootValue, TContext>>
}

export type YogaSchemaDefinition<TContext, TRootValue> =
| TypeDefsAndResolvers<TContext, TRootValue>
export type YogaSchemaDefinition<TContext> =
| PromiseOrValue<GraphQLSchemaWithContext<TContext>>
| ((request: Request) => PromiseOrValue<GraphQLSchemaWithContext<TContext>>)

// Will be moved to a seperate export later
export function getDefaultSchema() {
return makeExecutableSchema({
typeDefs: /* GraphQL */ `
"""
Greetings from GraphQL Yoga!
"""
type Query {
greetings: String
}
type Subscription {
"""
Current Time
"""
time: String
}
`,
resolvers: {
Query: {
greetings: () =>
'This is the `greetings` field of the root `Query` type',
},
Subscription: {
time: {
async *subscribe() {
while (true) {
yield { time: new Date().toISOString() }
await new Promise((resolve) => setTimeout(resolve, 1000))
}
},
},
},
},
})
}

export const useSchema = <
TContext extends YogaInitialContext = YogaInitialContext,
TRootValue = {},
>(
schemaDef?: YogaSchemaDefinition<TContext, TRootValue>,
schemaDef?: YogaSchemaDefinition<TContext>,
): Plugin<TContext> => {
if (schemaDef == null) {
const schema = getDefaultSchema()
return {
onPluginInit({ setSchema }) {
setSchema(schema)
},
}
}
if ('typeDefs' in schemaDef) {
const schema = makeExecutableSchema(schemaDef)
return {
onPluginInit({ setSchema }) {
setSchema(schema)
},
}
return {}
}
if (isSchema(schemaDef)) {
return {
Expand Down
24 changes: 6 additions & 18 deletions packages/graphql-yoga/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ import { useLimitBatching } from './plugins/requestValidation/useLimitBatching.j
export type YogaServerOptions<
TServerContext extends Record<string, any>,
TUserContext extends Record<string, any>,
TRootValue,
> = {
/**
* Enable/disable logging or provide a custom logger.
Expand Down Expand Up @@ -147,8 +146,7 @@ export type YogaServerOptions<
renderGraphiQL?: (options?: GraphiQLOptions) => PromiseOrValue<BodyInit>

schema?: YogaSchemaDefinition<
TUserContext & TServerContext & YogaInitialContext,
TRootValue
TUserContext & TServerContext & YogaInitialContext
>

/**
Expand Down Expand Up @@ -199,7 +197,6 @@ export type BatchingOptions =
export class YogaServer<
TServerContext extends Record<string, any>,
TUserContext extends Record<string, any>,
TRootValue,
> {
/**
* Instance of envelop
Expand All @@ -221,9 +218,7 @@ export class YogaServer<
private maskedErrorsOpts: YogaMaskedErrorOpts | null
private id: string

constructor(
options?: YogaServerOptions<TServerContext, TUserContext, TRootValue>,
) {
constructor(options?: YogaServerOptions<TServerContext, TUserContext>) {
this.id = options?.id ?? 'yoga'
this.fetchAPI =
options?.fetchAPI ??
Expand Down Expand Up @@ -662,21 +657,14 @@ export class YogaServer<
export type YogaServerInstance<
TServerContext extends Record<string, any>,
TUserContext extends Record<string, any>,
TRootValue extends Record<string, any>,
> = ServerAdapter<
TServerContext,
YogaServer<TServerContext, TUserContext, TRootValue>
>
> = ServerAdapter<TServerContext, YogaServer<TServerContext, TUserContext>>

export function createYoga<
TServerContext extends Record<string, any> = {},
TUserContext extends Record<string, any> = {},
TRootValue extends Record<string, any> = {},
>(
options: YogaServerOptions<TServerContext, TUserContext, TRootValue>,
): YogaServerInstance<TServerContext, TUserContext, TRootValue> {
const server = new YogaServer<TServerContext, TUserContext, TRootValue>(
options,
)
options: YogaServerOptions<TServerContext, TUserContext>,
): YogaServerInstance<TServerContext, TUserContext> {
const server = new YogaServer<TServerContext, TUserContext>(options)
return createServerAdapter(server, server.fetchAPI.Request)
}
6 changes: 3 additions & 3 deletions website/src/pages/v3/features/envelop-plugins.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ The following example adds [GraphQL JIT](https://github.com/zalando-incubator/gr

```ts
import { useGraphQlJit } from '@envelop/graphql-jit'
import { createYoga } from 'graphql-yoga'
import { createYoga, createSchema } from 'graphql-yoga'

// Provide your schema
const yoga = createYoga({
schema: {
schema: createSchema({
typeDefs: /* GraphQL */ `
type Query {
greetings: String!
Expand All @@ -27,7 +27,7 @@ const yoga = createYoga({
greetings: () => 'Hello World!',
},
},
},
}),
plugins: [useGraphQlJit()],
})

Expand Down
Loading

0 comments on commit eeaced0

Please sign in to comment.