paco
Version:
Node package development/distribution utility kit
100 lines (84 loc) • 3.13 kB
JavaScript
;
var path = require('path');
var uppity = require('uppity');
/**
* Returns an interpolated string where path variables has been
* replaced with actual paths.
*/
function getInterpolatedPaths(pathStr) {
if (!pathStr) {
return pathStr;
}
return pathStr.replace(/%root_paco_path%/g, process.env.PACO_ROOT_PATH).replace(/%package_path%/g, process.env.PACO_PACKAGE_PATH);
}
/**
* Returns a pathname's relative path to the paco root
*/
function pathRelativeToRoot(pathname) {
return path.resolve(process.env.PACO_ROOT_PATH, pathname);
}
/**
* Returns a pathname's relative path to the current
* nearest package.
*/
function pathRelativeToPackage(pathname) {
return path.resolve(process.env.PACO_PACKAGE_PATH, pathname);
}
/**
* Traverses the directory tree from a starting point and returns
* an array of all files with a given filename.
*/
function getTraversedFilesNamed(filename) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
options.startAt = options.startAt || process.cwd();
options.stopAt = options.stopAt || path.parse(options.startAt).root;
var lowestDepth = options.stopAt.split(path.sep).length;
return uppity(filename).filter(function (file) {
return path.dirname(file).split(path.sep).length >= lowestDepth;
});
}
/**
* Returns the full path to the nearest file with a given name,
* where searching starts from `startPath`.
*/
function getNearestPathToFileWithName(filename, startPath) {
var allMatches = getTraversedFilesNamed(filename, { startAt: startPath });
return allMatches && allMatches.length > 0 ? allMatches[0] : new Error('No ' + filename + ' available in directory tree');
}
/**
* Returns a path to the nearest directory containing a file
* with a given name, where searching start from `startPath`.
*/
function getNearestDirContainingFileNamed(filename, startPath) {
try {
var filePath = getNearestPathToFileWithName(filename, startPath);
return path.dirname(filePath);
} catch (ex) {
return ex;
}
}
/**
* Returns a path to the last occurance of a file up the
* directory tree.
*/
function getHighestPathToFileNamed(filename, startPath) {
var allMatches = getTraversedFilesNamed(filename, { startAt: startPath });
return allMatches && allMatches.length > 0 ? allMatches[allMatches.length - 1] : new Error('No ' + filename + ' available in directory tree');
}
/**
* Returns a path to the last parent directory containing a file
* with a given name.
*/
function getHighestDirContainingFileNamed(filename, startPath) {
return path.dirname(getHighestPathToFileNamed(filename, startPath));
}
module.exports = {
getInterpolatedPaths: getInterpolatedPaths,
pathRelativeToRoot: pathRelativeToRoot,
pathRelativeToPackage: pathRelativeToPackage,
getTraversedFilesNamed: getTraversedFilesNamed,
getNearestPathToFileWithName: getNearestPathToFileWithName,
getNearestDirContainingFileNamed: getNearestDirContainingFileNamed,
getHighestPathToFileNamed: getHighestPathToFileNamed,
getHighestDirContainingFileNamed: getHighestDirContainingFileNamed
};