UNPKG

4.55 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.distribution = exports.reduceDecisionRules = exports.formatProperty = exports.formatDecisionRules = undefined;
7exports.decide = decide;
8exports.getDecisionRulesProperties = getDecisionRulesProperties;
9exports.decideFromContextsArray = decideFromContextsArray;
10
11var _lodash = require('lodash');
12
13var _lodash2 = _interopRequireDefault(_lodash);
14
15var _context = require('./context');
16
17var _context2 = _interopRequireDefault(_context);
18
19var _interpreter_v = require('./interpreter_v1');
20
21var _parse4 = require('./parse');
22
23var _parse5 = _interopRequireDefault(_parse4);
24
25var _reducer = require('./reducer');
26
27var _semver = require('semver');
28
29var _semver2 = _interopRequireDefault(_semver);
30
31var _errors = require('./errors');
32
33var _interpreter_v2 = require('./interpreter_v2');
34
35var _formatter = require('./formatter');
36
37function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
38
39function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
40
41var DECISION_FORMAT_VERSION = '1.1.0';
42
43function decide(tree) {
44 var _parse = (0, _parse5.default)(tree),
45 _version = _parse._version,
46 configuration = _parse.configuration,
47 trees = _parse.trees;
48
49 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
50 args[_key - 1] = arguments[_key];
51 }
52
53 var ctx = configuration ? _context2.default.apply(undefined, [configuration].concat(args)) : _lodash2.default.extend.apply(_lodash2.default, [{}].concat(args));
54 return _decide(configuration, trees, ctx, _version);
55}
56
57function _decide(configuration, trees, ctx, _version) {
58 if (_semver2.default.satisfies(_version, '>=1.0.0 <2.0.0')) {
59 return (0, _interpreter_v.decide)(configuration, trees, ctx);
60 }
61 if (_semver2.default.satisfies(_version, '>=2.0.0 <3.0.0')) {
62 return (0, _interpreter_v2.decide)(configuration, trees, ctx);
63 }
64 throw new _errors.CraftAiDecisionError('Invalid decision tree format, "' + _version + '" is not a valid version.');
65}
66
67function reduceNodes(tree, fn, initialAccValue) {
68 var nodes = [];
69 nodes.push(tree);
70 var recursiveNext = function recursiveNext(acc) {
71 if (nodes.length == 0) {
72 // No more nodes
73 return acc;
74 }
75
76 var node = nodes.pop();
77 if (node.children) {
78 nodes = node.children.concat(nodes);
79 }
80
81 var updatedAcc = fn(acc, node);
82 return recursiveNext(updatedAcc);
83 };
84 return recursiveNext(initialAccValue);
85}
86
87function getDecisionRulesProperties(tree) {
88 var _parse2 = (0, _parse5.default)(tree),
89 configuration = _parse2.configuration,
90 trees = _parse2.trees;
91
92 return (0, _lodash2.default)(trees).values().reduce(function (properties, tree) {
93 return reduceNodes(tree, function (properties, node) {
94 if (node.children) {
95 // Skip leaves
96 return properties.concat(node.children[0].decision_rule.property);
97 }
98 return properties;
99 }, properties);
100 }, (0, _lodash2.default)([])).uniq().map(function (property) {
101 return _lodash2.default.extend(configuration.context[property], {
102 property: property
103 });
104 }).value();
105}
106
107function decideFromContextsArray(tree, contexts) {
108 var _parse3 = (0, _parse5.default)(tree),
109 _version = _parse3._version,
110 configuration = _parse3.configuration,
111 trees = _parse3.trees;
112
113 return _lodash2.default.map(contexts, function (contextsItem) {
114 var ctx = void 0;
115 if (_lodash2.default.isArray(contextsItem)) {
116 ctx = _context2.default.apply(undefined, [configuration].concat(_toConsumableArray(contextsItem)));
117 } else {
118 ctx = (0, _context2.default)(configuration, contextsItem);
119 }
120 try {
121 return _decide(configuration, trees, ctx, _version);
122 } catch (error) {
123 if (error instanceof _errors.CraftAiNullDecisionError) {
124 var message = error.message,
125 metadata = error.metadata;
126
127 return {
128 _version: DECISION_FORMAT_VERSION,
129 context: ctx,
130 error: { message: message, metadata: metadata }
131 };
132 } else {
133 throw error;
134 }
135 }
136 });
137}
138
139exports.formatDecisionRules = _formatter.formatDecisionRules;
140exports.formatProperty = _formatter.formatProperty;
141exports.reduceDecisionRules = _reducer.reduceDecisionRules;
142exports.distribution = _interpreter_v2.distribution;
\No newline at end of file