From b307ea6d43741ecdf30eb4eb3ce16d52a14baf6a Mon Sep 17 00:00:00 2001 From: rikinsk Date: Thu, 16 May 2019 16:57:52 +0530 Subject: [PATCH 1/2] update semver code --- console/src/components/Main/Actions.js | 29 ++++---- console/src/components/Main/Main.js | 65 +++++++++--------- console/src/helpers/semver.js | 95 ++++++-------------------- 3 files changed, 68 insertions(+), 121 deletions(-) diff --git a/console/src/components/Main/Actions.js b/console/src/components/Main/Actions.js index 8827f168f4958..0a407874a25b2 100644 --- a/console/src/components/Main/Actions.js +++ b/console/src/components/Main/Actions.js @@ -10,7 +10,7 @@ import { ADMIN_SECRET_ERROR, UPDATE_DATA_HEADERS, } from '../Services/Data/DataActions'; -import semverCheck, { componentsSemver } from '../../helpers/semver'; +import { getFeaturesSupport } from '../../helpers/semver'; import { changeRequestHeader } from '../Services/ApiExplorer/Actions'; const SET_MIGRATION_STATUS_SUCCESS = 'Main/SET_MIGRATION_STATUS_SUCCESS'; @@ -31,23 +31,22 @@ const UPDATE_ADMIN_SECRET_INPUT = 'Main/UPDATE_ADMIN_SECRET_INPUT'; const LOGIN_IN_PROGRESS = 'Main/LOGIN_IN_PROGRESS'; const LOGIN_ERROR = 'Main/LOGIN_ERROR'; -const SET_SEMVER = 'Main/SET_SEMVER'; -const setSemverBulk = data => ({ - type: SET_SEMVER, +const SET_FEATURES_SUPPORT = 'Main/SET_FEATURES_SUPPORT'; +const setFeaturesSupport = data => ({ + type: SET_FEATURES_SUPPORT, data, }); -const semverInit = () => { +const featureSupportInit = () => { return (dispatch, getState) => { const { serverVersion } = getState().main; if (!serverVersion) { return; } - const semverObj = {}; - Object.keys(componentsSemver).forEach(feature => { - semverObj[feature] = semverCheck(feature, serverVersion); - }); - return dispatch(setSemverBulk(semverObj)); + + const featuresSupport = getFeaturesSupport(serverVersion); + + return dispatch(setFeaturesSupport(featuresSupport)); }; }; @@ -95,7 +94,7 @@ const loadServerVersion = () => dispatch => { ); }; -const checkServerUpdates = () => (dispatch, getState) => { +const loadLatestServerVersion = () => (dispatch, getState) => { const url = Endpoints.updateCheck + '?agent=console&version=' + @@ -305,10 +304,10 @@ const mainReducer = (state = defaultState, action) => { return { ...state, loginInProgress: action.data }; case LOGIN_ERROR: return { ...state, loginError: action.data }; - case SET_SEMVER: + case SET_FEATURES_SUPPORT: return { ...state, - semver: { ...action.data }, + featuresSupport: { ...action.data }, }; default: return state; @@ -328,6 +327,6 @@ export { LOGIN_ERROR, validateLogin, loadServerVersion, - checkServerUpdates, - semverInit, + loadLatestServerVersion, + featureSupportInit, }; diff --git a/console/src/components/Main/Main.js b/console/src/components/Main/Main.js index 3816f6b475902..13951e4dc4ce4 100644 --- a/console/src/components/Main/Main.js +++ b/console/src/components/Main/Main.js @@ -6,7 +6,11 @@ import globals from '../../Globals'; import * as tooltip from './Tooltips'; import 'react-toggle/style.css'; import Spinner from '../Common/Spinner/Spinner'; -import { loadServerVersion, checkServerUpdates, semverInit } from './Actions'; +import { + loadServerVersion, + loadLatestServerVersion, + featureSupportInit, +} from './Actions'; import { loadConsoleOpts } from '../../telemetry/Actions.js'; import './NotificationOverrides.css'; import { @@ -14,21 +18,22 @@ import { redirectToMetadataStatus, } from '../Services/Metadata/Actions'; -const semver = require('semver'); - import { getLoveConsentState, setLoveConsentState, } from './loveConsentLocalStorage'; +import { versionGT } from '../../helpers/semver'; + class Main extends React.Component { constructor(props) { super(props); + this.state = { - showBannerNotification: false, + showUpdateNotification: false, + loveConsentState: getLoveConsentState(), }; - this.state.loveConsentState = getLoveConsentState(); this.handleBodyClick = this.handleBodyClick.bind(this); } @@ -40,7 +45,7 @@ class Main extends React.Component { .addEventListener('click', this.handleBodyClick); dispatch(loadServerVersion()).then(() => { - dispatch(semverInit()); + dispatch(featureSupportInit()); dispatch(loadInconsistentObjects()).then(() => { this.handleMetadataRedirect(); @@ -48,23 +53,23 @@ class Main extends React.Component { dispatch(loadConsoleOpts()); - dispatch(checkServerUpdates()).then(() => { - let isUpdateAvailable = false; + dispatch(loadLatestServerVersion()).then(() => { try { - isUpdateAvailable = semver.gt( - this.props.latestServerVersion, - this.props.serverVersion - ); const isClosedBefore = window.localStorage.getItem( this.props.latestServerVersion + '_BANNER_NOTIFICATION_CLOSED' ); - if (isClosedBefore === 'true') { - isUpdateAvailable = false; - this.setState({ showBannerNotification: false }); - } else { - this.setState({ - showBannerNotification: isUpdateAvailable, - }); + + if (isClosedBefore !== 'true') { + const isUpdateAvailable = versionGT( + this.props.latestServerVersion, + this.props.serverVersion + ); + + if (isUpdateAvailable) { + this.setState({ + showUpdateNotification: true, + }); + } } } catch (e) { console.error(e); @@ -111,7 +116,7 @@ class Main extends React.Component { latestServerVersion + '_BANNER_NOTIFICATION_CLOSED', 'true' ); - this.setState({ showBannerNotification: false }); + this.setState({ showUpdateNotification: false }); } render() { @@ -207,11 +212,11 @@ class Main extends React.Component { return adminSecretHtml; }; - const getBannerNotification = () => { - let bannerNotificationHtml = null; + const getUpdateNotification = () => { + let updateNotificationHtml = null; - if (this.state.showBannerNotification) { - bannerNotificationHtml = ( + if (this.state.showUpdateNotification) { + updateNotificationHtml = (
{' '} {/* phantom div to prevent overlapping of banner with content. */} @@ -254,7 +259,7 @@ class Main extends React.Component {
); } - return bannerNotificationHtml; + return updateNotificationHtml; }; const getLoveSection = () => { @@ -323,9 +328,7 @@ class Main extends React.Component {
{'GitHub'}
@@ -356,9 +359,7 @@ class Main extends React.Component {
{'Twitter'}
@@ -591,7 +592,7 @@ class Main extends React.Component { {getMainContent()}
- {getBannerNotification()} + {getUpdateNotification()} ); diff --git a/console/src/helpers/semver.js b/console/src/helpers/semver.js index 0fd91a0dadf31..58bc9c758606c 100644 --- a/console/src/helpers/semver.js +++ b/console/src/helpers/semver.js @@ -1,84 +1,31 @@ const semver = require('semver'); // list of feature launch versions -const componentsSemver = { - // feature: '1.0.1' +const featureVersions = { + // feature: 'v1.0.0' }; -const getPreRelease = version => { - const prerelease = semver.prerelease(version); - if (!prerelease) { - return ''; - } - // TODO: fix beta parsing - if (prerelease.length === 1) { - const regex = /(alpha|beta)(\d+)/gm; - const str = prerelease[0]; - const m = regex.exec(str); - if (m.length < 3) { - return ''; - } - return m.slice(1, 3); - } - return prerelease.slice(0, 2); -}; - -const semverCheck = (component, serverVersion) => { - if (component in componentsSemver) { - const componentCoerce = semver.valid(componentsSemver[component]); - if (componentCoerce == null) { - return false; +export const getFeaturesSupport = serverVersion => { + const featuresSupport = {}; + + Object.keys(featureVersions).forEach(feature => { + try { + featuresSupport[feature] = semver.satisfies( + featureVersions[feature], + '>=' + serverVersion + ); + } catch (e) { + console.log(e); } + }); - const serverCoerce = semver.valid(serverVersion); - if (serverCoerce == null) { - return true; - } - - switch (semver.compare(serverCoerce, componentCoerce)) { - case 0: - // check for prerelease tags - const componentPrerelease = getPreRelease(componentsSemver[component]); - const serverPrerelease = getPreRelease(serverVersion); - // If both component and server doesn't have a prerelease, return true - if (componentPrerelease.length === 0 && serverPrerelease.length === 0) { - return true; - } - // If component does't have a prerelease tag and server has a p rerelease - // tag, return false - if (componentPrerelease.length === 0 && serverPrerelease.length !== 0) { - return false; - } - // If server does't have a prerelease tag and component has a prerelease - // tag, return true - if (componentPrerelease.length !== 0 && serverPrerelease.length === 0) { - return true; - } - if ( - componentPrerelease[0] === 'beta' && - serverPrerelease[0] !== 'beta' - ) { - return false; - } - if ( - parseInt(serverPrerelease[1], 10) >= - parseInt(componentPrerelease[1], 10) - ) { - return true; - } - return false; + return featuresSupport; +}; - case 1: - return true; - case -1: - return false; - default: - return false; - } +export const versionGT = (version1, version2) => { + try { + return semver.gt(version1, version2); + } catch (e) { + console.log(e); } - return false; }; - -export { componentsSemver }; - -export default semverCheck; From 25f38b68eeccab1069bc1d7638affe39f62a3180 Mon Sep 17 00:00:00 2001 From: rikinsk Date: Fri, 17 May 2019 01:16:34 +0530 Subject: [PATCH 2/2] update semver --- console/src/components/Main/Actions.js | 20 ++++++++-------- console/src/components/Main/Main.js | 6 ++--- console/src/components/Main/State.js | 1 + console/src/helpers/semver.js | 31 ------------------------- console/src/helpers/versionUtils.js | 32 ++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 44 deletions(-) delete mode 100644 console/src/helpers/semver.js create mode 100644 console/src/helpers/versionUtils.js diff --git a/console/src/components/Main/Actions.js b/console/src/components/Main/Actions.js index 0a407874a25b2..9be79568d93ce 100644 --- a/console/src/components/Main/Actions.js +++ b/console/src/components/Main/Actions.js @@ -10,7 +10,7 @@ import { ADMIN_SECRET_ERROR, UPDATE_DATA_HEADERS, } from '../Services/Data/DataActions'; -import { getFeaturesSupport } from '../../helpers/semver'; +import { getFeaturesCompatibility } from '../../helpers/versionUtils'; import { changeRequestHeader } from '../Services/ApiExplorer/Actions'; const SET_MIGRATION_STATUS_SUCCESS = 'Main/SET_MIGRATION_STATUS_SUCCESS'; @@ -31,22 +31,22 @@ const UPDATE_ADMIN_SECRET_INPUT = 'Main/UPDATE_ADMIN_SECRET_INPUT'; const LOGIN_IN_PROGRESS = 'Main/LOGIN_IN_PROGRESS'; const LOGIN_ERROR = 'Main/LOGIN_ERROR'; -const SET_FEATURES_SUPPORT = 'Main/SET_FEATURES_SUPPORT'; -const setFeaturesSupport = data => ({ - type: SET_FEATURES_SUPPORT, +const SET_FEATURES_COMPATIBILITY = 'Main/SET_FEATURES_COMPATIBILITY'; +const setFeaturesCompatibility = data => ({ + type: SET_FEATURES_COMPATIBILITY, data, }); -const featureSupportInit = () => { +const featureCompatibilityInit = () => { return (dispatch, getState) => { const { serverVersion } = getState().main; if (!serverVersion) { return; } - const featuresSupport = getFeaturesSupport(serverVersion); + const featuresCompatibility = getFeaturesCompatibility(serverVersion); - return dispatch(setFeaturesSupport(featuresSupport)); + return dispatch(setFeaturesCompatibility(featuresCompatibility)); }; }; @@ -304,10 +304,10 @@ const mainReducer = (state = defaultState, action) => { return { ...state, loginInProgress: action.data }; case LOGIN_ERROR: return { ...state, loginError: action.data }; - case SET_FEATURES_SUPPORT: + case SET_FEATURES_COMPATIBILITY: return { ...state, - featuresSupport: { ...action.data }, + featuresCompatibility: { ...action.data }, }; default: return state; @@ -328,5 +328,5 @@ export { validateLogin, loadServerVersion, loadLatestServerVersion, - featureSupportInit, + featureCompatibilityInit, }; diff --git a/console/src/components/Main/Main.js b/console/src/components/Main/Main.js index 13951e4dc4ce4..83c8f9e24cd10 100644 --- a/console/src/components/Main/Main.js +++ b/console/src/components/Main/Main.js @@ -9,7 +9,7 @@ import Spinner from '../Common/Spinner/Spinner'; import { loadServerVersion, loadLatestServerVersion, - featureSupportInit, + featureCompatibilityInit, } from './Actions'; import { loadConsoleOpts } from '../../telemetry/Actions.js'; import './NotificationOverrides.css'; @@ -23,7 +23,7 @@ import { setLoveConsentState, } from './loveConsentLocalStorage'; -import { versionGT } from '../../helpers/semver'; +import { versionGT } from '../../helpers/versionUtils'; class Main extends React.Component { constructor(props) { @@ -45,7 +45,7 @@ class Main extends React.Component { .addEventListener('click', this.handleBodyClick); dispatch(loadServerVersion()).then(() => { - dispatch(featureSupportInit()); + dispatch(featureCompatibilityInit()); dispatch(loadInconsistentObjects()).then(() => { this.handleMetadataRedirect(); diff --git a/console/src/components/Main/State.js b/console/src/components/Main/State.js index 98289f5e7dd25..b655162dfca3e 100644 --- a/console/src/components/Main/State.js +++ b/console/src/components/Main/State.js @@ -10,6 +10,7 @@ const defaultState = { serverVersion: null, latestServerVersion: null, telemetryEnabled: true, + featuresCompatibility: {}, }; export default defaultState; diff --git a/console/src/helpers/semver.js b/console/src/helpers/semver.js deleted file mode 100644 index 58bc9c758606c..0000000000000 --- a/console/src/helpers/semver.js +++ /dev/null @@ -1,31 +0,0 @@ -const semver = require('semver'); - -// list of feature launch versions -const featureVersions = { - // feature: 'v1.0.0' -}; - -export const getFeaturesSupport = serverVersion => { - const featuresSupport = {}; - - Object.keys(featureVersions).forEach(feature => { - try { - featuresSupport[feature] = semver.satisfies( - featureVersions[feature], - '>=' + serverVersion - ); - } catch (e) { - console.log(e); - } - }); - - return featuresSupport; -}; - -export const versionGT = (version1, version2) => { - try { - return semver.gt(version1, version2); - } catch (e) { - console.log(e); - } -}; diff --git a/console/src/helpers/versionUtils.js b/console/src/helpers/versionUtils.js new file mode 100644 index 0000000000000..c0a7b384e4187 --- /dev/null +++ b/console/src/helpers/versionUtils.js @@ -0,0 +1,32 @@ +const semver = require('semver'); + +// list of feature launch versions +const featureLaunchVersions = { + // feature: 'v1.0.0' +}; + +export const getFeaturesCompatibility = serverVersion => { + const featuresCompatibility = {}; + + const isPullRequest = serverVersion.startsWith('pull'); + + try { + Object.keys(featureLaunchVersions).forEach(feature => { + featuresCompatibility[feature] = + isPullRequest || + semver.satisfies(featureLaunchVersions[feature], '>=' + serverVersion); + }); + } catch (e) { + console.error(e); + } + + return featuresCompatibility; +}; + +export const versionGT = (version1, version2) => { + try { + return semver.gt(version1, version2); + } catch (e) { + console.error(e); + } +};