@coorpacademy/progression-engine
Version:
102 lines (76 loc) • 3.26 kB
JavaScript
;
exports.__esModule = true;
exports.DEFAULT_SOURCE = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _get = require('lodash/fp/get');
var _get2 = _interopRequireDefault(_get);
var _head = require('lodash/fp/head');
var _head2 = _interopRequireDefault(_head);
var _isEqual = require('lodash/fp/isEqual');
var _isEqual2 = _interopRequireDefault(_isEqual);
var _filter = require('lodash/fp/filter');
var _filter2 = _interopRequireDefault(_filter);
var _sortBy = require('lodash/fp/sortBy');
var _sortBy2 = _interopRequireDefault(_sortBy);
var _conditionOperators = require('./condition-operators');
var _conditionOperators2 = _interopRequireDefault(_conditionOperators);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const DEFAULT_SOURCE = exports.DEFAULT_SOURCE = {
type: 'slide',
ref: ''
};
const isRuleAvailable = source => chapterRule => {
const isSameSource = (0, _isEqual2.default)(source, chapterRule.source);
const hasSameType = (source && source.type) === chapterRule.source.type;
const isGlobalRule = hasSameType && (0, _get2.default)('source.ref', chapterRule) === '*';
return isSameSource || isGlobalRule;
};
const isSameType = refValue => value => {
if (Array.isArray(value) && Array.isArray(refValue)) return value.every(isSameType(refValue[0]));
return typeof refValue === typeof value;
};
const matchWithState = state => chapterRule => {
const conditions = chapterRule.conditions;
return conditions.every(condition => {
const { target, operator, values } = condition;
switch (target.scope) {
case 'slide':
{
const { ref, field } = target;
const answerRecord = state.allAnswers.reverse().find(record => {
return record.slideRef === ref;
});
if (!answerRecord) return false;
const value = answerRecord[field];
const typedValues = values.filter(isSameType(value));
return (0, _conditionOperators2.default)(operator, typedValues, value);
}
case 'variable':
{
const { field } = target;
const variables = _extends({
lives: state.lives,
stars: state.stars
}, state.variables);
const value = variables[field];
const typedValues = values.filter(isSameType(value));
return (0, _conditionOperators2.default)(operator, typedValues, value);
}
/* istanbul ignore next */
default:
{
return false;
}
}
});
};
const selectRule = (rules, state) => {
const targetedChapterRules = (0, _filter2.default)(isRuleAvailable(state ? state.nextContent : DEFAULT_SOURCE), rules);
const sortedChapterRules = (0, _sortBy2.default)('priority', targetedChapterRules);
if (!state) {
return (0, _head2.default)(sortedChapterRules);
}
return sortedChapterRules.find(matchWithState(state)) || null;
};
exports.default = selectRule;
//# sourceMappingURL=select-rule.js.map