Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) {
// Where the magic happens
const middleware = function OpenApiMiddleware (req, res, next) {
if (isFirstRequest) {
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath)
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware)
isFirstRequest = false
}

Expand All @@ -48,8 +48,8 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) {

// Expose the current document and prefix
middleware.routePrefix = routePrefix
middleware.document = generateDocument(doc, undefined, opts.basePath)
middleware.generateDocument = generateDocument
middleware.document = generateDocument(doc, undefined, opts.basePath, middleware)
middleware.generateDocument = (doc, router, basePath) => generateDocument(doc, router, basePath, middleware)
middleware.options = opts

// Add a path schema to the document
Expand All @@ -59,6 +59,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) {
}

setSchema(schemaMiddleware, schema)
schemaMiddleware._ownerMiddleware = middleware
return schemaMiddleware
}

Expand All @@ -73,6 +74,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) {
}

setSchema(validSchemaMiddleware, schema)
validSchemaMiddleware._ownerMiddleware = middleware
return validSchemaMiddleware
}

Expand Down Expand Up @@ -131,13 +133,13 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) {

// OpenAPI document as json
router.get(`${routePrefix}.json`, (req, res) => {
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath)
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware)
res.json(middleware.document)
})

// OpenAPI document as yaml
router.get([`${routePrefix}.yaml`, `${routePrefix}.yml`], (req, res) => {
const jsonSpec = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath)
const jsonSpec = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware)
const yamlSpec = YAML.stringify(jsonSpec)

res.type('yaml')
Expand All @@ -146,7 +148,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) {

router.get(`${routePrefix}/components/:type/:name.json`, (req, res, next) => {
const { type, name } = req.params
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath)
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware)

// No component by that identifer
if (!middleware.document.components[type] || !middleware.document.components[type][name]) {
Expand All @@ -159,7 +161,7 @@ module.exports = function ExpressOpenApi (_routePrefix, _doc, _opts) {

// Validate full open api document
router.get(`${routePrefix}/validate`, (req, res) => {
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath)
middleware.document = generateDocument(middleware.document, req.app._router || req.app.router, opts.basePath, middleware)
SwaggerParser.validate(middleware.document, (err, api) => {
if (err) {
return res.json({
Expand Down
7 changes: 6 additions & 1 deletion lib/generate-doc.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const pathToRegexp = require('path-to-regexp')
const minimumViableDocument = require('./minimum-doc')
const { get: getSchema, set: setSchema } = require('./layer-schema')

module.exports = function generateDocument (baseDocument, router, basePath) {
module.exports = function generateDocument (baseDocument, router, basePath, ownerMiddleware) {
// Merge document with select minimum defaults
const doc = Object.assign({
openapi: minimumViableDocument.openapi
Expand All @@ -23,6 +23,11 @@ module.exports = function generateDocument (baseDocument, router, basePath) {
return
}

// If ownerMiddleware is provided, only exclude routes owned by other OpenAPI middlewares
if (ownerMiddleware && layer.handle._ownerMiddleware && layer.handle._ownerMiddleware !== ownerMiddleware) {
return
}

const operation = Object.assign({}, schema)

// Add route params to schema
Expand Down
Loading