@@ -16,6 +16,35 @@ import type {
1616 SchemaObjectDereferenced ,
1717} from "./dereferencedOpenApiv3.js" ;
1818
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+
1948function mergeResources ( resourceA : Resource , resourceB : Resource ) {
2049 for ( const fieldB of resourceB . fields ?? [ ] ) {
2150 if ( ! resourceA . fields ?. some ( ( fieldA ) => fieldA . name === fieldB . name ) ) {
@@ -154,8 +183,14 @@ export default async function handleJson(
154183
155184 const title = classify ( baseName ) ;
156185
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 ;
159194 if ( ! showOperation && ! editOperation ) {
160195 continue ;
161196 }
@@ -184,14 +219,8 @@ export default async function handleJson(
184219 resource = mergeResources ( showResource , editResource ) ;
185220 }
186221
187- const {
188- put : putOperation ,
189- patch : patchOperation ,
190- delete : deleteOperation ,
191- } = pathItem ;
192222 const pathCollection = document . paths [ `/${ name } ` ] ;
193- const listOperation = pathCollection && pathCollection . get ;
194- const createOperation = pathCollection && pathCollection . post ;
223+ const { get : listOperation , post : createOperation } = pathCollection ?? { } ;
195224
196225 resource . operations = [
197226 ...( showOperation
@@ -214,7 +243,7 @@ export default async function handleJson(
214243 : [ ] ) ,
215244 ] ;
216245
217- if ( listOperation && listOperation . parameters ) {
246+ if ( listOperation ? .parameters ) {
218247 resource . parameters = listOperation . parameters . map (
219248 ( parameter ) =>
220249 new Parameter (
@@ -230,25 +259,5 @@ export default async function handleJson(
230259 resources . push ( resource ) ;
231260 }
232261
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 ) ;
254263}
0 commit comments