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..bdb7c8bf --- /dev/null +++ b/cds-plugin-openapi/index.js @@ -0,0 +1,29 @@ +/* eslint-disable require-await */ +const cds = require('@sap/cds'), { BuildTaskHandler } = cds.build +const cdsdk = require('@sap/cds-dk') + +cds.build.register(class OpenApiHandler extends BuildTaskHandler { + static get meta() { + return { + id: 'openapi', + runWith: ['node-cf', 'java-cf'], + config: { src: cds.env.folders.srv.replace(/\/$/, '') } + } + } + async clean() { + return this.remove('openapi-docs') + } + 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:diagram': String(options.diagram) === 'true' + }) + this.write(openApi).to(`openapi-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 fbf16378..901d796e 100644 --- a/package.json +++ b/package.json @@ -13,13 +13,14 @@ "@capire/media": "./media", "@capire/orders": "./orders", "@capire/reviews": "./reviews", - "@sap/cds": "^5.5.3" + "@sap/cds": "git+https://github.tools.sap/cap/cds#add/customBuildTaskProviders" }, "devDependencies": { "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "chai-subset": "^1.6.0", - "sqlite3": "^5" + "sqlite3": "^5", + "@cds/cds-plugin-openapi": "./cds-plugin-openapi" }, "scripts": { "cleanup": "rm -rf node_modules && rm -rf */node_modules && rm -rf */*/node_modules",