platform/packages/graphql/graphql_schema/lib/src/schema.dart

160 lines
4.9 KiB
Dart
Raw Normal View History

2018-08-02 13:31:54 +00:00
library graphql_schema.src.schema;
import 'dart:async';
2018-08-03 18:59:31 +00:00
2018-08-04 19:18:53 +00:00
import 'package:collection/collection.dart';
2018-08-02 13:31:54 +00:00
import 'package:meta/meta.dart';
2018-08-03 21:07:08 +00:00
import 'package:source_span/source_span.dart';
2018-08-03 18:59:31 +00:00
2018-08-02 13:31:54 +00:00
part 'argument.dart';
2018-08-03 18:59:31 +00:00
2018-08-03 22:01:36 +00:00
part 'enum.dart';
2018-08-02 13:31:54 +00:00
part 'field.dart';
2018-08-03 18:59:31 +00:00
2018-08-02 13:31:54 +00:00
part 'gen.dart';
2018-08-03 18:59:31 +00:00
2018-08-02 13:31:54 +00:00
part 'object_type.dart';
2018-08-03 18:59:31 +00:00
2018-08-02 13:31:54 +00:00
part 'scalar.dart';
2018-08-03 18:59:31 +00:00
2018-08-02 13:31:54 +00:00
part 'type.dart';
2018-08-03 18:59:31 +00:00
2018-08-04 00:22:50 +00:00
part 'union.dart';
2018-08-02 13:31:54 +00:00
part 'validation_result.dart';
/// The schema against which queries, mutations, and subscriptions are executed.
2018-08-02 13:31:54 +00:00
class GraphQLSchema {
/// The shape which all queries against the backend must take.
2018-08-04 19:18:53 +00:00
final GraphQLObjectType queryType;
/// The shape required for any query that changes the state of the backend.
2018-08-04 19:18:53 +00:00
final GraphQLObjectType mutationType;
/// A [GraphQLObjectType] describing the form of data sent to real-time subscribers.
///
/// Note that as of August 4th, 2018 (when this text was written), subscriptions are not formalized
/// in the GraphQL specification. Therefore, any GraphQL implementation can potentially implement
/// subscriptions in its own way.
2018-08-04 19:18:53 +00:00
final GraphQLObjectType subscriptionType;
2018-08-02 13:31:54 +00:00
2018-08-04 19:18:53 +00:00
GraphQLSchema({this.queryType, this.mutationType, this.subscriptionType});
2018-08-02 13:31:54 +00:00
}
/// A shorthand for creating a [GraphQLSchema].
2018-08-02 13:31:54 +00:00
GraphQLSchema graphQLSchema(
2018-08-04 19:18:53 +00:00
{@required GraphQLObjectType queryType,
GraphQLObjectType mutationType,
GraphQLObjectType subscriptionType}) =>
2018-08-03 18:59:31 +00:00
new GraphQLSchema(
2018-08-04 19:18:53 +00:00
queryType: queryType,
mutationType: mutationType,
subscriptionType: subscriptionType);
2018-08-02 15:17:14 +00:00
/// A default resolver that always returns `null`.
resolveToNull(_, __) => null;
2018-08-02 18:33:50 +00:00
/// An exception that occurs during execution of a GraphQL query.
2018-08-03 21:07:08 +00:00
class GraphQLException implements Exception {
/// A list of all specific errors, with text representation, that caused this exception.
2018-08-03 21:07:08 +00:00
final List<GraphQLExceptionError> errors;
GraphQLException(this.errors);
factory GraphQLException.fromMessage(String message) {
return new GraphQLException([
new GraphQLExceptionError(message),
]);
}
factory GraphQLException.fromSourceSpan(String message, FileSpan span) {
return new GraphQLException([
new GraphQLExceptionError(
message,
locations: [
new GraphExceptionErrorLocation.fromSourceLocation(span.start),
],
),
]);
}
Map<String, List<Map<String, dynamic>>> toJson() {
return {
'errors': errors.map((e) => e.toJson()).toList(),
};
}
}
/// One of an arbitrary number of errors that may occur during the execution of a GraphQL query.
///
/// This will almost always be passed to a [GraphQLException], as it is useless alone.
2018-08-03 21:07:08 +00:00
class GraphQLExceptionError {
/// The reason execution was halted, whether it is a syntax error, or a runtime error, or some other exception.
2018-08-03 21:07:08 +00:00
final String message;
/// An optional list of locations within the source text where this error occurred.
///
/// Smart tools can use this information to show end users exactly which part of the errant query
/// triggered an error.
2018-08-03 21:07:08 +00:00
final List<GraphExceptionErrorLocation> locations;
GraphQLExceptionError(this.message, {this.locations: const []});
Map<String, dynamic> toJson() {
var out = <String, dynamic>{'message': message};
if (locations?.isNotEmpty == true) {
out['locations'] = locations.map((l) => l.toJson()).toList();
}
return out;
}
}
/// Information about a location in source text that caused an error during the execution of a GraphQL query.
///
/// This is analogous to a [SourceLocation] from `package:source_span`.
2018-08-03 21:07:08 +00:00
class GraphExceptionErrorLocation {
final int line;
final int column;
GraphExceptionErrorLocation(this.line, this.column);
factory GraphExceptionErrorLocation.fromSourceLocation(
SourceLocation location) {
return new GraphExceptionErrorLocation(location.line, location.column);
}
2018-08-02 18:33:50 +00:00
2018-08-03 21:07:08 +00:00
Map<String, int> toJson() {
return {'line': line, 'column': column};
}
2018-08-02 18:33:50 +00:00
}
2018-08-03 18:59:31 +00:00
2019-02-03 20:25:02 +00:00
typedef GraphQLType GraphDocumentationTypeProvider();
2018-08-03 18:59:31 +00:00
/// A metadata annotation used to provide documentation to `package:graphql_server`.
class GraphQLDocumentation {
/// The description of the annotated class, field, or enum value, to be displayed in tools like GraphiQL.
2018-08-03 18:59:31 +00:00
final String description;
/// The reason the annotated field or enum value was deprecated, if any.
final String deprecationReason;
/// A constant callback that returns an explicit type for the annotated field, rather than having it be assumed
/// via `dart:mirrors`.
2019-02-03 20:25:02 +00:00
final GraphDocumentationTypeProvider type;
/// The name of an explicit type for the annotated field, rather than having it be assumed.
final Symbol typeName;
2018-08-03 18:59:31 +00:00
const GraphQLDocumentation(
2019-02-03 20:25:02 +00:00
{this.description, this.deprecationReason, this.type, this.typeName});
}
/// The canonical instance.
const GraphQLClass graphQLClass = const GraphQLClass._();
/// Signifies that a class should statically generate a [GraphQLSchema].
class GraphQLClass {
const GraphQLClass._();
2018-08-03 18:59:31 +00:00
}