@coorpacademy/progression-engine
Version:
92 lines (91 loc) • 3.64 kB
JavaScript
;
exports.__esModule = true;
exports.default = exports.DEFAULT_SOURCE = void 0;
var _sample2 = _interopRequireDefault(require("lodash/fp/sample"));
var _uniqBy2 = _interopRequireDefault(require("lodash/fp/uniqBy"));
var _reverse2 = _interopRequireDefault(require("lodash/fp/reverse"));
var _find2 = _interopRequireDefault(require("lodash/fp/find"));
var _pipe2 = _interopRequireDefault(require("lodash/fp/pipe"));
var _sortBy2 = _interopRequireDefault(require("lodash/fp/sortBy"));
var _filter2 = _interopRequireDefault(require("lodash/fp/filter"));
var _isEqual2 = _interopRequireDefault(require("lodash/fp/isEqual"));
var _head2 = _interopRequireDefault(require("lodash/fp/head"));
var _get2 = _interopRequireDefault(require("lodash/fp/get"));
var _conditionOperators = _interopRequireDefault(require("./condition-operators"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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 = (0, _pipe2.default)(_reverse2.default, (0, _uniqBy2.default)('slideRef'), (0, _find2.default)({
slideRef: ref
}))(state.allAnswers);
if (!answerRecord) return false;
const value = answerRecord[field];
const typedValues = values.filter(isSameType(value));
return (0, _conditionOperators.default)(operator, typedValues, value);
}
case 'variable':
{
const {
field
} = target;
const variables = {
lives: state.lives,
stars: state.stars,
...state.variables
};
const value = variables[field];
const typedValues = values.filter(isSameType(value));
return (0, _conditionOperators.default)(operator, typedValues, value);
}
/* istanbul ignore next */
default:
{
return false;
}
}
});
};
const match = state => chapterRule => {
if (!state) {
return chapterRule.source.ref === '' && chapterRule.source.type === 'slide';
}
return matchWithState(state, chapterRule);
};
const selectRule = (rules, state) => {
const targetedChapterRules = (0, _filter2.default)(isRuleAvailable(state ? state.nextContent : DEFAULT_SOURCE), rules);
const sortedChapterRules = (0, _sortBy2.default)('priority', targetedChapterRules);
const machedRules = sortedChapterRules.filter(match(state));
const priority = (0, _pipe2.default)(_head2.default, (0, _get2.default)('priority'))(machedRules);
return (0, _pipe2.default)((0, _filter2.default)({
priority
}), _sample2.default)(machedRules) || null;
};
var _default = exports.default = selectRule;
//# sourceMappingURL=select-rule.js.map