refactor: comments address

This commit is contained in:
Rishabh Agarwal
2022-05-17 15:24:36 +05:30
parent 6417ece710
commit 5233c36904
3 changed files with 69 additions and 91 deletions

View File

@@ -8,16 +8,16 @@ type PrimitiveSchemaType = "string" | "integer" | "number" | "boolean"
type SchemaType = "array" | "object" | PrimitiveSchemaType
type PrimitiveRequestBodyExampleType = number | string | boolean
type PrimitiveRequestBodyExample = number | string | boolean
type RequestBodyExampleType =
| { [name: string]: RequestBodyExampleType }
| Array<RequestBodyExampleType>
| PrimitiveRequestBodyExampleType
type RequestBodyExample =
| { [name: string]: RequestBodyExample }
| Array<RequestBodyExample>
| PrimitiveRequestBodyExample
const getPrimitiveTypePlaceholder = (
schemaType: PrimitiveSchemaType
): PrimitiveRequestBodyExampleType => {
): PrimitiveRequestBodyExample => {
switch (schemaType) {
case "string":
return "string"
@@ -54,11 +54,11 @@ const isSchemaTypeObject = (schemaType: string): schemaType is "object" =>
const getSampleEnumValueOrPlaceholder = (
schema: OpenAPIV2.SchemaObject
): RequestBodyExampleType =>
): RequestBodyExample =>
pipe(
schema.enum,
O.fromNullable,
O.map((enums) => enums[0] as RequestBodyExampleType),
O.map((enums) => enums[0] as RequestBodyExample),
O.altW(() =>
pipe(
schema,
@@ -72,7 +72,7 @@ const getSampleEnumValueOrPlaceholder = (
const generateExampleArrayFromOpenAPIV2ItemsObject = (
items: OpenAPIV2.ItemsObject
): RequestBodyExampleType =>
): RequestBodyExample =>
// ItemsObject can not hold type "object"
// https://swagger.io/specification/v2/#itemsObject
@@ -85,25 +85,26 @@ const generateExampleArrayFromOpenAPIV2ItemsObject = (
flow((items) => items.type as SchemaType, isSchemaTypePrimitive)
),
O.map(
flow(getSampleEnumValueOrPlaceholder, (arrayItem) =>
Array.of(arrayItem, arrayItem)
)
flow(getSampleEnumValueOrPlaceholder, (arrayItem) => [
arrayItem,
arrayItem,
])
),
O.getOrElse(() =>
// If the type is not primitive, it is "array"
// items property is required if type is array
Array.of(
[
generateExampleArrayFromOpenAPIV2ItemsObject(
items.items as OpenAPIV2.ItemsObject
)
)
),
]
)
)
const generateRequestBodyExampleFromOpenAPIV2BodySchema = (
schema: OpenAPIV2.SchemaObject
): RequestBodyExampleType => {
if (schema.example) return schema.example as RequestBodyExampleType
): RequestBodyExample => {
if (schema.example) return schema.example as RequestBodyExample
const primitiveTypeExample = pipe(
schema,
@@ -155,7 +156,7 @@ const generateRequestBodyExampleFromOpenAPIV2BodySchema = (
),
O.getOrElseW(() => [] as [string, OpenAPIV2.SchemaObject][]),
A.reduce(
{} as { [name: string]: RequestBodyExampleType },
{} as { [name: string]: RequestBodyExample },
(aggregatedExample, property) => {
const example = generateRequestBodyExampleFromOpenAPIV2BodySchema(
property[1]
@@ -179,10 +180,6 @@ export const generateRequestBodyExampleFromOpenAPIV2Body = (
generateRequestBodyExampleFromOpenAPIV2BodySchema
)
),
O.getOrElse(() => "" as RequestBodyExampleType),
(requestBodyExample) =>
pipe(
prettyPrintJSON(requestBodyExample),
O.getOrElse(() => "")
)
O.chain(prettyPrintJSON),
O.getOrElse(() => "")
)

View File

@@ -1,7 +1,7 @@
import { OpenAPIV3 } from "openapi-types"
import { pipe } from "fp-ts/function"
import * as A from "fp-ts/Array"
import * as O from "fp-ts/Option"
import { tupleToRecord } from "~/helpers/functional/record"
type SchemaType =
| OpenAPIV3.ArraySchemaObjectType
@@ -9,12 +9,12 @@ type SchemaType =
type PrimitiveSchemaType = Exclude<SchemaType, "array" | "object">
type PrimitiveRequestBodyExampleType = string | number | boolean | null
type PrimitiveRequestBodyExample = string | number | boolean | null
type RequestBodyExampleType =
| PrimitiveRequestBodyExampleType
| Array<RequestBodyExampleType>
| { [name: string]: RequestBodyExampleType }
type RequestBodyExample =
| PrimitiveRequestBodyExample
| Array<RequestBodyExample>
| { [name: string]: RequestBodyExample }
const isSchemaTypePrimitive = (
schemaType: SchemaType
@@ -23,7 +23,7 @@ const isSchemaTypePrimitive = (
const getPrimitiveTypePlaceholder = (
primitiveType: PrimitiveSchemaType
): PrimitiveRequestBodyExampleType => {
): PrimitiveRequestBodyExample => {
switch (primitiveType) {
case "number":
return 0.0
@@ -40,46 +40,34 @@ const getPrimitiveTypePlaceholder = (
// TODO(agarwal): Use Enum values, if any
const generatePrimitiveRequestBodyExample = (
schemaObject: OpenAPIV3.NonArraySchemaObject
): RequestBodyExampleType =>
): RequestBodyExample =>
getPrimitiveTypePlaceholder(schemaObject.type as PrimitiveSchemaType)
// Use carefully, call only when type is object
const generateObjectRequestBodyExample = (
schemaObject: OpenAPIV3.NonArraySchemaObject
): RequestBodyExampleType =>
): RequestBodyExample =>
pipe(
schemaObject.properties,
O.fromNullable,
O.map(
(properties) =>
Object.entries(properties) as [string, OpenAPIV3.SchemaObject][]
),
O.map(Object.entries),
O.getOrElseW(() => [] as [string, OpenAPIV3.SchemaObject][]),
A.reduce(
{} as { [name: string]: RequestBodyExampleType },
(aggregatedExample, property) => {
aggregatedExample[property[0]] =
generateRequestBodyExampleFromSchemaObject(property[1])
return aggregatedExample
}
)
tupleToRecord
)
const generateArrayRequestBodyExample = (
schemaObject: OpenAPIV3.ArraySchemaObject
): RequestBodyExampleType =>
Array.of(
generateRequestBodyExampleFromSchemaObject(
schemaObject.items as OpenAPIV3.SchemaObject
)
)
): RequestBodyExample => [
generateRequestBodyExampleFromSchemaObject(
schemaObject.items as OpenAPIV3.SchemaObject
),
]
const generateRequestBodyExampleFromSchemaObject = (
schemaObject: OpenAPIV3.SchemaObject
): RequestBodyExampleType => {
): RequestBodyExample => {
// TODO: Handle schema objects with allof
if (schemaObject.example)
return schemaObject.example as RequestBodyExampleType
if (schemaObject.example) return schemaObject.example as RequestBodyExample
// If request body can be oneof or allof several schema, choose the first schema to generate an example
if (schemaObject.oneOf)
@@ -110,10 +98,9 @@ const generateRequestBodyExampleFromSchemaObject = (
export const generateRequestBodyExampleFromMediaObject = (
mediaObject: OpenAPIV3.MediaTypeObject
): RequestBodyExampleType => {
if (mediaObject.example) return mediaObject.example as RequestBodyExampleType
if (mediaObject.examples)
return mediaObject.examples[0] as RequestBodyExampleType
): RequestBodyExample => {
if (mediaObject.example) return mediaObject.example as RequestBodyExample
if (mediaObject.examples) return mediaObject.examples[0] as RequestBodyExample
return mediaObject.schema
? generateRequestBodyExampleFromSchemaObject(
mediaObject.schema as OpenAPIV3.SchemaObject

View File

@@ -18,12 +18,12 @@ type PrimitiveSchemaType = Exclude<
"object"
>
type PrimitiveRequestBodyExampleType = string | number | boolean | null
type PrimitiveRequestBodyExample = string | number | boolean | null
type RequestBodyExampleType =
| PrimitiveRequestBodyExampleType
| Array<RequestBodyExampleType>
| { [name: string]: RequestBodyExampleType }
type RequestBodyExample =
| PrimitiveRequestBodyExample
| Array<RequestBodyExample>
| { [name: string]: RequestBodyExample }
const isSchemaTypePrimitive = (
schemaType: SchemaType
@@ -32,7 +32,7 @@ const isSchemaTypePrimitive = (
const getPrimitiveTypePlaceholder = (
primitiveType: PrimitiveSchemaType
): PrimitiveRequestBodyExampleType => {
): PrimitiveRequestBodyExample => {
switch (primitiveType) {
case "number":
return 0.0
@@ -50,13 +50,13 @@ const getPrimitiveTypePlaceholder = (
// TODO(agarwal): Use Enum values, if any
const generatePrimitiveRequestBodyExample = (
schemaObject: OpenAPIV31.NonArraySchemaObject
): RequestBodyExampleType =>
): RequestBodyExample =>
getPrimitiveTypePlaceholder(schemaObject.type as PrimitiveSchemaType)
// Use carefully, the schema type should necessarily be object
const generateObjectRequestBodyExample = (
schemaObject: OpenAPIV31.NonArraySchemaObject
): RequestBodyExampleType =>
): RequestBodyExample =>
pipe(
schemaObject.properties,
O.fromNullable,
@@ -66,7 +66,7 @@ const generateObjectRequestBodyExample = (
),
O.getOrElseW(() => [] as [string, OpenAPIV31.SchemaObject][]),
A.reduce(
{} as { [name: string]: RequestBodyExampleType },
{} as { [name: string]: RequestBodyExample },
(aggregatedExample, property) => {
aggregatedExample[property[0]] =
generateRequestBodyExampleFromSchemaObject(property[1])
@@ -78,39 +78,34 @@ const generateObjectRequestBodyExample = (
// Use carefully, the schema type should necessarily be mixed array
const generateMixedArrayRequestBodyEcample = (
schemaObject: OpenAPIV31.SchemaObject
): RequestBodyExampleType =>
): RequestBodyExample =>
pipe(
schemaObject,
(schemaObject) => schemaObject.type as MixedArraySchemaType,
A.reduce(
[] as Array<RequestBodyExampleType>,
(aggregatedExample, itemType) => {
// TODO: Figure out how to include non-primitive types as well
if (isSchemaTypePrimitive(itemType)) {
aggregatedExample.push(getPrimitiveTypePlaceholder(itemType))
}
return aggregatedExample
A.reduce([] as Array<RequestBodyExample>, (aggregatedExample, itemType) => {
// TODO: Figure out how to include non-primitive types as well
if (isSchemaTypePrimitive(itemType)) {
aggregatedExample.push(getPrimitiveTypePlaceholder(itemType))
}
)
return aggregatedExample
})
)
const generateArrayRequestBodyExample = (
schemaObject: OpenAPIV31.ArraySchemaObject
): RequestBodyExampleType =>
Array.of(
generateRequestBodyExampleFromSchemaObject(
schemaObject.items as OpenAPIV31.SchemaObject
)
)
): RequestBodyExample => [
generateRequestBodyExampleFromSchemaObject(
schemaObject.items as OpenAPIV31.SchemaObject
),
]
const generateRequestBodyExampleFromSchemaObject = (
schemaObject: OpenAPIV31.SchemaObject
): RequestBodyExampleType => {
): RequestBodyExample => {
// TODO: Handle schema objects with oneof or anyof
if (schemaObject.example)
return schemaObject.example as RequestBodyExampleType
if (schemaObject.example) return schemaObject.example as RequestBodyExample
if (schemaObject.examples)
return schemaObject.examples[0] as RequestBodyExampleType
return schemaObject.examples[0] as RequestBodyExample
if (!schemaObject.type) return ""
if (isSchemaTypePrimitive(schemaObject.type))
return generatePrimitiveRequestBodyExample(
@@ -125,10 +120,9 @@ const generateRequestBodyExampleFromSchemaObject = (
export const generateRequestBodyExampleFromMediaObject = (
mediaObject: OpenAPIV31.MediaTypeObject
): RequestBodyExampleType => {
if (mediaObject.example) return mediaObject.example as RequestBodyExampleType
if (mediaObject.examples)
return mediaObject.examples[0] as RequestBodyExampleType
): RequestBodyExample => {
if (mediaObject.example) return mediaObject.example as RequestBodyExample
if (mediaObject.examples) return mediaObject.examples[0] as RequestBodyExample
return mediaObject.schema
? generateRequestBodyExampleFromSchemaObject(mediaObject.schema)
: ""