Source: resolve-filename.js

import Bluebird from 'bluebird';
import objectAssign from 'object-assign';
import fs from 'fs';
import path from 'path';

/**
* lookup file with extensions in dist
* eg: resolveFileName('foo') -> 'foo.js' or 'foo.json'
*
* @function resolveFileName
* @param {string} file - lookup filename
* @param {object} [options]
* @param {object} [options.dist] - a base path
* @param {object} [options.extensions] - lookup file extensions
* @return {promise} fileName - fulfill is lookedup file
*/
const resolveFileName = (file, options = {}, callback) => {
  const opts = objectAssign({
    dist: process.cwd(),
    extensions: ['', '.js', '.json'],
  }, options);

  opts.extensions.reduceRight((next, ext) => () => {
    const fileName = path.join(opts.dist, `${file}${ext}`);

    fs.stat(fileName, (error, stat) => {
      if (stat && stat.isFile()) {
        callback(null, fileName);
      } else if (stat && stat.isDirectory()) {
        resolveFileName(path.join(file, 'index'), opts, callback);
      } else if (error && error.code !== 'ENOENT') {
        callback(error);
      } else {
        next();
      }
    });
  }, () => {
    callback(new Error(`no such file: ${file}`));
  })();
};
export default Bluebird.promisify(resolveFileName);