Skip to content

Commit

Permalink
feat: Parse annotated enums (#146)
Browse files Browse the repository at this point in the history
Co-authored-by: Seam Bot <seambot@getseam.com>
  • Loading branch information
andrii-balitskyi and seambot authored Jan 14, 2025
1 parent 962602b commit f302ac0
Show file tree
Hide file tree
Showing 8 changed files with 5,018 additions and 23 deletions.
44 changes: 37 additions & 7 deletions src/lib/blueprint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,9 +239,7 @@ interface EnumProperty extends BaseProperty {
values: EnumValue[]
}

interface EnumValue {
name: string
}
type EnumValue = BaseProperty

interface RecordProperty extends BaseProperty {
format: 'record'
Expand Down Expand Up @@ -732,9 +730,24 @@ const createParameter = (
...baseParam,
format: 'enum',
jsonType: 'string',
values: parsedProp.enum.map((value: any) => ({
name: value,
})),
values: parsedProp.enum.map((value: string | boolean) => {
const enumValue = parsedProp['x-enums']?.[String(value)]
if (parsedProp['x-enums'] != null && enumValue == null) {
throw new Error(
`Missing enum value definition in x-enums for "${String(value)}"`,
)
}
return {
name: String(value),
description: enumValue?.description ?? '',
isDeprecated: Boolean(enumValue?.deprecated?.length ?? 0),
deprecationMessage: enumValue?.deprecated ?? '',
isUndocumented: Boolean(enumValue?.undocumented?.length ?? 0),
undocumentedMessage: enumValue?.undocumented ?? '',
isDraft: Boolean(enumValue?.draft?.length ?? 0),
draftMessage: enumValue?.draft ?? '',
}
}),
}
}
if (parsedProp.format === 'date-time') {
Expand Down Expand Up @@ -973,7 +986,24 @@ const createProperty = (
...baseProperty,
format: 'enum',
jsonType: 'string',
values: parsedProp.enum.map((value: any) => ({ name: value })),
values: parsedProp.enum.map((value: string | boolean) => {
const enumValue = parsedProp['x-enums']?.[String(value)]
if (parsedProp['x-enums'] != null && enumValue == null) {
throw new Error(
`Missing enum value definition in x-enums for "${String(value)}"`,
)
}
return {
name: String(value),
description: enumValue?.description ?? '',
isDeprecated: Boolean(enumValue?.deprecated?.length ?? 0),
deprecationMessage: enumValue?.deprecated ?? '',
isUndocumented: Boolean(enumValue?.undocumented?.length ?? 0),
undocumentedMessage: enumValue?.undocumented ?? '',
isDraft: Boolean(enumValue?.draft?.length ?? 0),
draftMessage: enumValue?.draft ?? '',
}
}),
}
}
if (parsedProp.format === 'date-time') {
Expand Down
8 changes: 8 additions & 0 deletions src/lib/openapi/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ export const OpenapiOperationSchema = z.object({
'x-draft': z.string().default(''),
})

export const EnumValueSchema = z.object({
description: z.string().default(''),
undocumented: z.string().default(''),
deprecated: z.string().default(''),
draft: z.string().default(''),
})

export const PropertySchema: z.ZodSchema<any> = z.object({
type: z.enum(['string', 'number', 'integer', 'boolean', 'array', 'object']),
description: z.string().default(''),
Expand All @@ -91,6 +98,7 @@ export const PropertySchema: z.ZodSchema<any> = z.object({
'x-deprecated': z.string().default(''),
'x-draft': z.string().default(''),
enum: z.array(z.string().or(z.boolean())).optional(),
'x-enums': z.record(z.string(), EnumValueSchema).optional(),
$ref: z.string().optional(),
format: z.string().optional(),
})
Expand Down
10 changes: 10 additions & 0 deletions src/lib/openapi/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,16 @@ export interface OpenapiSchema {
'x-draft'?: string
'x-undocumented'?: string
'x-route-path'?: string
'x-enums'?: Record<
string,
{
title?: string
description?: string
undocumented?: string
deprecated?: string
draft?: string
}
>
}

export interface OpenapiComponents {
Expand Down
14 changes: 14 additions & 0 deletions test/fixtures/types/openapi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,20 @@ export default {
format: 'uuid',
type: 'string',
},
foo_type: {
description: 'Foo type',
type: 'string',
enum: ['foo_basic', 'foo_advanced'],
'x-enums': {
foo_basic: {
description: 'Use a basic foo',
},
foo_advanced: {
description: 'Use an advanced foo',
deprecated: 'Advanced foo is deprecated',
},
},
},
name: {
description: 'Foo name',
type: 'string',
Expand Down
138 changes: 138 additions & 0 deletions test/snapshots/blueprint.test.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,34 @@ Generated by [AVA](https://avajs.dev).
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'success',
undocumentedMessage: '',
},
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'pending',
undocumentedMessage: '',
},
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'error',
undocumentedMessage: '',
},
],
},
Expand All @@ -67,7 +88,14 @@ Generated by [AVA](https://avajs.dev).
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'CREATE_FOO',
undocumentedMessage: '',
},
],
},
Expand Down Expand Up @@ -112,7 +140,14 @@ Generated by [AVA](https://avajs.dev).
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'foo.created',
undocumentedMessage: '',
},
],
},
Expand Down Expand Up @@ -218,6 +253,40 @@ Generated by [AVA](https://avajs.dev).
name: 'foo_id',
undocumentedMessage: '',
},
{
deprecationMessage: '',
description: 'Foo type',
draftMessage: '',
format: 'enum',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
jsonType: 'string',
name: 'foo_type',
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: 'Use a basic foo',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'foo_basic',
undocumentedMessage: '',
},
{
deprecationMessage: 'Advanced foo is deprecated',
description: 'Use an advanced foo',
draftMessage: '',
isDeprecated: true,
isDraft: false,
isUndocumented: false,
name: 'foo_advanced',
undocumentedMessage: '',
},
],
},
{
deprecationMessage: '',
description: 'Foo name',
Expand Down Expand Up @@ -1085,13 +1154,34 @@ Generated by [AVA](https://avajs.dev).
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'success',
undocumentedMessage: '',
},
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'pending',
undocumentedMessage: '',
},
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'error',
undocumentedMessage: '',
},
],
},
Expand All @@ -1108,7 +1198,14 @@ Generated by [AVA](https://avajs.dev).
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'CREATE_FOO',
undocumentedMessage: '',
},
],
},
Expand Down Expand Up @@ -1153,7 +1250,14 @@ Generated by [AVA](https://avajs.dev).
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: '',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'foo.created',
undocumentedMessage: '',
},
],
},
Expand Down Expand Up @@ -1259,6 +1363,40 @@ Generated by [AVA](https://avajs.dev).
name: 'foo_id',
undocumentedMessage: '',
},
{
deprecationMessage: '',
description: 'Foo type',
draftMessage: '',
format: 'enum',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
jsonType: 'string',
name: 'foo_type',
undocumentedMessage: '',
values: [
{
deprecationMessage: '',
description: 'Use a basic foo',
draftMessage: '',
isDeprecated: false,
isDraft: false,
isUndocumented: false,
name: 'foo_basic',
undocumentedMessage: '',
},
{
deprecationMessage: 'Advanced foo is deprecated',
description: 'Use an advanced foo',
draftMessage: '',
isDeprecated: true,
isDraft: false,
isUndocumented: false,
name: 'foo_advanced',
undocumentedMessage: '',
},
],
},
{
deprecationMessage: '',
description: 'Foo name',
Expand Down
Binary file modified test/snapshots/blueprint.test.ts.snap
Binary file not shown.
Loading

0 comments on commit f302ac0

Please sign in to comment.