import { version } from '../../../package.json'; import { FeatureFlagRemote } from '../../types/types'; import Logger from '../logging/logger'; import { FeatureName } from './feature'; /** * Check if the current SDK version is greater than or equal to the minimum supported SDK version. * @param minVersion - Minimum supported SDK version from remote project settings. * @param sdkVersion - Current SDK version. * @returns True if the SDK version is greater than or equal to the minimum version, otherwise false. * @throws Error if either version format is invalid. */ const isVersionSupported = ( minVersion: string, sdkVersion: string ): boolean | undefined => { // TODO: make it work for release candidate convention, example: 1.1.1.-RC1 const versionRegex = /^\d+\.\d+\.\d+$/; if (!versionRegex.test(minVersion) || !versionRegex.test(sdkVersion)) { throw new Error('Invalid version format'); } const minVersionArray = minVersion.split('.').map(Number); const sdkVersionArray = sdkVersion.split('.').map(Number); if (minVersionArray.length !== 3 || sdkVersionArray.length !== 3) { Logger.warn('Invalid version format.', true); return; } for (let i = 0; i < minVersionArray.length; i++) { if (minVersionArray[i] < sdkVersionArray[i]) { return true; } else if (minVersionArray[i] > sdkVersionArray[i]) { return false; } } return true; }; /** * Rename feature flag name to its assigned feature name. * Uses the FeatureName mapping to determine the appropriate feature name. * @param featureFlag - Remote feature flag object. * @returns Feature flag object with updated name. */ const updateFeatureFlagName = ( featureFlag: FeatureFlagRemote ): FeatureFlagRemote => { const featureName = Object.keys(FeatureName).find( key => FeatureName[key as keyof typeof FeatureName] === featureFlag.name ); if (featureName) { featureFlag.name = featureName; } return featureFlag; }; /** * Filter out React Native relevant Feature Flags. * @param {Array} featureFlags - Array of Feature Flags coming from the remote project settings. * @returns {Array} Array of valid React Native relevant Feature Flags. */ export const getSupportedFeatureFlags = ( featureFlags: FeatureFlagRemote[] ): FeatureFlagRemote[] => { const validFeatureFlags = featureFlags .filter(flag => Object.values(FeatureName).includes(flag.name)) .filter(flag => isVersionSupported(flag.min_version || '', version)) .map(flag => updateFeatureFlagName(flag)); return validFeatureFlags; };