From 2b56aceb987fdd7b0418e3833a8bce3b47d02291 Mon Sep 17 00:00:00 2001 From: nodkz Date: Sun, 16 Feb 2020 01:49:23 +0600 Subject: [PATCH] feat: remove undocumented Thunk support due to Thunk stability in complex schemas and provide stronger & better DX Closes #231 --- src/InputTypeComposer.d.ts | 10 +++----- src/InputTypeComposer.js | 8 +++--- src/InterfaceTypeComposer.d.ts | 5 +--- src/InterfaceTypeComposer.js | 11 ++------- src/ObjectTypeComposer.d.ts | 16 +++++------- src/ObjectTypeComposer.js | 16 +++++------- src/TypeMapper.d.ts | 8 +++--- src/TypeMapper.js | 31 +++--------------------- src/__tests__/ObjectTypeComposer-test.js | 11 +++------ src/__tests__/TypeMapper-test.js | 4 +-- src/__tests__/github_issues/231-test.js | 8 +++--- 11 files changed, 36 insertions(+), 92 deletions(-) diff --git a/src/InputTypeComposer.d.ts b/src/InputTypeComposer.d.ts index 3610f6e9..97ae00b8 100644 --- a/src/InputTypeComposer.d.ts +++ b/src/InputTypeComposer.d.ts @@ -34,13 +34,12 @@ export type InputTypeComposerAsObjectDefinition = { export type InputTypeComposerFieldConfigMap = ObjMap; export type InputTypeComposerFieldConfigMapDefinition = ObjMap< - Thunk + InputTypeComposerFieldConfigDefinition >; export type InputTypeComposerFieldConfigDefinition = | InputTypeComposerFieldConfigAsObjectDefinition - | ComposeInputTypeDefinition - | ComposeInputType; + | Thunk; export type InputTypeComposerFieldConfigAsObjectDefinition = { type: Thunk; @@ -101,10 +100,7 @@ export class InputTypeComposer { public setFields(fields: InputTypeComposerFieldConfigMapDefinition): this; - public setField( - fieldName: string, - fieldConfig: Thunk - ): this; + public setField(fieldName: string, fieldConfig: InputTypeComposerFieldConfigDefinition): this; /** * Add new fields or replace existed in a GraphQL type diff --git a/src/InputTypeComposer.js b/src/InputTypeComposer.js index e4e831ac..c56ec80d 100644 --- a/src/InputTypeComposer.js +++ b/src/InputTypeComposer.js @@ -52,13 +52,11 @@ export type InputTypeComposerAsObjectDefinition = { }; export type InputTypeComposerFieldConfigMap = ObjMap; -export type InputTypeComposerFieldConfigMapDefinition = ObjMapReadOnly< - Thunk ->; +export type InputTypeComposerFieldConfigMapDefinition = ObjMapReadOnly; export type InputTypeComposerFieldConfigDefinition = | InputTypeComposerFieldConfigAsObjectDefinition - | ComposeInputTypeDefinition + | Thunk | $ReadOnly; export type InputTypeComposerFieldConfigAsObjectDefinition = { @@ -222,7 +220,7 @@ export class InputTypeComposer { setField( fieldName: string, - fieldConfig: Thunk> + fieldConfig: InputTypeComposerFieldConfigDefinition ): InputTypeComposer { this._gqcFields[fieldName] = this.schemaComposer.typeMapper.convertInputFieldConfig( fieldConfig, diff --git a/src/InterfaceTypeComposer.d.ts b/src/InterfaceTypeComposer.d.ts index 362a5c4f..e55095b7 100644 --- a/src/InterfaceTypeComposer.d.ts +++ b/src/InterfaceTypeComposer.d.ts @@ -121,10 +121,7 @@ export class InterfaceTypeComposer { public setField( name: string, - fieldConfig: Thunk< - | ComposeOutputType - | ObjectTypeComposerFieldConfigDefinition - > + fieldConfig: ObjectTypeComposerFieldConfigDefinition ): this; /** diff --git a/src/InterfaceTypeComposer.js b/src/InterfaceTypeComposer.js index 39bb59c4..a98edfb4 100644 --- a/src/InterfaceTypeComposer.js +++ b/src/InterfaceTypeComposer.js @@ -53,11 +53,7 @@ import { } from './utils/typeHelpers'; import { defineFieldMap, convertObjectFieldMapToConfig } from './utils/configToDefine'; import { graphqlVersion } from './utils/graphqlVersion'; -import type { - ComposeNamedInputType, - ComposeNamedOutputType, - ComposeOutputType, -} from './utils/typeHelpers'; +import type { ComposeNamedInputType, ComposeNamedOutputType } from './utils/typeHelpers'; import { printInterface, type SchemaPrinterOptions } from './utils/schemaPrinter'; import { getInterfaceTypeDefinitionNode } from './utils/definitionNode'; @@ -253,10 +249,7 @@ export class InterfaceTypeComposer { setField( fieldName: string, - fieldConfig: Thunk< - | $ReadOnly> - | ObjectTypeComposerFieldConfigDefinition - > + fieldConfig: ObjectTypeComposerFieldConfigDefinition ): InterfaceTypeComposer { this._gqcFields[fieldName] = this.schemaComposer.typeMapper.convertOutputFieldConfig( fieldConfig diff --git a/src/ObjectTypeComposer.d.ts b/src/ObjectTypeComposer.d.ts index a92390e6..0d9b5169 100644 --- a/src/ObjectTypeComposer.d.ts +++ b/src/ObjectTypeComposer.d.ts @@ -65,14 +65,13 @@ export type ObjectTypeComposerFieldConfigMap = ObjMap< ObjectTypeComposerFieldConfig >; export type ObjectTypeComposerFieldConfigMapDefinition = ObjMap< - Thunk> + ObjectTypeComposerFieldConfigDefinition >; export type ObjectTypeComposerFieldConfigDefinition = | ObjectTypeComposerFieldConfigAsObjectDefinition - | ComposeOutputTypeDefinition - | Resolver - | ComposeOutputType; + | Thunk> + | Resolver; export type ObjectTypeComposerFieldConfigAsObjectDefinition = { type: Thunk | Resolver>; @@ -106,7 +105,7 @@ export type ObjectTypeComposerArgumentConfigMap = { }; export type ObjectTypeComposerArgumentConfigMapDefinition = { - [argName in keyof TArgs]: Thunk; + [argName in keyof TArgs]: ObjectTypeComposerArgumentConfigDefinition; }; export type ObjectTypeComposerArgumentConfigAsObjectDefinition = { @@ -128,7 +127,7 @@ export type ObjectTypeComposerArgumentConfig = { export type ObjectTypeComposerArgumentConfigDefinition = | ObjectTypeComposerArgumentConfigAsObjectDefinition - | ComposeInputTypeDefinition; + | Thunk; // RELATION ----------------------------- @@ -231,10 +230,7 @@ export class ObjectTypeComposer { public setField( fieldName: string, - fieldConfig: Thunk< - | ComposeOutputType - | ObjectTypeComposerFieldConfigDefinition - > + fieldConfig: ObjectTypeComposerFieldConfigDefinition ): this; /** diff --git a/src/ObjectTypeComposer.js b/src/ObjectTypeComposer.js index 14772217..2849e4dc 100644 --- a/src/ObjectTypeComposer.js +++ b/src/ObjectTypeComposer.js @@ -94,14 +94,13 @@ export type ObjectTypeComposerFieldConfigMap = ObjMap< ObjectTypeComposerFieldConfig >; export type ObjectTypeComposerFieldConfigMapDefinition = ObjMapReadOnly< - Thunk> + ObjectTypeComposerFieldConfigDefinition >; export type ObjectTypeComposerFieldConfigDefinition = | ObjectTypeComposerFieldConfigAsObjectDefinition - | ComposeOutputTypeDefinition - | $ReadOnly> - | $ReadOnly>; + | Thunk> + | $ReadOnly>; export type ObjectTypeComposerFieldConfigAsObjectDefinition = { type: Thunk | $ReadOnly>>, @@ -135,7 +134,7 @@ export type ObjectTypeComposerArgumentConfigMap = { }; export type ObjectTypeComposerArgumentConfigMapDefinition = { - +[argName: $Keys]: Thunk, + +[argName: $Keys]: ObjectTypeComposerArgumentConfigDefinition, }; export type ObjectTypeComposerArgumentConfigAsObjectDefinition = { @@ -157,7 +156,7 @@ export type ObjectTypeComposerArgumentConfig = { export type ObjectTypeComposerArgumentConfigDefinition = | ObjectTypeComposerArgumentConfigAsObjectDefinition - | ComposeInputTypeDefinition; + | Thunk; // RELATION ----------------------------- @@ -385,10 +384,7 @@ export class ObjectTypeComposer { setField( fieldName: string, - fieldConfig: Thunk< - | $ReadOnly> - | ObjectTypeComposerFieldConfigDefinition - > + fieldConfig: ObjectTypeComposerFieldConfigDefinition ): ObjectTypeComposer { this._gqcFields[fieldName] = this.schemaComposer.typeMapper.convertOutputFieldConfig( fieldConfig diff --git a/src/TypeMapper.d.ts b/src/TypeMapper.d.ts index 3a8904c7..49c0dfd0 100644 --- a/src/TypeMapper.d.ts +++ b/src/TypeMapper.d.ts @@ -78,9 +78,7 @@ declare class TypeMapper { ): ComposeOutputType | void; public convertOutputFieldConfig( - composeFC: Thunk< - ObjectTypeComposerFieldConfigDefinition | Resolver - >, + composeFC: ObjectTypeComposerFieldConfigDefinition | Resolver, fieldName?: string, typeName?: string ): ObjectTypeComposerFieldConfig; @@ -91,7 +89,7 @@ declare class TypeMapper { ): ObjectTypeComposerFieldConfigMap; public convertArgConfig( - composeAC: Thunk, + composeAC: ObjectTypeComposerArgumentConfigDefinition, argName?: string, fieldName?: string, typeName?: string @@ -110,7 +108,7 @@ declare class TypeMapper { ): ComposeInputType | void; public convertInputFieldConfig( - composeIFC: Thunk, + composeIFC: InputTypeComposerFieldConfigDefinition, fieldName?: string, typeName?: string ): InputTypeComposerFieldConfig; diff --git a/src/TypeMapper.js b/src/TypeMapper.js index d74de47c..b5c4ce7c 100644 --- a/src/TypeMapper.js +++ b/src/TypeMapper.js @@ -56,7 +56,6 @@ import { } from './graphql'; import type { GraphQLType, GraphQLInputType } from './graphql'; import { GraphQLDate, GraphQLBuffer, GraphQLJSON, GraphQLJSONObject } from './type'; -import { createThunkedObjectProxy } from './utils/createThunkedObjectProxy'; import type { InputTypeComposerFieldConfigMap, @@ -341,10 +340,9 @@ export class TypeMapper { } convertOutputFieldConfig( - composeFC: Thunk< + composeFC: | ObjectTypeComposerFieldConfigDefinition - | $ReadOnly> - >, + | $ReadOnly>, fieldName?: string = '', typeName?: string = '' ): ObjectTypeComposerFieldConfig { @@ -362,13 +360,6 @@ export class TypeMapper { }; } - // use proxy for evaluation on demand - if (isFunction(composeFC)) { - return (createThunkedObjectProxy(() => - this.convertOutputFieldConfig(composeFC(), fieldName, typeName) - ): any); - } - // convert type when its provided as composeIFC const tcFromIFC = this.convertOutputTypeDefinition(composeFC, fieldName, typeName); if (tcFromIFC) { @@ -414,7 +405,7 @@ export class TypeMapper { } convertArgConfig( - composeAC: Thunk, + composeAC: ObjectTypeComposerArgumentConfigDefinition, argName?: string = '', fieldName?: string = '', typeName?: string = '' @@ -424,13 +415,6 @@ export class TypeMapper { throw new Error(`You provide empty argument config ${inspect(composeAC)}`); } - // use proxy for evaluation on demand - if (isFunction(composeAC)) { - return (createThunkedObjectProxy(() => - this.convertArgConfig(composeAC(), argName, fieldName, typeName) - ): any); - } - // convert type when its provided as composeAC const tcFromAC = this.convertInputTypeDefinition((composeAC: any)); if (tcFromAC) { @@ -556,7 +540,7 @@ export class TypeMapper { } convertInputFieldConfig( - composeIFC: Thunk, + composeIFC: InputTypeComposerFieldConfigDefinition, fieldName?: string = '', typeName?: string = '' ): InputTypeComposerFieldConfig { @@ -565,13 +549,6 @@ export class TypeMapper { throw new Error(`You provide empty input field definition: ${inspect(composeIFC)}`); } - // use proxy for evaluation on demand - if (isFunction(composeIFC)) { - return (createThunkedObjectProxy(() => - this.convertInputFieldConfig(composeIFC(), fieldName, typeName) - ): any); - } - // convert type when its provided as composeIFC const tcFromIFC = this.convertInputTypeDefinition(composeIFC, fieldName, typeName); if (tcFromIFC) { diff --git a/src/__tests__/ObjectTypeComposer-test.js b/src/__tests__/ObjectTypeComposer-test.js index b70c9f07..787638d3 100644 --- a/src/__tests__/ObjectTypeComposer-test.js +++ b/src/__tests__/ObjectTypeComposer-test.js @@ -133,17 +133,12 @@ describe('ObjectTypeComposer', () => { } }); - it('accept fieldConfig as function', () => { + it('accept thunked type', () => { tc.setFields({ - input4: (): { type: string, args: { [key: string]: string }, resolve: Function } => ({ - type: 'String', - args: { a: 'Int' }, - resolve: () => 123, - }), + input4: () => 'String', }); + expect(tc.getField('input4').type).toBeInstanceOf(ThunkComposer); expect(tc.getFieldType('input4')).toBe(GraphQLString); - expect(tc.getFieldArgType('input4', 'a')).toBe(GraphQLInt); - expect((tc.getField('input4'): any).resolve()).toBe(123); }); }); diff --git a/src/__tests__/TypeMapper-test.js b/src/__tests__/TypeMapper-test.js index 55da0e0e..3ccab40f 100644 --- a/src/__tests__/TypeMapper-test.js +++ b/src/__tests__/TypeMapper-test.js @@ -443,7 +443,7 @@ describe('TypeMapper', () => { it('should pass unchanged thunk', () => { const myTypeThunk = (): string => 'Int'; const fc: any = typeMapper.convertOutputFieldConfig(myTypeThunk); - expect(fc.type).toBeInstanceOf(ScalarTypeComposer); + expect(fc.type).toBeInstanceOf(ThunkComposer); expect(fc.type.getType()).toBe(GraphQLInt); }); @@ -923,7 +923,7 @@ describe('TypeMapper', () => { it('should pass unchanged thunk', () => { const myTypeThunk = (): string => 'Int'; const ac: any = typeMapper.convertArgConfig(myTypeThunk); - expect(ac.type).toBeInstanceOf(ScalarTypeComposer); + expect(ac.type).toBeInstanceOf(ThunkComposer); expect(ac.type.getType()).toBe(GraphQLInt); }); diff --git a/src/__tests__/github_issues/231-test.js b/src/__tests__/github_issues/231-test.js index 70ed4ece..a2047fb4 100644 --- a/src/__tests__/github_issues/231-test.js +++ b/src/__tests__/github_issues/231-test.js @@ -4,18 +4,16 @@ import { schemaComposer } from '../..'; describe('github issue #231: Cloning a resolver evaluates its configuration thunks', () => { it('clone a resolver without evaluating its type and args thunks', async () => { - const aTypeThunk = jest.fn(() => 'String'); + const aTypeThunk: any = jest.fn(() => 'String'); const aResolver = schemaComposer.createResolver({ - name: aTypeThunk, - type: 'Boolean', + name: 'r1', + type: aTypeThunk, args: { anArg: aTypeThunk, }, }); - aResolver.clone(); - expect(aTypeThunk).not.toBeCalled(); }); });