From 42bb7bcb9dc623312db945bca4ecc126d5236654 Mon Sep 17 00:00:00 2001 From: Martin Kamleithner Date: Mon, 11 Aug 2025 00:28:18 +0100 Subject: [PATCH 1/2] fix(ferry_generator): pre-create allocators to ensure consistent imports --- .../ferry_generator/lib/graphql_builder.dart | 51 +++++++++---------- .../lib/src/allocators/gql_allocator.dart | 22 +++++--- packages/ferry_generator/pubspec.yaml | 2 +- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/packages/ferry_generator/lib/graphql_builder.dart b/packages/ferry_generator/lib/graphql_builder.dart index aca8736c..6c9f231d 100644 --- a/packages/ferry_generator/lib/graphql_builder.dart +++ b/packages/ferry_generator/lib/graphql_builder.dart @@ -88,21 +88,30 @@ class GraphqlBuilder implements Builder { final serializerOutputAsset = AssetId(buildStep.inputId.package, schemaOutputAsset.path); final serializerUrl = serializerOutputAsset.uri.toString(); - final schemaAllocator = GqlAllocator( - buildStep.inputId.uri.toString(), - config.sourceExtension, - outputAssetId(buildStep.inputId, schemaExtension, config.outputDir) - .uri - .toString(), - schemaUrl, - serializerUrl, - config.outputDir, - ); - - final varAllocator = schemaAllocator; final dataToVarsMode = config.dataToJsonMode; + Allocator createAllocator(String extension) { + return GqlAllocator( + buildStep.inputId.uri.toString(), + config.sourceExtension, + outputAssetId(buildStep.inputId, extension, config.outputDir) + .uri + .toString(), + schemaUrl, + serializerUrl, + config.outputDir, + ); + } + + final allocators = { + astExtension: createAllocator(astExtension), + dataExtension: createAllocator(dataExtension), + varExtension: createAllocator(varExtension), + reqExtension: createAllocator(reqExtension), + schemaExtension: createAllocator(schemaExtension), + }; + final libs = { astExtension: buildAstLibrary(doc), dataExtension: buildDataLibrary( @@ -118,7 +127,7 @@ class GraphqlBuilder implements Builder { addTypenames(schema), p.basename(generatedFilePath(buildStep.inputId, varExtension)), config.typeOverrides, - varAllocator, + allocators[varExtension]!, triStateValueConfig, config.shouldGenerateVarsCreateFactories), reqExtension: buildReqLibrary( @@ -132,7 +141,7 @@ class GraphqlBuilder implements Builder { config.typeOverrides, config.enumFallbackConfig, generatePossibleTypesMap: config.shouldGeneratePossibleTypes, - allocator: schemaAllocator, + allocator: allocators[schemaExtension]!, triStateValueConfig: triStateValueConfig, generateVarsCreateFactories: config.shouldGenerateVarsCreateFactories, ), @@ -141,20 +150,8 @@ class GraphqlBuilder implements Builder { for (var entry in libs.entries) { final generatedAsset = outputAssetId(buildStep.inputId, entry.key, config.outputDir); - final schemaOutputAsset = - outputAssetId(_schemaId, schemaExtension, config.outputDir); - - final serialzerOutputAsset = - AssetId(buildStep.inputId.package, schemaOutputAsset.path); - final allocator = GqlAllocator( - buildStep.inputId.uri.toString(), - config.sourceExtension, - generatedAsset.uri.toString(), - schemaOutputAsset.uri.toString(), - serialzerOutputAsset.uri.toString(), - config.outputDir, - ); + final allocator = allocators[entry.key]!; await writeDocument(generatedAsset, entry.value, allocator, buildStep); } diff --git a/packages/ferry_generator/lib/src/allocators/gql_allocator.dart b/packages/ferry_generator/lib/src/allocators/gql_allocator.dart index 281df209..f46e1476 100644 --- a/packages/ferry_generator/lib/src/allocators/gql_allocator.dart +++ b/packages/ferry_generator/lib/src/allocators/gql_allocator.dart @@ -22,17 +22,15 @@ class GqlAllocator implements Allocator { final String serializerUrl; final String outputDir; + /// Fixed imports are used to map specific package URLs to a specific import name. + final Map _fixedImports; + final _imports = {}; var _keys = 1; - GqlAllocator( - this.sourceUrl, - this.sourceExtension, - this.currentUrl, - this.schemaUrl, - this.serializerUrl, - this.outputDir, - ); + GqlAllocator(this.sourceUrl, this.sourceExtension, this.currentUrl, + this.schemaUrl, this.serializerUrl, this.outputDir, + [this._fixedImports = const {}]); @override String allocate(Reference reference) { @@ -46,6 +44,14 @@ class GqlAllocator implements Allocator { return symbol; } + if (_fixedImports.containsKey(Uri.parse(url))) { + final importName = _fixedImports[Uri.parse(url)]!; + + if (importName == currentUrl) { + return symbol; + } + } + final uri = Uri.parse(url); if (uri.path.endsWith(sourceExtension)) { diff --git a/packages/ferry_generator/pubspec.yaml b/packages/ferry_generator/pubspec.yaml index 0808f604..881dd8b5 100644 --- a/packages/ferry_generator/pubspec.yaml +++ b/packages/ferry_generator/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: gql_tristate_value: ^1.0.0 built_collection: ^5.0.0 code_builder: ^4.3.0 - build: ^2.0.0 + build: 2.4.2 path: ^1.8.0 ferry_exec: ^0.8.0-dev.0 yaml: ^3.1.0 From 2b7679d4b6ee6e4a74f6c03fcc4f82be3686eed1 Mon Sep 17 00:00:00 2001 From: Martin Kamleithner Date: Mon, 11 Aug 2025 00:43:58 +0100 Subject: [PATCH 2/2] fix(ferry_generator): revert changes to gql_allocator.dart --- .../lib/src/allocators/gql_allocator.dart | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/ferry_generator/lib/src/allocators/gql_allocator.dart b/packages/ferry_generator/lib/src/allocators/gql_allocator.dart index f46e1476..281df209 100644 --- a/packages/ferry_generator/lib/src/allocators/gql_allocator.dart +++ b/packages/ferry_generator/lib/src/allocators/gql_allocator.dart @@ -22,15 +22,17 @@ class GqlAllocator implements Allocator { final String serializerUrl; final String outputDir; - /// Fixed imports are used to map specific package URLs to a specific import name. - final Map _fixedImports; - final _imports = {}; var _keys = 1; - GqlAllocator(this.sourceUrl, this.sourceExtension, this.currentUrl, - this.schemaUrl, this.serializerUrl, this.outputDir, - [this._fixedImports = const {}]); + GqlAllocator( + this.sourceUrl, + this.sourceExtension, + this.currentUrl, + this.schemaUrl, + this.serializerUrl, + this.outputDir, + ); @override String allocate(Reference reference) { @@ -44,14 +46,6 @@ class GqlAllocator implements Allocator { return symbol; } - if (_fixedImports.containsKey(Uri.parse(url))) { - final importName = _fixedImports[Uri.parse(url)]!; - - if (importName == currentUrl) { - return symbol; - } - } - final uri = Uri.parse(url); if (uri.path.endsWith(sourceExtension)) {