@convertcom/js-sdk-rules 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +202 -0
- package/lib/enums/index.d.ts +29 -0
- package/lib/enums/src/audience-type.d.ts +11 -0
- package/lib/enums/src/data-enitites.d.ts +7 -0
- package/lib/enums/src/dictionary.d.ts +60 -0
- package/lib/enums/src/do-not-track.d.ts +12 -0
- package/lib/enums/src/event-type.d.ts +10 -0
- package/lib/enums/src/experience-type.d.ts +16 -0
- package/lib/enums/src/feature-status.d.ts +10 -0
- package/lib/enums/src/ga-type.d.ts +10 -0
- package/lib/enums/src/goal-data-key.d.ts +11 -0
- package/lib/enums/src/goal-type.d.ts +22 -0
- package/lib/enums/src/integration-provider.d.ts +27 -0
- package/lib/enums/src/log-level.d.ts +14 -0
- package/lib/enums/src/log-method.d.ts +14 -0
- package/lib/enums/src/project-type.d.ts +10 -0
- package/lib/enums/src/rule-error.d.ts +10 -0
- package/lib/enums/src/segments/browser-type.d.ts +17 -0
- package/lib/enums/src/segments/device-type.d.ts +16 -0
- package/lib/enums/src/segments/segments-keys.d.ts +15 -0
- package/lib/enums/src/segments/source-type.d.ts +12 -0
- package/lib/enums/src/segments/visitor-type.d.ts +10 -0
- package/lib/enums/src/system-events.d.ts +22 -0
- package/lib/enums/src/variable-types.d.ts +7 -0
- package/lib/enums/src/variation-change-type.d.ts +14 -0
- package/lib/index.js +227 -0
- package/lib/index.js.map +1 -0
- package/lib/index.min.js +2 -0
- package/lib/index.min.js.map +1 -0
- package/lib/index.min.mjs +1 -0
- package/lib/index.min.mjs.map +1 -0
- package/lib/index.mjs +227 -0
- package/lib/index.mjs.map +1 -0
- package/lib/legacy/enums/index.d.ts +29 -0
- package/lib/legacy/enums/src/audience-type.d.ts +11 -0
- package/lib/legacy/enums/src/data-enitites.d.ts +7 -0
- package/lib/legacy/enums/src/dictionary.d.ts +60 -0
- package/lib/legacy/enums/src/do-not-track.d.ts +12 -0
- package/lib/legacy/enums/src/event-type.d.ts +10 -0
- package/lib/legacy/enums/src/experience-type.d.ts +16 -0
- package/lib/legacy/enums/src/feature-status.d.ts +10 -0
- package/lib/legacy/enums/src/ga-type.d.ts +10 -0
- package/lib/legacy/enums/src/goal-data-key.d.ts +11 -0
- package/lib/legacy/enums/src/goal-type.d.ts +22 -0
- package/lib/legacy/enums/src/integration-provider.d.ts +27 -0
- package/lib/legacy/enums/src/log-level.d.ts +14 -0
- package/lib/legacy/enums/src/log-method.d.ts +14 -0
- package/lib/legacy/enums/src/project-type.d.ts +10 -0
- package/lib/legacy/enums/src/rule-error.d.ts +10 -0
- package/lib/legacy/enums/src/segments/browser-type.d.ts +17 -0
- package/lib/legacy/enums/src/segments/device-type.d.ts +16 -0
- package/lib/legacy/enums/src/segments/segments-keys.d.ts +15 -0
- package/lib/legacy/enums/src/segments/source-type.d.ts +12 -0
- package/lib/legacy/enums/src/segments/visitor-type.d.ts +10 -0
- package/lib/legacy/enums/src/system-events.d.ts +22 -0
- package/lib/legacy/enums/src/variable-types.d.ts +7 -0
- package/lib/legacy/enums/src/variation-change-type.d.ts +14 -0
- package/lib/legacy/index.js +291 -0
- package/lib/legacy/index.js.map +1 -0
- package/lib/legacy/index.min.js +8 -0
- package/lib/legacy/index.min.js.map +1 -0
- package/lib/legacy/logger/index.d.ts +8 -0
- package/lib/legacy/logger/src/interfaces/log-client.d.ts +13 -0
- package/lib/legacy/logger/src/interfaces/log-manager.d.ts +18 -0
- package/lib/legacy/logger/src/interfaces/log-method-map.d.ts +15 -0
- package/lib/legacy/logger/src/log-manager.d.ts +64 -0
- package/lib/legacy/rules/index.d.ts +8 -0
- package/lib/legacy/rules/src/interfaces/rule-manager.d.ts +14 -0
- package/lib/legacy/rules/src/rule-manager.d.ts +75 -0
- package/lib/legacy/types/index.d.ts +36 -0
- package/lib/legacy/types/src/Audience.d.ts +16 -0
- package/lib/legacy/types/src/BucketedFeature.d.ts +30 -0
- package/lib/legacy/types/src/BucketedVariation.d.ts +13 -0
- package/lib/legacy/types/src/BucketingAttributes.d.ts +13 -0
- package/lib/legacy/types/src/Config.d.ts +62 -0
- package/lib/legacy/types/src/ConversionAttributes.d.ts +11 -0
- package/lib/legacy/types/src/Entity.d.ts +13 -0
- package/lib/legacy/types/src/Experience.d.ts +37 -0
- package/lib/legacy/types/src/Feature.d.ts +18 -0
- package/lib/legacy/types/src/Goal.d.ts +30 -0
- package/lib/legacy/types/src/Id.d.ts +10 -0
- package/lib/{index.d.ts → legacy/types/src/IndentityField.d.ts} +2 -1
- package/lib/legacy/types/src/Integration.d.ts +16 -0
- package/lib/legacy/types/src/Location.d.ts +14 -0
- package/lib/legacy/types/src/Path.d.ts +10 -0
- package/lib/legacy/types/src/Project.d.ts +37 -0
- package/lib/legacy/types/src/RequireAtLeastOne.d.ts +3 -0
- package/lib/legacy/types/src/Rule.d.ts +24 -0
- package/lib/legacy/types/src/Segments.d.ts +14 -0
- package/lib/legacy/types/src/SegmentsAttributes.d.ts +9 -0
- package/lib/legacy/types/src/SegmentsData.d.ts +16 -0
- package/lib/legacy/types/src/StoreData.d.ts +14 -0
- package/lib/legacy/types/src/TrackingEvent.d.ts +14 -0
- package/lib/legacy/types/src/VariableType.d.ts +8 -0
- package/lib/legacy/types/src/Variation.d.ts +49 -0
- package/lib/legacy/types/src/VisitorsQueue.d.ts +16 -0
- package/lib/legacy/types/src/tracking/BucketingEvent.d.ts +11 -0
- package/lib/legacy/types/src/tracking/ConversionEvent.d.ts +16 -0
- package/lib/legacy/types/src/tracking/Visitor.d.ts +14 -0
- package/lib/legacy/types/src/tracking/VisitorEvent.d.ts +13 -0
- package/lib/legacy/utils/index.d.ts +14 -0
- package/lib/legacy/utils/src/array-utils.d.ts +11 -0
- package/lib/legacy/utils/src/comparisons.d.ts +22 -0
- package/lib/legacy/utils/src/data-store.d.ts +39 -0
- package/lib/legacy/utils/src/file-logger.d.ts +40 -0
- package/lib/legacy/utils/src/http-client.d.ts +102 -0
- package/lib/legacy/utils/src/object-utils.d.ts +28 -0
- package/lib/legacy/utils/src/string-utils.d.ts +20 -0
- package/lib/legacy/utils/src/types-utils.d.ts +12 -0
- package/lib/logger/index.d.ts +8 -0
- package/lib/logger/src/interfaces/log-client.d.ts +13 -0
- package/lib/logger/src/interfaces/log-manager.d.ts +18 -0
- package/lib/logger/src/interfaces/log-method-map.d.ts +15 -0
- package/lib/logger/src/log-manager.d.ts +64 -0
- package/lib/package.json +18 -0
- package/lib/rules/index.d.ts +8 -0
- package/lib/rules/src/interfaces/rule-manager.d.ts +14 -0
- package/lib/rules/src/rule-manager.d.ts +75 -0
- package/lib/types/index.d.ts +36 -0
- package/lib/types/src/Audience.d.ts +16 -0
- package/lib/types/src/BucketedFeature.d.ts +30 -0
- package/lib/types/src/BucketedVariation.d.ts +13 -0
- package/lib/types/src/BucketingAttributes.d.ts +13 -0
- package/lib/types/src/Config.d.ts +62 -0
- package/lib/types/src/ConversionAttributes.d.ts +11 -0
- package/lib/types/src/Entity.d.ts +13 -0
- package/lib/types/src/Experience.d.ts +37 -0
- package/lib/types/src/Feature.d.ts +18 -0
- package/lib/types/src/Goal.d.ts +30 -0
- package/lib/types/src/Id.d.ts +10 -0
- package/lib/types/src/IndentityField.d.ts +7 -0
- package/lib/types/src/Integration.d.ts +16 -0
- package/lib/types/src/Location.d.ts +14 -0
- package/lib/types/src/Path.d.ts +10 -0
- package/lib/types/src/Project.d.ts +37 -0
- package/lib/types/src/RequireAtLeastOne.d.ts +3 -0
- package/lib/types/src/Rule.d.ts +24 -0
- package/lib/types/src/Segments.d.ts +14 -0
- package/lib/types/src/SegmentsAttributes.d.ts +9 -0
- package/lib/types/src/SegmentsData.d.ts +16 -0
- package/lib/types/src/StoreData.d.ts +14 -0
- package/lib/types/src/TrackingEvent.d.ts +14 -0
- package/lib/types/src/VariableType.d.ts +8 -0
- package/lib/types/src/Variation.d.ts +49 -0
- package/lib/types/src/VisitorsQueue.d.ts +16 -0
- package/lib/types/src/tracking/BucketingEvent.d.ts +11 -0
- package/lib/types/src/tracking/ConversionEvent.d.ts +16 -0
- package/lib/types/src/tracking/Visitor.d.ts +14 -0
- package/lib/types/src/tracking/VisitorEvent.d.ts +13 -0
- package/lib/utils/index.d.ts +14 -0
- package/lib/utils/src/array-utils.d.ts +11 -0
- package/lib/utils/src/comparisons.d.ts +22 -0
- package/lib/utils/src/data-store.d.ts +39 -0
- package/lib/utils/src/file-logger.d.ts +40 -0
- package/lib/utils/src/http-client.d.ts +102 -0
- package/lib/utils/src/object-utils.d.ts +28 -0
- package/lib/utils/src/string-utils.d.ts +20 -0
- package/lib/utils/src/types-utils.d.ts +12 -0
- package/package.json +60 -1
package/lib/index.js
CHANGED
|
@@ -1,8 +1,235 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var jsSdkUtils = require('@convertcom/js-sdk-utils');
|
|
4
|
+
var jsSdkEnums = require('@convertcom/js-sdk-enums');
|
|
5
|
+
|
|
3
6
|
/*!
|
|
4
7
|
* Convert JS SDK
|
|
5
8
|
* Version 1.0.0
|
|
6
9
|
* Copyright(c) 2020 Convert Insights, Inc
|
|
7
10
|
* License Apache-2.0
|
|
8
11
|
*/
|
|
12
|
+
const DEFAULT_KEYS_CASE_SENSITIVE = true;
|
|
13
|
+
const DEFAULT_NEGATION = '!';
|
|
14
|
+
/**
|
|
15
|
+
* Provides rule processing calculations with corresponding comparisons methods
|
|
16
|
+
* @category Modules
|
|
17
|
+
* @constructor
|
|
18
|
+
* @implements {RuleManagerInterface}
|
|
19
|
+
*/
|
|
20
|
+
class RuleManager {
|
|
21
|
+
/**
|
|
22
|
+
* @param {Config=} config
|
|
23
|
+
* @param {Object=} dependencies
|
|
24
|
+
* @param {LogManagerInterface=} dependencies.loggerManager
|
|
25
|
+
*/
|
|
26
|
+
constructor(config, { loggerManager } = {}) {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
this._comparisonProcessor = jsSdkUtils.Comparisons;
|
|
29
|
+
this._negation = DEFAULT_NEGATION;
|
|
30
|
+
this._keys_case_sensitive = DEFAULT_KEYS_CASE_SENSITIVE;
|
|
31
|
+
this._loggerManager = loggerManager;
|
|
32
|
+
this._comparisonProcessor = jsSdkUtils.objectDeepValue(config, 'rules.comparisonProcessor', jsSdkUtils.Comparisons);
|
|
33
|
+
this._negation = String(jsSdkUtils.objectDeepValue(config, 'rules.negation', DEFAULT_NEGATION)).valueOf();
|
|
34
|
+
this._keys_case_sensitive = jsSdkUtils.objectDeepValue(config, 'rules.keys_case_sensitive', DEFAULT_KEYS_CASE_SENSITIVE, true);
|
|
35
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager()', jsSdkEnums.MESSAGES.RULE_CONSTRUCTOR, this);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Setter for comparison processor
|
|
39
|
+
* @param {Record<string, any>} comparisonProcessor
|
|
40
|
+
*/
|
|
41
|
+
set comparisonProcessor(comparisonProcessor) {
|
|
42
|
+
this._comparisonProcessor = comparisonProcessor;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Getter for comparison processor
|
|
46
|
+
*/
|
|
47
|
+
get comparisonProcessor() {
|
|
48
|
+
return this._comparisonProcessor;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Retrieve comparison methods from comparison processor
|
|
52
|
+
* @return {Array<string>} List of methods of comparison processor
|
|
53
|
+
*/
|
|
54
|
+
getComparisonProcessorMethods() {
|
|
55
|
+
return Object.getOwnPropertyNames(this._comparisonProcessor).filter((name) => typeof this._comparisonProcessor[name] === 'function');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check input data matching to rule set
|
|
59
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
60
|
+
* @param {RuleSet} ruleSet
|
|
61
|
+
* @return {boolean | RuleError}
|
|
62
|
+
*/
|
|
63
|
+
isRuleMatched(data, ruleSet, logEntry) {
|
|
64
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
65
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager.isRuleMatched()', {
|
|
66
|
+
data: data,
|
|
67
|
+
ruleSet: ruleSet
|
|
68
|
+
});
|
|
69
|
+
if (logEntry) {
|
|
70
|
+
(_d = (_c = this._loggerManager) === null || _c === void 0 ? void 0 : _c.info) === null || _d === void 0 ? void 0 : _d.call(_c, 'RuleManager.isRuleMatched()', jsSdkEnums.MESSAGES.PROCESSING_ENTITY.replace('#', logEntry));
|
|
71
|
+
}
|
|
72
|
+
// Top OR level
|
|
73
|
+
let match;
|
|
74
|
+
if (Object.prototype.hasOwnProperty.call(ruleSet, 'OR') &&
|
|
75
|
+
jsSdkUtils.arrayNotEmpty(ruleSet === null || ruleSet === void 0 ? void 0 : ruleSet.OR)) {
|
|
76
|
+
for (let i = 0, l = ruleSet.OR.length; i < l; i++) {
|
|
77
|
+
match = this._processAND(data, ruleSet.OR[i]);
|
|
78
|
+
if (Object.values(jsSdkEnums.RuleError).includes(match)) {
|
|
79
|
+
(_f = (_e = this._loggerManager) === null || _e === void 0 ? void 0 : _e.info) === null || _f === void 0 ? void 0 : _f.call(_e, 'RuleManager.isRuleMatched()', logEntry || '', jsSdkEnums.ERROR_MESSAGES.RULE_ERROR);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
(_h = (_g = this._loggerManager) === null || _g === void 0 ? void 0 : _g.info) === null || _h === void 0 ? void 0 : _h.call(_g, 'RuleManager.isRuleMatched()', logEntry || '', match === false
|
|
83
|
+
? jsSdkEnums.MESSAGES.RULE_NOT_MATCH
|
|
84
|
+
: jsSdkEnums.MESSAGES.RULE_MATCH.replace('#', String(i)));
|
|
85
|
+
}
|
|
86
|
+
if (match !== false) {
|
|
87
|
+
return match;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
(_k = (_j = this._loggerManager) === null || _j === void 0 ? void 0 : _j.warn) === null || _k === void 0 ? void 0 : _k.call(_j, 'RuleManager.isRuleMatched()', logEntry || '', jsSdkEnums.ERROR_MESSAGES.RULE_NOT_VALID);
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check is rule object valid
|
|
98
|
+
* @param {Rule} rule
|
|
99
|
+
* @return {boolean}
|
|
100
|
+
*/
|
|
101
|
+
isValidRule(rule) {
|
|
102
|
+
var _a, _b;
|
|
103
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager.isValidRule()', {
|
|
104
|
+
rule: rule
|
|
105
|
+
});
|
|
106
|
+
return (Object.prototype.hasOwnProperty.call(rule, 'matching') &&
|
|
107
|
+
typeof rule.matching === 'object' &&
|
|
108
|
+
Object.prototype.hasOwnProperty.call(rule.matching, 'match_type') &&
|
|
109
|
+
typeof rule.matching.match_type === 'string' &&
|
|
110
|
+
Object.prototype.hasOwnProperty.call(rule.matching, 'negated') &&
|
|
111
|
+
typeof rule.matching.negated === 'boolean' &&
|
|
112
|
+
Object.prototype.hasOwnProperty.call(rule, 'value'));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Process AND block of rule set. Return first false if found
|
|
116
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
117
|
+
* @param {RuleAnd} rulesSubset
|
|
118
|
+
* @return {boolean | RuleError}
|
|
119
|
+
* @private
|
|
120
|
+
*/
|
|
121
|
+
_processAND(data, rulesSubset) {
|
|
122
|
+
var _a, _b, _c, _d;
|
|
123
|
+
// Second AND level
|
|
124
|
+
let match;
|
|
125
|
+
if (Object.prototype.hasOwnProperty.call(rulesSubset, 'AND') &&
|
|
126
|
+
jsSdkUtils.arrayNotEmpty(rulesSubset === null || rulesSubset === void 0 ? void 0 : rulesSubset.AND)) {
|
|
127
|
+
for (let i = 0, l = rulesSubset.AND.length; i < l; i++) {
|
|
128
|
+
match = this._processORWHEN(data, rulesSubset.AND[i]);
|
|
129
|
+
if (match === false) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (match !== false) {
|
|
134
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.info) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager._processAND()', jsSdkEnums.MESSAGES.RULE_MATCH_AND);
|
|
135
|
+
}
|
|
136
|
+
return match;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
(_d = (_c = this._loggerManager) === null || _c === void 0 ? void 0 : _c.warn) === null || _d === void 0 ? void 0 : _d.call(_c, 'RuleManager._processAND()', jsSdkEnums.ERROR_MESSAGES.RULE_NOT_VALID);
|
|
140
|
+
}
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Process OR block of rule set. Return first true if found
|
|
145
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
146
|
+
* @param {RuleOrWhen} rulesSubset
|
|
147
|
+
* @return {boolean | RuleError}
|
|
148
|
+
* @private
|
|
149
|
+
*/
|
|
150
|
+
_processORWHEN(data, rulesSubset) {
|
|
151
|
+
var _a, _b;
|
|
152
|
+
// Third OR level. Called OR_WHEN.
|
|
153
|
+
let match;
|
|
154
|
+
if (Object.prototype.hasOwnProperty.call(rulesSubset, 'OR_WHEN') &&
|
|
155
|
+
jsSdkUtils.arrayNotEmpty(rulesSubset === null || rulesSubset === void 0 ? void 0 : rulesSubset.OR_WHEN)) {
|
|
156
|
+
for (let i = 0, l = rulesSubset.OR_WHEN.length; i < l; i++) {
|
|
157
|
+
match = this._processRuleItem(data, rulesSubset.OR_WHEN[i]);
|
|
158
|
+
if (match !== false) {
|
|
159
|
+
return match;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.warn) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager._processORWHEN()', jsSdkEnums.ERROR_MESSAGES.RULE_NOT_VALID);
|
|
165
|
+
}
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Process single rule item
|
|
170
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
171
|
+
* @param {Rule} rule A single rule to compare
|
|
172
|
+
* @return {boolean | RuleError} Comparison result
|
|
173
|
+
* @private
|
|
174
|
+
*/
|
|
175
|
+
_processRuleItem(data, rule) {
|
|
176
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
177
|
+
if (this.isValidRule(rule)) {
|
|
178
|
+
try {
|
|
179
|
+
const negation = rule.matching.negated || false;
|
|
180
|
+
const matching = rule.matching.match_type;
|
|
181
|
+
if (this.getComparisonProcessorMethods().indexOf(matching) !== -1) {
|
|
182
|
+
if (typeof data === 'object') {
|
|
183
|
+
// Validate data key-value set.
|
|
184
|
+
if (data.constructor === Object) {
|
|
185
|
+
// Rule object has to have `key` field
|
|
186
|
+
for (const key of Object.keys(data)) {
|
|
187
|
+
const k = this._keys_case_sensitive ? key : key.toLowerCase();
|
|
188
|
+
const rule_k = this._keys_case_sensitive
|
|
189
|
+
? rule.key
|
|
190
|
+
: rule.key.toLowerCase();
|
|
191
|
+
if (k === rule_k) {
|
|
192
|
+
return this._comparisonProcessor[matching](data[key], rule.value, negation);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else if (rule === null || rule === void 0 ? void 0 : rule.rule_type) {
|
|
197
|
+
// Rule object has to have `rule_type` field
|
|
198
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.info) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager._processRuleItem()', jsSdkEnums.MESSAGES.RULE_MATCH_START.replace('#', rule.rule_type));
|
|
199
|
+
for (const method of Object.getOwnPropertyNames(data.constructor.prototype)) {
|
|
200
|
+
if (method === 'constructor')
|
|
201
|
+
continue;
|
|
202
|
+
const rule_method = jsSdkUtils.camelCase(`get ${rule.rule_type.replace(/_/g, ' ')}`);
|
|
203
|
+
if (method === rule_method) {
|
|
204
|
+
const dataValue = data[method](rule);
|
|
205
|
+
if (Object.values(jsSdkEnums.RuleError).includes(dataValue))
|
|
206
|
+
return dataValue;
|
|
207
|
+
if (rule.rule_type === 'js_condition')
|
|
208
|
+
return dataValue;
|
|
209
|
+
return this._comparisonProcessor[matching](dataValue, rule.value, negation);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
(_d = (_c = this._loggerManager) === null || _c === void 0 ? void 0 : _c.warn) === null || _d === void 0 ? void 0 : _d.call(_c, 'RuleManager._processRuleItem()', {
|
|
216
|
+
warn: jsSdkEnums.ERROR_MESSAGES.RULE_DATA_NOT_VALID
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
(_f = (_e = this._loggerManager) === null || _e === void 0 ? void 0 : _e.error) === null || _f === void 0 ? void 0 : _f.call(_e, 'RuleManager._processRuleItem()', {
|
|
223
|
+
error: error.message
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
(_h = (_g = this._loggerManager) === null || _g === void 0 ? void 0 : _g.warn) === null || _h === void 0 ? void 0 : _h.call(_g, 'RuleManager._processRuleItem()', jsSdkEnums.ERROR_MESSAGES.RULE_NOT_VALID);
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
exports.RuleManager = RuleManager;
|
|
235
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/lib/index.min.js
CHANGED
|
@@ -4,3 +4,5 @@
|
|
|
4
4
|
* Copyright(c) 2020-2022 Convert Insights, Inc
|
|
5
5
|
* License Apache-2.0
|
|
6
6
|
*/
|
|
7
|
+
"use strict";var e=require("@convertcom/js-sdk-utils"),r=require("@convertcom/js-sdk-enums");exports.RuleManager=class{constructor(o,{loggerManager:l}={}){var t,s;this._comparisonProcessor=e.Comparisons,this._negation="!",this._keys_case_sensitive=true,this._loggerManager=l,this._comparisonProcessor=e.objectDeepValue(o,"rules.comparisonProcessor",e.Comparisons),this._negation=String(e.objectDeepValue(o,"rules.negation","!")).valueOf(),this._keys_case_sensitive=e.objectDeepValue(o,"rules.keys_case_sensitive",true,!0),null===(s=null===(t=this._loggerManager)||void 0===t?void 0:t.trace)||void 0===s||s.call(t,"RuleManager()",r.MESSAGES.RULE_CONSTRUCTOR,this)}set comparisonProcessor(e){this._comparisonProcessor=e}get comparisonProcessor(){return this._comparisonProcessor}getComparisonProcessorMethods(){return Object.getOwnPropertyNames(this._comparisonProcessor).filter((e=>"function"==typeof this._comparisonProcessor[e]))}isRuleMatched(o,l,t){var s,a,i,n,c,u,_,g,R,p;let d;if(null===(a=null===(s=this._loggerManager)||void 0===s?void 0:s.trace)||void 0===a||a.call(s,"RuleManager.isRuleMatched()",{data:o,ruleSet:l}),t&&(null===(n=null===(i=this._loggerManager)||void 0===i?void 0:i.info)||void 0===n||n.call(i,"RuleManager.isRuleMatched()",r.MESSAGES.PROCESSING_ENTITY.replace("#",t))),Object.prototype.hasOwnProperty.call(l,"OR")&&e.arrayNotEmpty(null==l?void 0:l.OR)){for(let e=0,s=l.OR.length;e<s;e++)if(d=this._processAND(o,l.OR[e]),Object.values(r.RuleError).includes(d)?null===(u=null===(c=this._loggerManager)||void 0===c?void 0:c.info)||void 0===u||u.call(c,"RuleManager.isRuleMatched()",t||"",r.ERROR_MESSAGES.RULE_ERROR):null===(g=null===(_=this._loggerManager)||void 0===_?void 0:_.info)||void 0===g||g.call(_,"RuleManager.isRuleMatched()",t||"",!1===d?r.MESSAGES.RULE_NOT_MATCH:r.MESSAGES.RULE_MATCH.replace("#",String(e))),!1!==d)return d}else null===(p=null===(R=this._loggerManager)||void 0===R?void 0:R.warn)||void 0===p||p.call(R,"RuleManager.isRuleMatched()",t||"",r.ERROR_MESSAGES.RULE_NOT_VALID);return!1}isValidRule(e){var r,o;return null===(o=null===(r=this._loggerManager)||void 0===r?void 0:r.trace)||void 0===o||o.call(r,"RuleManager.isValidRule()",{rule:e}),Object.prototype.hasOwnProperty.call(e,"matching")&&"object"==typeof e.matching&&Object.prototype.hasOwnProperty.call(e.matching,"match_type")&&"string"==typeof e.matching.match_type&&Object.prototype.hasOwnProperty.call(e.matching,"negated")&&"boolean"==typeof e.matching.negated&&Object.prototype.hasOwnProperty.call(e,"value")}_processAND(o,l){var t,s,a,i;let n;if(Object.prototype.hasOwnProperty.call(l,"AND")&&e.arrayNotEmpty(null==l?void 0:l.AND)){for(let e=0,r=l.AND.length;e<r;e++)if(n=this._processORWHEN(o,l.AND[e]),!1===n)return!1;return!1!==n&&(null===(s=null===(t=this._loggerManager)||void 0===t?void 0:t.info)||void 0===s||s.call(t,"RuleManager._processAND()",r.MESSAGES.RULE_MATCH_AND)),n}return null===(i=null===(a=this._loggerManager)||void 0===a?void 0:a.warn)||void 0===i||i.call(a,"RuleManager._processAND()",r.ERROR_MESSAGES.RULE_NOT_VALID),!1}_processORWHEN(o,l){var t,s;let a;if(Object.prototype.hasOwnProperty.call(l,"OR_WHEN")&&e.arrayNotEmpty(null==l?void 0:l.OR_WHEN)){for(let e=0,r=l.OR_WHEN.length;e<r;e++)if(a=this._processRuleItem(o,l.OR_WHEN[e]),!1!==a)return a}else null===(s=null===(t=this._loggerManager)||void 0===t?void 0:t.warn)||void 0===s||s.call(t,"RuleManager._processORWHEN()",r.ERROR_MESSAGES.RULE_NOT_VALID);return!1}_processRuleItem(o,l){var t,s,a,i,n,c,u,_;if(this.isValidRule(l))try{const n=l.matching.negated||!1,c=l.matching.match_type;if(-1!==this.getComparisonProcessorMethods().indexOf(c))if("object"==typeof o){if(o.constructor===Object)for(const e of Object.keys(o)){const r=this._keys_case_sensitive?e:e.toLowerCase();if(r===(this._keys_case_sensitive?l.key:l.key.toLowerCase()))return this._comparisonProcessor[c](o[e],l.value,n)}else if(null==l?void 0:l.rule_type){null===(s=null===(t=this._loggerManager)||void 0===t?void 0:t.info)||void 0===s||s.call(t,"RuleManager._processRuleItem()",r.MESSAGES.RULE_MATCH_START.replace("#",l.rule_type));for(const t of Object.getOwnPropertyNames(o.constructor.prototype)){if("constructor"===t)continue;if(t===e.camelCase(`get ${l.rule_type.replace(/_/g," ")}`)){const e=o[t](l);return Object.values(r.RuleError).includes(e)||"js_condition"===l.rule_type?e:this._comparisonProcessor[c](e,l.value,n)}}}}else null===(i=null===(a=this._loggerManager)||void 0===a?void 0:a.warn)||void 0===i||i.call(a,"RuleManager._processRuleItem()",{warn:r.ERROR_MESSAGES.RULE_DATA_NOT_VALID})}catch(e){null===(c=null===(n=this._loggerManager)||void 0===n?void 0:n.error)||void 0===c||c.call(n,"RuleManager._processRuleItem()",{error:e.message})}else null===(_=null===(u=this._loggerManager)||void 0===u?void 0:u.warn)||void 0===_||_.call(u,"RuleManager._processRuleItem()",r.ERROR_MESSAGES.RULE_NOT_VALID);return!1}};
|
|
8
|
+
//# sourceMappingURL=index.min.js.map
|
package/lib/index.min.js.map
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.min.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/lib/index.min.mjs
CHANGED
|
@@ -4,4 +4,5 @@
|
|
|
4
4
|
* Copyright(c) 2020-2022 Convert Insights, Inc
|
|
5
5
|
* License Apache-2.0
|
|
6
6
|
*/
|
|
7
|
+
import{Comparisons as e,objectDeepValue as r,arrayNotEmpty as o,camelCase as l}from"@convertcom/js-sdk-utils";import{MESSAGES as t,RuleError as s,ERROR_MESSAGES as a}from"@convertcom/js-sdk-enums";class i{constructor(o,{loggerManager:l}={}){var s,a;this._comparisonProcessor=e,this._negation="!",this._keys_case_sensitive=true,this._loggerManager=l,this._comparisonProcessor=r(o,"rules.comparisonProcessor",e),this._negation=String(r(o,"rules.negation","!")).valueOf(),this._keys_case_sensitive=r(o,"rules.keys_case_sensitive",true,!0),null===(a=null===(s=this._loggerManager)||void 0===s?void 0:s.trace)||void 0===a||a.call(s,"RuleManager()",t.RULE_CONSTRUCTOR,this)}set comparisonProcessor(e){this._comparisonProcessor=e}get comparisonProcessor(){return this._comparisonProcessor}getComparisonProcessorMethods(){return Object.getOwnPropertyNames(this._comparisonProcessor).filter((e=>"function"==typeof this._comparisonProcessor[e]))}isRuleMatched(e,r,l){var i,n,c,u,g,_,p,d,h,v;let R;if(null===(n=null===(i=this._loggerManager)||void 0===i?void 0:i.trace)||void 0===n||n.call(i,"RuleManager.isRuleMatched()",{data:e,ruleSet:r}),l&&(null===(u=null===(c=this._loggerManager)||void 0===c?void 0:c.info)||void 0===u||u.call(c,"RuleManager.isRuleMatched()",t.PROCESSING_ENTITY.replace("#",l))),Object.prototype.hasOwnProperty.call(r,"OR")&&o(null==r?void 0:r.OR)){for(let o=0,i=r.OR.length;o<i;o++)if(R=this._processAND(e,r.OR[o]),Object.values(s).includes(R)?null===(_=null===(g=this._loggerManager)||void 0===g?void 0:g.info)||void 0===_||_.call(g,"RuleManager.isRuleMatched()",l||"",a.RULE_ERROR):null===(d=null===(p=this._loggerManager)||void 0===p?void 0:p.info)||void 0===d||d.call(p,"RuleManager.isRuleMatched()",l||"",!1===R?t.RULE_NOT_MATCH:t.RULE_MATCH.replace("#",String(o))),!1!==R)return R}else null===(v=null===(h=this._loggerManager)||void 0===h?void 0:h.warn)||void 0===v||v.call(h,"RuleManager.isRuleMatched()",l||"",a.RULE_NOT_VALID);return!1}isValidRule(e){var r,o;return null===(o=null===(r=this._loggerManager)||void 0===r?void 0:r.trace)||void 0===o||o.call(r,"RuleManager.isValidRule()",{rule:e}),Object.prototype.hasOwnProperty.call(e,"matching")&&"object"==typeof e.matching&&Object.prototype.hasOwnProperty.call(e.matching,"match_type")&&"string"==typeof e.matching.match_type&&Object.prototype.hasOwnProperty.call(e.matching,"negated")&&"boolean"==typeof e.matching.negated&&Object.prototype.hasOwnProperty.call(e,"value")}_processAND(e,r){var l,s,i,n;let c;if(Object.prototype.hasOwnProperty.call(r,"AND")&&o(null==r?void 0:r.AND)){for(let o=0,l=r.AND.length;o<l;o++)if(c=this._processORWHEN(e,r.AND[o]),!1===c)return!1;return!1!==c&&(null===(s=null===(l=this._loggerManager)||void 0===l?void 0:l.info)||void 0===s||s.call(l,"RuleManager._processAND()",t.RULE_MATCH_AND)),c}return null===(n=null===(i=this._loggerManager)||void 0===i?void 0:i.warn)||void 0===n||n.call(i,"RuleManager._processAND()",a.RULE_NOT_VALID),!1}_processORWHEN(e,r){var l,t;let s;if(Object.prototype.hasOwnProperty.call(r,"OR_WHEN")&&o(null==r?void 0:r.OR_WHEN)){for(let o=0,l=r.OR_WHEN.length;o<l;o++)if(s=this._processRuleItem(e,r.OR_WHEN[o]),!1!==s)return s}else null===(t=null===(l=this._loggerManager)||void 0===l?void 0:l.warn)||void 0===t||t.call(l,"RuleManager._processORWHEN()",a.RULE_NOT_VALID);return!1}_processRuleItem(e,r){var o,i,n,c,u,g,_,p;if(this.isValidRule(r))try{const u=r.matching.negated||!1,g=r.matching.match_type;if(-1!==this.getComparisonProcessorMethods().indexOf(g))if("object"==typeof e){if(e.constructor===Object)for(const o of Object.keys(e)){const l=this._keys_case_sensitive?o:o.toLowerCase();if(l===(this._keys_case_sensitive?r.key:r.key.toLowerCase()))return this._comparisonProcessor[g](e[o],r.value,u)}else if(null==r?void 0:r.rule_type){null===(i=null===(o=this._loggerManager)||void 0===o?void 0:o.info)||void 0===i||i.call(o,"RuleManager._processRuleItem()",t.RULE_MATCH_START.replace("#",r.rule_type));for(const o of Object.getOwnPropertyNames(e.constructor.prototype)){if("constructor"===o)continue;if(o===l(`get ${r.rule_type.replace(/_/g," ")}`)){const l=e[o](r);return Object.values(s).includes(l)||"js_condition"===r.rule_type?l:this._comparisonProcessor[g](l,r.value,u)}}}}else null===(c=null===(n=this._loggerManager)||void 0===n?void 0:n.warn)||void 0===c||c.call(n,"RuleManager._processRuleItem()",{warn:a.RULE_DATA_NOT_VALID})}catch(e){null===(g=null===(u=this._loggerManager)||void 0===u?void 0:u.error)||void 0===g||g.call(u,"RuleManager._processRuleItem()",{error:e.message})}else null===(p=null===(_=this._loggerManager)||void 0===_?void 0:_.warn)||void 0===p||p.call(_,"RuleManager._processRuleItem()",a.RULE_NOT_VALID);return!1}}export{i as RuleManager};
|
|
7
8
|
//# sourceMappingURL=index.min.mjs.map
|
package/lib/index.min.mjs.map
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.min.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/lib/index.mjs
CHANGED
|
@@ -1,6 +1,233 @@
|
|
|
1
|
+
import { Comparisons, objectDeepValue, arrayNotEmpty, camelCase } from '@convertcom/js-sdk-utils';
|
|
2
|
+
import { MESSAGES, RuleError, ERROR_MESSAGES } from '@convertcom/js-sdk-enums';
|
|
3
|
+
|
|
1
4
|
/*!
|
|
2
5
|
* Convert JS SDK
|
|
3
6
|
* Version 1.0.0
|
|
4
7
|
* Copyright(c) 2020 Convert Insights, Inc
|
|
5
8
|
* License Apache-2.0
|
|
6
9
|
*/
|
|
10
|
+
const DEFAULT_KEYS_CASE_SENSITIVE = true;
|
|
11
|
+
const DEFAULT_NEGATION = '!';
|
|
12
|
+
/**
|
|
13
|
+
* Provides rule processing calculations with corresponding comparisons methods
|
|
14
|
+
* @category Modules
|
|
15
|
+
* @constructor
|
|
16
|
+
* @implements {RuleManagerInterface}
|
|
17
|
+
*/
|
|
18
|
+
class RuleManager {
|
|
19
|
+
/**
|
|
20
|
+
* @param {Config=} config
|
|
21
|
+
* @param {Object=} dependencies
|
|
22
|
+
* @param {LogManagerInterface=} dependencies.loggerManager
|
|
23
|
+
*/
|
|
24
|
+
constructor(config, { loggerManager } = {}) {
|
|
25
|
+
var _a, _b;
|
|
26
|
+
this._comparisonProcessor = Comparisons;
|
|
27
|
+
this._negation = DEFAULT_NEGATION;
|
|
28
|
+
this._keys_case_sensitive = DEFAULT_KEYS_CASE_SENSITIVE;
|
|
29
|
+
this._loggerManager = loggerManager;
|
|
30
|
+
this._comparisonProcessor = objectDeepValue(config, 'rules.comparisonProcessor', Comparisons);
|
|
31
|
+
this._negation = String(objectDeepValue(config, 'rules.negation', DEFAULT_NEGATION)).valueOf();
|
|
32
|
+
this._keys_case_sensitive = objectDeepValue(config, 'rules.keys_case_sensitive', DEFAULT_KEYS_CASE_SENSITIVE, true);
|
|
33
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager()', MESSAGES.RULE_CONSTRUCTOR, this);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Setter for comparison processor
|
|
37
|
+
* @param {Record<string, any>} comparisonProcessor
|
|
38
|
+
*/
|
|
39
|
+
set comparisonProcessor(comparisonProcessor) {
|
|
40
|
+
this._comparisonProcessor = comparisonProcessor;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Getter for comparison processor
|
|
44
|
+
*/
|
|
45
|
+
get comparisonProcessor() {
|
|
46
|
+
return this._comparisonProcessor;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Retrieve comparison methods from comparison processor
|
|
50
|
+
* @return {Array<string>} List of methods of comparison processor
|
|
51
|
+
*/
|
|
52
|
+
getComparisonProcessorMethods() {
|
|
53
|
+
return Object.getOwnPropertyNames(this._comparisonProcessor).filter((name) => typeof this._comparisonProcessor[name] === 'function');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check input data matching to rule set
|
|
57
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
58
|
+
* @param {RuleSet} ruleSet
|
|
59
|
+
* @return {boolean | RuleError}
|
|
60
|
+
*/
|
|
61
|
+
isRuleMatched(data, ruleSet, logEntry) {
|
|
62
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
63
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager.isRuleMatched()', {
|
|
64
|
+
data: data,
|
|
65
|
+
ruleSet: ruleSet
|
|
66
|
+
});
|
|
67
|
+
if (logEntry) {
|
|
68
|
+
(_d = (_c = this._loggerManager) === null || _c === void 0 ? void 0 : _c.info) === null || _d === void 0 ? void 0 : _d.call(_c, 'RuleManager.isRuleMatched()', MESSAGES.PROCESSING_ENTITY.replace('#', logEntry));
|
|
69
|
+
}
|
|
70
|
+
// Top OR level
|
|
71
|
+
let match;
|
|
72
|
+
if (Object.prototype.hasOwnProperty.call(ruleSet, 'OR') &&
|
|
73
|
+
arrayNotEmpty(ruleSet === null || ruleSet === void 0 ? void 0 : ruleSet.OR)) {
|
|
74
|
+
for (let i = 0, l = ruleSet.OR.length; i < l; i++) {
|
|
75
|
+
match = this._processAND(data, ruleSet.OR[i]);
|
|
76
|
+
if (Object.values(RuleError).includes(match)) {
|
|
77
|
+
(_f = (_e = this._loggerManager) === null || _e === void 0 ? void 0 : _e.info) === null || _f === void 0 ? void 0 : _f.call(_e, 'RuleManager.isRuleMatched()', logEntry || '', ERROR_MESSAGES.RULE_ERROR);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
(_h = (_g = this._loggerManager) === null || _g === void 0 ? void 0 : _g.info) === null || _h === void 0 ? void 0 : _h.call(_g, 'RuleManager.isRuleMatched()', logEntry || '', match === false
|
|
81
|
+
? MESSAGES.RULE_NOT_MATCH
|
|
82
|
+
: MESSAGES.RULE_MATCH.replace('#', String(i)));
|
|
83
|
+
}
|
|
84
|
+
if (match !== false) {
|
|
85
|
+
return match;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
(_k = (_j = this._loggerManager) === null || _j === void 0 ? void 0 : _j.warn) === null || _k === void 0 ? void 0 : _k.call(_j, 'RuleManager.isRuleMatched()', logEntry || '', ERROR_MESSAGES.RULE_NOT_VALID);
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check is rule object valid
|
|
96
|
+
* @param {Rule} rule
|
|
97
|
+
* @return {boolean}
|
|
98
|
+
*/
|
|
99
|
+
isValidRule(rule) {
|
|
100
|
+
var _a, _b;
|
|
101
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager.isValidRule()', {
|
|
102
|
+
rule: rule
|
|
103
|
+
});
|
|
104
|
+
return (Object.prototype.hasOwnProperty.call(rule, 'matching') &&
|
|
105
|
+
typeof rule.matching === 'object' &&
|
|
106
|
+
Object.prototype.hasOwnProperty.call(rule.matching, 'match_type') &&
|
|
107
|
+
typeof rule.matching.match_type === 'string' &&
|
|
108
|
+
Object.prototype.hasOwnProperty.call(rule.matching, 'negated') &&
|
|
109
|
+
typeof rule.matching.negated === 'boolean' &&
|
|
110
|
+
Object.prototype.hasOwnProperty.call(rule, 'value'));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Process AND block of rule set. Return first false if found
|
|
114
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
115
|
+
* @param {RuleAnd} rulesSubset
|
|
116
|
+
* @return {boolean | RuleError}
|
|
117
|
+
* @private
|
|
118
|
+
*/
|
|
119
|
+
_processAND(data, rulesSubset) {
|
|
120
|
+
var _a, _b, _c, _d;
|
|
121
|
+
// Second AND level
|
|
122
|
+
let match;
|
|
123
|
+
if (Object.prototype.hasOwnProperty.call(rulesSubset, 'AND') &&
|
|
124
|
+
arrayNotEmpty(rulesSubset === null || rulesSubset === void 0 ? void 0 : rulesSubset.AND)) {
|
|
125
|
+
for (let i = 0, l = rulesSubset.AND.length; i < l; i++) {
|
|
126
|
+
match = this._processORWHEN(data, rulesSubset.AND[i]);
|
|
127
|
+
if (match === false) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (match !== false) {
|
|
132
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.info) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager._processAND()', MESSAGES.RULE_MATCH_AND);
|
|
133
|
+
}
|
|
134
|
+
return match;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
(_d = (_c = this._loggerManager) === null || _c === void 0 ? void 0 : _c.warn) === null || _d === void 0 ? void 0 : _d.call(_c, 'RuleManager._processAND()', ERROR_MESSAGES.RULE_NOT_VALID);
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Process OR block of rule set. Return first true if found
|
|
143
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
144
|
+
* @param {RuleOrWhen} rulesSubset
|
|
145
|
+
* @return {boolean | RuleError}
|
|
146
|
+
* @private
|
|
147
|
+
*/
|
|
148
|
+
_processORWHEN(data, rulesSubset) {
|
|
149
|
+
var _a, _b;
|
|
150
|
+
// Third OR level. Called OR_WHEN.
|
|
151
|
+
let match;
|
|
152
|
+
if (Object.prototype.hasOwnProperty.call(rulesSubset, 'OR_WHEN') &&
|
|
153
|
+
arrayNotEmpty(rulesSubset === null || rulesSubset === void 0 ? void 0 : rulesSubset.OR_WHEN)) {
|
|
154
|
+
for (let i = 0, l = rulesSubset.OR_WHEN.length; i < l; i++) {
|
|
155
|
+
match = this._processRuleItem(data, rulesSubset.OR_WHEN[i]);
|
|
156
|
+
if (match !== false) {
|
|
157
|
+
return match;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.warn) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager._processORWHEN()', ERROR_MESSAGES.RULE_NOT_VALID);
|
|
163
|
+
}
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Process single rule item
|
|
168
|
+
* @param {Record<string, any>} data Single value or key-value data set to compare
|
|
169
|
+
* @param {Rule} rule A single rule to compare
|
|
170
|
+
* @return {boolean | RuleError} Comparison result
|
|
171
|
+
* @private
|
|
172
|
+
*/
|
|
173
|
+
_processRuleItem(data, rule) {
|
|
174
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
175
|
+
if (this.isValidRule(rule)) {
|
|
176
|
+
try {
|
|
177
|
+
const negation = rule.matching.negated || false;
|
|
178
|
+
const matching = rule.matching.match_type;
|
|
179
|
+
if (this.getComparisonProcessorMethods().indexOf(matching) !== -1) {
|
|
180
|
+
if (typeof data === 'object') {
|
|
181
|
+
// Validate data key-value set.
|
|
182
|
+
if (data.constructor === Object) {
|
|
183
|
+
// Rule object has to have `key` field
|
|
184
|
+
for (const key of Object.keys(data)) {
|
|
185
|
+
const k = this._keys_case_sensitive ? key : key.toLowerCase();
|
|
186
|
+
const rule_k = this._keys_case_sensitive
|
|
187
|
+
? rule.key
|
|
188
|
+
: rule.key.toLowerCase();
|
|
189
|
+
if (k === rule_k) {
|
|
190
|
+
return this._comparisonProcessor[matching](data[key], rule.value, negation);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else if (rule === null || rule === void 0 ? void 0 : rule.rule_type) {
|
|
195
|
+
// Rule object has to have `rule_type` field
|
|
196
|
+
(_b = (_a = this._loggerManager) === null || _a === void 0 ? void 0 : _a.info) === null || _b === void 0 ? void 0 : _b.call(_a, 'RuleManager._processRuleItem()', MESSAGES.RULE_MATCH_START.replace('#', rule.rule_type));
|
|
197
|
+
for (const method of Object.getOwnPropertyNames(data.constructor.prototype)) {
|
|
198
|
+
if (method === 'constructor')
|
|
199
|
+
continue;
|
|
200
|
+
const rule_method = camelCase(`get ${rule.rule_type.replace(/_/g, ' ')}`);
|
|
201
|
+
if (method === rule_method) {
|
|
202
|
+
const dataValue = data[method](rule);
|
|
203
|
+
if (Object.values(RuleError).includes(dataValue))
|
|
204
|
+
return dataValue;
|
|
205
|
+
if (rule.rule_type === 'js_condition')
|
|
206
|
+
return dataValue;
|
|
207
|
+
return this._comparisonProcessor[matching](dataValue, rule.value, negation);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
(_d = (_c = this._loggerManager) === null || _c === void 0 ? void 0 : _c.warn) === null || _d === void 0 ? void 0 : _d.call(_c, 'RuleManager._processRuleItem()', {
|
|
214
|
+
warn: ERROR_MESSAGES.RULE_DATA_NOT_VALID
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
(_f = (_e = this._loggerManager) === null || _e === void 0 ? void 0 : _e.error) === null || _f === void 0 ? void 0 : _f.call(_e, 'RuleManager._processRuleItem()', {
|
|
221
|
+
error: error.message
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
(_h = (_g = this._loggerManager) === null || _g === void 0 ? void 0 : _g.warn) === null || _h === void 0 ? void 0 : _h.call(_g, 'RuleManager._processRuleItem()', ERROR_MESSAGES.RULE_NOT_VALID);
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export { RuleManager };
|
|
233
|
+
//# sourceMappingURL=index.mjs.map
|
package/lib/index.mjs.map
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Convert JS SDK test
|
|
3
|
+
* Version 1.0.0
|
|
4
|
+
* Copyright(c) 2020 Convert Insights, Inc
|
|
5
|
+
* License Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
export * from './src/audience-type';
|
|
8
|
+
export * from './src/data-enitites';
|
|
9
|
+
export * from './src/dictionary';
|
|
10
|
+
export * from './src/do-not-track';
|
|
11
|
+
export * from './src/event-type';
|
|
12
|
+
export * from './src/experience-type';
|
|
13
|
+
export * from './src/feature-status';
|
|
14
|
+
export * from './src/ga-type';
|
|
15
|
+
export * from './src/goal-data-key';
|
|
16
|
+
export * from './src/goal-type';
|
|
17
|
+
export * from './src/integration-provider';
|
|
18
|
+
export * from './src/log-level';
|
|
19
|
+
export * from './src/log-method';
|
|
20
|
+
export * from './src/project-type';
|
|
21
|
+
export * from './src/rule-error';
|
|
22
|
+
export * from './src/system-events';
|
|
23
|
+
export * from './src/variable-types';
|
|
24
|
+
export * from './src/variation-change-type';
|
|
25
|
+
export * from './src/segments/browser-type';
|
|
26
|
+
export * from './src/segments/device-type';
|
|
27
|
+
export * from './src/segments/segments-keys';
|
|
28
|
+
export * from './src/segments/source-type';
|
|
29
|
+
export * from './src/segments/visitor-type';
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Convert JS SDK
|
|
3
|
+
* Version 1.0.0
|
|
4
|
+
* Copyright(c) 2020 Convert Insights, Inc
|
|
5
|
+
* License Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
export declare const ERROR_MESSAGES: {
|
|
8
|
+
SDK_KEY_MISSING: string;
|
|
9
|
+
DATA_OBJECT_MISSING: string;
|
|
10
|
+
CONFIG_DATA_NOT_VALID: string;
|
|
11
|
+
SDK_OR_DATA_OBJECT_REQUIRED: string;
|
|
12
|
+
RULE_NOT_VALID: string;
|
|
13
|
+
RULE_DATA_NOT_VALID: string;
|
|
14
|
+
RULE_ERROR: string;
|
|
15
|
+
DATA_STORE_NOT_VALID: string;
|
|
16
|
+
VISITOR_ID_REQUIRED: string;
|
|
17
|
+
GOAL_DATA_NOT_VALID: string;
|
|
18
|
+
UNABLE_TO_SELECT_BUCKET_FOR_VISITOR: string;
|
|
19
|
+
UNABLE_TO_PERFORM_NETWORK_REQUEST: string;
|
|
20
|
+
UNSUPPORTED_RESPONSE_TYPE: string;
|
|
21
|
+
};
|
|
22
|
+
export declare const MESSAGES: {
|
|
23
|
+
CONFIG_DATA_UPDATED: string;
|
|
24
|
+
CORE_CONSTRUCTOR: string;
|
|
25
|
+
CORE_INITIALIZED: string;
|
|
26
|
+
EXPERIENCE_CONSTRUCTOR: string;
|
|
27
|
+
EXPERIENCE_NOT_FOUND: string;
|
|
28
|
+
EXPERIENCE_RULES_MATCHED: string;
|
|
29
|
+
VARIATIONS_NOT_FOUND: string;
|
|
30
|
+
VARIATION_CHANGE_NOT_SUPPORTED: string;
|
|
31
|
+
FEATURE_CONSTRUCTOR: string;
|
|
32
|
+
FEATURE_NOT_FOUND: string;
|
|
33
|
+
FEATURE_VARIABLES_NOT_FOUND: string;
|
|
34
|
+
FEATURE_VARIABLES_TYPE_NOT_FOUND: string;
|
|
35
|
+
BUCKETING_CONSTRUCTOR: string;
|
|
36
|
+
DATA_CONSTRUCTOR: string;
|
|
37
|
+
RULE_CONSTRUCTOR: string;
|
|
38
|
+
PROCESSING_ENTITY: string;
|
|
39
|
+
LOCATION_MATCH: string;
|
|
40
|
+
LOCATION_NOT_MATCH: string;
|
|
41
|
+
AUDIENCE_MATCH: string;
|
|
42
|
+
AUDIENCE_NOT_MATCH: string;
|
|
43
|
+
AUDIENCE_NOT_RESTRICTED: string;
|
|
44
|
+
SEGMENTATION_MATCH: string;
|
|
45
|
+
RULE_NOT_MATCH: string;
|
|
46
|
+
RULE_MATCH: string;
|
|
47
|
+
RULE_MATCH_AND: string;
|
|
48
|
+
RULE_MATCH_START: string;
|
|
49
|
+
LOCATION_ACTIVATED: string;
|
|
50
|
+
LOCATION_DEACTIVATED: string;
|
|
51
|
+
BUCKETED_VISITOR_FOUND: string;
|
|
52
|
+
BUCKETED_VISITOR: string;
|
|
53
|
+
GOAL_NOT_FOUND: string;
|
|
54
|
+
GOAL_RULE_NOT_MATCH: string;
|
|
55
|
+
GOAL_FOUND: string;
|
|
56
|
+
SEGMENTS_NOT_FOUND: string;
|
|
57
|
+
SEGMENTS_RULE_NOT_MATCH: string;
|
|
58
|
+
CUSTOM_SEGMENTS_KEY_FOUND: string;
|
|
59
|
+
SEND_BEACON_SUCCESS: string;
|
|
60
|
+
};
|