Request parameters typings (#748)
This commit is contained in:
committed by
GitHub
parent
41109f0bc0
commit
f56ae1a70d
@ -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`)
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
71
scripts/utils/generateRequestTypes.js
Normal file
71
scripts/utils/generateRequestTypes.js
Normal 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
|
||||
@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user