|  | 'use strict'; | 
|  | var path = require('path'); | 
|  | var pathExists = require('path-exists'); | 
|  | var Promise = require('pinkie-promise'); | 
|  |  | 
|  | function splitPath(x) { | 
|  | return path.resolve(x || '').split(path.sep); | 
|  | } | 
|  |  | 
|  | function join(parts, filename) { | 
|  | return path.resolve(parts.join(path.sep) + path.sep, filename); | 
|  | } | 
|  |  | 
|  | module.exports = function (filename, opts) { | 
|  | opts = opts || {}; | 
|  |  | 
|  | var parts = splitPath(opts.cwd); | 
|  |  | 
|  | return new Promise(function (resolve) { | 
|  | (function find() { | 
|  | var fp = join(parts, filename); | 
|  |  | 
|  | pathExists(fp).then(function (exists) { | 
|  | if (exists) { | 
|  | resolve(fp); | 
|  | } else if (parts.pop()) { | 
|  | find(); | 
|  | } else { | 
|  | resolve(null); | 
|  | } | 
|  | }); | 
|  | })(); | 
|  | }); | 
|  | }; | 
|  |  | 
|  | module.exports.sync = function (filename, opts) { | 
|  | opts = opts || {}; | 
|  |  | 
|  | var parts = splitPath(opts.cwd); | 
|  | var len = parts.length; | 
|  |  | 
|  | while (len--) { | 
|  | var fp = join(parts, filename); | 
|  |  | 
|  | if (pathExists.sync(fp)) { | 
|  | return fp; | 
|  | } | 
|  |  | 
|  | parts.pop(); | 
|  | } | 
|  |  | 
|  | return null; | 
|  | }; |