pertain
Version:
Automated pub/sub across project dependencies. Run code from any installed package based on declarative rules in package.json
49 lines • 5.18 kB
JavaScript
import path from 'path';
import pertain from '../';
import TopologicalSorter from '../TopologicalSorter';
const projectPath = path.join(__dirname, '__fixtures__/cool-cactus');
test('provides info about pertaining dependencies, in dependency order', () => {
expect(pertain(projectPath, 'germane.draw')
// hide absolute paths so snapshot is portable
.map((dep) => ({
path: path.relative(projectPath, dep.path),
modulePath: path.relative(projectPath, dep.modulePath),
name: dep.name,
subject: dep.subject,
}))).toMatchSnapshot();
});
test('pertains to "germane.identify" in dep order to list ingredients in a cool cactus', () => {
const identifiers = pertain(projectPath, 'germane.identify');
const ingredients = identifiers
.map((i) => `- ${i.name} adds ${require(i.path)()}`)
.join('\n');
expect(ingredients).toMatchSnapshot();
});
test('runs the same sequence without invoking sort twice', () => {
pertain.clearCache();
const sort = jest.spyOn(TopologicalSorter.prototype, 'sort');
pertain(projectPath, 'germane.identify');
pertain(projectPath, 'germane.identify');
expect(sort).toHaveBeenCalledTimes(1);
sort.mockRestore();
});
test('pertains to "germane.draw" in dep order to draw the cool cactus', () => {
const picture = pertain(projectPath, 'germane.draw').reduce((drawing, artist) => require(artist.path)(drawing), '');
expect(picture).toMatchSnapshot();
});
test('throws informative error if a dep declares an invalid pertainer', () => {
expect(() => pertain(projectPath, 'lies')).toThrow('could not find');
});
test('throws informative error if circular deps are detected', () => {
expect(() => pertain(projectPath, 'humpty')).toThrow('Cyclic');
});
test('accepts custom DependencyFinder', () => {
pertain.clearCache();
const allTalk = pertain(projectPath, 'germane.identify', () => [
'cactus-attitude',
])
.map((dep) => require(dep.path)())
.join('');
expect(allTalk).toBe('a bad attitude');
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVydGFpbi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL19fdGVzdHNfXy9wZXJ0YWluLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sT0FBTyxNQUFNLEtBQUssQ0FBQztBQUMxQixPQUFPLGlCQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDBCQUEwQixDQUFDLENBQUM7QUFFckUsSUFBSSxDQUFDLGtFQUFrRSxFQUFFLEdBQUcsRUFBRTtJQUM1RSxNQUFNLENBQ0osT0FBTyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUM7UUFDbEMsOENBQThDO1NBQzdDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNiLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQzFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3RELElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtRQUNkLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztLQUNyQixDQUFDLENBQUMsQ0FDTixDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3RCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLGtGQUFrRixFQUFFLEdBQUcsRUFBRTtJQUM1RixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDN0QsTUFBTSxXQUFXLEdBQUcsV0FBVztTQUM1QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztTQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDeEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFO0lBQzlELE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDekMsT0FBTyxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDckIsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFO0lBQzNFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUN6RCxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQ2xELEVBQUUsQ0FDSCxDQUFDO0lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3BDLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLGlFQUFpRSxFQUFFLEdBQUcsRUFBRTtJQUMzRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsRUFBRTtJQUNsRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqRSxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7SUFDM0MsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3JCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDN0QsaUJBQWlCO0tBQ2xCLENBQUM7U0FDQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDWixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDLENBQUMifQ==