Files
cloud-cap-samples/cds-plugin-openapi/index.js
2021-11-23 23:11:32 +01:00

51 lines
1.9 KiB
JavaScript

/* eslint-disable require-await */
const path = require("path")
const fs = require("fs")
const cds = require('@sap/cds'), { BuildTaskProvider, BuildTaskHandler } = cds.build
const cdsdk = require('@sap/cds-dk')
const { path4 } = cds.serve
const logger = cds.log("build")
module.exports.activate = () => {
cds.build.registerProvider(
new (class extends BuildTaskProvider {
get id() {
return 'openapi'
}
get dependents() {
return ['node-cf', 'java-cf']
}
applyTaskDefaults(task) {
task.src = task.src || cds.env.folders.srv.replace(/\/$/, '')
}
async lookupTasks() {
if (process.env.NODE_ENV === 'production') {
return [{ for: this.id }]
}
}
get handler() {
return class extends BuildTaskHandler {
async clean() {
fs.rm(path.join(this.task.dest, "gen/docs"), { recursive: true, force: true }, (err) => logger.error(err))
}
async build() {
const model = await this.model()
const { options } = this.task
// generate openapi files for all services
await Promise.all(cds.linked(model).services.map(service => {
const openApi = cdsdk.compile.to.openapi(model, {
service: service.name,
'openapi:url': path4(service).replace(/\.[^.]+$/, ''),
'openapi:diagram': options.diagram
})
this.write(openApi).to(`gen/docs/${service.name}.openapi3.json`)
}))
}
}
}
})()
)
}