Github user nikhilkh commented on a diff in the pull request:
https://github.com/apache/cordova-lib/pull/363#discussion_r54193600
--- Diff: cordova-lib/src/cordova/plugin.js ---
@@ -512,3 +535,175 @@ function versionString(version) {
return null;
}
+
+/**
+ * Gets the version of a plugin that should be fetched for a given project
based
+ * on the plugin's engine information from NPM and the platforms/plugins
installed
+ * in the project. The cordovaDependencies object in the package.json's
engines
+ * entry takes the form of an object that maps plugin versions to a series
of
+ * constraints and semver ranges. For example:
+ *
+ * { plugin-version: { constraint: semver-range, ...}, ...}
+ *
+ * Constraint can be a plugin, platform, or cordova version. Plugin-version
+ * can be either a single version (e.g. 3.0.0) or an upper bound (e.g.
<3.0.0)
+ *
+ * @param {string} projectRoot The path to the root directory of the
project
+ * @param {object} pluginInfo The NPM info of the plugin be fetched
(e.g. the
+ * result of calling `registry.info()`)
+ * @param {string} cordovaVersion The semver version of cordova-lib
+ *
+ * @return {Promise} A promise that will resolve to either
a string
+ * if there is a version of the plugin
that this
+ * project satisfies or null if there is
not
+ */
+function getFetchVersion(projectRoot, pluginInfo, cordovaVersion) {
+ // Figure out the project requirements
+ if (pluginInfo.engines && pluginInfo.engines.cordovaDependencies) {
+ var pluginList = getInstalledPlugins(projectRoot);
+ var pluginMap = {};
+
+ pluginList.forEach(function(plugin) {
+ pluginMap[plugin.id] = plugin.version;
+ });
+
+ return cordova_util.getInstalledPlatformsWithVersions(projectRoot)
+ .then(function(platformVersions) {
+ return determinePluginVersionToFetch(
+ pluginInfo.versions,
+ pluginInfo.engines.cordovaDependencies,
+ pluginMap,
+ platformVersions,
+ cordovaVersion);
+ });
+ } else {
+ // If we have no engine, we want to fall back to the default
behavior
+ events.emit('verbose', 'No plugin engine info found, falling back
to latest or pinned version');
+ return Q(null);
+ }
+}
+
+function determinePluginVersionToFetch(allVersions, engine, pluginMap,
platformMap, cordovaVersion) {
+ var versions = [];
+ var latest = allVersions[allVersions.length - 1];
+ var upperBound = null;
+ var upperBoundRange = null;
+
+ for(var version in engine) {
+ if(version.indexOf('<') === 0 &&
semver.valid(version.substring(1))) {
--- End diff --
It might be a good idea to be more robust with whitespaces here.
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]