Skip to content

Commit 159918a

Browse files
committed
feat: Added factory and origins
1 parent 950a13b commit 159918a

File tree

1 file changed

+43
-37
lines changed

1 file changed

+43
-37
lines changed

src/openapi/openapi3.schema.ts

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ import {
1616
transformCompareRules,
1717
} from '../core'
1818
import type { OpenApi3SchemaRulesOptions } from './openapi3.types'
19-
import { AdapterResolver, CompareRules } from '../types'
19+
import { AdapterContext, AdapterResolver, CompareRules } from '../types'
2020
import {
21+
cleanOrigins,
2122
JSON_SCHEMA_NODE_TYPE_NULL,
2223
JSON_SCHEMA_PROPERTY_ANY_OF,
2324
JSON_SCHEMA_PROPERTY_NULLABLE,
@@ -93,47 +94,50 @@ const hasNullType = (schema: unknown): boolean => {
9394

9495
const buildNullTypeWithOrigins = (
9596
valueWithoutNullable: Record<PropertyKey, unknown>,
96-
originsFlag: PropertyKey,
97-
syntheticTitleFlag: symbol | undefined,
97+
context: AdapterContext<unknown>,
98+
factory: NativeAnySchemaFactory,
9899
): Record<PropertyKey, unknown> => {
99-
const nullableObject: Record<PropertyKey, unknown> = {
100-
[JSON_SCHEMA_PROPERTY_TYPE]: JSON_SCHEMA_NODE_TYPE_NULL,
101-
}
102-
103-
const origins: Record<PropertyKey, unknown> = {}
104-
const valueOrigins = valueWithoutNullable[originsFlag] as Record<PropertyKey, unknown> | undefined
100+
const { options, valueOrigins } = context
101+
const { originsFlag, syntheticTitleFlag } = options
105102

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]
111-
}
112-
}
103+
const nullableObject = factory(
104+
{ [JSON_SCHEMA_PROPERTY_TYPE]: JSON_SCHEMA_NODE_TYPE_NULL },
105+
valueOrigins,
106+
options,
107+
)
113108

114-
if (syntheticTitleFlag && valueWithoutNullable[syntheticTitleFlag]) {
115-
nullableObject[syntheticTitleFlag] = true
116-
}
109+
const inputOrigins = valueWithoutNullable[originsFlag] as Record<PropertyKey, unknown> | undefined
110+
const nullOrigins = nullableObject[originsFlag] as Record<PropertyKey, unknown> | undefined ?? {}
117111

118-
if (valueOrigins && valueOrigins[JSON_SCHEMA_PROPERTY_NULLABLE] !== undefined) {
112+
if (inputOrigins && inputOrigins.nullable) {
119113
const getOriginParent = (item: unknown) => ({
120114
value: JSON_SCHEMA_PROPERTY_TYPE,
121115
parent: (item as any)?.parent,
122116
})
123117

124-
origins[JSON_SCHEMA_PROPERTY_TYPE] = isArray(valueOrigins.nullable)
125-
? valueOrigins.nullable.map(getOriginParent)
126-
: getOriginParent(valueOrigins.nullable)
118+
nullOrigins[JSON_SCHEMA_PROPERTY_TYPE] = isArray(inputOrigins.nullable)
119+
? inputOrigins.nullable.map(getOriginParent)
120+
: getOriginParent(inputOrigins.nullable)
127121
}
128122

129-
if (Object.keys(origins).length > 0) {
130-
nullableObject[originsFlag] = origins
123+
const valueTitle = valueWithoutNullable[JSON_SCHEMA_PROPERTY_TITLE]
124+
if (valueTitle) {
125+
nullableObject[JSON_SCHEMA_PROPERTY_TITLE] = valueTitle
126+
127+
const titleOrigins = inputOrigins && inputOrigins[JSON_SCHEMA_PROPERTY_TITLE]
128+
if (titleOrigins) {
129+
nullOrigins[JSON_SCHEMA_PROPERTY_TITLE] = titleOrigins
130+
}
131+
}
132+
133+
if (syntheticTitleFlag && valueWithoutNullable[syntheticTitleFlag]) {
134+
nullableObject[syntheticTitleFlag] = true
131135
}
132136

133137
return nullableObject
134138
}
135139

136-
const jsonSchemaOas30to31Adapter: AdapterResolver = (value, reference, ctx) => {
140+
const jsonSchemaOas30to31Adapter: (factory: NativeAnySchemaFactory) => AdapterResolver = (factory) => (value, reference, valueContext) => {
137141
if (!isObject(value) || !isObject(reference)) {
138142
return value
139143
}
@@ -146,23 +150,25 @@ const jsonSchemaOas30to31Adapter: AdapterResolver = (value, reference, ctx) => {
146150
return value
147151
}
148152

149-
const { originsFlag, syntheticTitleFlag } = ctx.options
153+
const { originsFlag } = valueContext.options
150154

151-
return ctx.transformer(value, 'nullable-to-anyof', (current) => {
155+
return valueContext.transformer(value, 'nullable-to-anyof', (current) => {
152156
const {
153157
[JSON_SCHEMA_PROPERTY_NULLABLE]: _nullable,
154158
...valueWithoutNullable
155159
} = current as Record<PropertyKey, unknown>
156160

157-
const nullTypeObject = buildNullTypeWithOrigins(valueWithoutNullable, originsFlag, syntheticTitleFlag)
161+
const nullTypeObject = buildNullTypeWithOrigins(valueWithoutNullable, valueContext, factory)
162+
163+
cleanOrigins(valueWithoutNullable, JSON_SCHEMA_PROPERTY_NULLABLE, originsFlag)
158164

159165
const anyOfArray = [valueWithoutNullable, nullTypeObject]
160166

161167
const result: Record<PropertyKey, unknown> = { [JSON_SCHEMA_PROPERTY_ANY_OF]: anyOfArray }
162168

163-
setOrigins(result, JSON_SCHEMA_PROPERTY_ANY_OF, originsFlag, ctx.valueOrigins)
164-
setOrigins(anyOfArray, 0, originsFlag, ctx.valueOrigins)
165-
setOrigins(anyOfArray, 1, originsFlag, ctx.valueOrigins)
169+
setOrigins(result, JSON_SCHEMA_PROPERTY_ANY_OF, originsFlag, valueContext.valueOrigins)
170+
setOrigins(anyOfArray, 0, originsFlag, valueContext.valueOrigins)
171+
setOrigins(anyOfArray, 1, originsFlag, valueContext.valueOrigins)
166172

167173
return result
168174
})
@@ -175,7 +181,7 @@ export const openApiSchemaRules = (options: OpenApi3SchemaRulesOptions): Compare
175181
const schemaRules = jsonSchemaRules({
176182
additionalRules: {
177183
adapter: [
178-
...(options.version === SPEC_TYPE_OPEN_API_31 ? [jsonSchemaOas30to31Adapter] : []),
184+
...(options.version === SPEC_TYPE_OPEN_API_31 ? [jsonSchemaOas30to31Adapter(openApiJsonSchemaAnyFactory(options.version))] : []),
179185
jsonSchemaAdapter(openApiJsonSchemaAnyFactory(options.version)),
180186
],
181187
descriptionParamCalculator: schemaParamsCalculator,
@@ -190,7 +196,7 @@ export const openApiSchemaRules = (options: OpenApi3SchemaRulesOptions): Compare
190196
nonBreaking,
191197
({ after }) => breakingIf(!!after.value),
192198
],
193-
description: diffDescription(resolveSchemaDescriptionTemplates('nullable status'))
199+
description: diffDescription(resolveSchemaDescriptionTemplates('nullable status')),
194200
},
195201
'/discriminator': { $: allUnclassified },
196202
'/example': { $: allAnnotation, description: diffDescription(resolveSchemaDescriptionTemplates('example')) },
@@ -199,15 +205,15 @@ export const openApiSchemaRules = (options: OpenApi3SchemaRulesOptions): Compare
199205
description: diffDescription(resolveSchemaDescriptionTemplates('externalDocs')),
200206
'/description': {
201207
$: allAnnotation,
202-
description: diffDescription(resolveSchemaDescriptionTemplates('description of externalDocs'))
208+
description: diffDescription(resolveSchemaDescriptionTemplates('description of externalDocs')),
203209
},
204210
'/url': {
205211
$: allAnnotation,
206-
description: diffDescription(resolveSchemaDescriptionTemplates('url of externalDocs'))
212+
description: diffDescription(resolveSchemaDescriptionTemplates('url of externalDocs')),
207213
},
208214
'/*': {
209215
$: allAnnotation,
210-
description: diffDescription(resolveSchemaDescriptionTemplates('externalDocs'))
216+
description: diffDescription(resolveSchemaDescriptionTemplates('externalDocs')),
211217
},
212218
},
213219
'/xml': {},

0 commit comments

Comments
 (0)