You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					76 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					76 lines
				
				2.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const yaml = require('js-yaml')
							 | 
						||
| 
								 | 
							
								const { shouldRouteHide } = require('../../util/common')
							 | 
						||
| 
								 | 
							
								const { prepareDefaultOptions, prepareOpenapiObject, prepareOpenapiMethod, prepareOpenapiSchemas, normalizeUrl } = require('./utils')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function (opts, cache, routes, Ref, done) {
							 | 
						||
| 
								 | 
							
								  let ref
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const defOpts = prepareDefaultOptions(opts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return function (opts) {
							 | 
						||
| 
								 | 
							
								    if (opts && opts.yaml) {
							 | 
						||
| 
								 | 
							
								      if (cache.string) return cache.string
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      if (cache.object) return cache.object
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Base Openapi info
							 | 
						||
| 
								 | 
							
								    const openapiObject = prepareOpenapiObject(defOpts, done)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ref = Ref()
							 | 
						||
| 
								 | 
							
								    openapiObject.components.schemas = prepareOpenapiSchemas({
							 | 
						||
| 
								 | 
							
								      ...openapiObject.components.schemas,
							 | 
						||
| 
								 | 
							
								      ...(ref.definitions().definitions)
							 | 
						||
| 
								 | 
							
								    }, ref)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (const route of routes) {
							 | 
						||
| 
								 | 
							
								      const transformResult = defOpts.transform
							 | 
						||
| 
								 | 
							
								        ? defOpts.transform({ schema: route.schema, url: route.url })
							 | 
						||
| 
								 | 
							
								        : {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const schema = transformResult.schema || route.schema
							 | 
						||
| 
								 | 
							
								      const shouldRouteHideOpts = {
							 | 
						||
| 
								 | 
							
								        hiddenTag: defOpts.hiddenTag,
							 | 
						||
| 
								 | 
							
								        hideUntagged: defOpts.hideUntagged
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (shouldRouteHide(schema, shouldRouteHideOpts)) continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      let url = transformResult.url || route.url
							 | 
						||
| 
								 | 
							
								      url = normalizeUrl(url, defOpts.servers, defOpts.stripBasePath)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const openapiRoute = Object.assign({}, openapiObject.paths[url])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const openapiMethod = prepareOpenapiMethod(schema, ref, openapiObject)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (route.links) {
							 | 
						||
| 
								 | 
							
								        for (const statusCode of Object.keys(route.links)) {
							 | 
						||
| 
								 | 
							
								          if (!openapiMethod.responses[statusCode]) {
							 | 
						||
| 
								 | 
							
								            throw new Error(`missing status code ${statusCode} in route ${route.path}`)
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          openapiMethod.responses[statusCode].links = route.links[statusCode]
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // route.method should be either a String, like 'POST', or an Array of Strings, like ['POST','PUT','PATCH']
							 | 
						||
| 
								 | 
							
								      const methods = typeof route.method === 'string' ? [route.method] : route.method
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      for (const method of methods) {
							 | 
						||
| 
								 | 
							
								        openapiRoute[method.toLowerCase()] = openapiMethod
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      openapiObject.paths[url] = openapiRoute
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (opts && opts.yaml) {
							 | 
						||
| 
								 | 
							
								      cache.string = yaml.dump(openapiObject, { skipInvalid: true })
							 | 
						||
| 
								 | 
							
								      return cache.string
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cache.object = openapiObject
							 | 
						||
| 
								 | 
							
								    return cache.object
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |