diff --git a/desktop/flipper-server-core/src/plugins/isPluginVersionMoreRecent.tsx b/desktop/flipper-server-core/src/plugins/isPluginVersionMoreRecent.tsx new file mode 100644 index 000000000..2a710f5eb --- /dev/null +++ b/desktop/flipper-server-core/src/plugins/isPluginVersionMoreRecent.tsx @@ -0,0 +1,47 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import {ConcretePluginDetails} from 'flipper-common'; +import semver from 'semver'; +import isPluginCompatible from './isPluginCompatible'; + +export function isPluginVersionMoreRecent( + versionDetails: ConcretePluginDetails, + otherVersionDetails: ConcretePluginDetails, +) { + const isPlugin1Compatible = isPluginCompatible(versionDetails); + const isPlugin2Compatible = isPluginCompatible(otherVersionDetails); + + // prefer compatible plugins + if (isPlugin1Compatible && !isPlugin2Compatible) return true; + if (!isPlugin1Compatible && isPlugin2Compatible) return false; + + // prefer plugins with greater version + if (semver.gt(versionDetails.version, otherVersionDetails.version)) { + return true; + } + if ( + semver.eq(versionDetails.version, otherVersionDetails.version) && + versionDetails.isBundled + ) { + // prefer bundled versions + return true; + } + if ( + semver.eq(versionDetails.version, otherVersionDetails.version) && + versionDetails.isActivatable && + !otherVersionDetails.isActivatable + ) { + // prefer locally available versions to the versions available remotely on marketplace + return true; + } + return false; +} + +export default isPluginVersionMoreRecent;