Skip to content

Commit 0cb71db

Browse files
Render array props of discriminated objects
1 parent c4affc9 commit 0cb71db

2 files changed

Lines changed: 54 additions & 1 deletion

File tree

src/layouts/partials/api-resource.hbs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,33 @@ This object has no properties.
4848
{{/each}}
4949
{{/if}}
5050
{{/unless}}
51-
{{#if listProperties}}
51+
{{#if discriminatorVariants}}
52+
{{#if discriminatorVariants.length}}
53+
54+
The items in this list are objects. The specific structure of each object depends on the value of its `{{discriminator}}` field. Each object will be one of the following variants:
55+
{% tabs %}
56+
{{#each discriminatorVariants}}
57+
{% tab title="{{this.name}}" %}
58+
{{#if this.description}}
59+
60+
{{this.description}}
61+
{{/if}}
62+
{{#if this.properties.length}}
63+
64+
Variant Properties:
65+
{{#each this.properties}}
66+
67+
{{> property-collapsible this}}
68+
{{/each}}
69+
{{else}}
70+
71+
This variant has no additional specific properties.
72+
{{/if}}
73+
{% endtab %}
74+
{{/each}}
75+
{% endtabs %}
76+
{{/if}}
77+
{{else if listProperties}}
5278
{{#each listProperties}}
5379

5480
{{> property-collapsible this}}

src/lib/layout/api-route.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ type ApiRouteProperty = Pick<
4141
listItemFormat?: string
4242
linkTarget?: string
4343
value?: string
44+
discriminator?: string
45+
discriminatorVariants?: Array<{
46+
name: string
47+
description: string
48+
properties: ApiRouteProperty[]
49+
}>
4450
}
4551

4652
export interface ApiRouteResource {
@@ -250,6 +256,27 @@ export const mapBlueprintPropertyToRouteProperty = (
250256
contextRouteProp.listItemFormat = normalizePropertyFormatForDocs(
251257
prop.itemFormat,
252258
)
259+
260+
if (prop.itemFormat === 'discriminated_object') {
261+
const discriminatedListProp = prop
262+
contextRouteProp.discriminator = discriminatedListProp.discriminator
263+
contextRouteProp.discriminatorVariants =
264+
discriminatedListProp.variants.map((variant) => {
265+
const discriminatorProperty = variant.properties.find(
266+
(p) => p.name === discriminatedListProp.discriminator,
267+
)
268+
const variantName =
269+
(discriminatorProperty as EnumProperty)?.values?.[0]?.name ??
270+
'unknown_variant'
271+
return {
272+
name: variantName,
273+
description: variant.description,
274+
properties: variant.properties
275+
.filter((p) => !p.isUndocumented)
276+
.map(mapBlueprintPropertyToRouteProperty),
277+
}
278+
})
279+
}
253280
}
254281

255282
return contextRouteProp

0 commit comments

Comments
 (0)