"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getAllNativeModules = getAllNativeModules;
exports.getAllForPlatform = getAllForPlatform;
exports.getAllNativeForExpoClientOnPlatform = getAllNativeForExpoClientOnPlatform;
exports.getVersionableModulesForPlatform = getVersionableModulesForPlatform;
exports.getDetachableModules = getDetachableModules;
exports.getPublishableModules = getPublishableModules;
exports.doesVersionSatisfy = doesVersionSatisfy;

function _semver() {
  const data = _interopRequireDefault(require("semver"));

  _semver = function () {
    return data;
  };

  return data;
}

function _config() {
  const data = require("./config");

  _config = function () {
    return data;
  };

  return data;
}

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

const HIGHEST_KNOWN_VERSION = '10000.0.0';

function getAllNativeModules() {
  return [..._config().expoSdkUniversalModulesConfigs, ..._config().vendoredNativeModules].filter(moduleConfig => moduleConfig.isNativeModule);
}

function getAllForPlatform(platform, sdkVersion) {
  return _config().expoSdkUniversalModulesConfigs.filter(moduleConfig => doesVersionSatisfy(sdkVersion, moduleConfig.sdkVersions)).map(moduleConfig => ({ ...moduleConfig,
    ...moduleConfig.config[platform]
  }));
}

function getAllNativeForExpoClientOnPlatform(platform, sdkVersion) {
  return getAllForPlatform(platform, sdkVersion).filter(moduleConfig => moduleConfig.includeInExpoClient && moduleConfig.isNativeModule);
}

function getVersionableModulesForPlatform(platform, sdkVersion) {
  return getAllNativeForExpoClientOnPlatform(platform, sdkVersion).filter(moduleConfig => {
    return moduleConfig.versionable;
  });
}

function getDetachableModules(platform, sdkVersion) {
  return getAllForPlatform(platform, sdkVersion).filter(moduleConfig => moduleConfig.isNativeModule && moduleConfig.detachable);
}

function getPublishableModules(sdkVersion) {
  return _config().expoSdkUniversalModulesConfigs.filter(moduleConfig => !!moduleConfig.libName && doesVersionSatisfy(sdkVersion, moduleConfig.sdkVersions));
}

function doesVersionSatisfy(version, versionRequirement) {
  if (version === 'UNVERSIONED') {
    return _semver().default.satisfies(HIGHEST_KNOWN_VERSION, versionRequirement);
  }

  return _semver().default.satisfies(version, versionRequirement);
}
//# sourceMappingURL=../__sourcemaps__/modules/Modules.js.map