Skip to content

Commit 950a13b

Browse files
committed
fix: Refactoring
1 parent d7c8c5c commit 950a13b

File tree

1 file changed

+45
-70
lines changed

1 file changed

+45
-70
lines changed

src/openapi/openapi3.schema.ts

Lines changed: 45 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,28 @@ import {
1616
transformCompareRules,
1717
} from '../core'
1818
import type { OpenApi3SchemaRulesOptions } from './openapi3.types'
19-
import { CompareRules, AdapterResolver } from '../types'
19+
import { AdapterResolver, CompareRules } from '../types'
2020
import {
21+
JSON_SCHEMA_NODE_TYPE_NULL,
22+
JSON_SCHEMA_PROPERTY_ANY_OF,
23+
JSON_SCHEMA_PROPERTY_NULLABLE,
24+
JSON_SCHEMA_PROPERTY_ONE_OF,
25+
JSON_SCHEMA_PROPERTY_TITLE,
26+
JSON_SCHEMA_PROPERTY_TYPE,
2127
JsonSchemaSpecVersion,
2228
normalize,
2329
type OpenApiSpecVersion,
2430
OriginsMetaRecord,
31+
setOrigins,
2532
SPEC_TYPE_JSON_SCHEMA_04,
2633
SPEC_TYPE_JSON_SCHEMA_07,
2734
SPEC_TYPE_OPEN_API_30,
2835
SPEC_TYPE_OPEN_API_31,
29-
JSON_SCHEMA_PROPERTY_NULLABLE,
30-
JSON_SCHEMA_PROPERTY_ANY_OF,
31-
JSON_SCHEMA_PROPERTY_ONE_OF,
32-
JSON_SCHEMA_PROPERTY_TYPE,
33-
JSON_SCHEMA_NODE_TYPE_NULL,
34-
setOrigins,
3536
} from '@netcracker/qubership-apihub-api-unifier'
3637
import { schemaParamsCalculator } from './openapi3.description.schema'
37-
import { isObject, isArray } from '../utils'
38+
import { isArray, isObject } from '../utils'
3839

40+
const NULL_TYPE_COMBINERS = [JSON_SCHEMA_PROPERTY_ANY_OF, JSON_SCHEMA_PROPERTY_ONE_OF] as const
3941
const SPEC_TYPE_TO_VERSION: Record<OpenApiSpecVersion, string> = {
4042
[SPEC_TYPE_OPEN_API_30]: '3.0.0',
4143
[SPEC_TYPE_OPEN_API_31]: '3.1.0',
@@ -69,96 +71,68 @@ const openApiJsonSchemaAnyFactory: (version: OpenApiSpecVersion) => NativeAnySch
6971
return normalizedSpec.components.schemas.empty as Record<PropertyKey, unknown>
7072
}
7173

72-
// Helper function to check if a schema has null type
7374
const hasNullType = (schema: unknown): boolean => {
74-
if (!isObject(schema)) return false
75-
76-
// Check direct type property
75+
if (!isObject(schema)) {
76+
return false
77+
}
78+
7779
const type = schema[JSON_SCHEMA_PROPERTY_TYPE]
78-
if (type === JSON_SCHEMA_NODE_TYPE_NULL) return true
79-
if (isArray(type) && type.includes(JSON_SCHEMA_NODE_TYPE_NULL)) return true
80-
81-
// Check in combiners (anyOf, oneOf)
82-
for (const combiner of [JSON_SCHEMA_PROPERTY_ANY_OF, JSON_SCHEMA_PROPERTY_ONE_OF] as const) {
83-
const combinerArray = schema[combiner]
84-
if (isArray(combinerArray)) {
85-
for (const item of combinerArray) {
86-
if (hasNullType(item)) return true
87-
}
88-
}
80+
if (type === JSON_SCHEMA_NODE_TYPE_NULL) {
81+
return true
82+
}
83+
84+
if (isArray(type) && type.includes(JSON_SCHEMA_NODE_TYPE_NULL)) {
85+
return true
8986
}
90-
91-
return false
92-
}
9387

94-
// Builds a "null" type schema carrying over relevant origins from source
95-
// const buildNullTypeWithOrigins = (
96-
// valueWithoutNullable: Record<PropertyKey, unknown>,
97-
// originsFlag: PropertyKey,
98-
// ): Record<PropertyKey, unknown> => {
99-
// const nullTypeObject: Record<PropertyKey, unknown> = {
100-
// [JSON_SCHEMA_PROPERTY_TYPE]: JSON_SCHEMA_NODE_TYPE_NULL,
101-
// }
102-
// const valueOrigins = valueWithoutNullable[originsFlag] as Record<PropertyKey, unknown> | undefined
103-
//
104-
// if (valueWithoutNullable.title) {
105-
// nullTypeObject.title = valueWithoutNullable.title
106-
// const titleOrigin = valueOrigins && (valueOrigins as Record<PropertyKey, unknown>).title
107-
// if (titleOrigin !== undefined) {
108-
// nullTypeObject[originsFlag] = { title: titleOrigin }
109-
// }
110-
// }
111-
//
112-
// const nullableOrigin = valueOrigins && (valueOrigins as Record<PropertyKey, unknown>).nullable
113-
// if (nullableOrigin !== undefined) {
114-
// const existing = (nullTypeObject[originsFlag] as Record<PropertyKey, unknown>) || {}
115-
// nullTypeObject[originsFlag] = { ...existing, nullable: nullableOrigin }
116-
// }
117-
//
118-
// return nullTypeObject
119-
// }
88+
return NULL_TYPE_COMBINERS.some((combiner) => {
89+
const variants = schema[combiner]
90+
return isArray(variants) && variants.some(hasNullType)
91+
})
92+
}
12093

12194
const buildNullTypeWithOrigins = (
12295
valueWithoutNullable: Record<PropertyKey, unknown>,
12396
originsFlag: PropertyKey,
124-
syntheticTitleFlag: PropertyKey
97+
syntheticTitleFlag: symbol | undefined,
12598
): Record<PropertyKey, unknown> => {
126-
const nullTypeObject: Record<PropertyKey, unknown> = {
99+
const nullableObject: Record<PropertyKey, unknown> = {
127100
[JSON_SCHEMA_PROPERTY_TYPE]: JSON_SCHEMA_NODE_TYPE_NULL,
128101
}
129102

130-
const valueOrigins = valueWithoutNullable[originsFlag] as Record<PropertyKey, unknown> | undefined
131103
const origins: Record<PropertyKey, unknown> = {}
104+
const valueOrigins = valueWithoutNullable[originsFlag] as Record<PropertyKey, unknown> | undefined
132105

133-
if (valueWithoutNullable.title) {
134-
nullTypeObject.title = valueWithoutNullable.title
135-
if (valueOrigins?.title !== undefined) {
136-
origins.title = valueOrigins.title
106+
const valueTitle = valueWithoutNullable[JSON_SCHEMA_PROPERTY_TITLE]
107+
if (valueTitle) {
108+
nullableObject[JSON_SCHEMA_PROPERTY_TITLE] = valueTitle
109+
if (valueOrigins && valueOrigins[JSON_SCHEMA_PROPERTY_TITLE] !== undefined) {
110+
origins[JSON_SCHEMA_PROPERTY_TITLE] = valueOrigins[JSON_SCHEMA_PROPERTY_TITLE]
137111
}
138112
}
139113

140-
if (valueOrigins?.nullable !== undefined) {
141-
142-
// origins.nullable = valueOrigins.nullable
114+
if (syntheticTitleFlag && valueWithoutNullable[syntheticTitleFlag]) {
115+
nullableObject[syntheticTitleFlag] = true
116+
}
143117

118+
if (valueOrigins && valueOrigins[JSON_SCHEMA_PROPERTY_NULLABLE] !== undefined) {
144119
const getOriginParent = (item: unknown) => ({
145120
value: JSON_SCHEMA_PROPERTY_TYPE,
146121
parent: (item as any)?.parent,
147122
})
148123

149-
origins[JSON_SCHEMA_PROPERTY_TYPE] = Array.isArray(valueOrigins.nullable)
124+
origins[JSON_SCHEMA_PROPERTY_TYPE] = isArray(valueOrigins.nullable)
150125
? valueOrigins.nullable.map(getOriginParent)
151126
: getOriginParent(valueOrigins.nullable)
152127
}
153128

154129
if (Object.keys(origins).length > 0) {
155-
nullTypeObject[originsFlag] = origins
130+
nullableObject[originsFlag] = origins
156131
}
157132

158-
return nullTypeObject
133+
return nullableObject
159134
}
160135

161-
// Adapter to transform JSON Schemas used in OpenAPI 3.0 schemas to JSON Schemas used in OpenAPI 3.1 for comparison
162136
const jsonSchemaOas30to31Adapter: AdapterResolver = (value, reference, ctx) => {
163137
if (!isObject(value) || !isObject(reference)) {
164138
return value
@@ -172,12 +146,13 @@ const jsonSchemaOas30to31Adapter: AdapterResolver = (value, reference, ctx) => {
172146
return value
173147
}
174148

175-
const originsFlag: PropertyKey = ctx.options.originsFlag
176-
// @ts-ignore
177-
const syntheticTitleFlag: PropertyKey = ctx.options.syntheticTitleFlag
149+
const { originsFlag, syntheticTitleFlag } = ctx.options
178150

179151
return ctx.transformer(value, 'nullable-to-anyof', (current) => {
180-
const { [JSON_SCHEMA_PROPERTY_NULLABLE]: _nullable, ...valueWithoutNullable } = current as Record<PropertyKey, unknown>
152+
const {
153+
[JSON_SCHEMA_PROPERTY_NULLABLE]: _nullable,
154+
...valueWithoutNullable
155+
} = current as Record<PropertyKey, unknown>
181156

182157
const nullTypeObject = buildNullTypeWithOrigins(valueWithoutNullable, originsFlag, syntheticTitleFlag)
183158

0 commit comments

Comments
 (0)