HEX
Server: nginx/1.28.3
System: Linux lightweb-s1 5.15.0-173-generic #183-Ubuntu SMP Fri Mar 6 13:29:34 UTC 2026 x86_64
User: drdrivek-71 (1047)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: /home/eslinced-103/brise-edu.or.kr/node_modules/semver-set/lib/intersect.js
var semver = require('semver');
var product = require('cartesian-product');
var _ = require('lodash');
var invariant = require('invariant');

var pluck = _.pluck;
var reduce = _.reduce;
var map = _.map;
var flatten = _.flatten;
var filter = _.filter;

var lowest = { semver: -Infinity, operator: '>' };
var highest = { semver: Infinity, operator: '<' };

function cmp(a, b) {
	if (a === '<' && b === '<=') {
		return -1;
	} else if (a === '<=' && b === '<') {
		return 1;
	} else if (a === '>' && b === '>=') {
		return 1;
	} else if (a === '>=' && b === '>') {
		return -1;
	} else {
		return 0;
	}
}

function icmp(a, b) {
	if (a === Infinity) {
		return 1;
	} else if (b === Infinity) {
		return -1;
	} else if (a === -Infinity) {
		return -1;
	} else if (b === -Infinity) {
		return 1;
	} else {
		return 0;
	}
}

function rcmp(a, b) {
	return icmp(a.semver, b.semver) ||
		semver.compare(a.semver, b.semver) ||
		cmp(a.operator, b.operator);
}

function min(a, b) {
	return rcmp(a, b) < 0 ? a : b;
}

function max(a, b) {
	return rcmp(a, b) > 0 ? a : b;
}

function isHi(entry) {
	return /^<?=?$/.test(entry.operator);
}

function isLo(entry) {
	return /^>?=?$/.test(entry.operator);
}

function combine(set, a) {

	var hi = set[1],
		lo = set[0];

	invariant(isLo(lo), 'lo entry must be a lower bound');
	invariant(isHi(hi), 'hi entry must be an upper bound');

	if (isHi(a)) {
		hi = min(a, hi);
	}

	if (isLo(a)) {
		lo = max(a, lo);
	}

	return [lo, hi];
}

function intersect() {
	ranges = map(arguments, semver.Range);
	// item.set is an array of disjunctions – we can match any of the entries
	// this means we must take the cartesian product of all the disjunctions,
	// intersect them with each other, and take the disjunction of the result
	// naturally any empty results can simply be omitted.

	ranges = filter(map(product(pluck(ranges, 'set')), function(values) {
		return reduce(flatten(values), combine, [ lowest, highest ]);
	}), function(entry) {
		var lo = entry[0], hi = entry[1];
		return lo.test(hi.semver) && hi.test(lo.semver);
	});

	ranges = map(ranges, function(range) {
		var lo = range[0], hi = range[1];
		if (lo.operator === '>=' && hi.operator === '<') {
			if (/\.0\.0$/.test(hi.semver.raw)) {
				return '^' + lo.semver.raw;
			} else if (/\.0$/.test(hi.semver.raw)) {
				// Anything in the 0.x.x line behaves like ~ even for the ^
				// operator.
				if (/^0\./.test(lo.semver.raw)) {
					return '^' + lo.semver.raw;
				} else {
					return '~' + lo.semver.raw;
				}
			}
		}
		return lo.operator+lo.semver.raw + ' && ' + hi.operator+hi.semver.raw;
	});

	if (ranges.length === 0) {
		return null;
	}

	return ranges.join(' || ');
}

module.exports = intersect;