“use strict”;

Object.defineProperty(exports, “__esModule”, {

value: true

}); exports.isPluginRequired = isPluginRequired; exports.default = _default;

var _semver = _interopRequireDefault(require(“semver”));

var _utils = require(“./utils”);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isPluginRequired(supportedEnvironments, plugin) {

const targetEnvironments = Object.keys(supportedEnvironments);

if (targetEnvironments.length === 0) {
  return true;
}

const isRequiredForEnvironments = targetEnvironments.filter(environment => {
  if (!plugin[environment]) {
    return true;
  }

  const lowestImplementedVersion = plugin[environment];
  const lowestTargetedVersion = supportedEnvironments[environment];

  if ((0, _utils.isUnreleasedVersion)(lowestTargetedVersion, environment)) {
    return false;
  }

  if ((0, _utils.isUnreleasedVersion)(lowestImplementedVersion, environment)) {
    return true;
  }

  if (!_semver.default.valid(lowestTargetedVersion.toString())) {
    throw new Error(`Invalid version passed for target "${environment}": "${lowestTargetedVersion}". ` + "Versions must be in semver format (major.minor.patch)");
  }

  return _semver.default.gt((0, _utils.semverify)(lowestImplementedVersion), lowestTargetedVersion.toString());
});
return isRequiredForEnvironments.length > 0;

}

function _default(list, includes, excludes, targets, defaultIncludes, defaultExcludes, pluginSyntaxMap) {

const result = new Set();

for (const item in list) {
  if (!excludes.has(item) && (isPluginRequired(targets, list[item]) || includes.has(item))) {
    result.add(item);
  } else if (pluginSyntaxMap) {
    const shippedProposalsSyntax = pluginSyntaxMap.get(item);

    if (shippedProposalsSyntax) {
      result.add(shippedProposalsSyntax);
    }
  }
}

if (defaultIncludes) {
  defaultIncludes.forEach(item => !excludes.has(item) && result.add(item));
}

if (defaultExcludes) {
  defaultExcludes.forEach(item => !includes.has(item) && result.delete(item));
}

return result;

}