diff --git a/.changeset/great-eyes-try.md b/.changeset/great-eyes-try.md new file mode 100644 index 00000000000..ad14a045729 --- /dev/null +++ b/.changeset/great-eyes-try.md @@ -0,0 +1,13 @@ +--- +"codemirror-graphql": minor +"@graphiql/toolkit": minor +"monaco-graphql": minor +"graphiql": minor +"graphql-language-service-cli": minor +"graphql-language-service-interface": minor +"graphql-language-service-parser": minor +"graphql-language-service-server": minor +"graphql-language-service": minor +--- + +upgrade to `graphql@16.0.0-experimental-stream-defer.5` diff --git a/examples/graphiql-create-fetcher/package.json b/examples/graphiql-create-fetcher/package.json index 4b3f90c5c8c..d079b2284f0 100644 --- a/examples/graphiql-create-fetcher/package.json +++ b/examples/graphiql-create-fetcher/package.json @@ -12,7 +12,7 @@ "dependencies": { "graphiql": "file:../../packages/graphiql", "@graphiql/toolkit": "file:../../packages/graphiql-toolkit", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "react": "16.13.1" }, "devDependencies": { diff --git a/examples/graphiql-create-react-app/package.json b/examples/graphiql-create-react-app/package.json index 9f72bd1db3a..a536565e81f 100644 --- a/examples/graphiql-create-react-app/package.json +++ b/examples/graphiql-create-react-app/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "graphiql": "file:../../packages/graphiql", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "react": "^16.13.1", "react-dom": "^16.13.1", "react-scripts": "3.4.1" diff --git a/examples/graphiql-parcel/package.json b/examples/graphiql-parcel/package.json index 7f9503a555c..a9db04dbaa0 100644 --- a/examples/graphiql-parcel/package.json +++ b/examples/graphiql-parcel/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "graphiql": "file:../../packages/graphiql", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "react": "^16.13.1", "react-dom": "^16.13.1", "typescript": "^3.4.4" diff --git a/examples/graphiql-webpack/package.json b/examples/graphiql-webpack/package.json index 674220f753b..de9746824c8 100644 --- a/examples/graphiql-webpack/package.json +++ b/examples/graphiql-webpack/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "graphiql": "file:../../packages/graphiql", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "react": "17.0.2" }, "devDependencies": { diff --git a/examples/monaco-graphql-webpack/package.json b/examples/monaco-graphql-webpack/package.json index f3bc008eee7..9bbe2466d0c 100644 --- a/examples/monaco-graphql-webpack/package.json +++ b/examples/monaco-graphql-webpack/package.json @@ -9,7 +9,7 @@ "start": "cross-env NODE_ENV=development webpack-dev-server" }, "dependencies": { - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "monaco-graphql": "^0.5.1", "prettier": "^2.0.4" }, diff --git a/packages/codemirror-graphql/package.json b/packages/codemirror-graphql/package.json index b3a7cfb5b1f..70e19c76deb 100644 --- a/packages/codemirror-graphql/package.json +++ b/packages/codemirror-graphql/package.json @@ -40,7 +40,7 @@ }, "peerDependencies": { "codemirror": "^5.58.2", - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "dependencies": { "graphql-language-service-interface": "^2.8.2", @@ -49,7 +49,7 @@ "devDependencies": { "codemirror": "^5.58.2", "cross-env": "^7.0.2", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "jsdom": "^16.4.0", "rimraf": "^3.0.2", "sane": "2.0.0" diff --git a/packages/codemirror-graphql/src/__tests__/hint-test.ts b/packages/codemirror-graphql/src/__tests__/hint-test.ts index efec2f5e80f..1f0e103b26e 100644 --- a/packages/codemirror-graphql/src/__tests__/hint-test.ts +++ b/packages/codemirror-graphql/src/__tests__/hint-test.ts @@ -137,13 +137,13 @@ describe('graphql-hint', () => { }, { text: '__typename', - type: GraphQLNonNull(GraphQLString), + type: new GraphQLNonNull(GraphQLString), description: 'The name of the current Object type at runtime.', isDeprecated: false, }, { text: '__schema', - type: GraphQLNonNull(__Schema), + type: new GraphQLNonNull(__Schema), description: 'Access the current type schema of this server.', isDeprecated: false, }, @@ -209,7 +209,7 @@ describe('graphql-hint', () => { }, { text: '__typename', - type: GraphQLNonNull(GraphQLString), + type: new GraphQLNonNull(GraphQLString), description: 'The name of the current Object type at runtime.', isDeprecated: false, }, @@ -619,7 +619,7 @@ describe('graphql-hint', () => { { text: '__Type', description: - 'The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByUrl`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.', + 'The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.', }, { text: '__Field', @@ -855,7 +855,7 @@ describe('graphql-hint', () => { }, { text: '__typename', - type: GraphQLNonNull(GraphQLString), + type: new GraphQLNonNull(GraphQLString), description: 'The name of the current Object type at runtime.', isDeprecated: false, }, @@ -887,7 +887,7 @@ describe('graphql-hint', () => { }, { text: '__typename', - type: GraphQLNonNull(GraphQLString), + type: new GraphQLNonNull(GraphQLString), description: 'The name of the current Object type at runtime.', isDeprecated: false, }, @@ -1111,7 +1111,7 @@ describe('graphql-hint', () => { description: 'The name of the current Object type at runtime.', isDeprecated: false, text: '__typename', - type: GraphQLNonNull(GraphQLString), + type: new GraphQLNonNull(GraphQLString), deprecationReason: undefined, }, ]; diff --git a/packages/codemirror-graphql/src/info.ts b/packages/codemirror-graphql/src/info.ts index 412e2dd7d39..cce469e9bb9 100644 --- a/packages/codemirror-graphql/src/info.ts +++ b/packages/codemirror-graphql/src/info.ts @@ -76,7 +76,7 @@ CodeMirror.registerHelper( ) { const into = document.createElement('div'); renderField(into, typeInfo, options); - renderDescription(into, options, typeInfo.fieldDef as GraphQLInputField); + renderDescription(into, options, typeInfo.fieldDef as any); return into; } else if (kind === 'Directive' && step === 1 && typeInfo.directiveDef) { const into = document.createElement('div'); diff --git a/packages/codemirror-graphql/src/utils/getTypeInfo.ts b/packages/codemirror-graphql/src/utils/getTypeInfo.ts index 66d2e56a2da..7d5bb9a9619 100644 --- a/packages/codemirror-graphql/src/utils/getTypeInfo.ts +++ b/packages/codemirror-graphql/src/utils/getTypeInfo.ts @@ -107,7 +107,7 @@ export default function getTypeInfo(schema: GraphQLSchema, tokenState: State) { getFieldDef(schema, info.parentType, state.prevState.name) : null : null; - info.argDefs = parentDef ? parentDef.args : null; + info.argDefs = parentDef ? (parentDef.args as GraphQLArgument[]) : null; break; case 'Argument': info.argDef = null; @@ -125,7 +125,10 @@ export default function getTypeInfo(schema: GraphQLSchema, tokenState: State) { const enumType = info.inputType ? getNamedType(info.inputType) : null; info.enumValue = enumType instanceof GraphQLEnumType - ? find(enumType.getValues(), val => val.value === state.name) + ? find( + enumType.getValues() as GraphQLEnumValue[], + val => val.value === state.name, + ) : null; break; case 'ListValue': diff --git a/packages/graphiql-2-rfc-context/package.json b/packages/graphiql-2-rfc-context/package.json index 1754c694c42..c6c520a682d 100644 --- a/packages/graphiql-2-rfc-context/package.json +++ b/packages/graphiql-2-rfc-context/package.json @@ -57,7 +57,7 @@ "theme-ui": "^0.3.1" }, "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0", + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5", "prop-types": ">=15.5.0", "react": "^16.8.0", "react-dom": "^16.8.0" @@ -80,7 +80,7 @@ "express-graphql": "experimental-stream-defer", "file-loader": "6.2.0", "fork-ts-checker-webpack-plugin": "4.1.3", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "html-webpack-plugin": "^4.2.0", "identity-obj-proxy": "^3.0.0", "jest": "^25.3.0", diff --git a/packages/graphiql-toolkit/package.json b/packages/graphiql-toolkit/package.json index 3f233247b7d..0cc9844165e 100644 --- a/packages/graphiql-toolkit/package.json +++ b/packages/graphiql-toolkit/package.json @@ -25,12 +25,12 @@ "meros": "^1.1.4" }, "devDependencies": { - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "isomorphic-fetch": "^3.0.0", "subscriptions-transport-ws": "^0.9.19" }, "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.6.1" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "keywords": [ "graphql", diff --git a/packages/graphiql/cypress/integration/prettify.spec.ts b/packages/graphiql/cypress/integration/prettify.spec.ts index 8472c8f4f76..f6f84c0172e 100644 --- a/packages/graphiql/cypress/integration/prettify.spec.ts +++ b/packages/graphiql/cypress/integration/prettify.spec.ts @@ -2,8 +2,7 @@ const prettifiedQuery = `{ longDescriptionType { id } -} -`; +}`; const prettifiedVariables = `{ "a": 1 diff --git a/packages/graphiql/package.json b/packages/graphiql/package.json index 1437c5ae968..4020da9df49 100644 --- a/packages/graphiql/package.json +++ b/packages/graphiql/package.json @@ -53,7 +53,7 @@ "markdown-it": "^10.0.0" }, "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0", + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" }, @@ -72,7 +72,7 @@ "express": "^4.17.1", "express-graphql": "experimental-stream-defer", "fork-ts-checker-webpack-plugin": "4.1.3", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "html-webpack-plugin": "^4.2.0", "identity-obj-proxy": "^3.0.0", "jest": "^25.3.0", diff --git a/packages/graphiql/src/components/DocExplorer/TypeDoc.tsx b/packages/graphiql/src/components/DocExplorer/TypeDoc.tsx index e7bb87b0f7f..d837af04714 100644 --- a/packages/graphiql/src/components/DocExplorer/TypeDoc.tsx +++ b/packages/graphiql/src/components/DocExplorer/TypeDoc.tsx @@ -93,9 +93,7 @@ export default class TypeDoc extends React.Component<
{'fields'}
{fields - .filter(field => - 'isDeprecated' in field ? !field.isDeprecated : true, - ) + .filter(field => !field.deprecationReason) .map(field => ( ); - const deprecatedFields = fields.filter( - field => 'isDeprecated' in field && field.isDeprecated, + const deprecatedFields = fields.filter(field => + Boolean(field.deprecationReason), ); if (deprecatedFields.length > 0) { deprecatedFieldsDef = ( @@ -143,14 +141,16 @@ export default class TypeDoc extends React.Component<
{'values'}
{values - .filter(value => !value.isDeprecated) + .filter(value => Boolean(!value.deprecationReason)) .map(value => ( ))}
); - const deprecatedValues = values.filter(value => value.isDeprecated); + const deprecatedValues = values.filter(value => + Boolean(value.deprecationReason), + ); if (deprecatedValues.length > 0) { deprecatedValuesDef = (
diff --git a/packages/graphiql/src/components/GraphiQL.tsx b/packages/graphiql/src/components/GraphiQL.tsx index c90276353af..7728418eab0 100644 --- a/packages/graphiql/src/components/GraphiQL.tsx +++ b/packages/graphiql/src/components/GraphiQL.tsx @@ -936,7 +936,7 @@ export class GraphiQL extends React.Component { } else { visit( parse(this.props.externalFragments, { - experimentalFragmentVariables: true, + allowLegacyFragmentVariables: true, }), { FragmentDefinition(def) { @@ -1219,7 +1219,7 @@ export class GraphiQL extends React.Component { const editor = this.getQueryEditor(); const editorContent = editor?.getValue() ?? ''; const prettifiedEditorContent = print( - parse(editorContent, { experimentalFragmentVariables: true }), + parse(editorContent, { allowLegacyFragmentVariables: true }), ); if (prettifiedEditorContent !== editorContent) { diff --git a/packages/graphiql/src/components/__tests__/ExampleSchema.ts b/packages/graphiql/src/components/__tests__/ExampleSchema.ts index 1a20309976e..cad815b41d0 100644 --- a/packages/graphiql/src/components/__tests__/ExampleSchema.ts +++ b/packages/graphiql/src/components/__tests__/ExampleSchema.ts @@ -28,7 +28,7 @@ export const ExampleEnum = new GraphQLEnumType({ }); export const ExampleUnionType1 = new GraphQLObjectType({ - name: 'Union Type 1', + name: 'Union_Type_1', interfaces: [ExampleInterface], fields: { name: { @@ -43,7 +43,7 @@ export const ExampleUnionType1 = new GraphQLObjectType({ }); export const ExampleUnionType2 = new GraphQLObjectType({ - name: 'Union Type 2', + name: 'Union_Type_2', interfaces: [ExampleInterface], fields: { name: { diff --git a/packages/graphiql/src/utility/fillLeafs.ts b/packages/graphiql/src/utility/fillLeafs.ts index c0925868fbb..9ee6a6bbc50 100644 --- a/packages/graphiql/src/utility/fillLeafs.ts +++ b/packages/graphiql/src/utility/fillLeafs.ts @@ -17,6 +17,7 @@ import { GraphQLOutputType, GraphQLType, SelectionSetNode, + Kind, } from 'graphql'; import { Maybe } from '../components/GraphiQL'; @@ -153,14 +154,14 @@ function buildSelectionSet( // Build a selection set of each field, calling buildSelectionSet recursively. return { - kind: 'SelectionSet', + kind: Kind.SELECTION_SET, selections: fieldNames.map(fieldName => { const fieldDef = namedType.getFields()[fieldName]; const fieldType = fieldDef ? fieldDef.type : null; return { - kind: 'Field', + kind: Kind.FIELD, name: { - kind: 'Name', + kind: Kind.NAME, value: fieldName, }, // we can use as here, because we already know that fieldType diff --git a/packages/graphiql/src/utility/getQueryFacts.ts b/packages/graphiql/src/utility/getQueryFacts.ts index 2d4741b2e20..8e1e1e082f3 100644 --- a/packages/graphiql/src/utility/getQueryFacts.ts +++ b/packages/graphiql/src/utility/getQueryFacts.ts @@ -43,7 +43,7 @@ export default function getOperationFacts( let documentAST: DocumentNode; try { documentAST = parse(documentStr, { - experimentalFragmentVariables: true, + allowLegacyFragmentVariables: true, }); } catch { return; diff --git a/packages/graphiql/src/utility/mergeAst.ts b/packages/graphiql/src/utility/mergeAst.ts index 2875cf7990d..16c1a696fc7 100644 --- a/packages/graphiql/src/utility/mergeAst.ts +++ b/packages/graphiql/src/utility/mergeAst.ts @@ -16,9 +16,8 @@ import { getNamedType, visit, visitWithTypeInfo, - ASTKindToNode, - Visitor, - ASTNode, + ASTVisitor, + Kind, } from 'graphql'; type Maybe = null | T; @@ -82,7 +81,7 @@ export function inlineRelevantFragmentSpreads( if (fragmentDefinition) { const { typeCondition, directives, selectionSet } = fragmentDefinition; selection = { - kind: 'InlineFragment', + kind: Kind.INLINE_FRAGMENT, typeCondition, directives, selectionSet, @@ -90,7 +89,7 @@ export function inlineRelevantFragmentSpreads( } } if ( - selection.kind === 'InlineFragment' && + selection.kind === Kind.INLINE_FRAGMENT && // Cannot inline if there are directives (!selection.directives || selection.directives?.length === 0) ) { @@ -129,13 +128,13 @@ export default function mergeAST( } = Object.create(null); for (const definition of documentAST.definitions) { - if (definition.kind === 'FragmentDefinition') { + if (definition.kind === Kind.FRAGMENT_DEFINITION) { fragmentDefinitions[definition.name.value] = definition; } } - const visitors: Visitor = { - SelectionSet(node) { + const visitors: ASTVisitor = { + SelectionSet(node: any) { const selectionSetType = typeInfo ? typeInfo.getParentType() : null; let { selections } = node; diff --git a/packages/graphiql/src/utility/onHasCompletion.ts b/packages/graphiql/src/utility/onHasCompletion.ts index 5e15cee2538..c9a9b509c33 100644 --- a/packages/graphiql/src/utility/onHasCompletion.ts +++ b/packages/graphiql/src/utility/onHasCompletion.ts @@ -82,7 +82,7 @@ export default function onHasCompletion( : type + description) + '
'; - if (ctx && deprecation && ctx.isDeprecated) { + if (ctx && deprecation && ctx.deprecationReason) { const reason = ctx.deprecationReason ? md.render(ctx.deprecationReason) : ''; diff --git a/packages/graphql-language-service-cli/package.json b/packages/graphql-language-service-cli/package.json index 5d02b84f708..d781f2f5e0a 100644 --- a/packages/graphql-language-service-cli/package.json +++ b/packages/graphql-language-service-cli/package.json @@ -27,7 +27,7 @@ "LSP" ], "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "dependencies": { "@babel/polyfill": "^7.8.7", @@ -37,6 +37,6 @@ "yargs": "^16.2.0" }, "devDependencies": { - "graphql": "experimental-stream-defer" + "graphql": "16.0.0-experimental-stream-defer.5" } } diff --git a/packages/graphql-language-service-interface/package.json b/packages/graphql-language-service-interface/package.json index 1ec34d1b24e..9dccc3a9052 100644 --- a/packages/graphql-language-service-interface/package.json +++ b/packages/graphql-language-service-interface/package.json @@ -24,7 +24,7 @@ "module": "esm/index.js", "typings": "dist/index.d.ts", "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "dependencies": { "graphql-language-service-parser": "^1.9.0", @@ -33,7 +33,7 @@ "vscode-languageserver-types": "^3.15.1" }, "devDependencies": { - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "graphql-config": "^3.0.2" } } diff --git a/packages/graphql-language-service-interface/src/getAutocompleteSuggestions.ts b/packages/graphql-language-service-interface/src/getAutocompleteSuggestions.ts index 2ea95e9faee..5c71d2d8f3e 100644 --- a/packages/graphql-language-service-interface/src/getAutocompleteSuggestions.ts +++ b/packages/graphql-language-service-interface/src/getAutocompleteSuggestions.ts @@ -22,6 +22,9 @@ import { isInterfaceType, GraphQLInterfaceType, GraphQLObjectType, + Kind, + DirectiveLocation, + GraphQLArgument, } from 'graphql'; import { @@ -72,7 +75,7 @@ const collectFragmentDefs = (op: string | undefined) => { if (op) { visit( parse(op, { - experimentalFragmentVariables: true, + allowLegacyFragmentVariables: true, }), { FragmentDefinition(def) { @@ -286,8 +289,8 @@ function getSuggestionsForFieldNames( label: field.name, detail: String(field.type), documentation: field.description ?? undefined, - deprecated: field.isDeprecated, - isDeprecated: field.isDeprecated, + deprecated: Boolean(field.deprecationReason), + isDeprecated: Boolean(field.deprecationReason), deprecationReason: field.deprecationReason, kind: CompletionItemKind.Field, type: field.type, @@ -312,7 +315,7 @@ function getSuggestionsForInputValues( ).filter(v => v.detail === namedInputType.name); if (namedInputType instanceof GraphQLEnumType) { - const values: GraphQLEnumValue[] = namedInputType.getValues(); + const values = namedInputType.getValues(); return hintList( token, values @@ -320,8 +323,8 @@ function getSuggestionsForInputValues( label: value.name, detail: String(namedInputType), documentation: value.description ?? undefined, - deprecated: value.isDeprecated, - isDeprecated: value.isDeprecated, + deprecated: Boolean(value.deprecationReason), + isDeprecated: Boolean(value.deprecationReason), deprecationReason: value.deprecationReason, kind: CompletionItemKind.EnumMember, type: namedInputType, @@ -627,7 +630,7 @@ export function getFragmentDefinitions( fragmentDefs.push({ kind: RuleKinds.FRAGMENT_DEFINITION, name: { - kind: 'Name', + kind: Kind.NAME, value: state.name, }, @@ -639,7 +642,7 @@ export function getFragmentDefinitions( typeCondition: { kind: RuleKinds.NAMED_TYPE, name: { - kind: 'Name', + kind: Kind.NAME, value: state.type, }, }, @@ -783,47 +786,51 @@ export function canUseDirective( const locations = directive.locations; switch (kind) { case RuleKinds.QUERY: - return locations.indexOf('QUERY') !== -1; + return locations.indexOf(DirectiveLocation.QUERY) !== -1; case RuleKinds.MUTATION: - return locations.indexOf('MUTATION') !== -1; + return locations.indexOf(DirectiveLocation.MUTATION) !== -1; case RuleKinds.SUBSCRIPTION: - return locations.indexOf('SUBSCRIPTION') !== -1; + return locations.indexOf(DirectiveLocation.SUBSCRIPTION) !== -1; case RuleKinds.FIELD: case RuleKinds.ALIASED_FIELD: - return locations.indexOf('FIELD') !== -1; + return locations.indexOf(DirectiveLocation.FIELD) !== -1; case RuleKinds.FRAGMENT_DEFINITION: - return locations.indexOf('FRAGMENT_DEFINITION') !== -1; + return locations.indexOf(DirectiveLocation.FRAGMENT_DEFINITION) !== -1; case RuleKinds.FRAGMENT_SPREAD: - return locations.indexOf('FRAGMENT_SPREAD') !== -1; + return locations.indexOf(DirectiveLocation.FRAGMENT_SPREAD) !== -1; case RuleKinds.INLINE_FRAGMENT: - return locations.indexOf('INLINE_FRAGMENT') !== -1; + return locations.indexOf(DirectiveLocation.INLINE_FRAGMENT) !== -1; // Schema Definitions case RuleKinds.SCHEMA_DEF: - return locations.indexOf('SCHEMA') !== -1; + return locations.indexOf(DirectiveLocation.SCHEMA) !== -1; case RuleKinds.SCALAR_DEF: - return locations.indexOf('SCALAR') !== -1; + return locations.indexOf(DirectiveLocation.SCALAR) !== -1; case RuleKinds.OBJECT_TYPE_DEF: - return locations.indexOf('OBJECT') !== -1; + return locations.indexOf(DirectiveLocation.OBJECT) !== -1; case RuleKinds.FIELD_DEF: - return locations.indexOf('FIELD_DEFINITION') !== -1; + return locations.indexOf(DirectiveLocation.FIELD_DEFINITION) !== -1; case RuleKinds.INTERFACE_DEF: - return locations.indexOf('INTERFACE') !== -1; + return locations.indexOf(DirectiveLocation.INTERFACE) !== -1; case RuleKinds.UNION_DEF: - return locations.indexOf('UNION') !== -1; + return locations.indexOf(DirectiveLocation.UNION) !== -1; case RuleKinds.ENUM_DEF: - return locations.indexOf('ENUM') !== -1; + return locations.indexOf(DirectiveLocation.ENUM) !== -1; case RuleKinds.ENUM_VALUE: - return locations.indexOf('ENUM_VALUE') !== -1; + return locations.indexOf(DirectiveLocation.ENUM_VALUE) !== -1; case RuleKinds.INPUT_DEF: - return locations.indexOf('INPUT_OBJECT') !== -1; + return locations.indexOf(DirectiveLocation.INPUT_OBJECT) !== -1; case RuleKinds.INPUT_VALUE_DEF: const prevStateKind = state.prevState && state.prevState.kind; switch (prevStateKind) { case RuleKinds.ARGUMENTS_DEF: - return locations.indexOf('ARGUMENT_DEFINITION') !== -1; + return ( + locations.indexOf(DirectiveLocation.ARGUMENT_DEFINITION) !== -1 + ); case RuleKinds.INPUT_DEF: - return locations.indexOf('INPUT_FIELD_DEFINITION') !== -1; + return ( + locations.indexOf(DirectiveLocation.INPUT_FIELD_DEFINITION) !== -1 + ); } } @@ -913,10 +920,11 @@ export function getTypeInfo( } else { switch (state.prevState.kind) { case RuleKinds.FIELD: - argDefs = fieldDef && fieldDef.args; + argDefs = fieldDef && (fieldDef.args as GraphQLArgument[]); break; case RuleKinds.DIRECTIVE: - argDefs = directiveDef && directiveDef.args; + argDefs = + directiveDef && (directiveDef.args as GraphQLArgument[]); break; case RuleKinds.ALIASED_FIELD: { const name = state.prevState && state.prevState.name; @@ -931,7 +939,7 @@ export function getTypeInfo( argDefs = null; break; } - argDefs = field.args; + argDefs = field.args as GraphQLArgument[]; break; } default: @@ -957,7 +965,7 @@ export function getTypeInfo( enumValue = enumType instanceof GraphQLEnumType ? find( - enumType.getValues(), + enumType.getValues() as GraphQLEnumValue[], (val: GraphQLEnumValue) => val.value === state.name, ) : null; diff --git a/packages/graphql-language-service-interface/src/getDiagnostics.ts b/packages/graphql-language-service-interface/src/getDiagnostics.ts index b4b5a2da1ff..4b7a242b889 100644 --- a/packages/graphql-language-service-interface/src/getDiagnostics.ts +++ b/packages/graphql-language-service-interface/src/getDiagnostics.ts @@ -17,9 +17,11 @@ import { SourceLocation, ValidationRule, print, + validate, + NoDeprecatedCustomRule, } from 'graphql'; -import { findDeprecatedUsages, parse } from 'graphql'; +import { parse } from 'graphql'; import { CharacterStream, onlineParser } from 'graphql-language-service-parser'; @@ -115,7 +117,7 @@ export function validateQuery( // TODO: detect if > graphql@15.2.0, and use the new rule for this. const deprecationWarningAnnotations = mapCat( - findDeprecatedUsages(schema, ast), + validate(schema, ast, [NoDeprecatedCustomRule]), error => annotations(error, DIAGNOSTIC_SEVERITY.Warning, 'Deprecation'), ); return validationErrorAnnotations.concat(deprecationWarningAnnotations); diff --git a/packages/graphql-language-service-interface/src/getOutline.ts b/packages/graphql-language-service-interface/src/getOutline.ts index b57f56f5bd1..1435a5482a5 100644 --- a/packages/graphql-language-service-interface/src/getOutline.ts +++ b/packages/graphql-language-service-interface/src/getOutline.ts @@ -12,6 +12,7 @@ import { TextToken, TokenKind, IPosition, + OutlineTree, } from 'graphql-language-service-types'; import { @@ -90,7 +91,7 @@ export function getOutline(documentText: string): Outline | null { } const visitorFns = outlineTreeConverter(documentText); - const outlineTrees = visit(ast, { + const outlineTrees = (visit(ast, { leave(node) { if (visitorFns !== undefined && node.kind in visitorFns) { // @ts-ignore @@ -98,7 +99,7 @@ export function getOutline(documentText: string): Outline | null { } return null; }, - }); + }) as unknown) as OutlineTree[]; return { outlineTrees }; } diff --git a/packages/graphql-language-service-parser/package.json b/packages/graphql-language-service-parser/package.json index 1c2b7e97ef9..daf153d0394 100644 --- a/packages/graphql-language-service-parser/package.json +++ b/packages/graphql-language-service-parser/package.json @@ -24,12 +24,12 @@ "module": "esm/index.js", "typings": "dist/index.d.ts", "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "devDependencies": { "@types/benchmark": "^1.0.33", "benchmark": "^2.1.4", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "lodash": "^4.17.15", "platform": "^1.3.5", "ts-node": "^8.10.2", diff --git a/packages/graphql-language-service-parser/src/Rules.ts b/packages/graphql-language-service-parser/src/Rules.ts index efc9983b4e0..016eba2f389 100644 --- a/packages/graphql-language-service-parser/src/Rules.ts +++ b/packages/graphql-language-service-parser/src/Rules.ts @@ -10,6 +10,7 @@ import { State, Token, Rule, RuleKind, ParseRule } from './types'; import CharacterStream from './CharacterStream'; import { opt, list, butNot, t, p } from './RuleHelpers'; +import { Kind } from 'graphql'; /** * Whitespace tokens defined in GraphQL spec. @@ -61,7 +62,7 @@ export const ParseRules: { [name: string]: ParseRule } = { case 'subscription': return 'Subscription'; case 'fragment': - return 'FragmentDefinition'; + return Kind.FRAGMENT_DEFINITION; case 'schema': return 'SchemaDef'; case 'scalar': diff --git a/packages/graphql-language-service-parser/src/onlineParser.ts b/packages/graphql-language-service-parser/src/onlineParser.ts index 1321b8f68f1..6e1fb4a3ff8 100644 --- a/packages/graphql-language-service-parser/src/onlineParser.ts +++ b/packages/graphql-language-service-parser/src/onlineParser.ts @@ -35,6 +35,7 @@ import CharacterStream from './CharacterStream'; import { State, Token, Rule, RuleKind } from './types'; import { LexRules, ParseRules, isIgnored } from './Rules'; +import { Kind } from 'graphql'; export type ParserOptions = { eatWhitespace: (stream: CharacterStream) => boolean; @@ -67,7 +68,7 @@ export default function onlineParser( prevState: null, }; - pushRule(options.parseRules, initialState, 'Document'); + pushRule(options.parseRules, initialState, Kind.DOCUMENT); return initialState; }, token(stream: CharacterStream, state: State) { diff --git a/packages/graphql-language-service-server/package.json b/packages/graphql-language-service-server/package.json index 2103f7cfcc6..07553aaec73 100644 --- a/packages/graphql-language-service-server/package.json +++ b/packages/graphql-language-service-server/package.json @@ -26,7 +26,7 @@ "module": "esm/index.js", "typings": "esm/index.d.ts", "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "dependencies": { "@babel/parser": "^7.13.13", @@ -44,7 +44,7 @@ "devDependencies": { "@types/mkdirp": "^1.0.1", "cross-env": "^7.0.2", - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "vscode-languageserver-protocol": "^3.15.3" } } diff --git a/packages/graphql-language-service-server/src/GraphQLCache.ts b/packages/graphql-language-service-server/src/GraphQLCache.ts index 756a148ad9c..8355f26447c 100644 --- a/packages/graphql-language-service-server/src/GraphQLCache.ts +++ b/packages/graphql-language-service-server/src/GraphQLCache.ts @@ -122,10 +122,7 @@ export class GraphQLCache implements GraphQLCacheInterface { // Return an empty array. let parsedQuery; try { - parsedQuery = parse(query, { - allowLegacySDLImplementsInterfaces: true, - allowLegacySDLEmptyFields: true, - }); + parsedQuery = parse(query); } catch (error) { return []; } @@ -220,8 +217,7 @@ export class GraphQLCache implements GraphQLCacheInterface { let parsedQuery; try { parsedQuery = parse(query, { - allowLegacySDLImplementsInterfaces: true, - allowLegacySDLEmptyFields: true, + allowLegacyFragmentVariables: true, }); } catch (error) { return []; @@ -414,10 +410,7 @@ export class GraphQLCache implements GraphQLCacheInterface { const asts = contents.map(({ query }) => { try { return { - ast: parse(query, { - allowLegacySDLImplementsInterfaces: true, - allowLegacySDLEmptyFields: true, - }), + ast: parse(query), query, }; } catch (error) { @@ -479,10 +472,7 @@ export class GraphQLCache implements GraphQLCacheInterface { const asts = contents.map(({ query }) => { try { return { - ast: parse(query, { - allowLegacySDLImplementsInterfaces: true, - allowLegacySDLEmptyFields: true, - }), + ast: parse(query), query, }; } catch (error) { @@ -641,13 +631,7 @@ export class GraphQLCache implements GraphQLCacheInterface { const customDirectives = projectConfig?.extensions?.customDirectives; if (customDirectives && schema) { const directivesSDL = customDirectives.join('\n\n'); - schema = extendSchema( - schema, - parse(directivesSDL, { - allowLegacySDLImplementsInterfaces: true, - allowLegacySDLEmptyFields: true, - }), - ); + schema = extendSchema(schema, parse(directivesSDL)); } if (!schema) { @@ -816,14 +800,7 @@ export class GraphQLCache implements GraphQLCacheInterface { return; } - queries.forEach(({ query }) => - asts.push( - parse(query, { - allowLegacySDLImplementsInterfaces: true, - allowLegacySDLEmptyFields: true, - }), - ), - ); + queries.forEach(({ query }) => asts.push(parse(query))); resolve({ filePath, content, diff --git a/packages/graphql-language-service-server/src/MessageProcessor.ts b/packages/graphql-language-service-server/src/MessageProcessor.ts index e699e056cdf..1c04bb9578a 100644 --- a/packages/graphql-language-service-server/src/MessageProcessor.ts +++ b/packages/graphql-language-service-server/src/MessageProcessor.ts @@ -688,17 +688,11 @@ export class MessageProcessor { const inlineFragments: string[] = []; - visit( - parse(query, { - allowLegacySDLEmptyFields: true, - allowLegacySDLImplementsInterfaces: true, - }), - { - FragmentDefinition: (node: FragmentDefinitionNode) => { - inlineFragments.push(node.name.value); - }, + visit(parse(query), { + FragmentDefinition: (node: FragmentDefinitionNode) => { + inlineFragments.push(node.name.value); }, - ); + }); const formatted = result ? result.definitions.map(res => { @@ -911,9 +905,7 @@ export class MessageProcessor { try { const schema = await this._graphQLCache.getSchema(project.name); if (schema) { - let schemaText = printSchema(schema, { - commentDescriptions: true, - }); + let schemaText = printSchema(schema); // file:// protocol path const uri = this._getTmpProjectPath( project, diff --git a/packages/graphql-language-service-types/package.json b/packages/graphql-language-service-types/package.json index f048e3d9b67..cb053472199 100644 --- a/packages/graphql-language-service-types/package.json +++ b/packages/graphql-language-service-types/package.json @@ -24,10 +24,10 @@ "module": "esm/index.js", "typings": "dist/index.d.ts", "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "devDependencies": { - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "graphql-config": "^3.0.2", "vscode-languageserver-types": "^3.15.1" } diff --git a/packages/graphql-language-service-utils/package.json b/packages/graphql-language-service-utils/package.json index 029d8dc91b4..85f265794f5 100644 --- a/packages/graphql-language-service-utils/package.json +++ b/packages/graphql-language-service-utils/package.json @@ -24,7 +24,7 @@ "module": "esm/index.js", "typings": "dist/index.d.ts", "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "dependencies": { "graphql-language-service-types": "^1.8.0", @@ -32,6 +32,6 @@ }, "devDependencies": { "@types/jest": "^26.0.22", - "graphql": "experimental-stream-defer" + "graphql": "16.0.0-experimental-stream-defer.5" } } diff --git a/packages/graphql-language-service-utils/src/fragmentDependencies.ts b/packages/graphql-language-service-utils/src/fragmentDependencies.ts index a0a7ff0949f..8b69fb2d69c 100644 --- a/packages/graphql-language-service-utils/src/fragmentDependencies.ts +++ b/packages/graphql-language-service-utils/src/fragmentDependencies.ts @@ -14,10 +14,7 @@ export const getFragmentDependencies = ( // Return an empty array. let parsedOperation; try { - parsedOperation = parse(operationString, { - allowLegacySDLImplementsInterfaces: true, - allowLegacySDLEmptyFields: true, - }); + parsedOperation = parse(operationString); } catch (error) { return []; } diff --git a/packages/graphql-language-service-utils/src/validateWithCustomRules.ts b/packages/graphql-language-service-utils/src/validateWithCustomRules.ts index 9938cbbecf7..0c2c4b19636 100644 --- a/packages/graphql-language-service-utils/src/validateWithCustomRules.ts +++ b/packages/graphql-language-service-utils/src/validateWithCustomRules.ts @@ -10,15 +10,15 @@ import { ValidationRule, DocumentNode, - Kind, specifiedRules, validate, GraphQLError, GraphQLSchema, NoUnusedFragmentsRule, KnownFragmentNamesRule, + Kind, + ExecutableDefinitionsRule, } from 'graphql'; -import { ExecutableDefinitions } from 'graphql/validation/rules/ExecutableDefinitions'; /** * Validate a GraphQL Document optionally with custom validation rules. @@ -33,7 +33,7 @@ export function validateWithCustomRules( // Because every fragment is considered for determing model subsets that may // be used anywhere in the codebase they're all technically "used" by clients // of graphql-data. So we remove this rule from the validators. - if (rule === NoUnusedFragmentsRule || rule === ExecutableDefinitions) { + if (rule === NoUnusedFragmentsRule || rule === ExecutableDefinitionsRule) { return false; } if (isRelayCompatMode && rule === KnownFragmentNamesRule) { diff --git a/packages/graphql-language-service/package.json b/packages/graphql-language-service/package.json index bb1ab6517be..f4461efb5bf 100644 --- a/packages/graphql-language-service/package.json +++ b/packages/graphql-language-service/package.json @@ -27,7 +27,7 @@ "graphql": "./dist/temp-bin.js" }, "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0" + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5" }, "dependencies": { "graphql-language-service-interface": "^2.8.2", @@ -36,6 +36,6 @@ "graphql-language-service-utils": "^2.5.3" }, "devDependencies": { - "graphql": "experimental-stream-defer" + "graphql": "16.0.0-experimental-stream-defer.5" } } diff --git a/packages/monaco-graphql/package.json b/packages/monaco-graphql/package.json index dd96ef8abb8..2cbae93d1c6 100644 --- a/packages/monaco-graphql/package.json +++ b/packages/monaco-graphql/package.json @@ -26,12 +26,12 @@ "graphql-language-service-utils": "^2.5.1" }, "devDependencies": { - "graphql": "experimental-stream-defer", + "graphql": "16.0.0-experimental-stream-defer.5", "monaco-editor": "^0.27.0", "vscode-languageserver-types": "^3.15.1" }, "peerDependencies": { - "graphql": ">= v14.5.0 <= 15.5.0", + "graphql": ">= 15.5.0 <= 16.0.0-experimental-stream-defer.5", "monaco-editor": "^0.20.0" } } diff --git a/packages/monaco-graphql/src/api.ts b/packages/monaco-graphql/src/api.ts index 1b5bb2650e4..325e3c654ea 100644 --- a/packages/monaco-graphql/src/api.ts +++ b/packages/monaco-graphql/src/api.ts @@ -106,7 +106,7 @@ export class LanguageServiceAPI { let rawSchema = schema as string; if (typeof schema !== 'string') { - rawSchema = printSchema(schema, { commentDescriptions: true }); + rawSchema = printSchema(schema); } this._schemaString = rawSchema; const langWorker = await (await this.worker)(); diff --git a/yarn.lock b/yarn.lock index 31209bb3963..d15fd9e1407 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11544,10 +11544,10 @@ graphql-ws@^4.9.0: resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-4.9.0.tgz#5cfd8bb490b35e86583d8322f5d5d099c26e365c" integrity sha512-sHkK9+lUm20/BGawNEWNtVAeJzhZeBg21VmvmLoT5NdGVeZWv5PdIhkcayQIAgjSyyQ17WMKmbDijIPG2On+Ag== -graphql@experimental-stream-defer: - version "15.4.0-experimental-stream-defer.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.4.0-experimental-stream-defer.1.tgz#46ae3fd2b532284575e7ddcf6c4f08aa7fe53fa3" - integrity sha512-zlGgY7aLlIofjO0CfTpCYK/tMccnj+5jvjnkTnW5qOxYhgEltuCvpMNYOJ67gz6L1flTIigt5BVEM8JExgtW3w== +graphql@16.0.0-experimental-stream-defer.5: + version "16.0.0-experimental-stream-defer.5" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.0.0-experimental-stream-defer.5.tgz#d668566fd33053a054dc5367c38c20a4ac4e4224" + integrity sha512-bluMjYpxh3a1lwZuNP+FAaEDMWzccVhkv+STcw0ckB2EPtLRTYUdXQhF9YBbUHd3tZSAR7LXzsxIw2GZXhg5rw== growly@^1.3.0: version "1.3.0"