Request parameters typings (#748)

This commit is contained in:
Tomas Della Vedova
2019-01-11 14:08:49 +01:00
committed by GitHub
parent 41109f0bc0
commit f56ae1a70d
6 changed files with 2411 additions and 428 deletions

View File

@ -7,7 +7,7 @@ const semver = require('semver')
const ora = require('ora')
const rimraf = require('rimraf')
const standard = require('standard')
const { generate, cloneAndCheckout, genFactory } = require('./utils')
const { generate, cloneAndCheckout, genFactory, generateRequestTypes } = require('./utils')
start(minimist(process.argv.slice(2), {
string: ['tag']
@ -23,6 +23,8 @@ function start (opts) {
const apiOutputFolder = join(packageFolder, 'api')
const mainOutputFile = join(packageFolder, 'index.js')
const typesOutputFile = join(packageFolder, 'generated.d.ts')
const requestParamsOutputFile = join(packageFolder, 'requestParams.d.ts')
const allSpec = []
log.text = 'Cleaning API folder...'
rimraf.sync(join(apiOutputFolder, '*.js'))
@ -36,6 +38,12 @@ function start (opts) {
readdirSync(apiFolder).forEach(generateApiFile(apiFolder, log))
readdirSync(xPackFolder).forEach(generateApiFile(xPackFolder, log))
writeFileSync(
requestParamsOutputFile,
generateRequestTypes(allSpec),
{ encoding: 'utf8' }
)
const { fn: factory, types } = genFactory(apiOutputFolder)
writeFileSync(
mainOutputFile,
@ -61,6 +69,7 @@ function start (opts) {
log.text = `Processing ${file}`
const spec = require(join(apiFolder, file))
allSpec.push(spec)
const code = generate(spec, common)
const filePath = join(apiOutputFolder, `${file.slice(0, file.lastIndexOf('.'))}.js`)

View File

@ -9,6 +9,11 @@ function genFactory (folder) {
const apiFiles = readdirSync(folder)
const types = apiFiles
.map(file => {
const name = file
.slice(0, -3)
.replace(/\.([a-z])/g, k => k[1].toUpperCase())
.replace(/_([a-z])/g, k => k[1].toUpperCase())
return file
.slice(0, -3) // remove `.js` extension
.split('.')
@ -16,12 +21,12 @@ function genFactory (folder) {
.reduce((acc, val) => {
const obj = {
[val]: acc === null
? 'ApiMethod'
? `ApiMethod<RequestParams.${name[0].toUpperCase() + name.slice(1)}>`
: acc
}
if (isSnakeCased(val)) {
obj[camelify(val)] = acc === null
? 'ApiMethod'
? `ApiMethod<RequestParams.${name[0].toUpperCase() + name.slice(1)}>`
: acc
}
return obj

View File

@ -0,0 +1,71 @@
'use strict'
function generate (api) {
var types = `export interface Generic {
method?: string;
ignore?: number | number[];
filter_path?: string | string[];
pretty?: boolean;
human?: boolean;
error_trace?: boolean;
source?: string;
}
`
api.forEach(generateRequestType)
return types
function generateRequestType (spec) {
const api = Object.keys(spec)[0]
const name = api
.replace(/\.([a-z])/g, k => k[1].toUpperCase())
.replace(/_([a-z])/g, k => k[1].toUpperCase())
const { parts = {}, params = {} } = spec[api].url
const { body } = spec[api]
const partsArr = Object.keys(parts)
.map(k => ({ key: k, value: parts[k] }))
const paramsArr = Object.keys(params)
.filter(k => !Object.keys(parts).includes(k))
.map(k => ({ key: k, value: params[k] }))
const genLine = e => {
const optional = e.value.required ? '' : '?'
return `${e.key}${optional}: ${getType(e.value.type, e.value.options)};`
}
const code = `
export interface ${name[0].toUpperCase() + name.slice(1)} extends Generic {
${partsArr.map(genLine).join('\n ')}
${paramsArr.map(genLine).join('\n ')}
${body ? `body${body.required ? '' : '?'}: any;` : ''}
}
`
types += '\n'
// remove empty lines
types += code.replace(/^\s*\n/gm, '')
}
function getType (type, options) {
switch (type) {
case 'list':
return 'string | string[]'
case 'date':
case 'time':
case 'timeout':
return 'string'
case 'enum':
return options.map(k => `'${k}'`).join(' | ')
case 'int':
case 'double':
case 'long':
return 'number'
default:
return type
}
}
}
module.exports = generate

View File

@ -1,7 +1,8 @@
'use strict'
const generate = require('./generate')
const generateRequestTypes = require('./generateRequestTypes')
const cloneAndCheckout = require('./clone-es')
const genFactory = require('./genMain')
module.exports = { generate, cloneAndCheckout, genFactory }
module.exports = { generate, cloneAndCheckout, genFactory, generateRequestTypes }