var isObject = require('lodash.isobject');
var isUndefined = require('lodash.isundefined');
var MockDescription = require('./MockDescription');

function isValidObject(val) {
  return !isUndefined(val) && val !== null && isObject(val);
}

/**
 * MixRecipe returns normalized MixRecipe instance with given recipe.
 *
 * @param {object} recipe
 * @param {string} recipe.rootDir             root directory of the test executor.
 * @param {MixMap} recipe.mocks               key-value pair of mockName and mockDescription
 */
function MixRecipe(recipe) {
  if (!isValidObject(recipe)) {
    throw new Error('MochaMix is expecting an object as an argument');
  }

  var rootDir = recipe.rootDir || process.cwd();
  var mixMap = recipe.mocks || {};
  var mocks = Object.keys(mixMap)
    .map(function (mockName) {
      return MockDescription(
        mockName,
        mixMap[mockName],
        recipe.defaultMockGenerator
      );
    });

  return {
    rootDir: rootDir,
    import: recipe.import,
    mocks: mocks
  };
}

module.exports = MixRecipe;

var fs = require('fs');
var path = require('path');
var isObject = require('lodash.isobject');
var isUndefined = require('lodash.isundefined');
var MockDescription = require('./MockDescription');
var SupportedExtensions = [
  '',
  '.js',
  '.jsx',
  '.es6',
  '.es6.js',
  '.coffee',
  '.ts'
];

function getTargetPath(rootDir, importPath) {
  var fullPath = path.isAbsolute(importPath) ?
    importPath :
    path.join(rootDir, importPath);
  var found = SupportedExtensions.some(function findFile(ext) {
    var filePath = fullPath + ext;
    return fs.existsSync(filePath);
  });

  return found ?
    path.dirname(fullPath) :
    fullPath ;
}

function isValidObject(val) {
  return !isUndefined(val) && val !== null && isObject(val);
}

/**
 * MixRecipe returns normalized MixRecipe instance with given recipe.
 *
 * @param {object} recipe
 * @param {string} recipe.rootDir             root directory of the test executor.
 * @param {MixMap} recipe.mocks               key-value pair of mockName and mockDescription
 */
function MixRecipe(recipe) {
  if (!isValidObject(recipe)) {
    throw new Error('MochaMix is expecting an object as an argument');
  }

  var rootDir = recipe.rootDir || process.cwd();
  var mixMap = recipe.mocks || {};
  var targetPath = getTargetPath(rootDir, recipe.import);
  var mocks = Object.keys(mixMap)
    .map(function (mockName) {
      return MockDescription(
        mockName,
        mixMap[mockName],
        recipe.defaultMockGenerator,
        targetPath
      );
    });

  return {
    rootDir: rootDir,
    import: recipe.import,
    mocks: mocks
  };
}

module.exports = MixRecipe;

Add targetPath support