All files / lib index.js

90% Statements 18/20
90.91% Branches 10/11
83.33% Functions 5/6
90% Lines 18/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85                                                  8x 8x 7x 1x   7x 1x   7x 2x               8x 8x 7x                 8x     5x   1x   1x     1x               1x             6x            
import {
  ContainerBuilder,
  YamlFileLoader,
  JsFileLoader,
  JsonFileLoader
} from 'node-dependency-injection'
import path from 'path'
import ExtensionConfigurationFileNameException from
  './exception/ExtensionConfigurationFileNameException'
 
/**
 * Dependency Injection middleware
 */
export default class Index {
  /**
   * @param {string} serviceFilePath
   * @param {boolean} compile
   * @param {[]} compilerPass
   * @param {*} logger
   * @return {Index.middleware}
   */
  constructor ({
    serviceFilePath, compile = false, compilerPass = [],
    logger = null
  }) {
    this._container = new ContainerBuilder()
    this.serviceFilePath = serviceFilePath
    for (let pass of compilerPass) {
      this._container.addCompilerPass(pass)
    }
    if (logger) {
      this._container.logger = logger
    }
    if (compile) {
      this._container.compile()
    }
  }
 
  /**
   * @param {string} serviceFilePath
   */
  set serviceFilePath (serviceFilePath) {
    const extName = path.extname(serviceFilePath).replace('.', '')
    const loader = this._getLoader(extName)
    loader.load(serviceFilePath)
  }
 
  /**
   * @param extName
   * @return {YamlFileLoader|JsFileLoader|JsonFileLoader|FileLoader}
   * @private
   */
  _getLoader (extName) {
    switch (extName) {
      case 'yaml':
      case 'yml':
        return new YamlFileLoader(this._container)
      case 'js':
        return new JsFileLoader(this._container)
      case 'json':
        return new JsonFileLoader(this._container)
    }
 
    throw new ExtensionConfigurationFileNameException(
      `${extName} is not supported`)
  }
 
  /**
   * @return {ContainerBuilder}
   */
  get container () {
    return this._container
  }
 
  /**
   * @return {function}
   */
  middleware () {
    return (req, res, next) => {
      req.container = this._container
      next()
    }
  }
}