diff --git a/gql_build/CHANGELOG.md b/gql_build/CHANGELOG.md index bdb73dad4..cda168364 100644 --- a/gql_build/CHANGELOG.md +++ b/gql_build/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +- add `__typename` field to interface and object types + ## 0.0.8 - escape reserved and private names diff --git a/gql_build/lib/src/data_builder.dart b/gql_build/lib/src/data_builder.dart index 5cd67769f..834680cd8 100644 --- a/gql_build/lib/src/data_builder.dart +++ b/gql_build/lib/src/data_builder.dart @@ -1,8 +1,8 @@ import "dart:async"; import "package:build/build.dart"; - import "package:gql_build/src/config.dart"; +import "package:gql_build/src/utils/add_introspection.dart"; import "package:gql_build/src/utils/reader.dart"; import "package:gql_build/src/utils/writer.dart"; import "package:gql_code_builder/data.dart"; @@ -26,7 +26,7 @@ class DataBuilder implements Builder { final library = buildDataLibrary( doc, - schema, + addTypenames(schema), ); return writeDocument( diff --git a/gql_build/lib/src/utils/add_introspection.dart b/gql_build/lib/src/utils/add_introspection.dart new file mode 100644 index 000000000..c8e9993a1 --- /dev/null +++ b/gql_build/lib/src/utils/add_introspection.dart @@ -0,0 +1,60 @@ +import "package:gql/ast.dart"; +import "package:gql_code_builder/source.dart"; + +const typenameField = FieldDefinitionNode( + name: NameNode( + value: "__typename", + ), + type: NamedTypeNode( + name: NameNode( + value: "String", + ), + isNonNull: true, + ), +); + +class AddTypenameField extends TransformingVisitor { + @override + ObjectTypeDefinitionNode visitObjectTypeDefinitionNode( + ObjectTypeDefinitionNode node, + ) => + ObjectTypeDefinitionNode( + name: node.name, + description: node.description, + directives: node.directives, + fields: [ + typenameField, + ...node.fields, + ], + interfaces: node.interfaces, + span: node.span, + ); + + @override + InterfaceTypeDefinitionNode visitInterfaceTypeDefinitionNode( + InterfaceTypeDefinitionNode node, + ) => + InterfaceTypeDefinitionNode( + name: node.name, + fields: [ + typenameField, + ...node.fields, + ], + directives: node.directives, + description: node.description, + span: node.span, + ); +} + +DocumentNode _transform(DocumentNode doc) => transform( + doc, + [ + AddTypenameField(), + ], + ); + +SourceNode addTypenames(SourceNode source) => SourceNode( + url: source.url, + document: _transform(source.document), + imports: source.imports.map(addTypenames).toSet(), + ); diff --git a/gql_build/lib/src/var_builder.dart b/gql_build/lib/src/var_builder.dart index 2ccb0ea5b..487a43fc0 100644 --- a/gql_build/lib/src/var_builder.dart +++ b/gql_build/lib/src/var_builder.dart @@ -2,6 +2,7 @@ import "dart:async"; import "package:build/build.dart"; import "package:gql_build/src/config.dart"; +import "package:gql_build/src/utils/add_introspection.dart"; import "package:gql_build/src/utils/reader.dart"; import "package:gql_build/src/utils/writer.dart"; import "package:gql_code_builder/var.dart"; @@ -25,7 +26,7 @@ class VarBuilder implements Builder { final library = buildVarLibrary( doc, - schema, + addTypenames(schema), ); return writeDocument( diff --git a/gql_build/pubspec.yaml b/gql_build/pubspec.yaml index b8abd7c6e..7ee3958c9 100644 --- a/gql_build/pubspec.yaml +++ b/gql_build/pubspec.yaml @@ -1,19 +1,19 @@ name: gql_build author: Klāvs Priedītis -version: 0.0.8 +version: 0.0.9 homepage: https://github.com/gql-dart/gql/tree/master/gql_build description: Useful builders for your GraphQL SDL and documents. Based on package:gql_code_builder and package:build -environment: - sdk: '>=2.2.2 <3.0.0' -dependencies: +environment: + sdk: ">=2.2.2 <3.0.0" +dependencies: gql: ^0.12.1 path: ^1.6.4 glob: ^1.2.0 build: ^1.0.0 - gql_code_builder: ^0.0.8 + gql_code_builder: ^0.0.9 code_builder: ^3.2.0 dart_style: ^1.2.9 -dev_dependencies: +dev_dependencies: test: ^1.0.0 build_test: ^0.10.7 gql_pedantic: ^1.0.1 diff --git a/gql_code_builder/CHANGELOG.md b/gql_code_builder/CHANGELOG.md index 3de1e90f4..227690389 100644 --- a/gql_code_builder/CHANGELOG.md +++ b/gql_code_builder/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +- remove duplicate ast imports + ## 0.0.8 - escape reserved and private names diff --git a/gql_code_builder/lib/source.dart b/gql_code_builder/lib/source.dart index 1ea19dc29..3f6f68d03 100644 --- a/gql_code_builder/lib/source.dart +++ b/gql_code_builder/lib/source.dart @@ -24,7 +24,7 @@ class SourceNode { ], ); - List getRefs() => [ + Set getRefs() => { ...document.definitions.map( (definition) => Reference( _getName(definition), @@ -34,7 +34,7 @@ class SourceNode { ...imports.expand( (import) => import.getRefs(), ), - ]; + }; } String _getName(DefinitionNode def) { diff --git a/gql_code_builder/pubspec.yaml b/gql_code_builder/pubspec.yaml index ea0b5a10b..152cc43a0 100644 --- a/gql_code_builder/pubspec.yaml +++ b/gql_code_builder/pubspec.yaml @@ -1,14 +1,14 @@ name: gql_code_builder author: Klāvs Priedītis -version: 0.0.8 +version: 0.0.9 homepage: https://github.com/gql-dart/gql/tree/master/gql_code_builder description: Dart code builders taking *.graphql documents and SDL to build useful classes. -environment: - sdk: '>=2.2.2 <3.0.0' -dependencies: +environment: + sdk: ">=2.2.2 <3.0.0" +dependencies: gql: ^0.12.1 code_builder: ^3.2.0 meta: ^1.1.7 built_collection: ^4.0.0 -dev_dependencies: +dev_dependencies: gql_pedantic: ^1.0.1