diff --git a/bookshop/package.json b/bookshop/package.json index e7125251..b02bee72 100644 --- a/bookshop/package.json +++ b/bookshop/package.json @@ -8,6 +8,9 @@ "express": "^4.17.1", "passport": "0.4.1" }, + "devDependencies": { + "@cds/cds-plugin-openapi": "*" + }, "scripts": { "genres": "cds serve test/genres.cds", "start": "cds run", diff --git a/cds-plugin-openapi/index.js b/cds-plugin-openapi/index.js new file mode 100644 index 00000000..1ac184ed --- /dev/null +++ b/cds-plugin-openapi/index.js @@ -0,0 +1,51 @@ +/* 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`) + })) + } + } + } + })() + ) +} \ No newline at end of file diff --git a/cds-plugin-openapi/package.json b/cds-plugin-openapi/package.json new file mode 100644 index 00000000..b7cd003e --- /dev/null +++ b/cds-plugin-openapi/package.json @@ -0,0 +1,9 @@ +{ + "name": "@sap/cds-plugin-openapi", + "version": "1.0.0", + "description": "OpenAPI service specification build plugin", + "main": "index.js", + "dependencies": { + "@sap/cds-dk": "^4" + } +} diff --git a/package.json b/package.json index f7821d41..f21560f4 100644 --- a/package.json +++ b/package.json @@ -12,14 +12,15 @@ "@capire/media": "./media", "@capire/orders": "./orders", "@capire/reviews": "./reviews", - "@sap/cds": "^5.1.5" + "@sap/cds": "git+https://github.tools.sap/cap/cds#add/customBuildTaskProviders" }, "devDependencies": { "cds-swagger-ui-express": "^0.2.0", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "chai-subset": "^1.6.0", - "sqlite3": "^5.0.0" + "sqlite3": "^5.0.0", + "@cds/cds-plugin-openapi": "./cds-plugin-openapi" }, "scripts": { "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules",