From b8e0131dcae5c4f6130c21757a4304d708e1f4a7 Mon Sep 17 00:00:00 2001 From: Petri Lehtinen Date: Sat, 27 May 2023 10:47:21 +0300 Subject: [PATCH] Cleanups --- README.md | 3 ++- src/generate.ts | 26 ++++++++++++++--------- tests/__snapshots__/generate.spec.ts.snap | 2 +- tests/other-routes.ts | 2 +- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d2e8cbe..39831f4 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,11 @@ const bodyCodec = t.type({ * @summary You can also set a short summary * @tags Tag1, Tag2 * + * @routeParam myRouteParam Description for route parameter + * * @response 200 Success response description. * @response 400 Another description for a response. This one * spans multile lines. - * @routeParam myRouteParam pathparameter description */ const myRoute: Route | Response.BadRequest> = route.post(...).use(Parser.body(bodyCodec)).handler(...) diff --git a/src/generate.ts b/src/generate.ts index 1a5a787..108e530 100644 --- a/src/generate.ts +++ b/src/generate.ts @@ -768,18 +768,24 @@ const typeToRequestParameters = ( ctx: Context, in_: 'path' | 'query' | 'header' | 'cookie', type: ts.Type | undefined, - routeParameters?: Map + descriptions?: Map ): OpenAPIV3.ParameterObject[] => { if (!type) return [] const props = ctx.checker.getPropertiesOfType(type) - const missingRouteParam = routeParameters - ? [...routeParameters.keys()].find( - (param) => !props.map((prop) => prop.name).includes(param) + + if (descriptions) { + const propNames = new Set(props.map((prop) => prop.name)) + const extraneousDescriptions = [...descriptions.keys()].filter( + (name) => !propNames.has(name) + ) + if (extraneousDescriptions.length > 0) { + throw new Error( + `Descriptions provided for unmatched ${in_} parameters: ${extraneousDescriptions.join( + ', ' + )}` ) - : undefined - if (missingRouteParam) { - throw new Error(`RouteParameter ${missingRouteParam} does not exist.`) + } } return props.map((prop): OpenAPIV3.ParameterObject => { const description = getDescriptionFromComment(ctx, prop) @@ -790,9 +796,9 @@ const typeToRequestParameters = ( schema: { type: 'string', }, - ...(routeParameters - ? routeParameters.get(prop.name) - ? { description: routeParameters.get(prop.name) } + ...(descriptions + ? descriptions.get(prop.name) + ? { description: descriptions.get(prop.name) } : undefined : description ? { description } diff --git a/tests/__snapshots__/generate.spec.ts.snap b/tests/__snapshots__/generate.spec.ts.snap index c821200..d599bb2 100644 --- a/tests/__snapshots__/generate.spec.ts.snap +++ b/tests/__snapshots__/generate.spec.ts.snap @@ -556,7 +556,7 @@ Object { "operationId": "routeWithRouteParameterTag", "parameters": Array [ Object { - "description": "12345", + "description": "Description goes here", "in": "path", "name": "myRouteParameter", "required": true, diff --git a/tests/other-routes.ts b/tests/other-routes.ts index d71f775..dddf073 100644 --- a/tests/other-routes.ts +++ b/tests/other-routes.ts @@ -1,7 +1,7 @@ import { Response, route, Route, router } from 'typera-express' /** - * @routeParam myRouteParameter 12345 + * @routeParam myRouteParameter Description goes here */ const routeWithRouteParameterTag: Route< Response.Ok | Response.BadRequest