UNPKG

redux-ab-test

Version:

A/B testing React components with Redux and debug tools. Isomorphic with a simple, universal interface. Well documented and lightweight. Tested in popular browsers and Node.js. Includes helpers for React, Redux, and Segment.io

93 lines (68 loc) 4.09 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _stringify = require('babel-runtime/core-js/json/stringify'); var _stringify2 = _interopRequireDefault(_stringify); exports['default'] = selectVariation; var _immutable = require('immutable'); var _immutable2 = _interopRequireDefault(_immutable); var _randomVariation = require('./random-variation'); var _randomVariation2 = _interopRequireDefault(_randomVariation); var _createCacheStore = require('./create-cache-store'); var _createCacheStore2 = _interopRequireDefault(_createCacheStore); var _getKey = require('./get-key'); var _getKey2 = _interopRequireDefault(_getKey); var _logger = require('./logger'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } /** * Select a variation for the experiment */ function selectVariation(props) { var active = props.active, experiment = props.experiment, defaultVariationName = props.defaultVariationName, cacheStore = props.cacheStore; var cache = cacheStore === undefined || cacheStore === null ? (0, _createCacheStore2['default'])() : cacheStore; var experimentKey = (0, _getKey2['default'])(experiment); (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', experimentKey=\'' + experimentKey + '\''); // Hash of variation.name => VariationType var variationsMap = experiment.get('variations').reduce(function (hash, variation) { hash[(0, _getKey2['default'])(variation)] = variation; return hash; }, {}); // Match against the redux state var variationKey = active.get(experimentKey); if (variationKey && variationsMap[variationKey]) { (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\''); (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationsMap[variationKey]=\'' + (0, _stringify2['default'])(variationsMap[variationKey]) + '\''); return variationsMap[variationKey]; } // Match against the instance state. // This is used as a in-memory cache to prevent multiple instances of the same experiment from getting differient variations. // It is wiped out with each pass of the RESET/LOAD/PLAY cycle variationKey = cache.getItem(experimentKey); if (variationKey && variationsMap[variationKey]) { (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\''); (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationsMap[variationKey]=\'' + (0, _stringify2['default'])(variationsMap[variationKey]) + '\''); return variationsMap[variationKey]; } // Match against the defaultVariationName variationKey = defaultVariationName; if (variationKey && variationsMap[variationKey]) { (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\''); (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationsMap[variationKey]=\'' + (0, _stringify2['default'])(variationsMap[variationKey]) + '\''); cache.setItem(experimentKey, variationKey); return variationsMap[variationKey]; } // Pick a variation ramdomly var variation = (0, _randomVariation2['default'])(experiment); // Record the choice in the tmp cache variationKey = (0, _getKey2['default'])(variation); cache.setItem(experimentKey, variationKey); (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variationKey=\'' + variationKey + '\''); (0, _logger.logger)(__filename + ' selectVariation experiment.name=\'' + experiment.get('name') + '\', variation.name=\'' + (variation && variation.get('name')) + '\''); // Return the chosen variation return variation; } module.exports = exports['default'];