From e6f1b645a2b41b3845dadafccbf7d058f792450a Mon Sep 17 00:00:00 2001 From: Tomas Della Vedova Date: Mon, 3 Aug 2020 11:45:48 +0200 Subject: [PATCH] Generate response type as boolean if the request is HEAD only (#1275) --- scripts/utils/generateMain.js | 89 +++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 36 deletions(-) diff --git a/scripts/utils/generateMain.js b/scripts/utils/generateMain.js index 8e99d40c7..c6b721675 100644 --- a/scripts/utils/generateMain.js +++ b/scripts/utils/generateMain.js @@ -50,8 +50,10 @@ function genFactory (folder, paths) { .split('.') .reverse() .reduce((acc, val) => { - const body = hasBody(paths, file.slice(0, -3)) - const methods = acc === null ? buildMethodDefinition({ kibana: false }, val, name, body) : null + const spec = readSpec(paths, file.slice(0, -3)) + const isHead = isHeadMethod(spec, file.slice(0, -3)) + const body = hasBody(spec, file.slice(0, -3)) + const methods = acc === null ? buildMethodDefinition({ kibana: false }, val, name, body, isHead) : null const obj = {} if (methods) { for (const m of methods) { @@ -80,8 +82,10 @@ function genFactory (folder, paths) { .split('.') .reverse() .reduce((acc, val) => { - const body = hasBody(paths, file.slice(0, -3)) - const methods = acc === null ? buildMethodDefinition({ kibana: true }, val, name, body) : null + const spec = readSpec(paths, file.slice(0, -3)) + const isHead = isHeadMethod(spec, file.slice(0, -3)) + const body = hasBody(spec, file.slice(0, -3)) + const methods = acc === null ? buildMethodDefinition({ kibana: true }, val, name, body, isHead) : null const obj = {} if (methods) { for (const m of methods) { @@ -246,73 +250,86 @@ function toPascalCase (str) { return str[0].toUpperCase() + str.slice(1) } -function buildMethodDefinition (opts, api, name, hasBody) { +function buildMethodDefinition (opts, api, name, hasBody, isHead) { const Name = toPascalCase(name) const bodyType = ndjsonApiKey.includes(Name) ? 'RequestNDBody' : 'RequestBody' + const responseType = isHead ? 'boolean' : 'Record' const defaultBodyType = ndjsonApiKey.includes(Name) ? 'Record[]' : 'Record' if (opts.kibana) { if (hasBody) { return [ - { key: `${camelify(api)}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: 'TransportRequestPromise>' } + { key: `${camelify(api)}(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: `TransportRequestPromise>` } ] } else { return [ - { key: `${camelify(api)}, TContext = Context>(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: 'TransportRequestPromise>' } + { key: `${camelify(api)}(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: `TransportRequestPromise>` } ] } } if (hasBody) { let methods = [ - { key: `${api}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: 'TransportRequestPromise>' }, - { key: `${api}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${api}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(params: RequestParams.${Name}, callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${api}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: 'TransportRequestCallback' } + { key: `${api}(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: `TransportRequestPromise>` }, + { key: `${api}(callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${api}(params: RequestParams.${Name}, callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${api}(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: `TransportRequestCallback` } ] if (isSnakeCased(api)) { methods = methods.concat([ - { key: `${camelify(api)}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: 'TransportRequestPromise>' }, - { key: `${camelify(api)}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${camelify(api)}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(params: RequestParams.${Name}, callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${camelify(api)}, TRequestBody extends ${bodyType} = ${defaultBodyType}, TContext = Context>(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: 'TransportRequestCallback' } + { key: `${camelify(api)}(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: `TransportRequestPromise>` }, + { key: `${camelify(api)}(callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${camelify(api)}(params: RequestParams.${Name}, callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${camelify(api)}(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: `TransportRequestCallback` } ]) } return methods } else { let methods = [ - { key: `${api}, TContext = Context>(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: 'TransportRequestPromise>' }, - { key: `${api}, TContext = Context>(callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${api}, TContext = Context>(params: RequestParams.${Name}, callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${api}, TContext = Context>(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: 'TransportRequestCallback' } + { key: `${api}(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: `TransportRequestPromise>` }, + { key: `${api}(callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${api}(params: RequestParams.${Name}, callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${api}(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: `TransportRequestCallback` } ] if (isSnakeCased(api)) { methods = methods.concat([ - { key: `${camelify(api)}, TContext = Context>(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: 'TransportRequestPromise>' }, - { key: `${camelify(api)}, TContext = Context>(callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${camelify(api)}, TContext = Context>(params: RequestParams.${Name}, callback: callbackFn)`, val: 'TransportRequestCallback' }, - { key: `${camelify(api)}, TContext = Context>(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: 'TransportRequestCallback' } + { key: `${camelify(api)}(params?: RequestParams.${Name}, options?: TransportRequestOptions)`, val: `TransportRequestPromise>` }, + { key: `${camelify(api)}(callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${camelify(api)}(params: RequestParams.${Name}, callback: callbackFn)`, val: `TransportRequestCallback` }, + { key: `${camelify(api)}(params: RequestParams.${Name}, options: TransportRequestOptions, callback: callbackFn)`, val: `TransportRequestCallback` } ]) } return methods } } -function hasBody (paths, file) { - const spec = readSpec() - return !!spec[file].body +function hasBody (spec, api) { + return !!spec[api].body +} - function readSpec () { - try { - return require(join(paths[0], file)) - } catch (err) {} - - try { - return require(join(paths[1], file)) - } catch (err) {} - - throw new Error(`Cannot read spec file ${file}`) +function isHeadMethod (spec, api) { + const { paths } = spec[api].url + const methods = [] + for (const path of paths) { + for (const method of path.methods) { + if (!methods.includes(method)) { + methods.push(method) + } + } } + return methods.length === 1 && methods[0] === 'HEAD' +} + +function readSpec (paths, file) { + try { + return require(join(paths[0], file)) + } catch (err) {} + + try { + return require(join(paths[1], file)) + } catch (err) {} + + throw new Error(`Cannot read spec file ${file}`) } module.exports = genFactory