diff --git a/src/SwaggerProvider.DesignTime/DefinitionCompiler.fs b/src/SwaggerProvider.DesignTime/DefinitionCompiler.fs index 3628e444..3097fbbb 100644 --- a/src/SwaggerProvider.DesignTime/DefinitionCompiler.fs +++ b/src/SwaggerProvider.DesignTime/DefinitionCompiler.fs @@ -483,7 +483,8 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable, useDateOnly: b | _ when resolvedType = Some JsonSchemaType.Object && not(isNull schemaObj.AdditionalProperties) - -> // Dictionary -> + && (schemaObj.Properties |> isNull || schemaObj.Properties.Count = 0) + -> // Dictionary (only when no explicit properties are also defined) ns.ReleaseNameReservation tyName let elSchema = schemaObj.AdditionalProperties diff --git a/tests/SwaggerProvider.Tests/Schema.ArrayAndMapTypeMappingTests.fs b/tests/SwaggerProvider.Tests/Schema.ArrayAndMapTypeMappingTests.fs index 086c0ee4..1c960b9a 100644 --- a/tests/SwaggerProvider.Tests/Schema.ArrayAndMapTypeMappingTests.fs +++ b/tests/SwaggerProvider.Tests/Schema.ArrayAndMapTypeMappingTests.fs @@ -96,6 +96,41 @@ let ``additionalProperties boolean maps to Map``() = ty |> shouldEqual(typedefof>.MakeGenericType(typeof, typeof)) +// ── Object with both properties and additionalProperties is not a Map ───────── +// When a schema has explicit `properties` alongside `additionalProperties`, the +// type should be compiled as an object (preserving the declared properties), not +// silently reduced to a Map that discards them. + +[] +let ``object with properties and additionalProperties compiles to object type not Map``() = + let schemaStr = + """openapi: "3.0.0" +info: + title: MixedAdditionalPropsTest + version: "1.0.0" +paths: {} +components: + schemas: + TestType: + type: object + properties: + Value: + type: object + properties: + Name: + type: string + additionalProperties: + type: integer +""" + + let ty = compileSchemaAndGetValueType schemaStr + // Should be an object type (not a generic Map) + ty.IsGenericType |> shouldEqual false + + ty.GetProperties() + |> Array.exists(fun p -> p.Name = "Name") + |> shouldEqual true + // ── Array of $ref objects ───────────────────────────────────────────────────── []