| '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; | 
| }; |