Skip to content

Commit

Permalink
Merge pull request #167 from vosmol/feat/add-request-cookies-definition
Browse files Browse the repository at this point in the history
feat: add support for cookies in RouteConfig.request object
  • Loading branch information
georgyangelov committed Jul 26, 2023
2 parents d916809 + 2dc9fb5 commit fe0c06f
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 2 deletions.
79 changes: 79 additions & 0 deletions spec/routes/parameters.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,85 @@ describe('parameters', () => {
});
});

describe('cookies', () => {
it('generates a cookie parameter for route', () => {
const { parameters } = generateDataForRoute({
request: { cookies: z.object({ test: z.string() }) },
});

expect(parameters).toEqual([
{
in: 'cookie',
name: 'test',
required: true,
schema: {
type: 'string',
},
},
]);
});

it('generates a reference cookie parameter for route', () => {
const TestParam = registerParameter(
'TestParam',
z.string().openapi({
param: { name: 'test', in: 'cookie' },
})
);

const { parameters, documentParameters } = generateDataForRoute(
{ request: { cookies: z.object({ test: TestParam.schema }) } },
[TestParam]
);

expect(documentParameters).toEqual({
TestParam: {
in: 'cookie',
name: 'test',
required: true,
schema: {
$ref: '#/components/schemas/TestParam',
},
},
});

expect(parameters).toEqual([
{ $ref: '#/components/parameters/TestParam' },
]);
});

it('can automatically register request cookie parameters', () => {
const cookieId = z.string().openapi('cookieId').length(6);

const { documentSchemas, parameters } = generateDataForRoute({
request: {
cookies: z.object({
id: cookieId,
}),
},
});

expect(documentSchemas).toEqual({
cookieId: {
type: 'string',
minLength: 6,
maxLength: 6,
},
});

expect(parameters).toEqual([
{
in: 'cookie',
name: 'id',
required: true,
schema: {
$ref: '#/components/schemas/cookieId',
},
},
]);
});
});

describe('header', () => {
it('generates a header parameter with array for route', () => {
const { parameters } = generateDataForRoute({
Expand Down
14 changes: 12 additions & 2 deletions src/openapi-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,7 @@ export class OpenAPIGenerator {
return [];
}

const { query, params, headers } = request;
const { query, params, headers, cookies } = request;

const queryParameters = this.enhanceMissingParametersError(
() => (query ? this.generateInlineParameters(query, 'query') : []),
Expand All @@ -546,6 +546,11 @@ export class OpenAPIGenerator {
{ location: 'path' }
);

const cookieParameters = this.enhanceMissingParametersError(
() => (cookies ? this.generateInlineParameters(cookies, 'cookie') : []),
{ location: 'cookie' }
);

const headerParameters = this.enhanceMissingParametersError(
() =>
headers
Expand All @@ -558,7 +563,12 @@ export class OpenAPIGenerator {
{ location: 'header' }
);

return [...pathParameters, ...queryParameters, ...headerParameters];
return [
...pathParameters,
...queryParameters,
...headerParameters,
...cookieParameters,
];
}

generatePath(route: RouteConfig): PathItemObject {
Expand Down
1 change: 1 addition & 0 deletions src/openapi-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ export type RouteConfig = Omit<OperationObject, 'responses'> & {
body?: ZodRequestBody;
params?: AnyZodObject;
query?: AnyZodObject;
cookies?: AnyZodObject;
headers?: AnyZodObject | ZodType<unknown>[];
};
responses: {
Expand Down

0 comments on commit fe0c06f

Please sign in to comment.