From 779588e47c889a543578111822eb5c000bd5994d Mon Sep 17 00:00:00 2001 From: Tobe O Date: Wed, 14 Aug 2019 00:42:31 -0400 Subject: [PATCH 1/5] Changelog + bump gql_server to 1.0.1 --- graphql_server/CHANGELOG.md | 4 ++++ graphql_server/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/graphql_server/CHANGELOG.md b/graphql_server/CHANGELOG.md index 435668fb..25c38458 100644 --- a/graphql_server/CHANGELOG.md +++ b/graphql_server/CHANGELOG.md @@ -1,3 +1,7 @@ +# 1.0.1 +* Fix a bug where `globalVariables` were not being properly passed +to field resolvers. + # 1.0.0 * Finish testing. * Add `package:pedantic` fixes. diff --git a/graphql_server/pubspec.yaml b/graphql_server/pubspec.yaml index ea32cb83..09081d32 100644 --- a/graphql_server/pubspec.yaml +++ b/graphql_server/pubspec.yaml @@ -1,5 +1,5 @@ name: graphql_server -version: 1.0.0 +version: 1.0.1 author: Tobe O description: Base package for implementing GraphQL servers. You might prefer `package:angel_graphql`, the fastest way to implement GraphQL backends in Dart. homepage: https://github.com/angel-dart/graphql From c8f5a0931cc5f4d3528015c31779e8675b15c46e Mon Sep 17 00:00:00 2001 From: Tobe O Date: Wed, 14 Aug 2019 00:43:19 -0400 Subject: [PATCH 2/5] Send globalVariables explicitly to resolveFieldValue --- graphql_server/lib/graphql_server.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/graphql_server/lib/graphql_server.dart b/graphql_server/lib/graphql_server.dart index 378b3f4e..1a99f4c8 100644 --- a/graphql_server/lib/graphql_server.dart +++ b/graphql_server/lib/graphql_server.dart @@ -374,7 +374,10 @@ class GraphQL { var argumentValues = coerceArgumentValues(objectType, field, variableValues); var resolvedValue = await resolveFieldValue( - objectType, objectValue, fieldName, argumentValues); + objectType, + objectValue, + fieldName, + Map.from(globalVariables)..addAll(argumentValues)); return completeValue(document, fieldName, fieldType, fields, resolvedValue, variableValues, globalVariables); } From 1d33583ddf6768f918dd2b087d90d7ff1cbd6d35 Mon Sep 17 00:00:00 2001 From: Tobe O Date: Wed, 14 Aug 2019 00:44:04 -0400 Subject: [PATCH 3/5] Protect from case where globalVars is null --- graphql_server/lib/graphql_server.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/graphql_server/lib/graphql_server.dart b/graphql_server/lib/graphql_server.dart index 1a99f4c8..a27c5bdf 100644 --- a/graphql_server/lib/graphql_server.dart +++ b/graphql_server/lib/graphql_server.dart @@ -377,7 +377,8 @@ class GraphQL { objectType, objectValue, fieldName, - Map.from(globalVariables)..addAll(argumentValues)); + Map.from(globalVariables ?? {}) + ..addAll(argumentValues ?? {})); return completeValue(document, fieldName, fieldType, fields, resolvedValue, variableValues, globalVariables); } From cf4b96da4280f7166df697a0b0d71a2b32256b77 Mon Sep 17 00:00:00 2001 From: Tobe O Date: Wed, 14 Aug 2019 00:44:22 -0400 Subject: [PATCH 4/5] Remove "new" kw --- graphql_server/example/main.dart | 4 +- graphql_server/lib/graphql_server.dart | 76 +++++++++++++------------- graphql_server/lib/introspection.dart | 14 ++--- graphql_server/lib/mirrors.dart | 14 ++--- graphql_server/test/query_test.dart | 4 +- 5 files changed, 56 insertions(+), 56 deletions(-) diff --git a/graphql_server/example/main.dart b/graphql_server/example/main.dart index c008fb84..6cf07e9e 100644 --- a/graphql_server/example/main.dart +++ b/graphql_server/example/main.dart @@ -23,7 +23,7 @@ void main() { 'todos', listOf(todoType), resolve: (_, __) => [ - new Todo( + Todo( text: 'Clean your room!', completed: false, ) @@ -32,7 +32,7 @@ void main() { ]), ); - var graphql = new GraphQL(schema); + var graphql = GraphQL(schema); var result = await graphql.parseAndExecute('{ todos { text } }'); print(result); diff --git a/graphql_server/lib/graphql_server.dart b/graphql_server/lib/graphql_server.dart index a27c5bdf..f24c8f02 100644 --- a/graphql_server/lib/graphql_server.dart +++ b/graphql_server/lib/graphql_server.dart @@ -53,7 +53,7 @@ class GraphQL { GraphQLType convertType(TypeContext ctx) { if (ctx.listType != null) { - return new GraphQLListType(convertType(ctx.listType.type)); + return GraphQLListType(convertType(ctx.listType.type)); } else if (ctx.typeName != null) { switch (ctx.typeName.name) { case 'Int': @@ -71,11 +71,11 @@ class GraphQL { return graphQLDate; default: return customTypes.firstWhere((t) => t.name == ctx.typeName.name, - orElse: () => throw new ArgumentError( + orElse: () => throw ArgumentError( 'Unknown GraphQL type: "${ctx.typeName.name}"')); } } else { - throw new ArgumentError('Invalid GraphQL type: "${ctx.span.text}"'); + throw ArgumentError('Invalid GraphQL type: "${ctx.span.text}"'); } } @@ -86,13 +86,13 @@ class GraphQL { initialValue, Map globalVariables}) { var tokens = scan(text, sourceUrl: sourceUrl); - var parser = new Parser(tokens); + var parser = Parser(tokens); var document = parser.parseDocument(); if (parser.errors.isNotEmpty) { - throw new GraphQLException(parser.errors - .map((e) => new GraphQLExceptionError(e.message, locations: [ - new GraphExceptionErrorLocation.fromSourceLocation(e.span.start) + throw GraphQLException(parser.errors + .map((e) => GraphQLExceptionError(e.message, locations: [ + GraphExceptionErrorLocation.fromSourceLocation(e.span.start) ])) .toList()); } @@ -135,12 +135,12 @@ class GraphQL { if (operationName == null) { return ops.length == 1 ? ops.first as OperationDefinitionContext - : throw new GraphQLException.fromMessage( + : throw GraphQLException.fromMessage( 'This document does not define any operations.'); } else { return ops.firstWhere( (d) => (d as OperationDefinitionContext).name == operationName, - orElse: () => throw new GraphQLException.fromMessage( + orElse: () => throw GraphQLException.fromMessage( 'Missing required operation "$operationName".')) as OperationDefinitionContext; } @@ -164,7 +164,7 @@ class GraphQL { if (defaultValue != null) { coercedValues[variableName] = defaultValue.value.value; } else if (!variableType.isNullable) { - throw new GraphQLException.fromSourceSpan( + throw GraphQLException.fromSourceSpan( 'Missing required variable "$variableName".', variableDefinition.span); } @@ -173,9 +173,9 @@ class GraphQL { var validation = type.validate(variableName, value); if (!validation.successful) { - throw new GraphQLException(validation.errors - .map((e) => new GraphQLExceptionError(e, locations: [ - new GraphExceptionErrorLocation.fromSourceLocation( + throw GraphQLException(validation.errors + .map((e) => GraphQLExceptionError(e, locations: [ + GraphExceptionErrorLocation.fromSourceLocation( variableDefinition.span.start) ])) .toList()); @@ -211,7 +211,7 @@ class GraphQL { var mutationType = schema.mutationType; if (mutationType == null) { - throw new GraphQLException.fromMessage( + throw GraphQLException.fromMessage( 'The schema does not define a mutation type.'); } @@ -348,7 +348,7 @@ class GraphQL { objectValue, fields, fieldType, - new Map.from( + Map.from( globalVariables ?? {}) ..addAll(variableValues), globalVariables); @@ -411,7 +411,7 @@ class GraphQL { } else if (defaultValue != null || argumentDefinition.defaultsToNull) { coercedValues[argumentName] = defaultValue; } else if (argumentType is GraphQLNonNullableType) { - throw new GraphQLException.fromSourceSpan( + throw GraphQLException.fromSourceSpan( 'Missing value for argument "$argumentName" of field "$fieldName".', value.valueOrVariable.span); } else { @@ -421,7 +421,7 @@ class GraphQL { if (defaultValue != null || argumentDefinition.defaultsToNull) { coercedValues[argumentName] = defaultValue; } else if (argumentType is GraphQLNonNullableType) { - throw new GraphQLException.fromMessage( + throw GraphQLException.fromMessage( 'Missing value for argument "$argumentName" of field "$fieldName".'); } else { continue; @@ -433,10 +433,10 @@ class GraphQL { if (!validation.successful) { var errors = [ - new GraphQLExceptionError( + GraphQLExceptionError( 'Type coercion error for value of argument "$argumentName" of field "$fieldName".', locations: [ - new GraphExceptionErrorLocation.fromSourceLocation( + GraphExceptionErrorLocation.fromSourceLocation( value.valueOrVariable.span.start) ], ) @@ -444,34 +444,34 @@ class GraphQL { for (var error in validation.errors) { errors.add( - new GraphQLExceptionError( + GraphQLExceptionError( error, locations: [ - new GraphExceptionErrorLocation.fromSourceLocation( + GraphExceptionErrorLocation.fromSourceLocation( value.valueOrVariable.span.start) ], ), ); } - throw new GraphQLException(errors); + throw GraphQLException(errors); } else { var coercedValue = validation.value; coercedValues[argumentName] = coercedValue; } } on TypeError catch (e) { - throw new GraphQLException([ - new GraphQLExceptionError( + throw GraphQLException([ + GraphQLExceptionError( 'Type coercion error for value of argument "$argumentName" of field "$fieldName".', locations: [ - new GraphExceptionErrorLocation.fromSourceLocation( + GraphExceptionErrorLocation.fromSourceLocation( value.valueOrVariable.span.start) ], ), - new GraphQLExceptionError( + GraphQLExceptionError( e.message.toString(), locations: [ - new GraphExceptionErrorLocation.fromSourceLocation( + GraphExceptionErrorLocation.fromSourceLocation( value.valueOrVariable.span.start) ], ), @@ -514,7 +514,7 @@ class GraphQL { fields, result, variableValues, globalVariables); if (completedResult == null) { - throw new GraphQLException.fromMessage( + throw GraphQLException.fromMessage( 'Null value provided for non-nullable field "$fieldName".'); } else { return completedResult; @@ -527,7 +527,7 @@ class GraphQL { if (fieldType is GraphQLListType) { if (result is! Iterable) { - throw new GraphQLException.fromMessage( + throw GraphQLException.fromMessage( 'Value of field "$fieldName" must be a list or iterable, got $result instead.'); } @@ -552,7 +552,7 @@ class GraphQL { return validation.value; } } on TypeError { - throw new GraphQLException.fromMessage( + throw GraphQLException.fromMessage( 'Value of field "$fieldName" must be ${fieldType.valueType}, got $result instead.'); } } @@ -571,7 +571,7 @@ class GraphQL { result, variableValues, globalVariables); } - throw new UnsupportedError('Unsupported type: $fieldType'); + throw UnsupportedError('Unsupported type: $fieldType'); } GraphQLObjectType resolveAbstractType( @@ -587,7 +587,7 @@ class GraphQL { } else if (type is GraphQLUnionType) { possibleTypes = type.possibleTypes; } else { - throw new ArgumentError(); + throw ArgumentError(); } var errors = []; @@ -602,7 +602,7 @@ class GraphQL { } errors - .addAll(validation.errors.map((m) => new GraphQLExceptionError(m))); + .addAll(validation.errors.map((m) => GraphQLExceptionError(m))); } on GraphQLException catch (e) { errors.addAll(e.errors); } @@ -610,10 +610,10 @@ class GraphQL { errors.insert( 0, - new GraphQLExceptionError( + GraphQLExceptionError( 'Cannot convert value $result to type $type.')); - throw new GraphQLException(errors); + throw GraphQLException(errors); } SelectionSetContext mergeSelectionSets(List fields) { @@ -627,7 +627,7 @@ class GraphQL { } } - return new SelectionSetContext.merged(selections); + return SelectionSetContext.merged(selections); } Map> collectFields( @@ -713,7 +713,7 @@ class GraphQL { var vname = vv.variable.name; if (!variableValues.containsKey(vname)) - throw new GraphQLException.fromSourceSpan( + throw GraphQLException.fromSourceSpan( 'Unknown variable: "$vname"', vv.span); return variableValues[vname]; @@ -721,7 +721,7 @@ class GraphQL { bool doesFragmentTypeApply( GraphQLObjectType objectType, TypeConditionContext fragmentType) { - var type = convertType(new TypeContext(fragmentType.typeName, null)); + var type = convertType(TypeContext(fragmentType.typeName, null)); if (type is GraphQLObjectType && !type.isInterface) { for (var field in type.fields) if (!objectType.fields.any((f) => f.name == field.name)) return false; diff --git a/graphql_server/lib/introspection.dart b/graphql_server/lib/introspection.dart index a341791d..ad07bd43 100644 --- a/graphql_server/lib/introspection.dart +++ b/graphql_server/lib/introspection.dart @@ -1,7 +1,7 @@ import 'package:graphql_parser/graphql_parser.dart'; import 'package:graphql_schema/graphql_schema.dart'; -/// Performs introspection over a GraphQL [schema], and returns a new one, containing +/// Performs introspection over a GraphQL [schema], and returns a one, containing /// introspective information. /// /// [allTypes] should contain all types, not directly defined in the schema, that you @@ -79,11 +79,11 @@ GraphQLSchema reflectSchema(GraphQLSchema schema, List allTypes) { field( '__type', typeType, - inputs: [new GraphQLFieldInput('name', graphQLString.nonNullable())], + inputs: [GraphQLFieldInput('name', graphQLString.nonNullable())], resolve: (_, args) { var name = args['name'] as String; return allTypes.firstWhere((t) => t.name == name, - orElse: () => throw new GraphQLException.fromMessage( + orElse: () => throw GraphQLException.fromMessage( 'No type named "$name" exists.')); }, ), @@ -91,7 +91,7 @@ GraphQLSchema reflectSchema(GraphQLSchema schema, List allTypes) { fields.addAll(schema.queryType.fields); - return new GraphQLSchema( + return GraphQLSchema( queryType: objectType(schema.queryType.name, fields: fields), mutationType: schema.mutationType, subscriptionType: schema.subscriptionType, @@ -228,14 +228,14 @@ GraphQLObjectType _createTypeType() { else if (t is GraphQLUnionType) return 'UNION'; else - throw new UnsupportedError('Cannot get the kind of $t.'); + throw UnsupportedError('Cannot get the kind of $t.'); }, ), field( 'fields', listOf(fieldType), inputs: [ - new GraphQLFieldInput( + GraphQLFieldInput( 'includeDeprecated', graphQLBoolean, defaultValue: false, @@ -252,7 +252,7 @@ GraphQLObjectType _createTypeType() { 'enumValues', listOf(enumValueType.nonNullable()), inputs: [ - new GraphQLFieldInput( + GraphQLFieldInput( 'includeDeprecated', graphQLBoolean, defaultValue: false, diff --git a/graphql_server/lib/mirrors.dart b/graphql_server/lib/mirrors.dart index 3f04d9b6..35149790 100644 --- a/graphql_server/lib/mirrors.dart +++ b/graphql_server/lib/mirrors.dart @@ -42,10 +42,10 @@ GraphQLType _objectTypeFromDartType(Type type, [List typeArguments]) { } else if (type == double) { return graphQLFloat; } else if (type == num) { - throw new UnsupportedError( + throw UnsupportedError( 'Cannot convert `num` to a GraphQL type. Choose `int` or `float` instead.'); } else if (type == Null) { - throw new UnsupportedError('Cannot convert `Null` to a GraphQL type.'); + throw UnsupportedError('Cannot convert `Null` to a GraphQL type.'); } else if (type == String) { return graphQLString; } else if (type == DateTime) { @@ -56,7 +56,7 @@ GraphQLType _objectTypeFromDartType(Type type, [List typeArguments]) { type, typeArguments?.isNotEmpty == true ? typeArguments : null); if (mirror is! ClassMirror) { - throw new StateError( + throw StateError( '$type is not a class, and therefore cannot be converted into a GraphQL object type.'); } @@ -69,7 +69,7 @@ GraphQLType _objectTypeFromDartType(Type type, [List typeArguments]) { return listOf(inner.nonNullable()); } - throw new ArgumentError( + throw ArgumentError( 'Cannot convert ${clazz.reflectedType}, an iterable WITHOUT a type argument, into a GraphQL type.'); } @@ -213,7 +213,7 @@ GraphQLEnumType enumTypeFromClassMirror(ClassMirror mirror) { if (name != #values) { var methodMirror = mirror.staticMembers[name]; values.add( - new GraphQLEnumValue( + GraphQLEnumValue( MirrorSystem.getName(name), mirror.getField(name).reflectee, description: _getDescription(methodMirror.metadata), @@ -223,7 +223,7 @@ GraphQLEnumType enumTypeFromClassMirror(ClassMirror mirror) { } } - return new GraphQLEnumType( + return GraphQLEnumType( MirrorSystem.getName(mirror.simpleName), values, description: _getDescription(mirror.metadata), @@ -294,7 +294,7 @@ String _getSerializedName(Symbol name, MethodMirror mirror, ClassMirror clazz) { var ann = obj.reflectee as Serializable; if (ann.autoSnakeCaseNames != false) { - return new ReCase(MirrorSystem.getName(name)).snakeCase; + return ReCase(MirrorSystem.getName(name)).snakeCase; } } } diff --git a/graphql_server/test/query_test.dart b/graphql_server/test/query_test.dart index c008fb84..6cf07e9e 100644 --- a/graphql_server/test/query_test.dart +++ b/graphql_server/test/query_test.dart @@ -23,7 +23,7 @@ void main() { 'todos', listOf(todoType), resolve: (_, __) => [ - new Todo( + Todo( text: 'Clean your room!', completed: false, ) @@ -32,7 +32,7 @@ void main() { ]), ); - var graphql = new GraphQL(schema); + var graphql = GraphQL(schema); var result = await graphql.parseAndExecute('{ todos { text } }'); print(result); From 77eb28f49c8787968427a1d360fd9700e91e1a3d Mon Sep 17 00:00:00 2001 From: Tobe O Date: Wed, 14 Aug 2019 00:48:18 -0400 Subject: [PATCH 5/5] Pedantic fixes --- graphql_server/example/main.dart | 10 +-- graphql_server/lib/graphql_server.dart | 74 ++++++++++---------- graphql_server/lib/introspection.dart | 21 +++--- graphql_server/lib/mirrors.dart | 5 +- graphql_server/lib/src/apollo/server.dart | 27 ++++--- graphql_server/lib/src/apollo/transport.dart | 9 +-- graphql_server/test/query_test.dart | 10 +-- 7 files changed, 84 insertions(+), 72 deletions(-) diff --git a/graphql_server/example/main.dart b/graphql_server/example/main.dart index 6cf07e9e..335fe284 100644 --- a/graphql_server/example/main.dart +++ b/graphql_server/example/main.dart @@ -23,11 +23,11 @@ void main() { 'todos', listOf(todoType), resolve: (_, __) => [ - Todo( - text: 'Clean your room!', - completed: false, - ) - ], + Todo( + text: 'Clean your room!', + completed: false, + ) + ], ), ]), ); diff --git a/graphql_server/lib/graphql_server.dart b/graphql_server/lib/graphql_server.dart index f24c8f02..796422af 100644 --- a/graphql_server/lib/graphql_server.dart +++ b/graphql_server/lib/graphql_server.dart @@ -45,10 +45,12 @@ class GraphQL { } if (_schema.queryType != null) this.customTypes.add(_schema.queryType); - if (_schema.mutationType != null) + if (_schema.mutationType != null) { this.customTypes.add(_schema.mutationType); - if (_schema.subscriptionType != null) + } + if (_schema.subscriptionType != null) { this.customTypes.add(_schema.subscriptionType); + } } GraphQLType convertType(TypeContext ctx) { @@ -115,10 +117,10 @@ class GraphQL { var operation = getOperation(document, operationName); var coercedVariableValues = coerceVariableValues( schema, operation, variableValues ?? {}); - if (operation.isQuery) + if (operation.isQuery) { return await executeQuery(document, operation, schema, coercedVariableValues, initialValue, globalVariables); - else if (operation.isSubscription) { + } else if (operation.isSubscription) { return await subscribe(document, operation, schema, coercedVariableValues, globalVariables, initialValue); } else { @@ -129,20 +131,17 @@ class GraphQL { OperationDefinitionContext getOperation( DocumentContext document, String operationName) { - var ops = - document.definitions.where((d) => d is OperationDefinitionContext); + var ops = document.definitions.whereType(); if (operationName == null) { return ops.length == 1 - ? ops.first as OperationDefinitionContext + ? ops.first : throw GraphQLException.fromMessage( 'This document does not define any operations.'); } else { - return ops.firstWhere( - (d) => (d as OperationDefinitionContext).name == operationName, - orElse: () => throw GraphQLException.fromMessage( - 'Missing required operation "$operationName".')) - as OperationDefinitionContext; + return ops.firstWhere((d) => d.name == operationName, + orElse: () => throw GraphQLException.fromMessage( + 'Missing required operation "$operationName".')); } } @@ -241,15 +240,17 @@ class GraphQL { initialValue) { var selectionSet = subscription.selectionSet; var subscriptionType = schema.subscriptionType; - if (subscriptionType == null) + if (subscriptionType == null) { throw GraphQLException.fromSourceSpan( 'The schema does not define a subscription type.', subscription.span); + } var groupedFieldSet = collectFields(document, subscriptionType, selectionSet, variableValues); - if (groupedFieldSet.length != 1) + if (groupedFieldSet.length != 1) { throw GraphQLException.fromSourceSpan( 'The grouped field set from this query must have exactly one entry.', selectionSet.span); + } var fields = groupedFieldSet.entries.first.value; var fieldName = fields.first.field.fieldName.alias?.name ?? fields.first.field.fieldName.name; @@ -284,10 +285,10 @@ class GraphQL { Map globalVariables) async { var selectionSet = subscription.selectionSet; var subscriptionType = schema.subscriptionType; - if (subscriptionType == null) + if (subscriptionType == null) { throw GraphQLException.fromSourceSpan( 'The schema does not define a subscription type.', subscription.span); - + } try { var data = await executeSelectionSet(document, selectionSet, subscriptionType, initialValue, variableValues, globalVariables); @@ -309,10 +310,11 @@ class GraphQL { }); var resolver = field.resolve; var result = await resolver(rootValue, argumentValues); - if (result is Stream) + if (result is Stream) { return result; - else + } else { return Stream.fromIterable([result]); + } } Future> executeSelectionSet( @@ -348,8 +350,7 @@ class GraphQL { objectValue, fields, fieldType, - Map.from( - globalVariables ?? {}) + Map.from(globalVariables ?? {}) ..addAll(variableValues), globalVariables); } @@ -490,9 +491,10 @@ class GraphQL { if (objectValue is Map) { return objectValue[fieldName] as T; } else if (field.resolve == null) { - if (defaultFieldResolver != null) + if (defaultFieldResolver != null) { return await defaultFieldResolver( objectValue, fieldName, argumentValues); + } return null; } else { @@ -601,17 +603,14 @@ class GraphQL { return t; } - errors - .addAll(validation.errors.map((m) => GraphQLExceptionError(m))); + errors.addAll(validation.errors.map((m) => GraphQLExceptionError(m))); } on GraphQLException catch (e) { errors.addAll(e.errors); } } - errors.insert( - 0, - GraphQLExceptionError( - 'Cannot convert value $result to type $type.')); + errors.insert(0, + GraphQLExceptionError('Cannot convert value $result to type $type.')); throw GraphQLException(errors); } @@ -640,10 +639,13 @@ class GraphQL { visitedFragments ??= []; for (var selection in selectionSet.selections) { - if (getDirectiveValue('skip', 'if', selection, variableValues) == true) + if (getDirectiveValue('skip', 'if', selection, variableValues) == true) { continue; + } if (getDirectiveValue('include', 'if', selection, variableValues) == - false) continue; + false) { + continue; + } if (selection.field != null) { var responseKey = selection.field.fieldName.alias?.alias ?? @@ -656,11 +658,9 @@ class GraphQL { if (visitedFragments.contains(fragmentSpreadName)) continue; visitedFragments.add(fragmentSpreadName); var fragment = document.definitions - .where((d) => d is FragmentDefinitionContext) - .firstWhere( - (f) => - (f as FragmentDefinitionContext).name == fragmentSpreadName, - orElse: () => null) as FragmentDefinitionContext; + .whereType() + .firstWhere((f) => f.name == fragmentSpreadName, + orElse: () => null); if (fragment == null) continue; var fragmentType = fragment.typeCondition; @@ -712,9 +712,10 @@ class GraphQL { if (vv.value != null) return vv.value.value; var vname = vv.variable.name; - if (!variableValues.containsKey(vname)) + if (!variableValues.containsKey(vname)) { throw GraphQLException.fromSourceSpan( 'Unknown variable: "$vname"', vv.span); + } return variableValues[vname]; } @@ -723,8 +724,9 @@ class GraphQL { GraphQLObjectType objectType, TypeConditionContext fragmentType) { var type = convertType(TypeContext(fragmentType.typeName, null)); if (type is GraphQLObjectType && !type.isInterface) { - for (var field in type.fields) + for (var field in type.fields) { if (!objectType.fields.any((f) => f.name == field.name)) return false; + } return true; } else if (type is GraphQLObjectType && type.isInterface) { return objectType.isImplementationOf(type); diff --git a/graphql_server/lib/introspection.dart b/graphql_server/lib/introspection.dart index ad07bd43..8ccd68da 100644 --- a/graphql_server/lib/introspection.dart +++ b/graphql_server/lib/introspection.dart @@ -108,9 +108,9 @@ GraphQLObjectType _reflectSchemaTypes() { 'ofType', _reflectSchemaTypes(), resolve: (type, _) { - if (type is GraphQLListType) + if (type is GraphQLListType) { return type.ofType; - else if (type is GraphQLNonNullableType) return type.ofType; + } else if (type is GraphQLNonNullableType) return type.ofType; return null; }, ), @@ -213,22 +213,23 @@ GraphQLObjectType _createTypeType() { resolve: (type, _) { var t = type as GraphQLType; - if (t is GraphQLEnumType) + if (t is GraphQLEnumType) { return 'ENUM'; - else if (t is GraphQLScalarType) + } else if (t is GraphQLScalarType) { return 'SCALAR'; - else if (t is GraphQLInputObjectType) + } else if (t is GraphQLInputObjectType) { return 'INPUT_OBJECT'; - else if (t is GraphQLObjectType) + } else if (t is GraphQLObjectType) { return t.isInterface ? 'INTERFACE' : 'OBJECT'; - else if (t is GraphQLListType) + } else if (t is GraphQLListType) { return 'LIST'; - else if (t is GraphQLNonNullableType) + } else if (t is GraphQLNonNullableType) { return 'NON_NULL'; - else if (t is GraphQLUnionType) + } else if (t is GraphQLUnionType) { return 'UNION'; - else + } else { throw UnsupportedError('Cannot get the kind of $t.'); + } }, ), field( diff --git a/graphql_server/lib/mirrors.dart b/graphql_server/lib/mirrors.dart index 35149790..c69589e1 100644 --- a/graphql_server/lib/mirrors.dart +++ b/graphql_server/lib/mirrors.dart @@ -7,10 +7,11 @@ import 'package:recase/recase.dart'; /// Uses `dart:mirrors` to read field names from items. If they are Maps, performs a regular lookup. T mirrorsFieldResolver(objectValue, String fieldName, [Map objectValues]) { - if (objectValue is Map) + if (objectValue is Map) { return objectValue[fieldName] as T; - else + } else { return reflect(objectValue).getField(Symbol(fieldName)).reflectee as T; + } } /// Reflects upon a given [type] and dynamically generates a [GraphQLType] that corresponds to it. diff --git a/graphql_server/lib/src/apollo/server.dart b/graphql_server/lib/src/apollo/server.dart index 0a1de4a4..6a16f917 100644 --- a/graphql_server/lib/src/apollo/server.dart +++ b/graphql_server/lib/src/apollo/server.dart @@ -18,11 +18,12 @@ abstract class Server { if ((msg.type == OperationMessage.gqlConnectionInit) && !_init) { try { Map connectionParams; - if (msg.payload is Map) + if (msg.payload is Map) { connectionParams = msg.payload as Map; - else if (msg.payload != null) + } else if (msg.payload != null) { throw FormatException( '${msg.type} payload must be a map (object).'); + } var connect = await onConnect(client, connectionParams); if (!connect) throw false; @@ -39,33 +40,39 @@ abstract class Server { }); } } catch (e) { - if (e == false) + if (e == false) { _reportError('The connection was rejected.'); - else + } else { _reportError(e.toString()); + } } } else if (_init) { if (msg.type == OperationMessage.gqlStart) { - if (msg.id == null) + if (msg.id == null) { throw FormatException('${msg.type} id is required.'); - if (msg.payload == null) + } + if (msg.payload == null) { throw FormatException('${msg.type} payload is required.'); - else if (msg.payload is! Map) + } else if (msg.payload is! Map) { throw FormatException( '${msg.type} payload must be a map (object).'); + } var payload = msg.payload as Map; var query = payload['query']; var variables = payload['variables']; var operationName = payload['operationName']; - if (query == null || query is! String) + if (query == null || query is! String) { throw FormatException( '${msg.type} payload must contain a string named "query".'); - if (variables != null && variables is! Map) + } + if (variables != null && variables is! Map) { throw FormatException( '${msg.type} payload\'s "variables" field must be a map (object).'); - if (operationName != null && operationName is! String) + } + if (operationName != null && operationName is! String) { throw FormatException( '${msg.type} payload\'s "operationName" field must be a string.'); + } var result = await onOperation( msg.id, query as String, diff --git a/graphql_server/lib/src/apollo/transport.dart b/graphql_server/lib/src/apollo/transport.dart index 7eab13fc..dac18d65 100644 --- a/graphql_server/lib/src/apollo/transport.dart +++ b/graphql_server/lib/src/apollo/transport.dart @@ -44,14 +44,15 @@ class OperationMessage { var payload = map['payload']; var id = map['id']; - if (type == null) + if (type == null) { throw ArgumentError.notNull('type'); - else if (type is! String) + } else if (type is! String) { throw ArgumentError.value(type, 'type', 'must be a string'); - else if (id is num) + } else if (id is num) { id = id.toString(); - else if (id != null && id is! String) + } else if (id != null && id is! String) { throw ArgumentError.value(id, 'id', 'must be a string or number'); + } // TODO: This is technically a violation of the spec. // https://github.com/apollographql/subscriptions-transport-ws/issues/551 diff --git a/graphql_server/test/query_test.dart b/graphql_server/test/query_test.dart index 6cf07e9e..335fe284 100644 --- a/graphql_server/test/query_test.dart +++ b/graphql_server/test/query_test.dart @@ -23,11 +23,11 @@ void main() { 'todos', listOf(todoType), resolve: (_, __) => [ - Todo( - text: 'Clean your room!', - completed: false, - ) - ], + Todo( + text: 'Clean your room!', + completed: false, + ) + ], ), ]), );