diff --git a/packages/ferry_generator/lib/graphql_builder.dart b/packages/ferry_generator/lib/graphql_builder.dart index 5aeb676b..8997ca55 100644 --- a/packages/ferry_generator/lib/graphql_builder.dart +++ b/packages/ferry_generator/lib/graphql_builder.dart @@ -4,17 +4,17 @@ import 'package:build/build.dart'; import 'package:code_builder/code_builder.dart'; import 'package:gql_code_builder/ast.dart'; import 'package:gql_code_builder/data.dart'; -import 'package:gql_code_builder/var.dart'; import 'package:gql_code_builder/schema.dart'; +import 'package:gql_code_builder/var.dart'; import 'package:path/path.dart' as p; -import 'src/utils/locations.dart'; +import 'src/allocators/gql_allocator.dart'; +import 'src/codegen/req.dart'; +import 'src/utils/add_introspection.dart'; import 'src/utils/config.dart'; +import 'src/utils/locations.dart'; import 'src/utils/reader.dart'; import 'src/utils/writer.dart'; -import 'src/utils/add_introspection.dart'; -import 'src/codegen/req.dart'; -import 'src/allocators/gql_allocator.dart'; Builder graphqlBuilder( BuilderOptions options, @@ -55,6 +55,21 @@ class GraphqlBuilder implements Builder { 'When extensions require add_typenames to be true. Consider setting add_typenames to true in your build.yaml or disabling when_extensions in your build.yaml.'); } + final schemaOutputAsset = + outputAssetId(config.schemaId, schemaExtension, config.outputDir); + + final schemaUrl = schemaOutputAsset.uri.toString(); + final schemaAllocator = GqlAllocator( + buildStep.inputId.uri.toString(), + config.sourceExtension, + outputAssetId(buildStep.inputId, schemaExtension, config.outputDir) + .uri + .toString(), + schemaUrl, + config.outputDir, + ); + + final varAllocator = schemaAllocator; final libs = { astExtension: buildAstLibrary(doc), dataExtension: buildDataLibrary( @@ -65,11 +80,12 @@ class GraphqlBuilder implements Builder { config.whenExtensionConfig, ), varExtension: buildVarLibrary( - doc, - addTypenames(schema), - p.basename(generatedFilePath(buildStep.inputId, varExtension)), - config.typeOverrides, - ), + doc, + addTypenames(schema), + p.basename(generatedFilePath(buildStep.inputId, varExtension)), + config.typeOverrides, + config.serializeNulls, + varAllocator), reqExtension: buildReqLibrary( doc, p.basename(generatedFilePath(buildStep.inputId, reqExtension)), @@ -80,6 +96,7 @@ class GraphqlBuilder implements Builder { config.typeOverrides, config.enumFallbackConfig, generatePossibleTypesMap: config.shouldGeneratePossibleTypes, + allocator: schemaAllocator, ), }; @@ -89,13 +106,17 @@ class GraphqlBuilder implements Builder { final schemaOutputAsset = outputAssetId(config.schemaId, schemaExtension, config.outputDir); - final allocator = GqlAllocator( - buildStep.inputId.uri.toString(), - config.sourceExtension, - generatedAsset.uri.toString(), - schemaOutputAsset.uri.toString(), - config.outputDir, - ); + final allocator = entry.key == schemaExtension + ? schemaAllocator + : entry.key == varExtension + ? varAllocator + : GqlAllocator( + buildStep.inputId.uri.toString(), + config.sourceExtension, + generatedAsset.uri.toString(), + schemaOutputAsset.uri.toString(), + config.outputDir, + ); await writeDocument(generatedAsset, entry.value, allocator, buildStep); } diff --git a/packages/ferry_generator/lib/src/utils/config.dart b/packages/ferry_generator/lib/src/utils/config.dart index 7c1f9477..78c3b2b8 100644 --- a/packages/ferry_generator/lib/src/utils/config.dart +++ b/packages/ferry_generator/lib/src/utils/config.dart @@ -14,6 +14,7 @@ class BuilderConfig { final AssetId schemaId; final bool shouldAddTypenames; final bool shouldGeneratePossibleTypes; + final bool serializeNulls; final Map typeOverrides; final Set customSerializers; final EnumFallbackConfig enumFallbackConfig; @@ -27,6 +28,7 @@ class BuilderConfig { typeOverrides = _getTypeOverrides(config['type_overrides']), shouldGeneratePossibleTypes = config['generate_possible_types_map'] ?? true, + serializeNulls = config['serialize_nulls'] ?? false, customSerializers = _getCustomSerializers(config['custom_serializers']), enumFallbackConfig = _getEnumFallbackConfig(config), outputDir = config['output_dir'] ?? '__generated__', diff --git a/packages/ferry_generator/pubspec.yaml b/packages/ferry_generator/pubspec.yaml index 9f0accbd..0b78caba 100644 --- a/packages/ferry_generator/pubspec.yaml +++ b/packages/ferry_generator/pubspec.yaml @@ -19,8 +19,17 @@ dependencies: built_value_generator: ^8.1.1 built_value: ^8.1.2 analyzer: ">=4.2.0 <6.0.0" + dev_dependencies: test: ^1.16.8 build_runner: ^2.0.2 build_test: ^2.0.0 pedantic: ^1.11.0 + + +dependency_overrides: + gql_code_builder: + git: + url: https://github.com/twklessor/gql.git + ref: feature/serialize-nulls + path: codegen/gql_code_builder