diff --git a/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart b/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart index 400d3487..dfad9dbd 100644 --- a/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart +++ b/codegen/end_to_end_test/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart @@ -7,7 +7,7 @@ import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:end_to_end_test/graphql/__generated__/serializers.gql.dart' as _i1; -import 'package:gql_code_builder/src/serializers/inline_fragment_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i2; part 'hero_with_interface_subtyped_fragments.data.gql.g.dart'; diff --git a/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart b/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart index 51003156..7c30acec 100644 --- a/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart +++ b/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart @@ -8,7 +8,7 @@ import 'package:built_value/serializer.dart'; import 'package:end_to_end_test/custom_field.dart' as _i2; import 'package:end_to_end_test/graphql/__generated__/serializers.gql.dart' as _i1; -import 'package:gql_code_builder/src/serializers/default_scalar_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i3; part 'schema.schema.gql.g.dart'; diff --git a/codegen/end_to_end_test/lib/graphql/__generated__/serializers.gql.dart b/codegen/end_to_end_test/lib/graphql/__generated__/serializers.gql.dart index d2505df0..ea899337 100644 --- a/codegen/end_to_end_test/lib/graphql/__generated__/serializers.gql.dart +++ b/codegen/end_to_end_test/lib/graphql/__generated__/serializers.gql.dart @@ -150,7 +150,7 @@ import 'package:end_to_end_test/variables/__generated__/list_argument.req.gql.da show GreviewsWithListArgument; import 'package:end_to_end_test/variables/__generated__/list_argument.var.gql.dart' show GreviewsWithListArgumentVars; -import 'package:gql_code_builder/src/serializers/operation_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' show OperationSerializer; part 'serializers.gql.g.dart'; diff --git a/codegen/end_to_end_test/lib/interfaces/__generated__/hero_for_episode.data.gql.dart b/codegen/end_to_end_test/lib/interfaces/__generated__/hero_for_episode.data.gql.dart index 0c53c5ef..d844071c 100644 --- a/codegen/end_to_end_test/lib/interfaces/__generated__/hero_for_episode.data.gql.dart +++ b/codegen/end_to_end_test/lib/interfaces/__generated__/hero_for_episode.data.gql.dart @@ -7,7 +7,7 @@ import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:end_to_end_test/graphql/__generated__/serializers.gql.dart' as _i1; -import 'package:gql_code_builder/src/serializers/inline_fragment_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i2; part 'hero_for_episode.data.gql.g.dart'; diff --git a/codegen/end_to_end_test/pubspec.yaml b/codegen/end_to_end_test/pubspec.yaml index a44d3a61..32f82036 100644 --- a/codegen/end_to_end_test/pubspec.yaml +++ b/codegen/end_to_end_test/pubspec.yaml @@ -9,9 +9,10 @@ dependencies: built_collection: ^5.0.0 built_value: ^8.0.6 gql_exec: ^1.0.0 - gql_build: ^0.8.0 - gql_code_builder: ^0.7.1 + gql_code_builder_serializers: ^0.1.0 dev_dependencies: build: ^2.0.0 build_runner: ^2.0.0 test: ^1.16.8 + gql_code_builder: ^0.7.1 + gql_build: ^0.8.0 diff --git a/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart b/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart index 556761b7..f497c6c5 100644 --- a/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart +++ b/codegen/end_to_end_test_tristate/lib/fragments/__generated__/hero_with_interface_subtyped_fragments.data.gql.dart @@ -7,7 +7,7 @@ import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:end_to_end_test_tristate/graphql/__generated__/serializers.gql.dart' as _i1; -import 'package:gql_code_builder/src/serializers/inline_fragment_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i2; part 'hero_with_interface_subtyped_fragments.data.gql.g.dart'; diff --git a/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart b/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart index 31034415..e7be11a2 100644 --- a/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart +++ b/codegen/end_to_end_test_tristate/lib/graphql/__generated__/schema.schema.gql.dart @@ -8,7 +8,7 @@ import 'package:built_value/serializer.dart'; import 'package:end_to_end_test_tristate/custom_field.dart' as _i2; import 'package:end_to_end_test_tristate/graphql/__generated__/serializers.gql.dart' as _i3; -import 'package:gql_code_builder/src/serializers/default_scalar_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i4; import 'package:gql_tristate_value/gql_tristate_value.dart' as _i1; diff --git a/codegen/end_to_end_test_tristate/lib/graphql/__generated__/serializers.gql.dart b/codegen/end_to_end_test_tristate/lib/graphql/__generated__/serializers.gql.dart index 15090df8..144ac270 100644 --- a/codegen/end_to_end_test_tristate/lib/graphql/__generated__/serializers.gql.dart +++ b/codegen/end_to_end_test_tristate/lib/graphql/__generated__/serializers.gql.dart @@ -145,7 +145,7 @@ import 'package:end_to_end_test_tristate/variables/__generated__/human_with_args show GHumanWithArgs; import 'package:end_to_end_test_tristate/variables/__generated__/human_with_args.var.gql.dart' show GHumanWithArgsVars; -import 'package:gql_code_builder/src/serializers/operation_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' show OperationSerializer; part 'serializers.gql.g.dart'; diff --git a/codegen/end_to_end_test_tristate/lib/interfaces/__generated__/hero_for_episode.data.gql.dart b/codegen/end_to_end_test_tristate/lib/interfaces/__generated__/hero_for_episode.data.gql.dart index abe7e1bb..271e23b4 100644 --- a/codegen/end_to_end_test_tristate/lib/interfaces/__generated__/hero_for_episode.data.gql.dart +++ b/codegen/end_to_end_test_tristate/lib/interfaces/__generated__/hero_for_episode.data.gql.dart @@ -7,7 +7,7 @@ import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:end_to_end_test_tristate/graphql/__generated__/serializers.gql.dart' as _i1; -import 'package:gql_code_builder/src/serializers/inline_fragment_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i2; part 'hero_for_episode.data.gql.g.dart'; diff --git a/codegen/end_to_end_test_tristate/pubspec.yaml b/codegen/end_to_end_test_tristate/pubspec.yaml index 9da7f779..28cbd575 100644 --- a/codegen/end_to_end_test_tristate/pubspec.yaml +++ b/codegen/end_to_end_test_tristate/pubspec.yaml @@ -9,10 +9,11 @@ dependencies: built_collection: ^5.0.0 built_value: ^8.0.6 gql_exec: ^1.0.0 - gql_build: ^0.8.0 - gql_code_builder: ^0.7.1 + gql_code_builder_serializers: ^0.1.0 dev_dependencies: build: ^2.0.0 build_runner: ^2.0.0 test: ^1.16.8 gql_tristate_value: ^1.0.0 + gql_build: ^0.8.0 + gql_code_builder: ^0.7.1 diff --git a/codegen/gql_build/lib/src/serializer_builder.dart b/codegen/gql_build/lib/src/serializer_builder.dart index 16d60280..a2c838b1 100644 --- a/codegen/gql_build/lib/src/serializer_builder.dart +++ b/codegen/gql_build/lib/src/serializer_builder.dart @@ -93,7 +93,7 @@ class SerializerBuilder implements Builder { // GraphQL Operation serializer refer( "OperationSerializer", - "package:gql_code_builder/src/serializers/operation_serializer.dart", + "package:gql_code_builder_serializers/gql_code_builder_serializers.dart", ).call([]), // User-defined custom serializers ...customSerializers.map((ref) => ref.call([])), diff --git a/codegen/gql_build/pubspec.yaml b/codegen/gql_build/pubspec.yaml index e0b6fd21..3392e2a2 100644 --- a/codegen/gql_build/pubspec.yaml +++ b/codegen/gql_build/pubspec.yaml @@ -14,7 +14,8 @@ dependencies: dart_style: ^2.2.4 glob: ^2.0.0 gql: ^1.0.0 - gql_code_builder: ^0.10.0 + gql_code_builder: ^0.11.0 + gql_code_builder_serializers: ^0.1.0 path: ^1.8.0 yaml: ^3.1.0 gql_tristate_value: ^1.0.0 diff --git a/codegen/gql_code_builder/CHANGELOG.md b/codegen/gql_code_builder/CHANGELOG.md index 2b3bd4c5..548e76b2 100644 --- a/codegen/gql_code_builder/CHANGELOG.md +++ b/codegen/gql_code_builder/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.12.0 + +- Moving built-in Serializers to gql_code_builder_serializers package, so + so don't have to depend on gql_code_builder in dependencies, and can keep + it as dev-dependency (#456) + ## 0.11.0 - Adding option to create factory initializers with required parameters also for inputs (#585) diff --git a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart index 37fe603c..17933cc0 100644 --- a/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart +++ b/codegen/gql_code_builder/lib/src/inline_fragment_classes.dart @@ -131,7 +131,7 @@ List _inlineFragmentRootSerializationMethods({ ..body = TypeReference((b) => b ..symbol = "InlineFragmentSerializer" ..url = - "package:gql_code_builder/src/serializers/inline_fragment_serializer.dart" + "package:gql_code_builder_serializers/gql_code_builder_serializers.dart" ..types.add(refer(name))).call([ literalString(name), refer("${name}__base"), diff --git a/codegen/gql_code_builder/lib/src/schema/scalar.dart b/codegen/gql_code_builder/lib/src/schema/scalar.dart index ebe6d655..a6493531 100644 --- a/codegen/gql_code_builder/lib/src/schema/scalar.dart +++ b/codegen/gql_code_builder/lib/src/schema/scalar.dart @@ -97,7 +97,7 @@ ListBuilder _buildMethods( ..body = TypeReference((b) => b ..symbol = "DefaultScalarSerializer" ..url = - "package:gql_code_builder/src/serializers/default_scalar_serializer.dart" + "package:gql_code_builder_serializers/gql_code_builder_serializers.dart" ..types.add(refer(scalarName))).call([ Method( (b) => b diff --git a/codegen/gql_code_builder/lib/src/serializers/default_scalar_serializer.dart b/codegen/gql_code_builder/lib/src/serializers/default_scalar_serializer.dart index a3488b42..0bd67009 100644 --- a/codegen/gql_code_builder/lib/src/serializers/default_scalar_serializer.dart +++ b/codegen/gql_code_builder/lib/src/serializers/default_scalar_serializer.dart @@ -1,22 +1,7 @@ -import "package:built_value/serializer.dart"; - -class DefaultScalarSerializer implements PrimitiveSerializer { - final T Function(Object serialized) _deserialize; - - DefaultScalarSerializer(this._deserialize); - - @override - final types = [T]; - @override - final wireName = T.toString(); - - @override - Object serialize(Serializers serializers, T scalar, - {FullType specifiedType = FullType.unspecified}) => - (scalar as dynamic).value as Object; - - @override - T deserialize(Serializers serializers, Object serialized, - {FullType specifiedType = FullType.unspecified}) => - _deserialize(serialized); -} +// serializers have been implemented in this files originally, +// but moved to a separate package later to avoid +// direct dependencies on gql_code_builder in application code. +// This file is kept for backwards compatibility and should be removed in +// the next major version of gql_code_builder. +export "package:gql_code_builder_serializers/gql_code_builder_serializers.dart" + show DefaultScalarSerializer; diff --git a/codegen/gql_code_builder/lib/src/serializers/inline_fragment_serializer.dart b/codegen/gql_code_builder/lib/src/serializers/inline_fragment_serializer.dart index 945d235e..d56add31 100644 --- a/codegen/gql_code_builder/lib/src/serializers/inline_fragment_serializer.dart +++ b/codegen/gql_code_builder/lib/src/serializers/inline_fragment_serializer.dart @@ -1,66 +1,7 @@ -import "package:built_value/serializer.dart"; -import "package:built_value/standard_json_plugin.dart"; - -/// Deserializes a GraphQL selection with inline fragments into it's -/// appropriate concrete data class based on its `__typename` field. -/// -/// If no `__typename` is found, it will simply return a base data class that -/// only includes the common fields. -class InlineFragmentSerializer implements StructuredSerializer { - final String rootName; - final Type baseClass; - final Map asTypeClasses; - - InlineFragmentSerializer( - this.rootName, - this.baseClass, - this.asTypeClasses, - ); - - Type _typeForTypename(String name) => asTypeClasses[name] ?? baseClass; - - @override - T deserialize( - Serializers serializers, - Iterable serialized, { - FullType specifiedType = FullType.unspecified, - }) { - try { - // Get JSON representation of object - final json = StandardJsonPlugin() - .afterSerialize(serialized, specifiedType) as Map; - final typeName = (json["__typename"] ?? "") as String; - final type = _typeForTypename(typeName); - final serializer = - serializers.serializerForType(type) as StructuredSerializer; - return serializer.deserialize(serializers, serialized, - specifiedType: specifiedType) as T; - } catch (e) { - rethrow; - } - } - - @override - Iterable serialize( - Serializers serializers, - T object, { - FullType specifiedType = FullType.unspecified, - }) { - try { - final typeName = (object as dynamic).G__typename as String; - final type = _typeForTypename(typeName); - final serializer = - serializers.serializerForType(type) as StructuredSerializer; - return serializer.serialize(serializers, object, - specifiedType: specifiedType); - } catch (e) { - rethrow; - } - } - - @override - Iterable get types => [T]; - - @override - String get wireName => rootName; -} +// serializers have been implemented in this files originally, +// but moved to a separate package later to avoid +// direct dependencies on gql_code_builder in application code. +// This file is kept for backwards compatibility and should be removed in +// the next major version of gql_code_builder. +export "package:gql_code_builder_serializers/gql_code_builder_serializers.dart" + show InlineFragmentSerializer; diff --git a/codegen/gql_code_builder/lib/src/serializers/json_serializer.dart b/codegen/gql_code_builder/lib/src/serializers/json_serializer.dart index a80bf807..09268dd0 100644 --- a/codegen/gql_code_builder/lib/src/serializers/json_serializer.dart +++ b/codegen/gql_code_builder/lib/src/serializers/json_serializer.dart @@ -1,39 +1,7 @@ -import "package:built_value/serializer.dart"; -import "package:built_value/standard_json_plugin.dart"; - -/// A serializer which can be implemented to easily build a Json Serializer -abstract class JsonSerializer implements StructuredSerializer { - final _jsonPlugin = StandardJsonPlugin(); - - T fromJson(Map json); - - Map toJson(T object); - - @override - T deserialize( - Serializers serializers, - Iterable serialized, { - FullType specifiedType = FullType.unspecified, - }) { - final json = _jsonPlugin.afterSerialize(serialized, specifiedType) - as Map; - return fromJson(json); - } - - @override - Iterable serialize( - Serializers serializers, - T object, { - FullType specifiedType = FullType.unspecified, - }) { - final json = toJson(object); - final serialized = _jsonPlugin.beforeDeserialize(json, FullType(T)); - return serialized is Iterable ? serialized : [serialized]; - } - - @override - Iterable get types => [T]; - - @override - String get wireName => T.toString(); -} +// serializers have been implemented in this files originally, +// but moved to a separate package later to avoid +// direct dependencies on gql_code_builder in application code. +// This file is kept for backwards compatibility and should be removed in +// the next major version of gql_code_builder. +export "package:gql_code_builder_serializers/gql_code_builder_serializers.dart" + show JsonSerializer; diff --git a/codegen/gql_code_builder/lib/src/serializers/operation_serializer.dart b/codegen/gql_code_builder/lib/src/serializers/operation_serializer.dart index 01132d41..ea75fe9f 100644 --- a/codegen/gql_code_builder/lib/src/serializers/operation_serializer.dart +++ b/codegen/gql_code_builder/lib/src/serializers/operation_serializer.dart @@ -1,19 +1,7 @@ -import "package:gql/language.dart"; -import "package:gql_exec/gql_exec.dart"; - -import "./json_serializer.dart"; - -class OperationSerializer extends JsonSerializer { - @override - Operation fromJson(Map json) => Operation( - document: parseString(json["document"] as String), - operationName: json["operationName"] as String?, - ); - - @override - Map toJson(Operation operation) => { - "document": printNode(operation.document), - if (operation.operationName != null) - "operationName": operation.operationName, - }; -} +// serializers have been implemented in this files originally, +// but moved to a separate package later to avoid +// direct dependencies on gql_code_builder in application code. +// This file is kept for backwards compatibility and should be removed in +// the next major version of gql_code_builder. +export "package:gql_code_builder_serializers/gql_code_builder_serializers.dart" + show OperationSerializer; diff --git a/codegen/gql_code_builder/pubspec.yaml b/codegen/gql_code_builder/pubspec.yaml index 1a6873e8..27f683c0 100644 --- a/codegen/gql_code_builder/pubspec.yaml +++ b/codegen/gql_code_builder/pubspec.yaml @@ -1,5 +1,5 @@ name: gql_code_builder -version: 0.11.0 +version: 0.12.0 description: Dart code builders taking *.graphql documents and SDL to build useful classes. repository: https://github.com/gql-dart/gql environment: @@ -14,6 +14,7 @@ dependencies: gql_exec: ^1.0.0 path: ^1.8.0 gql_tristate_value: ^1.0.0 + gql_code_builder_serializers: ^0.1.0 dev_dependencies: build_runner: ^2.1.0 gql_pedantic: ^1.0.2 diff --git a/codegen/gql_code_builder_serializers/.gitignore b/codegen/gql_code_builder_serializers/.gitignore new file mode 100644 index 00000000..3a857904 --- /dev/null +++ b/codegen/gql_code_builder_serializers/.gitignore @@ -0,0 +1,3 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ diff --git a/codegen/gql_code_builder_serializers/CHANGELOG.md b/codegen/gql_code_builder_serializers/CHANGELOG.md new file mode 100644 index 00000000..5ed54dd6 --- /dev/null +++ b/codegen/gql_code_builder_serializers/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.1.0 + +- Initial version \ No newline at end of file diff --git a/codegen/gql_code_builder_serializers/LICENSE b/codegen/gql_code_builder_serializers/LICENSE new file mode 100644 index 00000000..2da6dcfa --- /dev/null +++ b/codegen/gql_code_builder_serializers/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018-present, GQL Dart + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/codegen/gql_code_builder_serializers/README.md b/codegen/gql_code_builder_serializers/README.md new file mode 100644 index 00000000..11ccb37c --- /dev/null +++ b/codegen/gql_code_builder_serializers/README.md @@ -0,0 +1,6 @@ +# gql_code_builder_serializers + +Common Serializers for `gql_code_builder`. +This package should be added as a dependency for packages +that generate code using `gql_code_builder`. + diff --git a/codegen/gql_code_builder_serializers/analysis_options.yaml b/codegen/gql_code_builder_serializers/analysis_options.yaml new file mode 100644 index 00000000..dee8927a --- /dev/null +++ b/codegen/gql_code_builder_serializers/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/codegen/gql_code_builder_serializers/lib/gql_code_builder_serializers.dart b/codegen/gql_code_builder_serializers/lib/gql_code_builder_serializers.dart new file mode 100644 index 00000000..ff24ddc5 --- /dev/null +++ b/codegen/gql_code_builder_serializers/lib/gql_code_builder_serializers.dart @@ -0,0 +1,4 @@ +export 'src/serializers/default_scalar_serializer.dart'; +export 'src/serializers/json_serializer.dart'; +export 'src/serializers/operation_serializer.dart'; +export 'src/serializers/inline_fragment_serializer.dart'; diff --git a/codegen/gql_code_builder_serializers/lib/src/serializers/default_scalar_serializer.dart b/codegen/gql_code_builder_serializers/lib/src/serializers/default_scalar_serializer.dart new file mode 100644 index 00000000..a3488b42 --- /dev/null +++ b/codegen/gql_code_builder_serializers/lib/src/serializers/default_scalar_serializer.dart @@ -0,0 +1,22 @@ +import "package:built_value/serializer.dart"; + +class DefaultScalarSerializer implements PrimitiveSerializer { + final T Function(Object serialized) _deserialize; + + DefaultScalarSerializer(this._deserialize); + + @override + final types = [T]; + @override + final wireName = T.toString(); + + @override + Object serialize(Serializers serializers, T scalar, + {FullType specifiedType = FullType.unspecified}) => + (scalar as dynamic).value as Object; + + @override + T deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) => + _deserialize(serialized); +} diff --git a/codegen/gql_code_builder_serializers/lib/src/serializers/inline_fragment_serializer.dart b/codegen/gql_code_builder_serializers/lib/src/serializers/inline_fragment_serializer.dart new file mode 100644 index 00000000..945d235e --- /dev/null +++ b/codegen/gql_code_builder_serializers/lib/src/serializers/inline_fragment_serializer.dart @@ -0,0 +1,66 @@ +import "package:built_value/serializer.dart"; +import "package:built_value/standard_json_plugin.dart"; + +/// Deserializes a GraphQL selection with inline fragments into it's +/// appropriate concrete data class based on its `__typename` field. +/// +/// If no `__typename` is found, it will simply return a base data class that +/// only includes the common fields. +class InlineFragmentSerializer implements StructuredSerializer { + final String rootName; + final Type baseClass; + final Map asTypeClasses; + + InlineFragmentSerializer( + this.rootName, + this.baseClass, + this.asTypeClasses, + ); + + Type _typeForTypename(String name) => asTypeClasses[name] ?? baseClass; + + @override + T deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { + try { + // Get JSON representation of object + final json = StandardJsonPlugin() + .afterSerialize(serialized, specifiedType) as Map; + final typeName = (json["__typename"] ?? "") as String; + final type = _typeForTypename(typeName); + final serializer = + serializers.serializerForType(type) as StructuredSerializer; + return serializer.deserialize(serializers, serialized, + specifiedType: specifiedType) as T; + } catch (e) { + rethrow; + } + } + + @override + Iterable serialize( + Serializers serializers, + T object, { + FullType specifiedType = FullType.unspecified, + }) { + try { + final typeName = (object as dynamic).G__typename as String; + final type = _typeForTypename(typeName); + final serializer = + serializers.serializerForType(type) as StructuredSerializer; + return serializer.serialize(serializers, object, + specifiedType: specifiedType); + } catch (e) { + rethrow; + } + } + + @override + Iterable get types => [T]; + + @override + String get wireName => rootName; +} diff --git a/codegen/gql_code_builder_serializers/lib/src/serializers/json_serializer.dart b/codegen/gql_code_builder_serializers/lib/src/serializers/json_serializer.dart new file mode 100644 index 00000000..a80bf807 --- /dev/null +++ b/codegen/gql_code_builder_serializers/lib/src/serializers/json_serializer.dart @@ -0,0 +1,39 @@ +import "package:built_value/serializer.dart"; +import "package:built_value/standard_json_plugin.dart"; + +/// A serializer which can be implemented to easily build a Json Serializer +abstract class JsonSerializer implements StructuredSerializer { + final _jsonPlugin = StandardJsonPlugin(); + + T fromJson(Map json); + + Map toJson(T object); + + @override + T deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final json = _jsonPlugin.afterSerialize(serialized, specifiedType) + as Map; + return fromJson(json); + } + + @override + Iterable serialize( + Serializers serializers, + T object, { + FullType specifiedType = FullType.unspecified, + }) { + final json = toJson(object); + final serialized = _jsonPlugin.beforeDeserialize(json, FullType(T)); + return serialized is Iterable ? serialized : [serialized]; + } + + @override + Iterable get types => [T]; + + @override + String get wireName => T.toString(); +} diff --git a/codegen/gql_code_builder_serializers/lib/src/serializers/operation_serializer.dart b/codegen/gql_code_builder_serializers/lib/src/serializers/operation_serializer.dart new file mode 100644 index 00000000..4023fe1b --- /dev/null +++ b/codegen/gql_code_builder_serializers/lib/src/serializers/operation_serializer.dart @@ -0,0 +1,18 @@ +import "package:gql/language.dart"; +import "package:gql_exec/gql_exec.dart"; + +import "./json_serializer.dart"; + +class OperationSerializer extends JsonSerializer { + @override + Operation fromJson(Map json) => Operation( + document: parseString(json["document"] as String), + operationName: json["operationName"] as String?, + ); + + @override + Map toJson(Operation object) => { + "document": printNode(object.document), + if (object.operationName != null) "operationName": object.operationName, + }; +} diff --git a/codegen/gql_code_builder_serializers/pubspec.yaml b/codegen/gql_code_builder_serializers/pubspec.yaml new file mode 100644 index 00000000..201d7bf7 --- /dev/null +++ b/codegen/gql_code_builder_serializers/pubspec.yaml @@ -0,0 +1,17 @@ +name: gql_code_builder_serializers +version: 0.1.0 +description: Common serializers for gql_code_builder +repository: https://github.com/gql-dart/gql +environment: + sdk: ^3.0.0 +dependencies: + gql: ^1.0.0 + built_value: ^8.0.0 + gql_exec: ^1.0.0 +dev_dependencies: + lints: ^3.0.0 + test: ^1.24.0 +topics: + - graphql + - gql + - codegen diff --git a/docs/gql.svg b/docs/gql.svg index 20af8e94..c53aed7b 100644 --- a/docs/gql.svg +++ b/docs/gql.svg @@ -1,572 +1,662 @@ - - - + + packages - + + +cluster + + cluster links - -links + +links cluster codegen - -codegen + +codegen cluster examples - -examples - - -cluster - + +examples gql_pedantic - -gql_pedantic + +gql_pedantic gql - -gql + +gql gql->gql_pedantic - - + + gql_exec - -gql_exec + +gql_exec gql_exec->gql_pedantic - - + + gql_exec->gql - - + + gql_link - -gql_link + +gql_link gql_link->gql_pedantic - - + + gql_link->gql - - + + gql_link->gql_exec - - + + gql_websocket_link - -gql_websocket_link + +gql_websocket_link gql_websocket_link->gql_pedantic - - + + gql_websocket_link->gql - - + + gql_websocket_link->gql_exec - - + + gql_websocket_link->gql_link - - + + - + +gql_tristate_value + +gql_tristate_value + + + gql_transform_link - -gql_transform_link + +gql_transform_link gql_transform_link->gql_pedantic - - + + gql_transform_link->gql - - + + gql_transform_link->gql_exec - - + + gql_transform_link->gql_link - - + + - + gql_http_link - -gql_http_link + +gql_http_link gql_http_link->gql_pedantic - - + + gql_http_link->gql - - + + gql_http_link->gql_exec - - + + gql_http_link->gql_link - - + + - + gql_error_link - -gql_error_link + +gql_error_link gql_error_link->gql_pedantic - - + + gql_error_link->gql - - + + gql_error_link->gql_exec - - + + gql_error_link->gql_link - - + + + + + +gql_code_builder_serializers + +gql_code_builder_serializers + + + +gql_code_builder_serializers->gql + + + + + +gql_code_builder_serializers->gql_exec + + - + gql_code_builder - -gql_code_builder + +gql_code_builder - + gql_code_builder->gql_pedantic - - + + - + gql_code_builder->gql - - + + - + gql_code_builder->gql_exec - - + + + + + +gql_code_builder->gql_tristate_value + + + + + +gql_code_builder->gql_code_builder_serializers + + - + gql_build - -gql_build + +gql_build - + gql_build->gql_pedantic - - + + - + gql_build->gql - - + + + + + +gql_build->gql_tristate_value + + - + gql_build->gql_code_builder - - + + - + gql_example_http_auth_link - -gql_example_http_auth_link + +gql_example_http_auth_link - + gql_example_http_auth_link->gql_pedantic - - + + - + gql_example_http_auth_link->gql - - + + - + gql_example_http_auth_link->gql_exec - - + + - + gql_example_http_auth_link->gql_link - - + + - + gql_example_http_auth_link->gql_transform_link - - + + - + gql_example_http_auth_link->gql_http_link - - + + - + gql_example_http_auth_link->gql_error_link - - + + - + gql_example_http_auth_link->gql_build - - + + - + gql_example_flutter - -gql_example_flutter + +gql_example_flutter - + gql_example_flutter->gql_pedantic - - + + - + gql_example_flutter->gql - - + + - + gql_example_flutter->gql_exec - - + + - + gql_example_flutter->gql_link - - + + - + gql_example_flutter->gql_http_link - - + + - + gql_example_flutter->gql_build - - + + - + gql_dio_link - -gql_dio_link + +gql_dio_link - + gql_dio_link->gql_pedantic - - + + - + gql_dio_link->gql - - + + - + gql_dio_link->gql_exec - - + + - + gql_dio_link->gql_link - - + + - + gql_example_dio_link - -gql_example_dio_link + +gql_example_dio_link - + gql_example_dio_link->gql - - + + - + gql_example_dio_link->gql_exec - - + + - + gql_example_dio_link->gql_link - - + + - + gql_example_dio_link->gql_dio_link - - + + - + gql_example_cli_github - -gql_example_cli_github + +gql_example_cli_github - + gql_example_cli_github->gql_pedantic - - + + - + gql_example_cli_github->gql - - + + - + gql_example_cli_github->gql_exec - - + + + + + +gql_example_cli_github->gql_link + + - + gql_example_cli_github->gql_transform_link - - + + - + gql_example_cli_github->gql_http_link - - + + - + gql_example_cli_github->gql_build - - + + - + gql_example_cli - -gql_example_cli + +gql_example_cli - + gql_example_cli->gql_pedantic - - + + - + gql_example_cli->gql - - + + - + gql_example_cli->gql_exec - - + + - + gql_example_cli->gql_link - - + + - + gql_example_cli->gql_http_link - - + + - + gql_example_cli->gql_build - - + + - + gql_example_build - -gql_example_build + +gql_example_build - + gql_example_build->gql_pedantic - - + + - + gql_example_build->gql_build - - + + - + gql_dedupe_link - -gql_dedupe_link + +gql_dedupe_link - + gql_dedupe_link->gql_pedantic - - + + - + gql_dedupe_link->gql - - + + - + gql_dedupe_link->gql_exec - - + + - + gql_dedupe_link->gql_link - - + + + + + +end_to_end_test_tristate + +end_to_end_test_tristate + + + +end_to_end_test_tristate->gql_exec + + + + + +end_to_end_test_tristate->gql_tristate_value + + + + + +end_to_end_test_tristate->gql_code_builder_serializers + + + + + +end_to_end_test_tristate->gql_code_builder + + + + + +end_to_end_test_tristate->gql_build + + - + end_to_end_test - -end_to_end_test + +end_to_end_test - + end_to_end_test->gql_exec - - + + + + + +end_to_end_test->gql_code_builder_serializers + + - + end_to_end_test->gql_code_builder - - + + - + end_to_end_test->gql_build - - + + diff --git a/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart b/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart index 754f98da..cbe166b2 100644 --- a/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart +++ b/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart @@ -5,7 +5,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; -import 'package:gql_code_builder/src/serializers/default_scalar_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i1; import 'package:gql_example_build/__generated__/serializers.gql.dart' as _i2; diff --git a/examples/gql_example_build/lib/__generated__/serializers.gql.dart b/examples/gql_example_build/lib/__generated__/serializers.gql.dart index 1e244c0d..2b62a8b6 100644 --- a/examples/gql_example_build/lib/__generated__/serializers.gql.dart +++ b/examples/gql_example_build/lib/__generated__/serializers.gql.dart @@ -1,7 +1,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/serializer.dart'; import 'package:built_value/standard_json_plugin.dart' show StandardJsonPlugin; -import 'package:gql_code_builder/src/serializers/operation_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' show OperationSerializer; import 'package:gql_example_build/__generated__/schema.schema.gql.dart' show GEnum, GInput, GScalar; diff --git a/examples/gql_example_build/lib/fragments/__generated__/shape.data.gql.dart b/examples/gql_example_build/lib/fragments/__generated__/shape.data.gql.dart index 554e3409..beea41a5 100644 --- a/examples/gql_example_build/lib/fragments/__generated__/shape.data.gql.dart +++ b/examples/gql_example_build/lib/fragments/__generated__/shape.data.gql.dart @@ -4,7 +4,7 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; -import 'package:gql_code_builder/src/serializers/inline_fragment_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i2; import 'package:gql_example_build/__generated__/serializers.gql.dart' as _i1; diff --git a/examples/gql_example_cli/lib/__generated__/serializers.gql.dart b/examples/gql_example_cli/lib/__generated__/serializers.gql.dart index 18f62476..f182edf5 100644 --- a/examples/gql_example_cli/lib/__generated__/serializers.gql.dart +++ b/examples/gql_example_cli/lib/__generated__/serializers.gql.dart @@ -1,7 +1,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/serializer.dart'; import 'package:built_value/standard_json_plugin.dart' show StandardJsonPlugin; -import 'package:gql_code_builder/src/serializers/operation_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' show OperationSerializer; import 'package:gql_example_cli/__generated__/dimensions.data.gql.dart' show GDimensionsData; diff --git a/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart b/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart index ac7577a5..acd8b840 100644 --- a/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart +++ b/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart @@ -5,7 +5,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; -import 'package:gql_code_builder/src/serializers/default_scalar_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' as _i2; import 'package:gql_example_cli_github/__generated__/serializers.gql.dart' as _i1; diff --git a/examples/gql_example_cli_github/lib/__generated__/serializers.gql.dart b/examples/gql_example_cli_github/lib/__generated__/serializers.gql.dart index 7c27f66c..c0e8df98 100644 --- a/examples/gql_example_cli_github/lib/__generated__/serializers.gql.dart +++ b/examples/gql_example_cli_github/lib/__generated__/serializers.gql.dart @@ -1,7 +1,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/serializer.dart'; import 'package:built_value/standard_json_plugin.dart' show StandardJsonPlugin; -import 'package:gql_code_builder/src/serializers/operation_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' show OperationSerializer; import 'package:gql_example_cli_github/__generated__/add_star.data.gql.dart' show GAddStarData, GAddStarData_action, GAddStarData_action_starrable; diff --git a/examples/gql_example_flutter/lib/graphql/__generated__/serializers.gql.dart b/examples/gql_example_flutter/lib/graphql/__generated__/serializers.gql.dart index 570bbaff..823252e7 100644 --- a/examples/gql_example_flutter/lib/graphql/__generated__/serializers.gql.dart +++ b/examples/gql_example_flutter/lib/graphql/__generated__/serializers.gql.dart @@ -1,7 +1,7 @@ import 'package:built_collection/built_collection.dart'; import 'package:built_value/serializer.dart'; import 'package:built_value/standard_json_plugin.dart' show StandardJsonPlugin; -import 'package:gql_code_builder/src/serializers/operation_serializer.dart' +import 'package:gql_code_builder_serializers/gql_code_builder_serializers.dart' show OperationSerializer; import 'package:gql_example_flutter/src/all_pokemon/graphql/__generated__/all_pokemon.data.gql.dart' show GAllPokemonData, GAllPokemonData_pokemons; diff --git a/examples/gql_example_flutter/lib/src/pokemon_card/pokemon_card.dart b/examples/gql_example_flutter/lib/src/pokemon_card/pokemon_card.dart index 6aadc557..99b7dbeb 100644 --- a/examples/gql_example_flutter/lib/src/pokemon_card/pokemon_card.dart +++ b/examples/gql_example_flutter/lib/src/pokemon_card/pokemon_card.dart @@ -23,9 +23,9 @@ class PokemonCard extends StatelessWidget { width: 200, ), Text(pokemon.name ?? '', - style: Theme.of(context).textTheme.headline6), + style: Theme.of(context).textTheme.titleLarge), Text('HP: ${pokemon.maxHP}', - style: Theme.of(context).textTheme.subtitle1) + style: Theme.of(context).textTheme.titleMedium) ], ), ), diff --git a/examples/gql_example_flutter/lib/src/pokemon_detail/pokemon_detail.dart b/examples/gql_example_flutter/lib/src/pokemon_detail/pokemon_detail.dart index 7a83c404..71c7908d 100644 --- a/examples/gql_example_flutter/lib/src/pokemon_detail/pokemon_detail.dart +++ b/examples/gql_example_flutter/lib/src/pokemon_detail/pokemon_detail.dart @@ -47,7 +47,7 @@ class PokemonDetailScreen extends StatelessWidget { ), Text( 'Height', - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.titleLarge, ), Text('min: ${data.pokemon!.height!.minimum}'), Text('max: ${data.pokemon!.height!.maximum}'), @@ -56,7 +56,7 @@ class PokemonDetailScreen extends StatelessWidget { ), Text( 'Weight', - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.titleLarge, ), Text('min: ${data.pokemon!.weight!.minimum}'), Text('max: ${data.pokemon!.weight!.maximum}'), diff --git a/links/gql_dio_link/test/multipart_upload_test.dart b/links/gql_dio_link/test/multipart_upload_test.dart index 43f3a8c3..d25cbab6 100644 --- a/links/gql_dio_link/test/multipart_upload_test.dart +++ b/links/gql_dio_link/test/multipart_upload_test.dart @@ -62,9 +62,11 @@ void main() { } }; + final testFileBytes = Uint8List.fromList([0, 1, 254, 255]); + List testFiles() => [ dio.MultipartFile.fromBytes( - [0, 1, 254, 255], + testFileBytes, filename: "sample_upload.jpg", contentType: MediaType("image", "jpeg"), ), @@ -135,7 +137,7 @@ void main() { final boundary = data.boundary; - final expected = [ + final expected = Uint8List.fromList([ ...utf8.encode( "--$boundary" '\r\ncontent-disposition: form-data; name="operations"\r\n\r\n' @@ -155,10 +157,7 @@ void main() { "content-type: image/jpeg\r\n" "\r\n", ), - 0, - 1, - 254, - 255, + ...testFileBytes, ...utf8.encode( "\r\n--$boundary" "\r\ncontent-disposition: form-data;" @@ -167,16 +166,18 @@ void main() { "just plain text" "\r\n--$boundary--\r\n", ), - ]; + ]); //NOTE: //dio and http reverse the place of content-disposition: //and content-type: expect( - /*utf8.decode(*/ bodyBytes, + /*utf8.decode(*/ + bodyBytes, /* allowMalformed: true),*/ equals( - /*utf8.decode(*/ expected, /* allowMalformed: true),*/ + /*utf8.decode(*/ + expected, /* allowMalformed: true),*/ ), ); });