Skip to content

Commit

Permalink
fix: break out Parameter into separate types (#68)
Browse files Browse the repository at this point in the history
  • Loading branch information
mikewuu authored Aug 29, 2024
1 parent 16865c1 commit ff7d7b7
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 17 deletions.
120 changes: 106 additions & 14 deletions src/lib/blueprint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,67 @@ export interface Endpoint {
codeSamples: CodeSample[]
}

export interface Parameter {
interface BaseParameter {
name: string
isRequired: boolean
isUndocumented: boolean
isDeprecated: boolean
deprecationMessage: string
description: string
jsonType: string
format: string
}

interface StringParameter extends BaseParameter {
format: 'string'
jsonType: 'string'
}

interface EnumParameter extends BaseParameter {
format: 'enum'
jsonType: 'string'
values: EnumValue[]
}

interface RecordParameter extends BaseParameter {
format: 'record'
jsonType: 'object'
}

interface ListParameter extends BaseParameter {
format: 'list'
jsonType: 'array'
}

interface BooleanParameter extends BaseParameter {
format: 'boolean'
jsonType: 'boolean'
}

interface ObjectParameter extends BaseParameter {
format: 'object'
jsonType: 'object'
parameters: Parameter[]
}

interface DatetimeParameter extends BaseParameter {
format: 'datetime'
jsonType: 'string'
}

interface IdParameter extends BaseParameter {
format: 'id'
jsonType: 'string'
}

export type Parameter =
| StringParameter
| EnumParameter
| RecordParameter
| ListParameter
| BooleanParameter
| ObjectParameter
| DatetimeParameter
| IdParameter

export interface Request {
methods: Method[]
semanticMethod: Method
Expand Down Expand Up @@ -354,21 +404,63 @@ const createRequestBody = (operation: OpenapiOperation): Parameter[] => {
return []
}

const requiredProperties = schema.required ?? []
return createParameters(schema.properties, schema.required)
}

return Object.entries(schema.properties).map(
const createParameters = (
properties: Record<string, OpenapiSchema>,
requiredParameters: string[] = [],
): Parameter[] => {
return Object.entries(properties).map(
([name, property]: [string, any]): Parameter => {
const parsedProperty = PropertySchema.parse(property)
const parsedProp = PropertySchema.parse(property)

return {
const baseParam: BaseParameter = {
name,
jsonType: parsedProperty.type,
format: property.format,
description: parsedProperty.description,
isRequired: requiredProperties.includes(name),
isDeprecated: parsedProperty.deprecated,
isUndocumented: parsedProperty['x-undocumented'].length > 0,
deprecationMessage: parsedProperty['x-deprecated'],
description: parsedProp.description,
isRequired: requiredParameters.includes(name),
isDeprecated: parsedProp['x-deprecated'].length > 0,
deprecationMessage: parsedProp['x-deprecated'],
isUndocumented: parsedProp['x-undocumented'].length > 0,
}

switch (parsedProp.type) {
case 'string':
if (parsedProp.enum !== undefined) {
return {
...baseParam,
format: 'enum',
jsonType: 'string',
values: parsedProp.enum.map((value: any) => ({
name: value,
})),
}
}
if (parsedProp.format === 'date-time') {
return { ...baseParam, format: 'datetime', jsonType: 'string' }
}
if (parsedProp.format === 'uuid') {
return { ...baseParam, format: 'id', jsonType: 'string' }
}
return { ...baseParam, format: 'string', jsonType: 'string' }
case 'boolean':
return { ...baseParam, format: 'boolean', jsonType: 'boolean' }
case 'array':
return { ...baseParam, format: 'list', jsonType: 'array' }
case 'object':
if (parsedProp.properties !== undefined) {
return {
...baseParam,
format: 'object',
jsonType: 'object',
parameters: createParameters(
parsedProp.properties as Record<string, OpenapiSchema>,
),
}
}
return { ...baseParam, format: 'record', jsonType: 'object' }
default:
throw new Error(`Unsupported property type: ${parsedProp.type}`)
}
},
)
Expand Down
6 changes: 3 additions & 3 deletions test/snapshots/seam-blueprint.test.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ Generated by [AVA](https://avajs.dev).
{
deprecationMessage: '',
description: 'ID of the desired access control system.',
format: 'uuid',
format: 'id',
isDeprecated: false,
isRequired: true,
isUndocumented: false,
Expand Down Expand Up @@ -289,7 +289,7 @@ Generated by [AVA](https://avajs.dev).
{
deprecationMessage: '',
description: 'ID of the connected account by which to filter the list of returned access control systems.',
format: 'uuid',
format: 'id',
isDeprecated: false,
isRequired: false,
isUndocumented: false,
Expand Down Expand Up @@ -327,7 +327,7 @@ Generated by [AVA](https://avajs.dev).
{
deprecationMessage: '',
description: 'ID of the ACS system for which you want to retrieve all compatible credential manager ACS systems.',
format: 'uuid',
format: 'id',
isDeprecated: false,
isRequired: true,
isUndocumented: false,
Expand Down
Binary file modified test/snapshots/seam-blueprint.test.ts.snap
Binary file not shown.

0 comments on commit ff7d7b7

Please sign in to comment.