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.
		
		
		
		
		
			
		
			
				
					
					
						
							99 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
	
	
							99 lines
						
					
					
						
							3.3 KiB
						
					
					
				'use strict'
 | 
						|
 | 
						|
const path = require('path')
 | 
						|
const fs = require('fs')
 | 
						|
const yaml = require('js-yaml')
 | 
						|
 | 
						|
module.exports = function (fastify, opts, done) {
 | 
						|
  if (!opts.specification) return done(new Error('specification is missing in the module options'))
 | 
						|
  if (typeof opts.specification !== 'object') return done(new Error('specification is not an object'))
 | 
						|
 | 
						|
  let swaggerObject = {}
 | 
						|
 | 
						|
  if (!opts.specification.path && !opts.specification.document) {
 | 
						|
    return done(new Error('both specification.path and specification.document are missing, should be path to the file or swagger document spec'))
 | 
						|
  } else if (opts.specification.path) {
 | 
						|
    if (typeof opts.specification.path !== 'string') return done(new Error('specification.path is not a string'))
 | 
						|
 | 
						|
    if (!fs.existsSync(path.resolve(opts.specification.path))) return done(new Error(`${opts.specification.path} does not exist`))
 | 
						|
 | 
						|
    const extName = path.extname(opts.specification.path).toLowerCase()
 | 
						|
    if (['.yaml', '.json'].indexOf(extName) === -1) return done(new Error("specification.path extension name is not supported, should be one from ['.yaml', '.json']"))
 | 
						|
 | 
						|
    if (opts.specification.postProcessor && typeof opts.specification.postProcessor !== 'function') return done(new Error('specification.postProcessor should be a function'))
 | 
						|
 | 
						|
    if (opts.specification.baseDir && typeof opts.specification.baseDir !== 'string') return done(new Error('specification.baseDir should be string'))
 | 
						|
 | 
						|
    if (!opts.specification.baseDir) {
 | 
						|
      opts.specification.baseDir = path.resolve(path.dirname(opts.specification.path))
 | 
						|
    } else {
 | 
						|
      while (opts.specification.baseDir.endsWith('/')) {
 | 
						|
        opts.specification.baseDir = opts.specification.baseDir.slice(0, -1)
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    // read
 | 
						|
    const source = fs.readFileSync(
 | 
						|
      path.resolve(opts.specification.path),
 | 
						|
      'utf8'
 | 
						|
    )
 | 
						|
    switch (extName) {
 | 
						|
      case '.yaml':
 | 
						|
        swaggerObject = yaml.load(source)
 | 
						|
        break
 | 
						|
      case '.json':
 | 
						|
        swaggerObject = JSON.parse(source)
 | 
						|
        break
 | 
						|
    }
 | 
						|
 | 
						|
    // apply postProcessor, if one was passed as an argument
 | 
						|
    if (opts.specification.postProcessor) {
 | 
						|
      swaggerObject = opts.specification.postProcessor(swaggerObject)
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    if (typeof opts.specification.document !== 'object') return done(new Error('specification.document is not an object'))
 | 
						|
 | 
						|
    swaggerObject = opts.specification.document
 | 
						|
  }
 | 
						|
 | 
						|
  fastify.decorate('swagger', swagger)
 | 
						|
 | 
						|
  if (opts.exposeRoute === true) {
 | 
						|
    const options = {
 | 
						|
      prefix: opts.routePrefix || '/documentation',
 | 
						|
      uiConfig: opts.uiConfig || {},
 | 
						|
      initOAuth: opts.initOAuth || {},
 | 
						|
      baseDir: opts.specification.baseDir,
 | 
						|
      staticCSP: opts.staticCSP,
 | 
						|
      transformStaticCSP: opts.transformStaticCSP,
 | 
						|
      hooks: opts.uiHooks
 | 
						|
    }
 | 
						|
 | 
						|
    fastify.register(require('../routes'), options)
 | 
						|
  }
 | 
						|
 | 
						|
  const cache = {
 | 
						|
    swaggerObject: null,
 | 
						|
    swaggerString: null
 | 
						|
  }
 | 
						|
 | 
						|
  function swagger (opts) {
 | 
						|
    if (opts && opts.yaml) {
 | 
						|
      if (cache.swaggerString) return cache.swaggerString
 | 
						|
    } else {
 | 
						|
      if (cache.swaggerObject) return cache.swaggerObject
 | 
						|
    }
 | 
						|
 | 
						|
    if (opts && opts.yaml) {
 | 
						|
      const swaggerString = yaml.dump(swaggerObject, { skipInvalid: true })
 | 
						|
      cache.swaggerString = swaggerString
 | 
						|
      return swaggerString
 | 
						|
    }
 | 
						|
 | 
						|
    cache.swaggerObject = swaggerObject
 | 
						|
    return swaggerObject
 | 
						|
  }
 | 
						|
 | 
						|
  done()
 | 
						|
}
 |