From 704269ddd76884ac17be2a2beea7e2aae701e5d5 Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Fri, 5 Apr 2019 10:06:01 -0400 Subject: [PATCH 1/6] add inputUnion fork, get tests running --- packages/interface/src/GraphQLLanguageService.js | 5 +++++ .../src/__tests__/__schema__/StarWarsSchema.graphql | 8 ++++++++ .../src/__tests__/getAutocompleteSuggestions-test.js | 3 +++ packages/interface/src/getAutocompleteSuggestions.js | 10 ++++++++++ packages/parser/src/Rules.js | 11 +++++++++++ packages/server/src/GraphQLCache.js | 9 +++++++++ packages/server/src/__tests__/GraphQLCache-test.js | 5 +++-- .../src/__tests__/__schema__/StarWarsSchema.graphql | 8 ++++++++ 8 files changed, 57 insertions(+), 2 deletions(-) diff --git a/packages/interface/src/GraphQLLanguageService.js b/packages/interface/src/GraphQLLanguageService.js index d3118d07..924c946e 100644 --- a/packages/interface/src/GraphQLLanguageService.js +++ b/packages/interface/src/GraphQLLanguageService.js @@ -47,12 +47,14 @@ const { UNION_TYPE_DEFINITION, SCALAR_TYPE_DEFINITION, INPUT_OBJECT_TYPE_DEFINITION, + INPUT_UNION_TYPE_DEFINITION, SCALAR_TYPE_EXTENSION, OBJECT_TYPE_EXTENSION, INTERFACE_TYPE_EXTENSION, UNION_TYPE_EXTENSION, ENUM_TYPE_EXTENSION, INPUT_OBJECT_TYPE_EXTENSION, + INPUT_UNION_TYPE_EXTENSION, DIRECTIVE_DEFINITION, FRAGMENT_SPREAD, OPERATION_DEFINITION, @@ -95,6 +97,8 @@ export class GraphQLLanguageService { case UNION_TYPE_EXTENSION: case ENUM_TYPE_EXTENSION: case INPUT_OBJECT_TYPE_EXTENSION: + case INPUT_UNION_TYPE_DEFINITION: + case INPUT_UNION_TYPE_EXTENSION: case DIRECTIVE_DEFINITION: return true; } @@ -261,6 +265,7 @@ export class GraphQLLanguageService { definition => definition.kind === OBJECT_TYPE_DEFINITION || definition.kind === INPUT_OBJECT_TYPE_DEFINITION || + definition.kind === INPUT_UNION_TYPE_DEFINITION || definition.kind === ENUM_TYPE_DEFINITION, ); diff --git a/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql b/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql index 67d9c1a8..e6b15d11 100644 --- a/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql +++ b/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql @@ -51,14 +51,22 @@ input InputType { value: Int = 42 } +input AltInputType { + key: String! + value: String +} + type TestType { testField: String } +# inputUnion Example = AltInputType | InputType + type Query { hero(episode: Episode): Character human(id: String!): Human droid(id: String!): Droid inputTypeTest(args: InputType = {key: "key"}): TestType + inputUnionTest(args: InputType): TestType deprecatedField: TestType @deprecated(reason: "Use test instead.") } diff --git a/packages/interface/src/__tests__/getAutocompleteSuggestions-test.js b/packages/interface/src/__tests__/getAutocompleteSuggestions-test.js index b148da30..c4c52fea 100644 --- a/packages/interface/src/__tests__/getAutocompleteSuggestions-test.js +++ b/packages/interface/src/__tests__/getAutocompleteSuggestions-test.js @@ -80,6 +80,7 @@ describe('getAutocompleteSuggestions', () => { {label: 'hero', detail: 'Character'}, {label: 'human', detail: 'Human'}, {label: 'inputTypeTest', detail: 'TestType'}, + {label: 'inputUnionTest', detail: 'TestType'}, ]); // Test for query text with empty lines @@ -97,6 +98,7 @@ query name { {label: 'hero', detail: 'Character'}, {label: 'human', detail: 'Human'}, {label: 'inputTypeTest', detail: 'TestType'}, + {label: 'inputUnionTest', detail: 'TestType'}, ]); }); @@ -107,6 +109,7 @@ query name { {label: 'hero', detail: 'Character'}, {label: 'human', detail: 'Human'}, {label: 'inputTypeTest', detail: 'TestType'}, + {label: 'inputUnionTest', detail: 'TestType'}, ]); }); diff --git a/packages/interface/src/getAutocompleteSuggestions.js b/packages/interface/src/getAutocompleteSuggestions.js index 5efd0bd2..9f4b3111 100644 --- a/packages/interface/src/getAutocompleteSuggestions.js +++ b/packages/interface/src/getAutocompleteSuggestions.js @@ -25,6 +25,7 @@ import { GraphQLBoolean, GraphQLEnumType, GraphQLInputObjectType, + GraphQLInputUnionType, GraphQLList, SchemaMetaFieldDef, TypeMetaFieldDef, @@ -503,6 +504,8 @@ function canUseDirective( return locations.indexOf('ENUM_VALUE') !== -1; case 'InputDef': return locations.indexOf('INPUT_OBJECT') !== -1; + case 'InputUnionDef': + return locations.indexOf('INPUT_UNION') !== -1; case 'InputValueDef': const prevStateKind = state.prevState && state.prevState.kind; switch (prevStateKind) { @@ -628,6 +631,13 @@ export function getTypeInfo( ? objectType.getFields() : null; break; + case 'InputUnionValue': + const inputUnionType = getNamedType(inputType); + objectFieldDefs = + inputUnionType instanceof GraphQLInputUnionType + ? inputUnionType.getFields() + : null; + break; case 'ObjectField': const objectField = state.name && objectFieldDefs ? objectFieldDefs[state.name] : null; diff --git a/packages/parser/src/Rules.js b/packages/parser/src/Rules.js index cb33f089..cc777fde 100644 --- a/packages/parser/src/Rules.js +++ b/packages/parser/src/Rules.js @@ -81,6 +81,8 @@ export const ParseRules: {[name: string]: ParseRule} = { return 'EnumDef'; case 'input': return 'InputDef'; + case 'inputUnion': + return 'InputUnionDef'; case 'extend': return 'ExtendDef'; case 'directive': @@ -196,6 +198,7 @@ export const ParseRules: {[name: string]: ParseRule} = { Type(token: Token) { return token.value === '[' ? 'ListType' : 'NonNullType'; }, + InputUnionValue: [p('{'), list('ObjectField'), p('}')], // NonNullType has been merged into ListType to simplify. ListType: [p('['), 'Type', p(']'), opt(p('!'))], NonNullType: ['NamedType', opt(p('!'))], @@ -252,6 +255,14 @@ export const ParseRules: {[name: string]: ParseRule} = { list('UnionMember', p('|')), ], UnionMember: ['NamedType'], + InputUnionDef: [ + word('inputUnion'), + name('atom'), + list('Directive'), + p('='), + list('InputUnionMember', p('|')), + ], + InputUnionMember: ['NamedType'], EnumDef: [ word('enum'), name('atom'), diff --git a/packages/server/src/GraphQLCache.js b/packages/server/src/GraphQLCache.js index 80c7a4bf..ff26de70 100644 --- a/packages/server/src/GraphQLCache.js +++ b/packages/server/src/GraphQLCache.js @@ -43,12 +43,14 @@ const { UNION_TYPE_DEFINITION, SCALAR_TYPE_DEFINITION, INPUT_OBJECT_TYPE_DEFINITION, + INPUT_UNION_TYPE_DEFINITION, SCALAR_TYPE_EXTENSION, OBJECT_TYPE_EXTENSION, INTERFACE_TYPE_EXTENSION, UNION_TYPE_EXTENSION, ENUM_TYPE_EXTENSION, INPUT_OBJECT_TYPE_EXTENSION, + INPUT_UNION_TYPE_EXTENSION, DIRECTIVE_DEFINITION, } = Kind; @@ -228,6 +230,9 @@ export class GraphQLCache implements GraphQLCacheInterface { InputObjectTypeDefinition(node) { existingObjectTypes.set(node.name.value, true); }, + InputUnionTypeDefinition(node) { + existingObjectTypes.set(node.name.value, true); + }, EnumTypeDefinition(node) { existingObjectTypes.set(node.name.value, true); }, @@ -254,6 +259,7 @@ export class GraphQLCache implements GraphQLCacheInterface { !referencedObjectTypes.has(node.name.value) && objectTypeDefinitions.get(node.name.value) ) { + console.log('name', node.name.value) asts.add(nullthrows(objectTypeDefinitions.get(node.name.value))); referencedObjectTypes.add(node.name.value); } @@ -603,12 +609,14 @@ export class GraphQLCache implements GraphQLCacheInterface { case UNION_TYPE_DEFINITION: case SCALAR_TYPE_DEFINITION: case INPUT_OBJECT_TYPE_DEFINITION: + case INPUT_UNION_TYPE_DEFINITION: case SCALAR_TYPE_EXTENSION: case OBJECT_TYPE_EXTENSION: case INTERFACE_TYPE_EXTENSION: case UNION_TYPE_EXTENSION: case ENUM_TYPE_EXTENSION: case INPUT_OBJECT_TYPE_EXTENSION: + case INPUT_UNION_TYPE_EXTENSION: case DIRECTIVE_DEFINITION: typeExtensions.push(definition); break; @@ -820,6 +828,7 @@ export class GraphQLCache implements GraphQLCacheInterface { if ( definition.kind === OBJECT_TYPE_DEFINITION || definition.kind === INPUT_OBJECT_TYPE_DEFINITION || + definition.kind === INPUT_UNION_TYPE_DEFINITION || definition.kind === ENUM_TYPE_DEFINITION ) { objectTypeDefinitions.set(definition.name.value, { diff --git a/packages/server/src/__tests__/GraphQLCache-test.js b/packages/server/src/__tests__/GraphQLCache-test.js index ca269fe9..7cb01644 100644 --- a/packages/server/src/__tests__/GraphQLCache-test.js +++ b/packages/server/src/__tests__/GraphQLCache-test.js @@ -7,7 +7,8 @@ * * @flow */ - +import fs from 'fs' +import path from 'path' import {expect} from 'chai'; import {GraphQLSchema} from 'graphql/type'; import {parse} from 'graphql/language'; @@ -188,7 +189,7 @@ describe('GraphQLCache', () => { const query = `type Query { hero(episode: Episode): Character } - + type Episode { id: ID! } diff --git a/packages/server/src/__tests__/__schema__/StarWarsSchema.graphql b/packages/server/src/__tests__/__schema__/StarWarsSchema.graphql index 5f51cc74..cbb26e78 100644 --- a/packages/server/src/__tests__/__schema__/StarWarsSchema.graphql +++ b/packages/server/src/__tests__/__schema__/StarWarsSchema.graphql @@ -40,13 +40,21 @@ input InputType { value: Int = 42 } +input AltInputType { + key: String! + value: String +} + type TestType { testField: String } +inputUnion ExampleInputUnion = InputType | AltInputType + type Query { hero(episode: Episode): Character human(id: String!): Human droid(id: String!): Droid inputTypeTest(args: InputType = {key: "key"}): TestType + inputUnionTest(args: ExampleInputUnion): TestType } From f20681038319479a96efb1d637d341d7b94f30ef Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Fri, 5 Apr 2019 10:10:42 -0400 Subject: [PATCH 2/6] cleanup, update contributing guidelines --- CONTRIBUTING.md | 15 +++++++++++++++ packages/server/src/GraphQLCache.js | 1 - 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a1b613ac..b47206d1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,6 +62,21 @@ Complete your CLA here: npm test ``` +6. (optional) Link to `graphql/graphql-js` locally + + from `graphql-js` repository: + ```sh + yarn + yarn build + cd dist + yarn link + ``` + + then from this project: + ```sh + yarn link + ``` + ## Release on NPM *Only core contributors may release to NPM.* diff --git a/packages/server/src/GraphQLCache.js b/packages/server/src/GraphQLCache.js index ff26de70..e22fe776 100644 --- a/packages/server/src/GraphQLCache.js +++ b/packages/server/src/GraphQLCache.js @@ -259,7 +259,6 @@ export class GraphQLCache implements GraphQLCacheInterface { !referencedObjectTypes.has(node.name.value) && objectTypeDefinitions.get(node.name.value) ) { - console.log('name', node.name.value) asts.add(nullthrows(objectTypeDefinitions.get(node.name.value))); referencedObjectTypes.add(node.name.value); } From 6465439c0e533a089ef19b380bc58e13f420252c Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Fri, 5 Apr 2019 10:11:46 -0400 Subject: [PATCH 3/6] fix command in CONTRIBUTING --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b47206d1..57d0f054 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -74,7 +74,7 @@ Complete your CLA here: then from this project: ```sh - yarn link + yarn link graphql ``` ## Release on NPM From 7899f65f948e4eb060898034038c692e1887031a Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Fri, 5 Apr 2019 10:36:27 -0400 Subject: [PATCH 4/6] cleanup tests --- package.json | 8 ++--- .../server/src/__tests__/GraphQLCache-test.js | 5 ++-- yarn.lock | 29 ++----------------- 3 files changed, 8 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 680a9e19..d50ae132 100644 --- a/package.json +++ b/package.json @@ -54,10 +54,10 @@ "flow-bin": "0.68.0", "graphql": "^14.0.2", "graphql-language-service-interface": "^1.0.0-0", - "graphql-language-service-parser": "^0.1.0-0", - "graphql-language-service-server": "^1.0.0-0", - "graphql-language-service-types": "^0.1.0-0", - "graphql-language-service-utils": "^1.0.0-0", + "graphql-language-service-parser": "^1.2.2", + "graphql-language-service-server": "^2.0.0", + "graphql-language-service-types": "^1.2.2", + "graphql-language-service-utils": "^2.0.0", "lerna": "^2.0.0", "mocha": "4.1.0", "prettier": "1.13" diff --git a/packages/server/src/__tests__/GraphQLCache-test.js b/packages/server/src/__tests__/GraphQLCache-test.js index 7cb01644..ca269fe9 100644 --- a/packages/server/src/__tests__/GraphQLCache-test.js +++ b/packages/server/src/__tests__/GraphQLCache-test.js @@ -7,8 +7,7 @@ * * @flow */ -import fs from 'fs' -import path from 'path' + import {expect} from 'chai'; import {GraphQLSchema} from 'graphql/type'; import {parse} from 'graphql/language'; @@ -189,7 +188,7 @@ describe('GraphQLCache', () => { const query = `type Query { hero(episode: Episode): Character } - + type Episode { id: ID! } diff --git a/yarn.lock b/yarn.lock index e5aea5b4..7ca2decd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1696,7 +1696,7 @@ graphql-import@^0.4.4: dependencies: lodash "^4.17.4" -graphql-language-service-interface@^1.0.0-0, graphql-language-service-interface@^1.3.2: +graphql-language-service-interface@^1.0.0-0: version "1.3.2" resolved "https://registry.yarnpkg.com/graphql-language-service-interface/-/graphql-language-service-interface-1.3.2.tgz#4bd5d49e23766c3d2ab65d110f26f10e321cc000" dependencies: @@ -1705,32 +1705,7 @@ graphql-language-service-interface@^1.0.0-0, graphql-language-service-interface@ graphql-language-service-types "^1.2.2" graphql-language-service-utils "^1.2.2" -graphql-language-service-parser@^0.1.0-0: - version "0.1.14" - resolved "https://registry.yarnpkg.com/graphql-language-service-parser/-/graphql-language-service-parser-0.1.14.tgz#dd25abda5dcff4f2268c9a19e026004271491661" - dependencies: - graphql-language-service-types "^0.1.14" - -graphql-language-service-server@^1.0.0-0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/graphql-language-service-server/-/graphql-language-service-server-1.3.2.tgz#9423ede58a5b7bcaa3bbcb42f39a6c9626f6787d" - dependencies: - babylon "^6.17.4" - fb-watchman "^2.0.0" - glob "^7.1.2" - graphql-config "2.0.1" - graphql-language-service-interface "^1.3.2" - graphql-language-service-types "^1.2.2" - graphql-language-service-utils "^1.2.2" - nullthrows "^1.0.0" - vscode-jsonrpc "^3.3.0" - vscode-languageserver "^3.3.0" - -graphql-language-service-types@^0.1.0-0, graphql-language-service-types@^0.1.14: - version "0.1.14" - resolved "https://registry.yarnpkg.com/graphql-language-service-types/-/graphql-language-service-types-0.1.14.tgz#e6112785fc23ea8222f59a7f00e61b359f263c88" - -graphql-language-service-utils@^1.0.0-0, graphql-language-service-utils@^1.2.2: +graphql-language-service-utils@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/graphql-language-service-utils/-/graphql-language-service-utils-1.2.2.tgz#d31d4b4288085bd31d1bb8efc35790d69e496cae" dependencies: From d2e071674bc6fdadba6b850b69db3ce5fceb731e Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Sun, 7 Apr 2019 11:45:21 -0400 Subject: [PATCH 5/6] return InputDef, add more examples --- packages/interface/src/GraphQLLanguageService.js | 2 +- .../src/__tests__/__schema__/HoverTestSchema.graphql | 4 +++- .../src/__tests__/__schema__/StarWarsSchema.graphql | 6 +++--- packages/interface/src/getAutocompleteSuggestions.js | 1 + packages/parser/src/Rules.js | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/interface/src/GraphQLLanguageService.js b/packages/interface/src/GraphQLLanguageService.js index 924c946e..91a69dc6 100644 --- a/packages/interface/src/GraphQLLanguageService.js +++ b/packages/interface/src/GraphQLLanguageService.js @@ -91,6 +91,7 @@ export class GraphQLLanguageService { case UNION_TYPE_DEFINITION: case SCALAR_TYPE_DEFINITION: case INPUT_OBJECT_TYPE_DEFINITION: + case INPUT_UNION_TYPE_EXTENSION: case SCALAR_TYPE_EXTENSION: case OBJECT_TYPE_EXTENSION: case INTERFACE_TYPE_EXTENSION: @@ -98,7 +99,6 @@ export class GraphQLLanguageService { case ENUM_TYPE_EXTENSION: case INPUT_OBJECT_TYPE_EXTENSION: case INPUT_UNION_TYPE_DEFINITION: - case INPUT_UNION_TYPE_EXTENSION: case DIRECTIVE_DEFINITION: return true; } diff --git a/packages/interface/src/__tests__/__schema__/HoverTestSchema.graphql b/packages/interface/src/__tests__/__schema__/HoverTestSchema.graphql index 5150c736..38798797 100644 --- a/packages/interface/src/__tests__/__schema__/HoverTestSchema.graphql +++ b/packages/interface/src/__tests__/__schema__/HoverTestSchema.graphql @@ -12,6 +12,8 @@ enum Color { BLUE } +inputUnion InputUnionType = String | Float | Boolean + union UnionType = String | Float | Boolean interface TestInterface { @@ -27,11 +29,11 @@ type TestType implements TestInterface { } type Query { - """ This is field documentation for Query.thing """ thing: TestType listOfThing: [TestType!] parameterizedField(id: String!): TestType cluck: Chicken unionField: UnionType + inputUnionTest(input: InputUnionType): UnionType } diff --git a/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql b/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql index e6b15d11..468a2633 100644 --- a/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql +++ b/packages/interface/src/__tests__/__schema__/StarWarsSchema.graphql @@ -53,20 +53,20 @@ input InputType { input AltInputType { key: String! - value: String + string: String! } type TestType { testField: String } -# inputUnion Example = AltInputType | InputType +inputUnion ExampleInputUnion = AltInputType | InputType type Query { hero(episode: Episode): Character human(id: String!): Human droid(id: String!): Droid inputTypeTest(args: InputType = {key: "key"}): TestType - inputUnionTest(args: InputType): TestType + inputUnionTest(args: ExampleInputUnion): TestType deprecatedField: TestType @deprecated(reason: "Use test instead.") } diff --git a/packages/interface/src/getAutocompleteSuggestions.js b/packages/interface/src/getAutocompleteSuggestions.js index 9f4b3111..e4d10369 100644 --- a/packages/interface/src/getAutocompleteSuggestions.js +++ b/packages/interface/src/getAutocompleteSuggestions.js @@ -122,6 +122,7 @@ export function getAutocompleteSuggestions( kind === 'EnumValue' || (kind === 'ListValue' && step === 1) || (kind === 'ObjectField' && step === 2) || + (kind === 'InputUnion' && step === 2) || (kind === 'Argument' && step === 2) ) { return getSuggestionsForInputValues(token, typeInfo); diff --git a/packages/parser/src/Rules.js b/packages/parser/src/Rules.js index cc777fde..d9865328 100644 --- a/packages/parser/src/Rules.js +++ b/packages/parser/src/Rules.js @@ -262,7 +262,7 @@ export const ParseRules: {[name: string]: ParseRule} = { p('='), list('InputUnionMember', p('|')), ], - InputUnionMember: ['NamedType'], + InputUnionMember: ['InputDef'], EnumDef: [ word('enum'), name('atom'), From 90f58ed01136985d6e6e5f89b4fbc518ec3663f5 Mon Sep 17 00:00:00 2001 From: Rikki Schulte Date: Sat, 1 Jun 2019 00:05:05 -0400 Subject: [PATCH 6/6] used NamedType instead of InputDef in InputUnionMember parser rules --- packages/parser/src/Rules.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/parser/src/Rules.js b/packages/parser/src/Rules.js index d9865328..cc777fde 100644 --- a/packages/parser/src/Rules.js +++ b/packages/parser/src/Rules.js @@ -262,7 +262,7 @@ export const ParseRules: {[name: string]: ParseRule} = { p('='), list('InputUnionMember', p('|')), ], - InputUnionMember: ['InputDef'], + InputUnionMember: ['NamedType'], EnumDef: [ word('enum'), name('atom'),