UNPKG

paco

Version:

Node package development/distribution utility kit

100 lines (84 loc) 3.13 kB
'use strict'; 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 };