diff --git a/__tests__/fixtures/spec.json b/__tests__/fixtures/spec.json index c4af10f..a4c6933 100644 --- a/__tests__/fixtures/spec.json +++ b/__tests__/fixtures/spec.json @@ -223,11 +223,15 @@ "parameters": [ { "in": "header", - "name": "ListUsersHeaderParams", + "name": "Authorization", + "required": true, + "schema": { "type": "string" } + }, + { + "in": "header", + "name": "X-Correlation-ID", "required": false, - "schema": { - "$ref": "#/components/schemas/ListUsersHeaderParams" - } + "schema": { "type": "string" } }, { "in": "query", diff --git a/__tests__/parameters.test.ts b/__tests__/parameters.test.ts index fe5e77f..9040463 100644 --- a/__tests__/parameters.test.ts +++ b/__tests__/parameters.test.ts @@ -26,7 +26,13 @@ describe('parameters', () => { let schemas: { [p: string]: SchemaObject } beforeAll(() => { - class ListUsersHeaderParams {} + class ListUsersHeaderParams { + @IsString() + deviceId: number + + @IsString() + acceptLanguage: number + } class ListUsersQueryParams { @IsNumber() @@ -199,7 +205,7 @@ describe('parameters', () => { }) it('parses header param from @HeaderParam decorator', () => { - expect(getHeaderParams(route)[0]).toEqual({ + expect(getHeaderParams(route, schemas)[0]).toEqual({ in: 'header', name: 'Authorization', required: true, @@ -207,12 +213,31 @@ describe('parameters', () => { }) }) - it('parses header param ref from @HeaderParams decorator', () => { - expect(getHeaderParams(route)[1]).toEqual({ - in: 'header', - name: 'ListUsersHeaderParams', - required: false, - schema: { $ref: '#/components/schemas/ListUsersHeaderParams' }, - }) + it('parses header param ref from @HeaderParams decorator', () => { // here + expect(getHeaderParams(route, schemas)).toEqual([ + // Authorization comes from @HeaderParam + { + in: 'header', + name: 'Authorization', + required: true, + schema: { type: 'string' }, + }, + { + in: 'header', + name: 'deviceId', + required: true, + schema: { + type: 'string' + } + }, + { + in: 'header', + name: 'acceptLanguage', + required: true, + schema: { + type: 'string' + } + } + ]) }) }) diff --git a/src/generateSpec.ts b/src/generateSpec.ts index e74f9b9..04c55fe 100644 --- a/src/generateSpec.ts +++ b/src/generateSpec.ts @@ -37,7 +37,7 @@ export function getOperation( const operation: oa.OperationObject = { operationId: getOperationId(route), parameters: [ - ...getHeaderParams(route), + ...getHeaderParams(route, schemas), ...getPathParams(route), ...getQueryParams(route, schemas), ], @@ -86,7 +86,10 @@ export function getPaths( /** * Return header parameters of given route. */ -export function getHeaderParams(route: IRoute): oa.ParameterObject[] { +export function getHeaderParams( + route: IRoute, + schemas: { [p: string]: oa.SchemaObject | oa.ReferenceObject }, +): oa.ParameterObject[] { const headers: oa.ParameterObject[] = route.params .filter((p) => p.type === 'header') .map((headerMeta) => { @@ -101,13 +104,23 @@ export function getHeaderParams(route: IRoute): oa.ParameterObject[] { const headersMeta = route.params.find((p) => p.type === 'headers') if (headersMeta) { - const schema = getParamSchema(headersMeta) as oa.ReferenceObject - headers.push({ - in: 'header', - name: schema.$ref.split('/').pop() || '', - required: isRequired(headersMeta, route), - schema, - }) + const paramSchema = getParamSchema(headersMeta) as oa.ReferenceObject + // the last segment after '/' + const paramSchemaName = paramSchema.$ref.split('/').pop() || '' + const currentSchema = schemas[paramSchemaName] + + if (currentSchema && oa.isSchemaObject(currentSchema)) { + for (const [name, schema] of Object.entries( + currentSchema?.properties || {} + )) { + headers.push({ + in: 'header', + name, + required: currentSchema.required?.includes(name), + schema, + }) + } + } } return headers