From 99da128cc86c0ed92ab36f6fb3b8db948c94f3e1 Mon Sep 17 00:00:00 2001 From: fayyazarshad Date: Wed, 19 Feb 2020 18:54:10 -0800 Subject: [PATCH 1/9] Removed isEmpty method of Lodash --- .../optimizely-sdk/lib/utils/fns/index.js | 22 ++++++++++++++++++- .../lib/utils/fns/index.tests.js | 18 ++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index c8688e282..608e7e572 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -16,6 +16,8 @@ var uuid = require('uuid'); var _isFinite = require('lodash/isFinite'); var MAX_NUMBER_LIMIT = Math.pow(2, 53); +var MAX_SAFE_INTEGER = 9007199254740991; +var hasOwnProperty = Object.prototype.hasOwnProperty; module.exports = { assign: require('lodash/assign'), @@ -25,7 +27,25 @@ module.exports = { return Math.round(new Date().getTime()); }, isArray: require('lodash/isArray'), - isEmpty: require('lodash/isEmpty'), + isEmpty: function isEmpty(value) { + if (value == null) { + return true; + } + var length = value.length; + if (typeof length == 'number' && length > -1 && length % 1 === 0 && length <= MAX_SAFE_INTEGER) { + var type = typeof value; + if (type === 'object') { + return !value.length; + } + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + , isFinite: function(number) { return _isFinite(number) && Math.abs(number) <= MAX_NUMBER_LIMIT; }, diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index fba8890b8..69238cf5c 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -37,5 +37,21 @@ describe('lib/utils/fns', function() { assert.isTrue(fns.isFinite(-Math.pow(2, 53))); }); }); + describe('isEmpty', function() { + it('should return true in case of null', function() { + assert.isTrue(fns.isEmpty(null)); + }); + it('should return True in case of empty {}', function() { + assert.isTrue(fns.isEmpty({})); + }); + it('should return false in case of value object', function() { + var obj = { "key": "value" }; + assert.isFalse(fns.isEmpty(obj)); + }); + it('should return true if anything else than an object', function() { + var obj = { "key": "value" }; + assert.isTrue(fns.isEmpty(1)); + }); + }); }); -}); \ No newline at end of file +}); From 19e19ef68d5e70a29e2e130b177cad93c05df982 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Wed, 19 Feb 2020 15:36:51 -0800 Subject: [PATCH 2/9] simplified the implementation to only support objects --- .../optimizely-sdk/lib/utils/fns/index.js | 22 +++---------------- .../lib/utils/fns/index.tests.js | 10 +++------ 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index 608e7e572..59e326856 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -27,25 +27,9 @@ module.exports = { return Math.round(new Date().getTime()); }, isArray: require('lodash/isArray'), - isEmpty: function isEmpty(value) { - if (value == null) { - return true; - } - var length = value.length; - if (typeof length == 'number' && length > -1 && length % 1 === 0 && length <= MAX_SAFE_INTEGER) { - var type = typeof value; - if (type === 'object') { - return !value.length; - } - } - for (var key in value) { - if (hasOwnProperty.call(value, key)) { - return false; - } - } - return true; - } - , + isEmpty: function(obj) { + return !obj || Object.keys(obj).length === 0; + }, isFinite: function(number) { return _isFinite(number) && Math.abs(number) <= MAX_NUMBER_LIMIT; }, diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index 69238cf5c..acc70ee6d 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -38,20 +38,16 @@ describe('lib/utils/fns', function() { }); }); describe('isEmpty', function() { - it('should return true in case of null', function() { + it('should return true when object is null', function() { assert.isTrue(fns.isEmpty(null)); }); - it('should return True in case of empty {}', function() { + it('should return true when object is empty {}', function() { assert.isTrue(fns.isEmpty({})); }); - it('should return false in case of value object', function() { + it('should return false when object has attributes', function() { var obj = { "key": "value" }; assert.isFalse(fns.isEmpty(obj)); }); - it('should return true if anything else than an object', function() { - var obj = { "key": "value" }; - assert.isTrue(fns.isEmpty(1)); - }); }); }); }); From 9b9425c3cb151779abaa1eb38839641d4f492a07 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Wed, 19 Feb 2020 16:01:33 -0800 Subject: [PATCH 3/9] fixed lint errors --- packages/optimizely-sdk/lib/utils/fns/index.js | 2 -- packages/optimizely-sdk/lib/utils/fns/index.tests.js | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index 59e326856..45fd33619 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -16,8 +16,6 @@ var uuid = require('uuid'); var _isFinite = require('lodash/isFinite'); var MAX_NUMBER_LIMIT = Math.pow(2, 53); -var MAX_SAFE_INTEGER = 9007199254740991; -var hasOwnProperty = Object.prototype.hasOwnProperty; module.exports = { assign: require('lodash/assign'), diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index acc70ee6d..8ee287444 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -37,6 +37,7 @@ describe('lib/utils/fns', function() { assert.isTrue(fns.isFinite(-Math.pow(2, 53))); }); }); + describe('isEmpty', function() { it('should return true when object is null', function() { assert.isTrue(fns.isEmpty(null)); From 2d1a06916b32676fac7402906b16ae1723645af5 Mon Sep 17 00:00:00 2001 From: fayyazarshad Date: Fri, 21 Feb 2020 12:12:27 -0800 Subject: [PATCH 4/9] Removed method as we don't need it --- .../lib/core/decision_service/index.js | 2 +- .../lib/core/project_config/index.js | 10 +++++----- packages/optimizely-sdk/lib/optimizely/index.js | 2 +- packages/optimizely-sdk/lib/utils/fns/index.js | 3 --- .../optimizely-sdk/lib/utils/fns/index.tests.js | 14 +------------- 5 files changed, 8 insertions(+), 23 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.js b/packages/optimizely-sdk/lib/core/decision_service/index.js index 321da3844..f9c8d05bb 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.js +++ b/packages/optimizely-sdk/lib/core/decision_service/index.js @@ -144,7 +144,7 @@ DecisionService.prototype.__checkIfExperimentIsActive = function(configObj, expe * @return {string|null} Forced variation if it exists for user ID, otherwise null */ DecisionService.prototype.__getWhitelistedVariation = function(experiment, userId) { - if (!fns.isEmpty(experiment.forcedVariations) && experiment.forcedVariations.hasOwnProperty(userId)) { + if (experiment.forcedVariations && experiment.forcedVariations.hasOwnProperty(userId)) { var forcedVariationKey = experiment.forcedVariations[userId]; if (experiment.variationKeyMap.hasOwnProperty(forcedVariationKey)) { var forcedBucketingSucceededMessageLog = sprintf(LOG_MESSAGES.USER_FORCED_IN_VARIATION, MODULE_NAME, userId, forcedVariationKey); diff --git a/packages/optimizely-sdk/lib/core/project_config/index.js b/packages/optimizely-sdk/lib/core/project_config/index.js index eeda8f1f9..ba781cb79 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.js @@ -122,7 +122,7 @@ module.exports = { */ getExperimentId: function(projectConfig, experimentKey) { var experiment = projectConfig.experimentKeyMap[experimentKey]; - if (fns.isEmpty(experiment)) { + if (!experiment) { throw new Error(sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_KEY, MODULE_NAME, experimentKey)); } return experiment.id; @@ -137,7 +137,7 @@ module.exports = { */ getLayerId: function(projectConfig, experimentId) { var experiment = projectConfig.experimentIdMap[experimentId]; - if (fns.isEmpty(experiment)) { + if (!experiment) { throw new Error(sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_ID, MODULE_NAME, experimentId)); } return experiment.layerId; @@ -190,7 +190,7 @@ module.exports = { */ getExperimentStatus: function(projectConfig, experimentKey) { var experiment = projectConfig.experimentKeyMap[experimentKey]; - if (fns.isEmpty(experiment)) { + if (!experiment) { throw new Error(sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_KEY, MODULE_NAME, experimentKey)); } return experiment.status; @@ -224,7 +224,7 @@ module.exports = { */ getExperimentAudienceConditions: function(projectConfig, experimentKey) { var experiment = projectConfig.experimentKeyMap[experimentKey]; - if (fns.isEmpty(experiment)) { + if (!experiment) { throw new Error(sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_KEY, MODULE_NAME, experimentKey)); } @@ -286,7 +286,7 @@ module.exports = { */ getTrafficAllocation: function(projectConfig, experimentKey) { var experiment = projectConfig.experimentKeyMap[experimentKey]; - if (fns.isEmpty(experiment)) { + if (!experiment) { throw new Error(sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_KEY, MODULE_NAME, experimentKey)); } return experiment.trafficAllocation; diff --git a/packages/optimizely-sdk/lib/optimizely/index.js b/packages/optimizely-sdk/lib/optimizely/index.js index bc4e2bc7d..610297a87 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.js +++ b/packages/optimizely-sdk/lib/optimizely/index.js @@ -375,7 +375,7 @@ Optimizely.prototype.getVariation = function(experimentKey, userId, attributes) } var experiment = configObj.experimentKeyMap[experimentKey]; - if (fns.isEmpty(experiment)) { + if (!experiment) { this.logger.log(LOG_LEVEL.DEBUG, sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_KEY, MODULE_NAME, experimentKey)); return null; } diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index 45fd33619..1db93d82a 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -25,9 +25,6 @@ module.exports = { return Math.round(new Date().getTime()); }, isArray: require('lodash/isArray'), - isEmpty: function(obj) { - return !obj || Object.keys(obj).length === 0; - }, isFinite: function(number) { return _isFinite(number) && Math.abs(number) <= MAX_NUMBER_LIMIT; }, diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index 8ee287444..e8448a951 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -37,18 +37,6 @@ describe('lib/utils/fns', function() { assert.isTrue(fns.isFinite(-Math.pow(2, 53))); }); }); - - describe('isEmpty', function() { - it('should return true when object is null', function() { - assert.isTrue(fns.isEmpty(null)); - }); - it('should return true when object is empty {}', function() { - assert.isTrue(fns.isEmpty({})); - }); - it('should return false when object has attributes', function() { - var obj = { "key": "value" }; - assert.isFalse(fns.isEmpty(obj)); - }); - }); + }); }); From 0665fd0028e689233fe4b0ecfd5d904d6dfe8a4f Mon Sep 17 00:00:00 2001 From: fayyazarshad Date: Fri, 21 Feb 2020 12:14:31 -0800 Subject: [PATCH 5/9] Revert the test file --- .../optimizely-sdk/lib/utils/fns/index.tests.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index e8448a951..acc70ee6d 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -37,6 +37,17 @@ describe('lib/utils/fns', function() { assert.isTrue(fns.isFinite(-Math.pow(2, 53))); }); }); - + describe('isEmpty', function() { + it('should return true when object is null', function() { + assert.isTrue(fns.isEmpty(null)); + }); + it('should return true when object is empty {}', function() { + assert.isTrue(fns.isEmpty({})); + }); + it('should return false when object has attributes', function() { + var obj = { "key": "value" }; + assert.isFalse(fns.isEmpty(obj)); + }); + }); }); }); From ee4e7d5a6bee9b9dec9d714cc69b38644ded727e Mon Sep 17 00:00:00 2001 From: fayyazarshad Date: Fri, 21 Feb 2020 12:45:52 -0800 Subject: [PATCH 6/9] Revert the test file --- packages/optimizely-sdk/lib/utils/fns/index.tests.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index acc70ee6d..b5aaa66c8 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -37,17 +37,5 @@ describe('lib/utils/fns', function() { assert.isTrue(fns.isFinite(-Math.pow(2, 53))); }); }); - describe('isEmpty', function() { - it('should return true when object is null', function() { - assert.isTrue(fns.isEmpty(null)); - }); - it('should return true when object is empty {}', function() { - assert.isTrue(fns.isEmpty({})); - }); - it('should return false when object has attributes', function() { - var obj = { "key": "value" }; - assert.isFalse(fns.isEmpty(obj)); - }); - }); }); }); From 515d47d62bd32f107e3a8e1f756b90dda1741897 Mon Sep 17 00:00:00 2001 From: fayyazarshad Date: Fri, 21 Feb 2020 12:55:22 -0800 Subject: [PATCH 7/9] Revert the test file --- packages/optimizely-sdk/lib/utils/fns/index.tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index b5aaa66c8..25672238c 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -28,7 +28,6 @@ describe('lib/utils/fns', function() { assert.isFalse(fns.isFinite(Math.pow(2, 53) + 2)); assert.isFalse(fns.isFinite(-Math.pow(2, 53) - 2)); }); - it('should return true for valid numbers', function() { assert.isTrue(fns.isFinite(0)); assert.isTrue(fns.isFinite(10)); @@ -39,3 +38,4 @@ describe('lib/utils/fns', function() { }); }); }); + From 09acbc11eae9153c62b29cf3bb4e6a0d02f216fe Mon Sep 17 00:00:00 2001 From: fayyazarshad Date: Fri, 21 Feb 2020 12:55:48 -0800 Subject: [PATCH 8/9] Revert the test file --- packages/optimizely-sdk/lib/utils/fns/index.tests.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index 25672238c..eab435103 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -28,6 +28,7 @@ describe('lib/utils/fns', function() { assert.isFalse(fns.isFinite(Math.pow(2, 53) + 2)); assert.isFalse(fns.isFinite(-Math.pow(2, 53) - 2)); }); + it('should return true for valid numbers', function() { assert.isTrue(fns.isFinite(0)); assert.isTrue(fns.isFinite(10)); From 0dc6a438f9ea4cb94ebc5187feaae92c837374ae Mon Sep 17 00:00:00 2001 From: fayyazarshad <42437293+fayyazarshad@users.noreply.github.com> Date: Thu, 20 Feb 2020 23:57:12 -0800 Subject: [PATCH 9/9] Update index.tests.js --- packages/optimizely-sdk/lib/utils/fns/index.tests.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.tests.js b/packages/optimizely-sdk/lib/utils/fns/index.tests.js index eab435103..b5aaa66c8 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.tests.js @@ -39,4 +39,3 @@ describe('lib/utils/fns', function() { }); }); }); -