From 1eae3013bc8ed1f8ef032a5d8278c48e5aa3f5d4 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 23 Jan 2026 12:55:36 +0000
Subject: [PATCH 1/6] Initial plan
From 8354f62ee7e9baca01a22dbe363c7ee8a2337022 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 23 Jan 2026 13:15:36 +0000
Subject: [PATCH 2/6] Fix nullable date deserialization by checking
JsonSchemaType.Null flag
Co-authored-by: sergey-tihon <1197905+sergey-tihon@users.noreply.github.com>
---
.../v3/DefinitionCompiler.fs | 6 +++-
.../Schemas/v3/nullable-date.yaml | 31 +++++++++++++++++++
.../SwaggerProvider.ProviderTests.fsproj | 1 +
.../TestNullableDate.fsx | 20 ++++++++++++
.../v3/Swagger.NullableDate.Tests.fs | 27 ++++++++++++++++
5 files changed, 84 insertions(+), 1 deletion(-)
create mode 100644 tests/SwaggerProvider.ProviderTests/Schemas/v3/nullable-date.yaml
create mode 100644 tests/SwaggerProvider.ProviderTests/TestNullableDate.fsx
create mode 100644 tests/SwaggerProvider.ProviderTests/v3/Swagger.NullableDate.Tests.fs
diff --git a/src/SwaggerProvider.DesignTime/v3/DefinitionCompiler.fs b/src/SwaggerProvider.DesignTime/v3/DefinitionCompiler.fs
index 573d05f..4e01a3e 100644
--- a/src/SwaggerProvider.DesignTime/v3/DefinitionCompiler.fs
+++ b/src/SwaggerProvider.DesignTime/v3/DefinitionCompiler.fs
@@ -279,7 +279,11 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable) as this =
if String.IsNullOrEmpty propName then
failwithf $"Property cannot be created with empty name. TypeName:%A{tyName}; SchemaObj:%A{schemaObj}"
- let isRequired = schemaObjRequired.Contains propName
+ // Check if the property is nullable (OpenAPI 3.0 nullable becomes Null type flag in 3.1)
+ let isNullable =
+ propSchema.Type.HasValue && propSchema.Type.Value.HasFlag(JsonSchemaType.Null)
+
+ let isRequired = schemaObjRequired.Contains propName && not isNullable
let pTy =
compileBySchema ns (ns.ReserveUniqueName tyName (nicePascalName propName)) propSchema isRequired ns.RegisterType false
diff --git a/tests/SwaggerProvider.ProviderTests/Schemas/v3/nullable-date.yaml b/tests/SwaggerProvider.ProviderTests/Schemas/v3/nullable-date.yaml
new file mode 100644
index 0000000..8a010a5
--- /dev/null
+++ b/tests/SwaggerProvider.ProviderTests/Schemas/v3/nullable-date.yaml
@@ -0,0 +1,31 @@
+openapi: 3.0.0
+info:
+ title: Nullable Date Test API
+ version: 1.0.0
+paths:
+ /test:
+ get:
+ operationId: getTest
+ responses:
+ '200':
+ description: Success
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PersonDto'
+components:
+ schemas:
+ PersonDto:
+ type: object
+ required:
+ - id
+ - name
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ birthDate:
+ type: string
+ format: date
+ nullable: true
diff --git a/tests/SwaggerProvider.ProviderTests/SwaggerProvider.ProviderTests.fsproj b/tests/SwaggerProvider.ProviderTests/SwaggerProvider.ProviderTests.fsproj
index d221006..b33f456 100644
--- a/tests/SwaggerProvider.ProviderTests/SwaggerProvider.ProviderTests.fsproj
+++ b/tests/SwaggerProvider.ProviderTests/SwaggerProvider.ProviderTests.fsproj
@@ -26,6 +26,7 @@
+
diff --git a/tests/SwaggerProvider.ProviderTests/TestNullableDate.fsx b/tests/SwaggerProvider.ProviderTests/TestNullableDate.fsx
new file mode 100644
index 0000000..45bbf6e
--- /dev/null
+++ b/tests/SwaggerProvider.ProviderTests/TestNullableDate.fsx
@@ -0,0 +1,20 @@
+#r "nuget: SwaggerProvider"
+open SwaggerProvider
+
+[]
+let Schema = __SOURCE_DIRECTORY__ + "/Schemas/v3/nullable-date.yaml"
+
+type TestApi = OpenApiClientProvider
+
+// Check the type of BirthDate property
+let personType = typeof
+let birthDateProp = personType.GetProperty("BirthDate")
+
+printfn "BirthDate property type: %A" birthDateProp.PropertyType
+printfn "Is generic: %b" birthDateProp.PropertyType.IsGenericType
+
+if birthDateProp.PropertyType.IsGenericType then
+ let genericTypeDef = birthDateProp.PropertyType.GetGenericTypeDefinition()
+ printfn "Generic type definition: %A" genericTypeDef
+ printfn "Is Option: %b" (genericTypeDef = typedefof