UNPKG

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
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