ls-engines
Version:
Determine if your dependency graph's stated "engines" criteria is met.
38 lines (34 loc) • 1.25 kB
JavaScript
;
/** @import { EnginesRecord } from './validVersionsForEngines' */
const getTree = require('get-dep-tree');
/** @type {import('./getGraphEntries')} */
module.exports = async function getGraphEntries({
mode,
dev,
peer,
production,
selectedEngines,
logger = void undefined,
path = void undefined,
}) {
const tree = await getTree(mode, { dev, logger, path, peer, production });
const nodesWithEngines = await tree.querySelectorAll(':attr(engines, [node])');
return /** @type {{ name: string, package: { _inBundle?: boolean, engines?: EnginesRecord }, dev?: boolean, peer?: boolean }[]} */ (nodesWithEngines)
.flatMap(({
name,
package: {
_inBundle,
engines,
},
dev: nodeDev = false,
peer: nodePeer = false,
}) => (
!_inBundle
&& engines
&& ((dev || !nodeDev) && (production || nodeDev) && (peer || !nodePeer)) // TODO: figure out why get-dep-tree isn't pruning properly
&& selectedEngines.some((engine) => engines[engine] !== '*')
? /** @type {[string, EnginesRecord][]} */ ([[name, engines]])
: []
))
.toSorted(([a, aE], [b, bE]) => a.localeCompare(b) || /** @type {NonNullable<typeof aE.node>} */ (aE.node).localeCompare(/** @type {NonNullable<typeof bE.node>} */ (bE.node)));
};