From 450851b6512d3e726e5ce052e502ba232525f311 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 12:49:58 -0800 Subject: [PATCH 01/10] Replaced lodash assign with Object.assign --- packages/optimizely-sdk/lib/utils/fns/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index b9b3bf3ec..417f11e37 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -18,7 +18,10 @@ var _isFinite = require('lodash/isFinite'); var MAX_NUMBER_LIMIT = Math.pow(2, 53); module.exports = { - assign: require('lodash/assign'), + assign: function (target) { + // Object.assign crashes if target object is undefined or null + return !!target ? Object.assign.apply(Object, arguments) : {}; + }, assignIn: require('lodash/assignIn'), cloneDeep: require('lodash/cloneDeep'), currentTimestamp: function() { From 37933147d216caaed80f3b191cedc5141ba82932 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 14:43:30 -0800 Subject: [PATCH 02/10] fixed lint error --- packages/optimizely-sdk/lib/utils/fns/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index 417f11e37..6d177d75b 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -20,7 +20,7 @@ var MAX_NUMBER_LIMIT = Math.pow(2, 53); module.exports = { assign: function (target) { // Object.assign crashes if target object is undefined or null - return !!target ? Object.assign.apply(Object, arguments) : {}; + return target ? Object.assign.apply(Object, arguments) : {}; }, assignIn: require('lodash/assignIn'), cloneDeep: require('lodash/cloneDeep'), From ddf003e38400e27608c8a37f464bc102a2cb76af Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 19:01:09 -0800 Subject: [PATCH 03/10] checking polyfill for Object.assign --- packages/optimizely-sdk/lib/index.browser.js | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index c796ca61d..7b0dbeddb 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -14,6 +14,37 @@ * limitations under the License. */ require('promise-polyfill/dist/polyfill'); + +// Temporary adding code here to test polyfill for Object.assign +if (typeof Object.assign !== 'function') { + // Must be writable: true, enumerable: false, configurable: true + Object.defineProperty(Object, "assign", { + value: function assign(target, varArgs) { // .length of function is 2 + 'use strict'; + if (target === null || target === undefined) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var to = Object(target); + + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + + if (nextSource !== null && nextSource !== undefined) { + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }, + writable: true, + configurable: true + }); +} var logging = require('@optimizely/js-sdk-logging'); var fns = require('./utils/fns'); var configValidator = require('./utils/config_validator'); From e22ff9e2ee452dd69cae745e292dd014f7e21bb4 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 19:05:25 -0800 Subject: [PATCH 04/10] fixed lint error --- packages/optimizely-sdk/lib/index.browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index 7b0dbeddb..789fd9a23 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -19,7 +19,7 @@ require('promise-polyfill/dist/polyfill'); if (typeof Object.assign !== 'function') { // Must be writable: true, enumerable: false, configurable: true Object.defineProperty(Object, "assign", { - value: function assign(target, varArgs) { // .length of function is 2 + value: function assign(target) { 'use strict'; if (target === null || target === undefined) { throw new TypeError('Cannot convert undefined or null to object'); From 7a8e52495c357547c85e0e4d5308205d3df63ff8 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 19:21:40 -0800 Subject: [PATCH 05/10] added polyfill for Object.assign --- packages/optimizely-sdk/lib/index.browser.js | 33 ++----------------- .../optimizely-sdk/lib/utils/fns/index.js | 32 ++++++++++++++++++ 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index 789fd9a23..5009e0fa5 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -14,37 +14,6 @@ * limitations under the License. */ require('promise-polyfill/dist/polyfill'); - -// Temporary adding code here to test polyfill for Object.assign -if (typeof Object.assign !== 'function') { - // Must be writable: true, enumerable: false, configurable: true - Object.defineProperty(Object, "assign", { - value: function assign(target) { - 'use strict'; - if (target === null || target === undefined) { - throw new TypeError('Cannot convert undefined or null to object'); - } - - var to = Object(target); - - for (var index = 1; index < arguments.length; index++) { - var nextSource = arguments[index]; - - if (nextSource !== null && nextSource !== undefined) { - for (var nextKey in nextSource) { - // Avoid bugs when hasOwnProperty is shadowed - if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }, - writable: true, - configurable: true - }); -} var logging = require('@optimizely/js-sdk-logging'); var fns = require('./utils/fns'); var configValidator = require('./utils/config_validator'); @@ -56,6 +25,8 @@ var loggerPlugin = require('./plugins/logger'); var Optimizely = require('./optimizely'); var eventProcessorConfigValidator = require('./utils/event_processor_config_validator'); +fns.applyAssignPolyfill(); + var logger = logging.getLogger(); logging.setLogHandler(loggerPlugin.createLogger()); logging.setLogLevel(logging.LogLevel.INFO); diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index 6d177d75b..d43abbced 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -17,6 +17,37 @@ var uuid = require('uuid'); var _isFinite = require('lodash/isFinite'); var MAX_NUMBER_LIMIT = Math.pow(2, 53); +// Polyfill Object.assign for older browsers +var applyAssignPolyfill = function() { + if (typeof Object.assign !== 'function') { + // Must be writable: true, enumerable: false, configurable: true + Object.defineProperty(Object, "assign", { + value: function assign(target) { + 'use strict'; + if (target === null || target === undefined) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var to = Object(target); + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + + if (nextSource !== null && nextSource !== undefined) { + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }, + writable: true, + configurable: true + }); + } +} + module.exports = { assign: function (target) { // Object.assign crashes if target object is undefined or null @@ -42,4 +73,5 @@ module.exports = { }, values: require('lodash/values'), isNumber: require('lodash/isNumber'), + applyAssignPolyfill: applyAssignPolyfill, }; From 22295b3e5c4290eb6b942e4efb37a750903d0e2c Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 19:54:27 -0800 Subject: [PATCH 06/10] minor refactor --- packages/optimizely-sdk/lib/utils/fns/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index d43abbced..cca7304d0 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -18,7 +18,7 @@ var _isFinite = require('lodash/isFinite'); var MAX_NUMBER_LIMIT = Math.pow(2, 53); // Polyfill Object.assign for older browsers -var applyAssignPolyfill = function() { +var applyPolyfills = function() { if (typeof Object.assign !== 'function') { // Must be writable: true, enumerable: false, configurable: true Object.defineProperty(Object, "assign", { @@ -73,5 +73,5 @@ module.exports = { }, values: require('lodash/values'), isNumber: require('lodash/isNumber'), - applyAssignPolyfill: applyAssignPolyfill, + applyPolyfills: applyPolyfills, }; From fc8ee9f8cc30e755980c599d3d87aace29f921ad Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 19:54:43 -0800 Subject: [PATCH 07/10] added missing change --- packages/optimizely-sdk/lib/index.browser.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index 5009e0fa5..4d57dc29f 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -25,8 +25,7 @@ var loggerPlugin = require('./plugins/logger'); var Optimizely = require('./optimizely'); var eventProcessorConfigValidator = require('./utils/event_processor_config_validator'); -fns.applyAssignPolyfill(); - +fns.applyPolyfills(); var logger = logging.getLogger(); logging.setLogHandler(loggerPlugin.createLogger()); logging.setLogLevel(logging.LogLevel.INFO); From d1003fcb9f4fd3f7beafe13fede8346a0211afd5 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Fri, 14 Feb 2020 20:08:33 -0800 Subject: [PATCH 08/10] updated a code comment --- packages/optimizely-sdk/lib/utils/fns/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index cca7304d0..095cf875a 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -17,7 +17,7 @@ var uuid = require('uuid'); var _isFinite = require('lodash/isFinite'); var MAX_NUMBER_LIMIT = Math.pow(2, 53); -// Polyfill Object.assign for older browsers +// Polyfills for older browsers var applyPolyfills = function() { if (typeof Object.assign !== 'function') { // Must be writable: true, enumerable: false, configurable: true From bfd34e48c7de8f21a5d3964784a1fbc7120e7a21 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Mon, 24 Feb 2020 13:33:21 -0800 Subject: [PATCH 09/10] removed mutation of prototype object --- packages/optimizely-sdk/lib/index.browser.js | 1 - .../optimizely-sdk/lib/utils/fns/index.js | 52 +++++++------------ 2 files changed, 19 insertions(+), 34 deletions(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index 4d57dc29f..c796ca61d 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -25,7 +25,6 @@ var loggerPlugin = require('./plugins/logger'); var Optimizely = require('./optimizely'); var eventProcessorConfigValidator = require('./utils/event_processor_config_validator'); -fns.applyPolyfills(); var logger = logging.getLogger(); logging.setLogHandler(loggerPlugin.createLogger()); logging.setLogLevel(logging.LogLevel.INFO); diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index c0edc8ba2..e37baafec 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -17,41 +17,28 @@ var uuid = require('uuid'); var _isFinite = require('lodash/isFinite'); var MAX_NUMBER_LIMIT = Math.pow(2, 53); -// Polyfills for older browsers -var applyPolyfills = function() { - if (typeof Object.assign !== 'function') { - // Must be writable: true, enumerable: false, configurable: true - Object.defineProperty(Object, "assign", { - value: function assign(target) { - 'use strict'; - if (target === null || target === undefined) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var to = Object(target); - for (var index = 1; index < arguments.length; index++) { - var nextSource = arguments[index]; - - if (nextSource !== null && nextSource !== undefined) { - for (var nextKey in nextSource) { - // Avoid bugs when hasOwnProperty is shadowed - if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } +module.exports = { + assign: function (target) { + if (!target) { + return {}; + } + if (typeof Object.assign === 'function') { + return Object.assign.apply(Object, arguments); + } else { + var to = Object(target); + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + if (nextSource !== null && nextSource !== undefined) { + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; } } } - return to; - }, - writable: true, - configurable: true - }); - } -} - -module.exports = { - assign: function (target) { - // Object.assign crashes if target object is undefined or null - return target ? Object.assign.apply(Object, arguments) : {}; + } + return to; + } }, assignIn: require('lodash/assignIn'), cloneDeep: require('lodash/cloneDeep'), @@ -68,7 +55,6 @@ module.exports = { return uuid.v4(); }, values: require('lodash/values'), - applyPolyfills: applyPolyfills, isNumber: function(value) { return typeof value === 'number'; }, From 815d1813a7a5a4d62d5773e3e210c1e85b03a1a1 Mon Sep 17 00:00:00 2001 From: Zeeshan Ashraf Date: Mon, 24 Feb 2020 13:47:59 -0800 Subject: [PATCH 10/10] replaced assignIn with assign --- packages/optimizely-sdk/lib/core/audience_evaluator/index.js | 2 +- packages/optimizely-sdk/lib/core/decision_service/index.js | 2 +- packages/optimizely-sdk/lib/core/project_config/index.js | 4 ++-- packages/optimizely-sdk/lib/index.browser.js | 2 +- packages/optimizely-sdk/lib/index.react_native.js | 2 +- packages/optimizely-sdk/lib/utils/fns/index.js | 1 - 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.js index 8ec9bb7d5..9d8af07d4 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.js @@ -35,7 +35,7 @@ var MODULE_NAME = 'AUDIENCE_EVALUATOR'; * @constructor */ function AudienceEvaluator(UNSTABLE_conditionEvaluators) { - this.typeToEvaluatorMap = fns.assignIn({}, UNSTABLE_conditionEvaluators, { + this.typeToEvaluatorMap = fns.assign({}, UNSTABLE_conditionEvaluators, { 'custom_attribute': customAttributeConditionEvaluator }); } diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.js b/packages/optimizely-sdk/lib/core/decision_service/index.js index f9c8d05bb..6cca4a534 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.js +++ b/packages/optimizely-sdk/lib/core/decision_service/index.js @@ -116,7 +116,7 @@ DecisionService.prototype.__resolveExperimentBucketMap = function(userId, attrib attributes = attributes || {} var userProfile = this.__getUserProfile(userId) || {}; var attributeExperimentBucketMap = attributes[enums.CONTROL_ATTRIBUTES.STICKY_BUCKETING_KEY]; - return fns.assignIn({}, userProfile.experiment_bucket_map, attributeExperimentBucketMap); + return fns.assign({}, userProfile.experiment_bucket_map, attributeExperimentBucketMap); }; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.js b/packages/optimizely-sdk/lib/core/project_config/index.js index ba781cb79..41b0ee6ce 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.js @@ -55,7 +55,7 @@ module.exports = { fns.forEach(projectConfig.groupIdMap, function(group, Id) { experiments = fns.cloneDeep(group.experiments); fns.forEach(experiments, function(experiment) { - projectConfig.experiments.push(fns.assignIn(experiment, {groupId: Id})); + projectConfig.experiments.push(fns.assign(experiment, {groupId: Id})); }); }); @@ -78,7 +78,7 @@ module.exports = { experiment.variationKeyMap = fns.keyBy(experiment.variations, 'key'); // Creates { : { key: , id: } } mapping for quick lookup - fns.assignIn(projectConfig.variationIdMap, fns.keyBy(experiment.variations, 'id')); + fns.assign(projectConfig.variationIdMap, fns.keyBy(experiment.variations, 'id')); fns.forOwn(experiment.variationKeyMap, function(variation) { if (variation.variables) { diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index c796ca61d..af6ffba08 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -107,7 +107,7 @@ module.exports = { eventDispatcher = config.eventDispatcher; } - config = fns.assignIn( + config = fns.assign( { clientEngine: enums.JAVASCRIPT_CLIENT_ENGINE, eventBatchSize: DEFAULT_EVENT_BATCH_SIZE, diff --git a/packages/optimizely-sdk/lib/index.react_native.js b/packages/optimizely-sdk/lib/index.react_native.js index 2dbaf6936..dc4874915 100644 --- a/packages/optimizely-sdk/lib/index.react_native.js +++ b/packages/optimizely-sdk/lib/index.react_native.js @@ -86,7 +86,7 @@ module.exports = { config.skipJSONValidation = true; } - config = fns.assignIn( + config = fns.assign( { clientEngine: enums.JAVASCRIPT_CLIENT_ENGINE, eventBatchSize: DEFAULT_EVENT_BATCH_SIZE, diff --git a/packages/optimizely-sdk/lib/utils/fns/index.js b/packages/optimizely-sdk/lib/utils/fns/index.js index e37baafec..f3520b98d 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.js +++ b/packages/optimizely-sdk/lib/utils/fns/index.js @@ -40,7 +40,6 @@ module.exports = { return to; } }, - assignIn: require('lodash/assignIn'), cloneDeep: require('lodash/cloneDeep'), currentTimestamp: function() { return Math.round(new Date().getTime());