pertain
Version:
Automated pub/sub across project dependencies. Run code from any installed package based on declarative rules in package.json
58 lines • 4.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug_1 = __importDefault(require("debug"));
const ExplicitDependencySet_1 = __importDefault(require("./ExplicitDependencySet"));
const PackageJson_1 = __importDefault(require("./PackageJson"));
const resolverFactory_1 = __importDefault(require("./resolverFactory"));
const debug = (0, debug_1.default)('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(Object.assign(Object.assign({}, 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 = (0, resolverFactory_1.default)(rootDir);
const packageJson = new PackageJson_1.default(rootDir);
const allDependencyNames = getDependencies(depsAndDevDeps(packageJson), packageJson, rootDir, subject);
debug('%s allDependencyNames %s', rootDir, allDependencyNames);
depSet = new ExplicitDependencySet_1.default(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();
exports.default = pertain;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVydGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJ0YWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQThCO0FBQzlCLG9GQUE0RDtBQUM1RCxnRUFBd0M7QUFDeEMsd0VBQXlDO0FBRXpDLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUyxFQUFDLGNBQWMsQ0FBQyxDQUFDO0FBU3hDLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBZ0IsRUFBWSxFQUFFO0lBQ3BELG9FQUFvRTtJQUNwRSx1RUFBdUU7SUFDdkUseUVBQXlFO0lBQ3pFLDZCQUE2QjtJQUM3QixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJLGlDQUNqQyxHQUFHLENBQUMsWUFBWSxHQUNoQixHQUFHLENBQUMsZUFBZSxFQUN0QixDQUFDO0lBQ0gsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYztJQUM3QyxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUMsQ0FBQztBQStCRjs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztBQUVwRTs7OztHQUlHO0FBQ0gsU0FBUyxPQUFPLENBQ2QsT0FBZSxFQUNmLE9BQWUsRUFDZixrQkFBb0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7SUFFcEQsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxLQUFLLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsMEVBQTBFO1FBQzFFLGFBQWE7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFRLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxxQkFBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUN4QyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQzNCLFdBQVcsRUFDWCxPQUFPLEVBQ1AsT0FBTyxDQUNSLENBQUM7UUFDRixLQUFLLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLElBQUksK0JBQXFCLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDaEUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztLQUN6QztJQUNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1FBQzFCLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBVztRQUNyQyxPQUFPO0tBQ1IsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE9BQU8sQ0FBQyxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7QUFFdEQsa0JBQWUsT0FBTyxDQUFDIn0=