Skip to content

Commit 7044ab8

Browse files
committed
Removed dependency of lodash completely from SDK
1 parent 9c9699b commit 7044ab8

File tree

9 files changed

+42
-42
lines changed

9 files changed

+42
-42
lines changed

packages/optimizely-sdk/lib/core/bucketer/index.tests.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
var bucketer = require('./');
1717
var enums = require('../../utils/enums');
1818
var logger = require('../../plugins/logger');
19-
var fns = require('../../utils/fns');
2019
var projectConfig = require('../project_config');
2120
var sprintf = require('@optimizely/js-sdk-utils').sprintf;
2221
var testData = require('../../tests/test_data').getTestProjectConfig();
2322

2423
var chai = require('chai');
2524
var assert = chai.assert;
2625
var expect = chai.expect;
26+
var cloneDeep = require('lodash/cloneDeep');
2727
var sinon = require('sinon');
2828

2929
var ERROR_MESSAGES = enums.ERROR_MESSAGES;
@@ -47,7 +47,7 @@ describe('lib/core/bucketer', function() {
4747

4848
describe('return values for bucketing (excluding groups)', function() {
4949
beforeEach(function() {
50-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
50+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
5151
bucketerParams = {
5252
experimentId: configObj.experiments[0].id,
5353
experimentKey: configObj.experiments[0].key,
@@ -67,7 +67,7 @@ describe('lib/core/bucketer', function() {
6767
});
6868

6969
it('should return correct variation ID when provided bucket value', function() {
70-
var bucketerParamsTest1 = bucketerParams;
70+
var bucketerParamsTest1 = cloneDeep(bucketerParams);
7171
bucketerParamsTest1.userId = 'ppid1';
7272
expect(bucketer.bucket(bucketerParamsTest1)).to.equal('111128');
7373

@@ -77,7 +77,7 @@ describe('lib/core/bucketer', function() {
7777
expect(bucketedUser_log1).to.equal(sprintf(LOG_MESSAGES.USER_ASSIGNED_TO_VARIATION_BUCKET, 'BUCKETER', '50', 'ppid1'));
7878
expect(bucketedUser_log2).to.equal(sprintf(LOG_MESSAGES.USER_HAS_VARIATION, 'BUCKETER', 'ppid1', 'control', 'testExperiment'));
7979

80-
var bucketerParamsTest2 = bucketerParams;
80+
var bucketerParamsTest2 = cloneDeep(bucketerParams);
8181
bucketerParamsTest2.userId = 'ppid2';
8282
expect(bucketer.bucket(bucketerParamsTest2)).to.equal(null);
8383

@@ -92,7 +92,7 @@ describe('lib/core/bucketer', function() {
9292
describe('return values for bucketing (including groups)', function() {
9393
var bucketerStub;
9494
beforeEach(function() {
95-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
95+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
9696
bucketerParams = {
9797
experimentId: configObj.experiments[0].id,
9898
experimentKey: configObj.experiments[0].key,
@@ -189,7 +189,7 @@ describe('lib/core/bucketer', function() {
189189
});
190190

191191
it('should throw an error if group ID is not in the datafile', function() {
192-
var bucketerParamsWithInvalidGroupId = bucketerParams;
192+
var bucketerParamsWithInvalidGroupId = cloneDeep(bucketerParams);
193193
bucketerParamsWithInvalidGroupId.experimentKeyMap[configObj.experiments[4].key].groupId = '6969';
194194

195195
assert.throws(function() {
@@ -237,7 +237,7 @@ describe('lib/core/bucketer', function() {
237237

238238
describe('when the bucket value falls into empty traffic allocation ranges', function() {
239239
beforeEach(function() {
240-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
240+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
241241
bucketerParams = {
242242
experimentId: configObj.experiments[0].id,
243243
experimentKey: configObj.experiments[0].key,
@@ -256,15 +256,15 @@ describe('lib/core/bucketer', function() {
256256
});
257257

258258
it('should return null', function() {
259-
var bucketerParamsTest1 = bucketerParams;
259+
var bucketerParamsTest1 = cloneDeep(bucketerParams);
260260
bucketerParamsTest1.userId = 'ppid1';
261261
expect(bucketer.bucket(bucketerParamsTest1)).to.equal('');
262262
});
263263
});
264264

265265
describe('when the traffic allocation has invalid variation ids', function() {
266266
beforeEach(function() {
267-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
267+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
268268
bucketerParams = {
269269
experimentId: configObj.experiments[0].id,
270270
experimentKey: configObj.experiments[0].key,
@@ -283,7 +283,7 @@ describe('lib/core/bucketer', function() {
283283
});
284284

285285
it('should return null', function() {
286-
var bucketerParamsTest1 = bucketerParams;
286+
var bucketerParamsTest1 = cloneDeep(bucketerParams);
287287
bucketerParamsTest1.userId = 'ppid1';
288288
expect(bucketer.bucket(bucketerParamsTest1)).to.equal(null);
289289
});
@@ -318,7 +318,7 @@ describe('lib/core/bucketer', function() {
318318
});
319319

320320
beforeEach(function() {
321-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
321+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
322322
bucketerParams = {
323323
trafficAllocationConfig: configObj.experiments[0].trafficAllocation,
324324
variationIdMap: configObj.variationIdMap,
@@ -329,7 +329,7 @@ describe('lib/core/bucketer', function() {
329329
});
330330

331331
it('check that a non null bucketingId buckets a variation different than the one expected with userId', function () {
332-
var bucketerParams1 = bucketerParams;
332+
var bucketerParams1 = cloneDeep(bucketerParams);
333333
bucketerParams1['userId'] = 'testBucketingIdControl';
334334
bucketerParams1['bucketingId'] = '123456789';
335335
bucketerParams1['experimentKey'] = 'testExperiment';
@@ -338,7 +338,7 @@ describe('lib/core/bucketer', function() {
338338
});
339339

340340
it('check that a null bucketing ID defaults to bucketing with the userId', function () {
341-
var bucketerParams2 = bucketerParams;
341+
var bucketerParams2 = cloneDeep(bucketerParams);
342342
bucketerParams2['userId'] = 'testBucketingIdControl';
343343
bucketerParams2['bucketingId'] = null;
344344
bucketerParams2['experimentKey'] = 'testExperiment';
@@ -347,7 +347,7 @@ describe('lib/core/bucketer', function() {
347347
});
348348

349349
it('check that bucketing works with an experiment in group', function () {
350-
var bucketerParams4 = bucketerParams;
350+
var bucketerParams4 = cloneDeep(bucketerParams);
351351
bucketerParams4['userId'] = 'testBucketingIdControl';
352352
bucketerParams4['bucketingId'] = '123456789';
353353
bucketerParams4['experimentKey'] = 'groupExperiment2';

packages/optimizely-sdk/lib/core/decision_service/index.tests.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ var bucketer = require('../bucketer');
2222
var DecisionService = require('./');
2323
var enums = require('../../utils/enums');
2424
var fns = require('../../utils/fns');
25+
var cloneDeep = require('lodash/cloneDeep');
2526
var logger = require('../../plugins/logger');
2627
var projectConfig = require('../project_config');
2728
var sprintf = require('@optimizely/js-sdk-utils').sprintf;
@@ -40,7 +41,7 @@ var DECISION_SOURCES = enums.DECISION_SOURCES;
4041

4142
describe('lib/core/decision_service', function() {
4243
describe('APIs', function() {
43-
var configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
44+
var configObj = projectConfig.createProjectConfig(cloneDeep(testData));
4445
var decisionServiceInstance;
4546
var mockLogger = logger.createLogger({logLevel: LOG_LEVEL.INFO});
4647
var bucketerStub;
@@ -619,7 +620,7 @@ describe('lib/core/decision_service', function() {
619620
it('should return null when a variation was previously set, and that variation no longer exists on the config object', function() {
620621
var didSetVariation = decisionServiceInstance.setForcedVariation(configObj, 'testExperiment', 'user1', 'control');
621622
assert.strictEqual(didSetVariation, true);
622-
var newDatafile = fns.cloneJsonObject(testData);
623+
var newDatafile = cloneDeep(testData);
623624
// Remove 'control' variation from variations, traffic allocation, and datafile forcedVariations.
624625
newDatafile.experiments[0].variations = [{
625626
key: 'variation',
@@ -642,7 +643,7 @@ describe('lib/core/decision_service', function() {
642643
it('should return null when a variation was previously set, and that variation\'s experiment no longer exists on the config object', function() {
643644
var didSetVariation = decisionServiceInstance.setForcedVariation(configObj, 'testExperiment', 'user1', 'control');
644645
assert.strictEqual(didSetVariation, true);
645-
var newConfigObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testDataWithFeatures));
646+
var newConfigObj = projectConfig.createProjectConfig(cloneDeep(testDataWithFeatures));
646647
var forcedVar = decisionServiceInstance.getForcedVariation(newConfigObj, 'testExperiment', 'user1');
647648
assert.strictEqual(forcedVar, null);
648649
});
@@ -658,7 +659,7 @@ describe('lib/core/decision_service', function() {
658659

659660
// TODO: Move tests that test methods of Optimizely to lib/optimizely/index.tests.js
660661
describe('when a bucketingID is provided', function() {
661-
var configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
662+
var configObj = projectConfig.createProjectConfig(cloneDeep(testData));
662663
var createdLogger = logger.createLogger({
663664
logLevel: LOG_LEVEL.DEBUG,
664665
logToConsole: false,
@@ -667,7 +668,7 @@ describe('lib/core/decision_service', function() {
667668
beforeEach(function () {
668669
optlyInstance = new Optimizely({
669670
clientEngine: 'node-sdk',
670-
datafile: fns.cloneJsonObject(testData),
671+
datafile: cloneDeep(testData),
671672
jsonSchemaValidator: jsonSchemaValidator,
672673
isValidInstance: true,
673674
logger: createdLogger,
@@ -805,7 +806,7 @@ describe('lib/core/decision_service', function() {
805806

806807
beforeEach(function() {
807808
sinon.stub(mockLogger, 'log');
808-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
809+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
809810
decisionService = DecisionService.createDecisionService({
810811
logger: mockLogger,
811812
});
@@ -840,7 +841,7 @@ describe('lib/core/decision_service', function() {
840841
var sandbox;
841842
var mockLogger = logger.createLogger({logLevel: LOG_LEVEL.INFO});
842843
beforeEach(function() {
843-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testDataWithFeatures));
844+
configObj = projectConfig.createProjectConfig(cloneDeep(testDataWithFeatures));
844845
sandbox = sinon.sandbox.create();
845846
sandbox.stub(mockLogger, 'log');
846847
decisionServiceInstance = DecisionService.createDecisionService({
@@ -1622,7 +1623,7 @@ describe('lib/core/decision_service', function() {
16221623
var __buildBucketerParamsSpy;
16231624

16241625
beforeEach(function() {
1625-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testDataWithFeatures));
1626+
configObj = projectConfig.createProjectConfig(cloneDeep(testDataWithFeatures));
16261627
feature = configObj.featureKeyMap.test_feature;
16271628
decisionService = DecisionService.createDecisionService({
16281629
logger: logger.createLogger({logLevel: LOG_LEVEL.INFO}),

packages/optimizely-sdk/lib/core/optimizely_config/index.tests.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616
var assert = require('chai').assert;
17-
var fns = require('../../utils/fns');
17+
var cloneDeep = require('lodash/cloneDeep');
1818
var datafile = require('../../tests/test_data').getTestProjectConfigWithFeatures();
1919
var projectConfig = require('../project_config');
2020
var optimizelyConfig = require('./index');
@@ -37,7 +37,7 @@ describe('lib/core/optimizely_config', function() {
3737
var optimizelyConfigObject;
3838
var projectConfigObject;
3939
beforeEach(function() {
40-
projectConfigObject = projectConfig.createProjectConfig(fns.cloneJsonObject(datafile));
40+
projectConfigObject = projectConfig.createProjectConfig(cloneDeep(datafile));
4141
optimizelyConfigObject = optimizelyConfig.getOptimizelyConfig(projectConfigObject);
4242
});
4343

packages/optimizely-sdk/lib/core/project_config/index.tests.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ var logging = require('@optimizely/js-sdk-logging');
2222
var logger = logging.getLogger();
2323

2424
var _ = require('lodash/core');
25+
var cloneDeep = require('lodash/cloneDeep');
2526
var fns = require('../../utils/fns');
2627
var chai = require('chai');
2728
var assert = chai.assert;
@@ -230,7 +231,7 @@ describe('lib/core/project_config', function() {
230231
var createdLogger = loggerPlugin.createLogger({logLevel: LOG_LEVEL.INFO});
231232

232233
beforeEach(function() {
233-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
234+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
234235
sinon.stub(createdLogger, 'log');
235236
});
236237

@@ -531,13 +532,13 @@ describe('lib/core/project_config', function() {
531532

532533
describe('#getExperimentAudienceConditions', function() {
533534
it('should retrieve audiences for valid experiment key', function() {
534-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
535+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
535536
assert.deepEqual(projectConfig.getExperimentAudienceConditions(configObj, testData.experiments[1].key),
536537
['11154']);
537538
});
538539

539540
it('should throw error for invalid experiment key', function() {
540-
configObj = projectConfig.createProjectConfig(fns.cloneJsonObject(testData));
541+
configObj = projectConfig.createProjectConfig(cloneDeep(testData));
541542
assert.throws(function() {
542543
projectConfig.getExperimentAudienceConditions(configObj, 'invalidExperimentKey');
543544
}, sprintf(ERROR_MESSAGES.INVALID_EXPERIMENT_KEY, 'PROJECT_CONFIG', 'invalidExperimentKey'));

packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var assert = require('chai').assert;
1818
var datafileManager = require('@optimizely/js-sdk-datafile-manager');
1919
var logging = require('@optimizely/js-sdk-logging');
2020
var sinon = require('sinon');
21-
var fns = require('../../utils/fns');
21+
var cloneDeep = require('lodash/cloneDeep');
2222
var sprintf = require('@optimizely/js-sdk-utils').sprintf;
2323
var enums = require('../../utils/enums');
2424
var jsonSchemaValidator = require('../../utils/json_schema_validator');
@@ -154,7 +154,7 @@ describe('lib/core/project_config/project_config_manager', function() {
154154
it('should return a valid datafile from getConfig and resolve onReady with a successful result', function() {
155155
var configWithFeatures = testData.getTestProjectConfigWithFeatures();
156156
var manager = new projectConfigManager.ProjectConfigManager({
157-
datafile: fns.cloneJsonObject(configWithFeatures),
157+
datafile: cloneDeep(configWithFeatures),
158158
});
159159
assert.deepEqual(
160160
manager.getConfig(),
@@ -205,7 +205,7 @@ describe('lib/core/project_config/project_config_manager', function() {
205205
datafileManager.HttpPollingDatafileManager.returns({
206206
start: sinon.stub(),
207207
stop: sinon.stub(),
208-
get: sinon.stub().returns(fns.cloneJsonObject(configWithFeatures)),
208+
get: sinon.stub().returns(cloneDeep(configWithFeatures)),
209209
on: sinon.stub().returns(function() {}),
210210
onReady: sinon.stub().returns(Promise.resolve())
211211
});
@@ -235,7 +235,7 @@ describe('lib/core/project_config/project_config_manager', function() {
235235
});
236236
nextDatafile.revision = '36';
237237
var fakeDatafileManager = datafileManager.HttpPollingDatafileManager.getCall(0).returnValue;
238-
fakeDatafileManager.get.returns(fns.cloneJsonObject(nextDatafile));
238+
fakeDatafileManager.get.returns(cloneDeep(nextDatafile));
239239
var updateListener = fakeDatafileManager.on.getCall(0).args[1];
240240
updateListener({ datafile: nextDatafile });
241241
assert.deepEqual(

packages/optimizely-sdk/lib/tests/test_data.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
var fns = require('../utils/fns');
16+
var cloneDeep = require('lodash/cloneDeep');
1717

1818
var config = {
1919
revision: '42',
@@ -345,7 +345,7 @@ var getParsedAudiences = [
345345
];
346346

347347
var getTestProjectConfig = function() {
348-
return fns.cloneJsonObject(config);
348+
return cloneDeep(config);
349349
};
350350

351351
var configWithFeatures = {
@@ -1010,7 +1010,7 @@ var configWithFeatures = {
10101010
};
10111011

10121012
var getTestProjectConfigWithFeatures = function() {
1013-
return fns.cloneJsonObject(configWithFeatures);
1013+
return cloneDeep(configWithFeatures);
10141014
};
10151015

10161016
var datafileWithFeaturesExpectedData = {
@@ -2036,7 +2036,7 @@ var unsupportedVersionConfig = {
20362036
};
20372037

20382038
var getUnsupportedVersionConfig = function() {
2039-
return unsupportedVersionConfig;
2039+
return cloneDeep(unsupportedVersionConfig);
20402040
};
20412041

20422042
var typedAudiencesConfig = {
@@ -2437,7 +2437,7 @@ var typedAudiencesConfig = {
24372437
};
24382438

24392439
var getTypedAudiencesConfig = function() {
2440-
return fns.cloneJsonObject(typedAudiencesConfig);
2440+
return cloneDeep(typedAudiencesConfig);
24412441
};
24422442

24432443
var typedAudiencesById = {
@@ -2575,7 +2575,7 @@ var mutexFeatureTestsConfig = {
25752575
};
25762576

25772577
var getMutexFeatureTestsConfig = function() {
2578-
return mutexFeatureTestsConfig;
2578+
return cloneDeep(mutexFeatureTestsConfig);
25792579
};
25802580

25812581
module.exports = {

packages/optimizely-sdk/lib/utils/fns/index.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@ module.exports = {
3939
return to;
4040
}
4141
},
42-
cloneJsonObject: function(object) {
43-
return JSON.parse(JSON.stringify(object));
44-
},
4542
currentTimestamp: function() {
4643
return Math.round(new Date().getTime());
4744
},

packages/optimizely-sdk/package-lock.json

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/optimizely-sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@
3838
"@optimizely/js-sdk-logging": "^0.1.0",
3939
"@optimizely/js-sdk-utils": "^0.2.0",
4040
"json-schema": "^0.2.3",
41-
"lodash": "^4.17.11",
4241
"murmurhash": "0.0.2",
4342
"promise-polyfill": "8.1.0",
4443
"uuid": "^3.3.2"
4544
},
4645
"devDependencies": {
4746
"bluebird": "^3.4.6",
4847
"chai": "^4.2.0",
48+
"lodash": "^4.17.11",
4949
"coveralls": "^3.0.2",
5050
"eslint": "^6.7.2",
5151
"istanbul": "^0.4.5",

0 commit comments

Comments
 (0)