@@ -16,6 +16,35 @@ import type {
16
16
SchemaObjectDereferenced ,
17
17
} from "./dereferencedOpenApiv3.js" ;
18
18
19
+ /**
20
+ * Assigns relationships between resources based on their fields.
21
+ * Sets the field's `embedded` or `reference` property depending on its type.
22
+ *
23
+ * @param resources - Array of Resource objects to process.
24
+ * @returns The same array of resources with relationships assigned.
25
+ */
26
+ function assignResourceRelationships ( resources : Resource [ ] ) {
27
+ for ( const resource of resources ) {
28
+ for ( const field of resource . fields ?? [ ] ) {
29
+ const name = camelize ( field . name ) . replace ( / I d s ? $ / , "" ) ;
30
+
31
+ const guessedResource = resources . find (
32
+ ( res ) => res . title === classify ( name ) ,
33
+ ) ;
34
+ if ( ! guessedResource ) {
35
+ continue ;
36
+ }
37
+ field . maxCardinality = field . type === "array" ? null : 1 ;
38
+ if ( field . type === "object" || field . arrayType === "object" ) {
39
+ field . embedded = guessedResource ;
40
+ } else {
41
+ field . reference = guessedResource ;
42
+ }
43
+ }
44
+ }
45
+ return resources ;
46
+ }
47
+
19
48
function mergeResources ( resourceA : Resource , resourceB : Resource ) {
20
49
for ( const fieldB of resourceB . fields ?? [ ] ) {
21
50
if ( ! resourceA . fields ?. some ( ( fieldA ) => fieldA . name === fieldB . name ) ) {
@@ -154,8 +183,14 @@ export default async function handleJson(
154
183
155
184
const title = classify ( baseName ) ;
156
185
157
- const showOperation = pathItem . get ;
158
- const editOperation = pathItem . put || pathItem . patch ;
186
+ const {
187
+ get : showOperation ,
188
+ put : putOperation ,
189
+ patch : patchOperation ,
190
+ delete : deleteOperation ,
191
+ } = pathItem ;
192
+
193
+ const editOperation = putOperation || patchOperation ;
159
194
if ( ! showOperation && ! editOperation ) {
160
195
continue ;
161
196
}
@@ -184,14 +219,8 @@ export default async function handleJson(
184
219
resource = mergeResources ( showResource , editResource ) ;
185
220
}
186
221
187
- const {
188
- put : putOperation ,
189
- patch : patchOperation ,
190
- delete : deleteOperation ,
191
- } = pathItem ;
192
222
const pathCollection = document . paths [ `/${ name } ` ] ;
193
- const listOperation = pathCollection && pathCollection . get ;
194
- const createOperation = pathCollection && pathCollection . post ;
223
+ const { get : listOperation , post : createOperation } = pathCollection ?? { } ;
195
224
196
225
resource . operations = [
197
226
...( showOperation
@@ -214,7 +243,7 @@ export default async function handleJson(
214
243
: [ ] ) ,
215
244
] ;
216
245
217
- if ( listOperation && listOperation . parameters ) {
246
+ if ( listOperation ? .parameters ) {
218
247
resource . parameters = listOperation . parameters . map (
219
248
( parameter ) =>
220
249
new Parameter (
@@ -230,25 +259,5 @@ export default async function handleJson(
230
259
resources . push ( resource ) ;
231
260
}
232
261
233
- // Guess embeddeds and references from property names
234
- for ( const resource of resources ) {
235
- for ( const field of resource . fields ?? [ ] ) {
236
- const name = camelize ( field . name ) . replace ( / I d s ? $ / , "" ) ;
237
-
238
- const guessedResource = resources . find (
239
- ( res ) => res . title === classify ( name ) ,
240
- ) ;
241
- if ( ! guessedResource ) {
242
- continue ;
243
- }
244
- field . maxCardinality = field . type === "array" ? null : 1 ;
245
- if ( field . type === "object" || field . arrayType === "object" ) {
246
- field . embedded = guessedResource ;
247
- } else {
248
- field . reference = guessedResource ;
249
- }
250
- }
251
- }
252
-
253
- return resources ;
262
+ return assignResourceRelationships ( resources ) ;
254
263
}
0 commit comments