55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
|
/**
|
||
|
* Walk up the directory tree until the specified path is found.
|
||
|
*
|
||
|
* @module walk-back
|
||
|
* @example
|
||
|
* const walkBack = require('walk-back')
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Returns an absolute file path (if found) else `null`.
|
||
|
*
|
||
|
* @param {string} - the directory to start in
|
||
|
* @param {string} - the path we're looking for
|
||
|
* @return {string}
|
||
|
* @alias module:walk-back
|
||
|
* @example
|
||
|
* > walkBack('/Users/lloyd/Documents/75lb/walk-back', 'package.json')
|
||
|
* '/Users/lloyd/Documents/75lb/walk-back/package.json'
|
||
|
*
|
||
|
* > walkBack('/Users/lloyd/Documents/75lb/walk-back', '75lb')
|
||
|
* '/Users/lloyd/Documents/75lb'
|
||
|
*
|
||
|
* > walkBack('/Users/lloyd/Documents/75lb/walk-back', '.bash_profile')
|
||
|
* '/Users/lloyd/.bash_profile'
|
||
|
*
|
||
|
* > walkBack('.', '.bash_profile')
|
||
|
* '/Users/lloyd/.bash_profile'
|
||
|
*
|
||
|
* > walkBack('/Users/lloyd/Documents/75lb/walk-back', 'non-existent.file')
|
||
|
* null
|
||
|
*/
|
||
|
function walkBack (startAt, lookingFor) {
|
||
|
const path = require('path')
|
||
|
const fs = require('fs')
|
||
|
startAt = path.resolve(startAt)
|
||
|
if (fs.existsSync(startAt) && fs.statSync(startAt).isDirectory()) {
|
||
|
const dirs = path.resolve(startAt).split(path.sep)
|
||
|
for (let i = 0; i < dirs.length; i++) {
|
||
|
const basedir = i < dirs.length - 1
|
||
|
? dirs.slice(0, dirs.length - i).join(path.sep)
|
||
|
: path.sep
|
||
|
|
||
|
if (fs.existsSync(path.join(basedir, lookingFor))) {
|
||
|
return path.join(basedir, lookingFor)
|
||
|
}
|
||
|
}
|
||
|
/* if we reached here, nothing was found */
|
||
|
return null
|
||
|
} else {
|
||
|
throw new Error('startAt path must be an existing directory: ' + startAt)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = walkBack
|