UNPKG

ls-engines

Version:

Determine if your dependency graph's stated "engines" criteria is met.

57 lines (48 loc) 1.76 kB
'use strict'; /** @import { SemVerString } from './getAllVersions' */ /** @import { GraphAllowedEntry } from './getGraphValids' */ const { default: intersect } = require('fast_array_intersect'); const compare = require('semver/functions/compare'); const { entries, fromEntries, } = Object; const validVersionsForEngines = require('./validVersionsForEngines'); /** @type {import('./getGraphValids')} */ module.exports = async function getGraphValids(graphEntries, allVersions) { if (!Array.isArray(graphEntries)) { throw new TypeError('`graphEntries` must be an array'); } if (!allVersions || typeof allVersions !== 'object' || Array.isArray(allVersions)) { throw new TypeError('`allVersions` must be an object'); } if (graphEntries.length === 0) { return { allowed: [], valids: {}, }; } /** @type {GraphAllowedEntry[]} */ const graphAllowed = await Promise.all(graphEntries.map(async ([name, engines]) => /** @type {const} */ ([ name, engines, await validVersionsForEngines(engines, allVersions), ]))); const mergedGraphEngines = graphAllowed.reduce((mergedEngines, [, , engines]) => { entries(engines).forEach(([engine, versions]) => { if (!Array.isArray(mergedEngines[engine])) { mergedEngines[engine] = []; // eslint-disable-line no-param-reassign } // eslint-disable-next-line no-param-reassign mergedEngines[engine][mergedEngines[engine].length] = versions; }); return mergedEngines; }, /** @type {{ [engine: string]: SemVerString[][] }} */ ({})); return { allowed: graphAllowed, valids: fromEntries(entries(mergedGraphEngines).map(([engine, versionArrays]) => { const intersection = intersect(versionArrays); return [engine, intersection.sort((a, b) => -compare(a, b))]; })), }; };