From 891be8cd3f5b91e64f0cd922f2a9e3547f50a553 Mon Sep 17 00:00:00 2001 From: yoniamishav Date: Sun, 26 Apr 2020 14:36:53 +0300 Subject: [PATCH 1/3] fix unhandled exception for index not found in reflected types --- src/generateSpec.ts | 49 +++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/generateSpec.ts b/src/generateSpec.ts index 1090ca76..f73e3e65 100644 --- a/src/generateSpec.ts +++ b/src/generateSpec.ts @@ -32,9 +32,9 @@ export function getOperation(route: IRoute): oa.OperationObject { const operation: oa.OperationObject = { operationId: getOperationId(route), parameters: [ - ...getHeaderParams(route), - ...getPathParams(route), - ...getQueryParams(route) + ... getHeaderParams(route), + ... getPathParams(route), + ... getQueryParams(route) ], requestBody: getRequestBody(route) || undefined, responses: getResponses(route), @@ -64,7 +64,7 @@ export function getPaths(routes: IRoute[]): oa.PathObject { })) // @ts-ignore: array spread - return _.merge(...routePaths) + return _.merge(... routePaths) } /** @@ -127,7 +127,7 @@ export function getPathParams(route: IRoute): oa.ParameterObject[] { if (meta) { const metaSchema = getParamSchema(meta) param.schema = - 'type' in metaSchema ? { ...param.schema, ...metaSchema } : metaSchema + 'type' in metaSchema ? { ... param.schema, ... metaSchema }: metaSchema } return param @@ -173,18 +173,18 @@ export function getRequestBody(route: IRoute): oa.RequestBodyObject | void { const bodyParamsSchema: oa.SchemaObject | null = bodyParamMetas.length > 0 ? bodyParamMetas.reduce( - (acc: oa.SchemaObject, d) => ({ - ...acc, - properties: { - ...acc.properties, - [d.name!]: getParamSchema(d) - }, - required: isRequired(d, route) - ? [...(acc.required || []), d.name!] - : acc.required - }), - { properties: {}, required: [], type: 'object' } - ) + (acc: oa.SchemaObject, d) => ({ + ... acc, + properties: { + ... acc.properties, + [d.name!]: getParamSchema(d) + }, + required: isRequired(d, route) + ? [... (acc.required || []), d.name!] + : acc.required + }), + { properties: {}, required: [], type: 'object' } + ) : null const bodyMeta = route.params.find(d => d.type === 'body') @@ -192,7 +192,7 @@ export function getRequestBody(route: IRoute): oa.RequestBodyObject | void { if (bodyMeta) { const bodySchema = getParamSchema(bodyMeta) const { $ref } = - 'items' in bodySchema && bodySchema.items ? bodySchema.items : bodySchema + 'items' in bodySchema && bodySchema.items ? bodySchema.items: bodySchema return { content: { @@ -221,7 +221,7 @@ export function getContentType(route: IRoute): string { ? 'application/json' : 'text/html; charset=utf-8' const contentMeta = _.find(route.responseHandlers, { type: 'content-type' }) - return contentMeta ? contentMeta.value : defaultContentType + return contentMeta ? contentMeta.value: defaultContentType } /** @@ -229,7 +229,7 @@ export function getContentType(route: IRoute): string { */ export function getStatusCode(route: IRoute): string { const successMeta = _.find(route.responseHandlers, { type: 'success-code' }) - return successMeta ? successMeta.value + '' : '200' + return successMeta ? successMeta.value + '': '200' } /** @@ -279,7 +279,7 @@ export function getTags(route: IRoute): string[] { export function expressToOpenAPIPath(expressPath: string) { const tokens = pathToRegexp.parse(expressPath) return tokens - .map(d => (_.isString(d) ? d : `${d.prefix}{${d.name}}`)) + .map(d => (_.isString(d) ? d: `${d.prefix}{${d.name}}`)) .join('') } @@ -289,7 +289,7 @@ export function expressToOpenAPIPath(expressPath: string) { */ function isRequired(meta: { required?: boolean }, route: IRoute) { const globalRequired = _.get(route.options, 'defaults.paramOptions.required') - return globalRequired ? meta.required !== false : !!meta.required + return globalRequired ? meta.required !== false: !!meta.required } /** @@ -300,8 +300,9 @@ function getParamSchema( param: ParamMetadataArgs ): oa.SchemaObject | oa.ReferenceObject { const { explicitType, index, object, method } = param - - const type = Reflect.getMetadata('design:paramtypes', object, method)[index] + const reflectedTypes = Reflect.getMetadata('design:paramtypes', object, method); + if (reflectedTypes.length <= index) return {}; + const type = reflectedTypes[index] if (_.isFunction(type) && type.name === 'Array') { const items = explicitType ? { $ref: '#/components/schemas/' + explicitType.name } From 082ce938a78a3976526b11d89e61bf5bd7c60d81 Mon Sep 17 00:00:00 2001 From: yoniamishav Date: Mon, 27 Apr 2020 07:32:11 +0300 Subject: [PATCH 2/3] run yarn format --- src/generateSpec.ts | 52 ++++++++++++++++++++++++--------------------- yarn.lock | 32 ++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/generateSpec.ts b/src/generateSpec.ts index f73e3e65..2af799d7 100644 --- a/src/generateSpec.ts +++ b/src/generateSpec.ts @@ -32,9 +32,9 @@ export function getOperation(route: IRoute): oa.OperationObject { const operation: oa.OperationObject = { operationId: getOperationId(route), parameters: [ - ... getHeaderParams(route), - ... getPathParams(route), - ... getQueryParams(route) + ...getHeaderParams(route), + ...getPathParams(route), + ...getQueryParams(route) ], requestBody: getRequestBody(route) || undefined, responses: getResponses(route), @@ -64,7 +64,7 @@ export function getPaths(routes: IRoute[]): oa.PathObject { })) // @ts-ignore: array spread - return _.merge(... routePaths) + return _.merge(...routePaths) } /** @@ -127,7 +127,7 @@ export function getPathParams(route: IRoute): oa.ParameterObject[] { if (meta) { const metaSchema = getParamSchema(meta) param.schema = - 'type' in metaSchema ? { ... param.schema, ... metaSchema }: metaSchema + 'type' in metaSchema ? { ...param.schema, ...metaSchema } : metaSchema } return param @@ -173,18 +173,18 @@ export function getRequestBody(route: IRoute): oa.RequestBodyObject | void { const bodyParamsSchema: oa.SchemaObject | null = bodyParamMetas.length > 0 ? bodyParamMetas.reduce( - (acc: oa.SchemaObject, d) => ({ - ... acc, - properties: { - ... acc.properties, - [d.name!]: getParamSchema(d) - }, - required: isRequired(d, route) - ? [... (acc.required || []), d.name!] - : acc.required - }), - { properties: {}, required: [], type: 'object' } - ) + (acc: oa.SchemaObject, d) => ({ + ...acc, + properties: { + ...acc.properties, + [d.name!]: getParamSchema(d) + }, + required: isRequired(d, route) + ? [...(acc.required || []), d.name!] + : acc.required + }), + { properties: {}, required: [], type: 'object' } + ) : null const bodyMeta = route.params.find(d => d.type === 'body') @@ -192,7 +192,7 @@ export function getRequestBody(route: IRoute): oa.RequestBodyObject | void { if (bodyMeta) { const bodySchema = getParamSchema(bodyMeta) const { $ref } = - 'items' in bodySchema && bodySchema.items ? bodySchema.items: bodySchema + 'items' in bodySchema && bodySchema.items ? bodySchema.items : bodySchema return { content: { @@ -221,7 +221,7 @@ export function getContentType(route: IRoute): string { ? 'application/json' : 'text/html; charset=utf-8' const contentMeta = _.find(route.responseHandlers, { type: 'content-type' }) - return contentMeta ? contentMeta.value: defaultContentType + return contentMeta ? contentMeta.value : defaultContentType } /** @@ -229,7 +229,7 @@ export function getContentType(route: IRoute): string { */ export function getStatusCode(route: IRoute): string { const successMeta = _.find(route.responseHandlers, { type: 'success-code' }) - return successMeta ? successMeta.value + '': '200' + return successMeta ? successMeta.value + '' : '200' } /** @@ -279,7 +279,7 @@ export function getTags(route: IRoute): string[] { export function expressToOpenAPIPath(expressPath: string) { const tokens = pathToRegexp.parse(expressPath) return tokens - .map(d => (_.isString(d) ? d: `${d.prefix}{${d.name}}`)) + .map(d => (_.isString(d) ? d : `${d.prefix}{${d.name}}`)) .join('') } @@ -289,7 +289,7 @@ export function expressToOpenAPIPath(expressPath: string) { */ function isRequired(meta: { required?: boolean }, route: IRoute) { const globalRequired = _.get(route.options, 'defaults.paramOptions.required') - return globalRequired ? meta.required !== false: !!meta.required + return globalRequired ? meta.required !== false : !!meta.required } /** @@ -300,8 +300,12 @@ function getParamSchema( param: ParamMetadataArgs ): oa.SchemaObject | oa.ReferenceObject { const { explicitType, index, object, method } = param - const reflectedTypes = Reflect.getMetadata('design:paramtypes', object, method); - if (reflectedTypes.length <= index) return {}; + const reflectedTypes = Reflect.getMetadata( + 'design:paramtypes', + object, + method + ) + if (reflectedTypes.length <= index) return {} const type = reflectedTypes[index] if (_.isFunction(type) && type.name === 'Array') { const items = explicitType diff --git a/yarn.lock b/yarn.lock index 6014be91..ea48ed61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -840,6 +840,11 @@ convert-source-map@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +cookie@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1275,6 +1280,18 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -2845,6 +2862,16 @@ rimraf@^3.0.0: dependencies: glob "^7.1.3" +routing-controllers@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/routing-controllers/-/routing-controllers-0.8.1.tgz#d53c35e05d0f0863ee25bd77c3fe41fc09fa39f5" + integrity sha512-dOgt0kiriKMH1swenPX73tU3Mxvlb+1N/sFLSgEpwbK314POrQF+dJGOZVoKv2ya5do1k4aUzSV5xi0K3ykdyw== + dependencies: + cookie "^0.4.0" + glob "^7.1.4" + reflect-metadata "^0.1.13" + template-url "^1.0.0" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -3181,6 +3208,11 @@ teeny-request@6.0.1: stream-events "^1.0.5" uuid "^3.3.2" +template-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/template-url/-/template-url-1.0.0.tgz#d9456bee70cac6617b462a7b08db29fb813a0b09" + integrity sha1-2UVr7nDKxmF7Rip7CNsp+4E6Cwk= + test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" From 65f04c2dcf6ea5d69fbadb7a9d8939834a38f95d Mon Sep 17 00:00:00 2001 From: yoniamishav Date: Thu, 14 May 2020 08:19:47 +0300 Subject: [PATCH 3/3] reset yarn.lock --- .idea/.gitignore | 5 ++ .idea/codeStyles/Project.xml | 50 ++++++++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 ++ .idea/inspectionProfiles/Project_Default.xml | 6 +++ .idea/misc.xml | 6 +++ .idea/modules.xml | 8 ++++ .idea/routing-controllers-openapi.iml | 12 +++++ .idea/vcs.xml | 6 +++ yarn.lock | 32 ------------- 9 files changed, 98 insertions(+), 32 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/routing-controllers-openapi.iml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..b58b603f --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..8e1eddec --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..df7825df --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..28a804d8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..98b50d0f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/routing-controllers-openapi.iml b/.idea/routing-controllers-openapi.iml new file mode 100644 index 00000000..24643cc3 --- /dev/null +++ b/.idea/routing-controllers-openapi.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index ea48ed61..6014be91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -840,11 +840,6 @@ convert-source-map@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" -cookie@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1280,18 +1275,6 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -2862,16 +2845,6 @@ rimraf@^3.0.0: dependencies: glob "^7.1.3" -routing-controllers@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/routing-controllers/-/routing-controllers-0.8.1.tgz#d53c35e05d0f0863ee25bd77c3fe41fc09fa39f5" - integrity sha512-dOgt0kiriKMH1swenPX73tU3Mxvlb+1N/sFLSgEpwbK314POrQF+dJGOZVoKv2ya5do1k4aUzSV5xi0K3ykdyw== - dependencies: - cookie "^0.4.0" - glob "^7.1.4" - reflect-metadata "^0.1.13" - template-url "^1.0.0" - rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -3208,11 +3181,6 @@ teeny-request@6.0.1: stream-events "^1.0.5" uuid "^3.3.2" -template-url@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/template-url/-/template-url-1.0.0.tgz#d9456bee70cac6617b462a7b08db29fb813a0b09" - integrity sha1-2UVr7nDKxmF7Rip7CNsp+4E6Cwk= - test-exclude@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"