From a46f76fe0fd2c1c448cdd6d78631cf737dd62152 Mon Sep 17 00:00:00 2001 From: CompuGeniusCode Date: Sat, 8 Aug 2026 23:47:24 -0400 Subject: [PATCH] Fix schema filtering for parameter references --- .../src/parser/parser/open_api_parser.dart | 24 ++++++-- .../parameter_schema_filtering_test.dart | 57 +++++++++++++++++++ 2 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 swagger_parser/test/parser/parameter_schema_filtering_test.dart diff --git a/swagger_parser/lib/src/parser/parser/open_api_parser.dart b/swagger_parser/lib/src/parser/parser/open_api_parser.dart index 89b89743..6ff92cf0 100644 --- a/swagger_parser/lib/src/parser/parser/open_api_parser.dart +++ b/swagger_parser/lib/src/parser/parser/open_api_parser.dart @@ -267,10 +267,17 @@ class OpenApiParser { } final isRequired = parameter[_requiredConst]?.toString().toBool() ?? false; + final parameterSchema = parameter[_schemaConst] != null + ? parameter[_schemaConst] as Map + : parameter; + + // Query/path/header parameters may reference component schemas. + // Register those references so tag-based schema filtering does not + // discard models used only by parameters. + _extractSchemaRefs(parameterSchema, null); + final typeWithImport = _findType( - parameter[_schemaConst] != null - ? parameter[_schemaConst] as Map - : parameter, + parameterSchema, name: parameter[_nameConst].toString(), isRequired: isRequired, ); @@ -549,10 +556,15 @@ class OpenApiParser { as Map; } + final parameterSchema = parameter[_schemaConst] != null + ? parameter[_schemaConst] as Map + : parameter; + + // Keep component schemas referenced by parameters when filtering. + _extractSchemaRefs(parameterSchema, null); + final typeWithImport = _findType( - rawParameter[_schemaConst] != null - ? rawParameter[_schemaConst] as Map - : rawParameter, + parameterSchema, name: rawParameter[_nameConst].toString(), isRequired: isRequired, ); diff --git a/swagger_parser/test/parser/parameter_schema_filtering_test.dart b/swagger_parser/test/parser/parameter_schema_filtering_test.dart new file mode 100644 index 00000000..583f62ba --- /dev/null +++ b/swagger_parser/test/parser/parameter_schema_filtering_test.dart @@ -0,0 +1,57 @@ +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:swagger_parser/swagger_parser.dart'; +import 'package:test/test.dart'; + +void main() { + test('keeps schemas referenced by filtered endpoint parameters', () async { + final root = await Directory.systemTemp.createTemp('swagger-parser-test-'); + addTearDown(() => root.delete(recursive: true)); + + final schema = File(p.join(root.path, 'openapi.yaml')) + ..writeAsStringSync(r''' +openapi: 3.0.0 +info: + title: Parameter schema filtering + version: 1.0.0 +paths: + /public: + get: + tags: [public] + parameters: + - name: unit + in: query + schema: + $ref: '#/components/schemas/Unit' + responses: + '200': + description: OK + /admin: + get: + tags: [admin] + responses: + '200': + description: OK +components: + schemas: + Unit: + type: string + enum: [imperial, metric] +'''); + + await GenProcessor( + SWPConfig( + schemaPath: schema.path, + outputDirectory: p.join(root.path, 'generated'), + excludeTags: ['admin'], + putClientsInFolder: true, + ), + ).generateFiles(); + + expect( + File(p.join(root.path, 'generated', 'models', 'unit.dart')).existsSync(), + isTrue, + ); + }); +}