52 řádky
1.4 KiB
JavaScript
Executable File
52 řádky
1.4 KiB
JavaScript
Executable File
import yaml from 'js-yaml'
|
|
import fs from 'fs'
|
|
import jsonata from 'jsonata'
|
|
import fetch from 'node-fetch'
|
|
|
|
const outputFn = 'build/spec.json'
|
|
|
|
const strategies = {
|
|
async default (conf, all) {
|
|
const req = await fetch(conf.url)
|
|
const resp = await req.json()
|
|
return jsonata(conf.query).evaluate(resp)
|
|
},
|
|
async github (conf, all) {
|
|
const req = await fetch('https://api.github.com/repos/@@/releases/latest'.replace(/@@/, all.repo))
|
|
const resp = await req.json()
|
|
return jsonata('$match(tag_name,/^v(.+)/)[0].groups[0]').evaluate(resp)
|
|
},
|
|
async html (conf, all) {
|
|
const req = await fetch(conf.url)
|
|
const resp = await req.text()
|
|
return resp.match(conf.query)[1]
|
|
}
|
|
}
|
|
|
|
async function getVersions (config, all) {
|
|
const local = await strategies[config.from.strategy ? config.from.strategy : 'default'](config.from, all)
|
|
const latest = await strategies[config.to.strategy ? config.to.strategy : 'default'](config.to, all)
|
|
return { local, latest }
|
|
}
|
|
|
|
async function build () {
|
|
const spec = yaml.load(fs.readFileSync('./spec/services.yaml'))
|
|
|
|
for (const item of spec.services) {
|
|
|
|
item.url = item.host ? `https://${item.host}` : item.url
|
|
if (item.version_conf) {
|
|
item.versions = await getVersions(item.version_conf, item)
|
|
}
|
|
delete item.version_conf
|
|
}
|
|
|
|
spec.time = new Date
|
|
|
|
fs.writeFileSync(outputFn, JSON.stringify(spec, null, 2))
|
|
console.log(`saved: ${outputFn}`)
|
|
console.log('build done')
|
|
}
|
|
|
|
build()
|