@jss-rule-engine/core
Version:
Rule engine for Sitecore JSS
132 lines • 5.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var parse_xml_1 = require("@rgrove/parse-xml");
function parseUnionCondition(conditionXmlNode, ruleEngineContext) {
var parsedCondition = {
conditions: new Array(),
className: conditionXmlNode.name
};
var childNodes = conditionXmlNode.children.filter(function (x) { return x.type == "element" && x.name == "condition"; });
childNodes.forEach(function (ruleXmlNode) {
var _a;
var parsedRule = parseCondition(ruleXmlNode, ruleEngineContext);
if (parsedRule) {
(_a = parsedCondition.conditions) === null || _a === void 0 ? void 0 : _a.push(parsedRule);
}
else {
throw new Error('Condition wasnt parsed' + ruleXmlNode);
}
});
return parsedCondition;
}
function parseRegularCondition(conditionXmlNode, _ruleEngineContext) {
var parsedCondition = {
className: "condition",
attributes: new Map()
};
var attributeKeys = Object.keys(conditionXmlNode.attributes);
attributeKeys.forEach(function (attr) {
switch (attr) {
case 'id':
parsedCondition.id = conditionXmlNode.attributes[attr];
case 'except':
parsedCondition.except = conditionXmlNode.attributes[attr] == 'true';
default:
parsedCondition.attributes.set(attr, conditionXmlNode.attributes[attr]);
}
});
return parsedCondition;
}
function parseAction(actionXmlNode, _ruleEngineContext) {
var parsedAction = {
className: "action",
attributes: new Map()
};
var attributeKeys = Object.keys(actionXmlNode === null || actionXmlNode === void 0 ? void 0 : actionXmlNode.attributes);
attributeKeys.forEach(function (attr) {
if (attr == 'id') {
parsedAction.id = actionXmlNode.attributes[attr];
}
else {
parsedAction.attributes.set(attr, actionXmlNode.attributes[attr]);
}
});
return parsedAction;
}
function parseCondition(conditionXmlNode, ruleEngineContext) {
if (conditionXmlNode.name == "or" || conditionXmlNode.name == "and") {
return parseUnionCondition(conditionXmlNode, ruleEngineContext);
}
return parseRegularCondition(conditionXmlNode, ruleEngineContext);
}
function default_1(ruleXml, ruleEngineContext) {
if (!ruleXml || ruleXml.length == 0) {
return null;
}
ruleXml = ruleXml.replaceAll('\t', '').replaceAll('\n', '').replaceAll('\r', '');
var xmlDoc = (0, parse_xml_1.parseXml)(ruleXml);
var rulesetNode = xmlDoc.children.find(function (x) { return x.type == "element" && x.name == "ruleset"; });
if (!rulesetNode ||
!rulesetNode.children ||
rulesetNode.type != "element" ||
rulesetNode.name != "ruleset") {
throw new Error("Ruleset node is missing.");
}
var parsedRule = {
rules: []
};
var rulesNodes = rulesetNode.children.filter(function (x) {
return x.type == "element" && x.name == "rule";
});
if (!rulesNodes) {
console.log('Rule nodes are missing.');
return null;
}
rulesNodes.forEach(function (ruleXmlNode) {
var _a, _b;
var rule = {
conditions: [],
actions: [],
attributes: new Map()
};
var attributeKeys = Object.keys(ruleXmlNode.attributes);
attributeKeys.forEach(function (attr) {
var _a;
(_a = rule.attributes) === null || _a === void 0 ? void 0 : _a.set(attr, ruleXmlNode.attributes[attr]);
});
var conditionsRootNode = ruleXmlNode.children.find(function (x) { return x.type == "element" && x.name == "conditions"; });
if (conditionsRootNode && conditionsRootNode.children) {
//ruleEngineContext.ruleEngine?.debugMessage(conditionsRootNode);
conditionsRootNode.children.filter(function (x) { return x.type == "element"; }).forEach(function (conditionXmlNode) {
var _a, _b;
var parsedCondition = parseCondition(conditionXmlNode, ruleEngineContext);
if (parsedCondition) {
(_a = ruleEngineContext.ruleEngine) === null || _a === void 0 ? void 0 : _a.debugMessage('Parsed condition element:');
(_b = rule.conditions) === null || _b === void 0 ? void 0 : _b.push(parsedCondition);
}
else {
throw new Error('Condition wasnt parsed ' + conditionXmlNode);
}
});
}
var actionsRootNode = ruleXmlNode.children.find(function (x) { return x.type == "element" && x.name == "actions"; });
if (actionsRootNode && actionsRootNode.children) {
(_a = ruleEngineContext.ruleEngine) === null || _a === void 0 ? void 0 : _a.debugMessage(actionsRootNode);
actionsRootNode.children.filter(function (x) { return x.type == "element"; }).forEach(function (actionXmlNode) {
var _a, _b;
var parsedAction = parseAction(actionXmlNode, ruleEngineContext);
if (parsedAction) {
(_a = ruleEngineContext.ruleEngine) === null || _a === void 0 ? void 0 : _a.debugMessage('Parsed action element:');
(_b = rule.actions) === null || _b === void 0 ? void 0 : _b.push(parsedAction);
}
else {
throw new Error('Condition wasnt parsed ' + actionXmlNode);
}
});
}
(_b = parsedRule.rules) === null || _b === void 0 ? void 0 : _b.push(rule);
});
return parsedRule;
}
exports.default = default_1;
//# sourceMappingURL=ruleParser.js.map