pertain
Version:
Automated pub/sub across project dependencies. Run code from any installed package based on declarative rules in package.json
56 lines • 4.42 kB
JavaScript
import makeDebug from 'debug';
import ExplicitDependencySet from './ExplicitDependencySet';
import PackageJson from './PackageJson';
import resolver from './resolverFactory';
const debug = makeDebug('pertain:main');
const depsAndDevDeps = (pkg) => {
// Merging the two dependency sets that we look at will dedupe them.
// We don't care whether it comes from devDependencies or dependencies.
// Both are relevant, because many applications with a build step compile
// code from devDependencies.
const allDependencyNames = Object.keys({
...pkg.dependencies,
...pkg.devDependencies,
});
allDependencyNames.push('./'); // rootDir too
return allDependencyNames;
};
/**
* Caches the ExplicitDependencySet calculated for a given project root.
* It should not change during the lifetime of this process, so there's no
* point in recalculating it.
*/
const dependencySetCache = new Map();
/**
* Query the direct dependencies of the Node project at `rootDir` for all
* packages which have a particular `package.json` property. Return them in
* peerDependency order.
*/
function pertain(rootDir, subject, getDependencies = (found) => found) {
let depSet = dependencySetCache.get(rootDir);
if (!depSet) {
debug('no cached depset for %s', rootDir);
// A convenience function which can be replaced with an alternate resolver
// algorithm.
const resolve = resolver(rootDir);
const packageJson = new PackageJson(rootDir);
const allDependencyNames = getDependencies(depsAndDevDeps(packageJson), packageJson, rootDir, subject);
debug('%s allDependencyNames %s', rootDir, allDependencyNames);
depSet = new ExplicitDependencySet(resolve, allDependencyNames);
dependencySetCache.set(rootDir, depSet);
}
return depSet.pertaining(subject).map((dep) => ({
name: dep.name,
modulePath: dep.modulePath,
path: dep.pertains(subject),
subject,
}));
}
/**
* Clear out the cache of dependencies that have already been detected and
* loaded. Use if the dependency graph changes and you want to "hot reload"
* functionality. Or, for testing.
*/
pertain.clearCache = () => dependencySetCache.clear();
export default pertain;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVydGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJ0YWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLHFCQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sV0FBVyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUV6QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7QUFTeEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFnQixFQUFZLEVBQUU7SUFDcEQsb0VBQW9FO0lBQ3BFLHVFQUF1RTtJQUN2RSx5RUFBeUU7SUFDekUsNkJBQTZCO0lBQzdCLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyQyxHQUFHLEdBQUcsQ0FBQyxZQUFZO1FBQ25CLEdBQUcsR0FBRyxDQUFDLGVBQWU7S0FDdkIsQ0FBQyxDQUFDO0lBQ0gsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYztJQUM3QyxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUMsQ0FBQztBQStCRjs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztBQUVwRTs7OztHQUlHO0FBQ0gsU0FBUyxPQUFPLENBQ2QsT0FBZSxFQUNmLE9BQWUsRUFDZixrQkFBb0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7SUFFcEQsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxLQUFLLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsMEVBQTBFO1FBQzFFLGFBQWE7UUFDYixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQ3hDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFDM0IsV0FBVyxFQUNYLE9BQU8sRUFDUCxPQUFPLENBQ1IsQ0FBQztRQUNGLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUMvRCxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNoRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5QyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDMUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFXO1FBQ3JDLE9BQU87S0FDUixDQUFDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsT0FBTyxDQUFDLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUV0RCxlQUFlLE9BQU8sQ0FBQyJ9