Open
Description
It’s basically two issues in one: the inability to parse the openapi v3 schema from https://cloud.squidex.io/ (a very nice .net CMS by the way)
Here I provide a script which reproduces the issues, see the comment./
For the nullable named property, re-serializing the schema with Microsoft.OpenApi is a workaround (hence the outputSchemaV3
function to do that.
Anyway, “subcomponent” schema (subschema?) are not parsed or correctly taken into account, see the last comment.
convertedcomponent-schema.json
nullablepropertyandcomponent-schema.json
converted-schema.json
nullableproperty-schema.json
#r "nuget: Microsoft.OpenApi.Readers"
#r "nuget: Microsoft.OpenApi"
open Microsoft.OpenApi.Readers
open Microsoft.OpenApi.Writers
open System.IO
let outputSchemaV3 origin converted =
let convertedPath = __SOURCE_DIRECTORY__ + "/" + converted
use convertedStream = File.Create(convertedPath)
use streamWriter = new StreamWriter(convertedStream)
let jsonWriter = new OpenApiJsonWriter(streamWriter)
let openApiDocumentReader = new OpenApiStreamReader()
let oriiginPath = __SOURCE_DIRECTORY__ + "/" + origin
use readerStream = File.OpenRead(oriiginPath)
readerStream |> openApiDocumentReader.Read |> fst |> _.SerializeAsV3(jsonWriter)
streamWriter.Flush() // Ensure all data is written to the file
outputSchemaV3 "nullableproperty-schema.json" "converted-schema.json"
outputSchemaV3 "nullablepropertyandcomponent-schema.json" "convertedcomponent-schema.json"
#r "nuget: SwaggerProvider"
open SwaggerProvider
[<Literal>]
let schemaPath = __SOURCE_DIRECTORY__ + "/nullableproperty-schema.json"
[<Literal>]
let convertedSchemaPath = __SOURCE_DIRECTORY__ + "/converted-schema.json"
[<Literal>]
let convertedComponentSchemaPath =
__SOURCE_DIRECTORY__ + "/convertedcomponent-schema.json"
// type BlogApi = OpenApiClientProvider<schemaPath>
// The type provider 'SwaggerProvider.OpenApiClientTypeProvider' reported an error: Schema parse errors:
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/post/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/patch/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}/delete/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1validity/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1defaults/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1pages~1{id}~1status/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/post/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/patch/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}/delete/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1{version}/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1validity/get/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1defaults/put/parameters @
// nullable is not a valid property at #/paths/~1api~1content~1fradav-blog~1posts~1{id}~1status/put/parameters @
type BlogApi = OpenApiClientProvider<convertedSchemaPath>
let page = BlogApi.PagesContentDto()
page.Data <- BlogApi.PagesDataDto()
page.Data.Title <- Map [ "iv", "Hello, world!" ]
// OK
type BlogApiComponent = OpenApiClientProvider<convertedComponentSchemaPath>
let alternativeTitleComponent =
BlogApiComponent.PagesDataDto_AlternativeTitle_Item()
// alternativeTitleComponent.Title <- Map [ "iv", "Hello, world!" ] // Not OK, Title should be a property of the component
Metadata
Metadata
Assignees
Labels
No labels