@kameleoon/javascript-sdk-core 1.1.1 → 2.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/dist/campaignConfiguration/campaignConfiguration.d.ts +2 -1
- package/dist/campaignConfiguration/campaignConfiguration.js +239 -197
- package/dist/campaignConfiguration/campaignConfiguration.js.map +1 -1
- package/dist/campaignConfiguration/constants.js +20 -14
- package/dist/campaignConfiguration/constants.js.map +1 -1
- package/dist/campaignConfiguration/index.js +78 -6
- package/dist/campaignConfiguration/index.js.map +1 -1
- package/dist/campaignConfiguration/types.d.ts +3 -2
- package/dist/campaignConfiguration/types.js +53 -45
- package/dist/campaignConfiguration/types.js.map +1 -1
- package/dist/clientSettings/clientSettings.d.ts +1 -1
- package/dist/clientSettings/clientSettings.js +28 -21
- package/dist/clientSettings/clientSettings.js.map +1 -1
- package/dist/clientSettings/index.js +18 -4
- package/dist/clientSettings/index.js.map +1 -1
- package/dist/clientSettings/types.d.ts +1 -1
- package/dist/clientSettings/types.js +4 -1
- package/dist/clientSettings/types.js.map +1 -1
- package/dist/constants.js +22 -14
- package/dist/constants.js.map +1 -1
- package/dist/eventSource/constants.js +6 -2
- package/dist/eventSource/constants.js.map +1 -1
- package/dist/eventSource/externalEventSource.js +28 -20
- package/dist/eventSource/externalEventSource.js.map +1 -1
- package/dist/eventSource/index.js +49 -6
- package/dist/eventSource/index.js.map +1 -1
- package/dist/eventSource/types.d.ts +1 -1
- package/dist/eventSource/types.js +4 -1
- package/dist/eventSource/types.js.map +1 -1
- package/dist/hasher/constants.js +6 -2
- package/dist/hasher/constants.js.map +1 -1
- package/dist/hasher/hasher.js +35 -24
- package/dist/hasher/hasher.js.map +1 -1
- package/dist/hasher/index.js +11 -4
- package/dist/hasher/index.js.map +1 -1
- package/dist/hasher/types.js +4 -1
- package/dist/hasher/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +297 -28
- package/dist/index.js.map +1 -1
- package/dist/kameleoonClient.d.ts +16 -16
- package/dist/kameleoonClient.js +307 -236
- package/dist/kameleoonClient.js.map +1 -1
- package/dist/kameleoonData/browser.js +37 -32
- package/dist/kameleoonData/browser.js.map +1 -1
- package/dist/kameleoonData/constants.js +6 -2
- package/dist/kameleoonData/constants.js.map +1 -1
- package/dist/kameleoonData/conversion.js +47 -40
- package/dist/kameleoonData/conversion.js.map +1 -1
- package/dist/kameleoonData/customData.js +62 -58
- package/dist/kameleoonData/customData.js.map +1 -1
- package/dist/kameleoonData/device.js +37 -32
- package/dist/kameleoonData/device.js.map +1 -1
- package/dist/kameleoonData/index.js +101 -18
- package/dist/kameleoonData/index.js.map +1 -1
- package/dist/kameleoonData/nonce.js +25 -13
- package/dist/kameleoonData/nonce.js.map +1 -1
- package/dist/kameleoonData/pageView.js +52 -44
- package/dist/kameleoonData/pageView.js.map +1 -1
- package/dist/kameleoonData/types.js +41 -26
- package/dist/kameleoonData/types.js.map +1 -1
- package/dist/kameleoonData/userAgent.js +33 -24
- package/dist/kameleoonData/userAgent.js.map +1 -1
- package/dist/kameleoonError/constants.js +25 -21
- package/dist/kameleoonError/constants.js.map +1 -1
- package/dist/kameleoonError/helpers.js +6 -4
- package/dist/kameleoonError/helpers.js.map +1 -1
- package/dist/kameleoonError/index.js +25 -8
- package/dist/kameleoonError/index.js.map +1 -1
- package/dist/kameleoonError/kameleoonError.js +64 -53
- package/dist/kameleoonError/kameleoonError.js.map +1 -1
- package/dist/kameleoonError/types.js +26 -22
- package/dist/kameleoonError/types.js.map +1 -1
- package/dist/kameleoonUtils.js +34 -33
- package/dist/kameleoonUtils.js.map +1 -1
- package/dist/requester/constants.d.ts +6 -7
- package/dist/requester/constants.js +58 -45
- package/dist/requester/constants.js.map +1 -1
- package/dist/requester/index.d.ts +2 -2
- package/dist/requester/index.js +67 -8
- package/dist/requester/index.js.map +1 -1
- package/dist/requester/requester.d.ts +7 -7
- package/dist/requester/requester.js +100 -113
- package/dist/requester/requester.js.map +1 -1
- package/dist/requester/types.d.ts +38 -10
- package/dist/requester/types.js +14 -36
- package/dist/requester/types.js.map +1 -1
- package/dist/storage/constants.js +11 -7
- package/dist/storage/constants.js.map +1 -1
- package/dist/storage/externalStorage.js +33 -26
- package/dist/storage/externalStorage.js.map +1 -1
- package/dist/storage/index.js +55 -6
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/types.js +4 -1
- package/dist/storage/types.js.map +1 -1
- package/dist/targeting/conditions/conditionFactory.js +24 -19
- package/dist/targeting/conditions/conditionFactory.js.map +1 -1
- package/dist/targeting/conditions/customDataCondition.js +99 -88
- package/dist/targeting/conditions/customDataCondition.js.map +1 -1
- package/dist/targeting/conditions/exclusiveExperimentCondition.js +27 -15
- package/dist/targeting/conditions/exclusiveExperimentCondition.js.map +1 -1
- package/dist/targeting/conditions/index.js +45 -10
- package/dist/targeting/conditions/index.js.map +1 -1
- package/dist/targeting/conditions/targetExperimentCondition.js +54 -32
- package/dist/targeting/conditions/targetExperimentCondition.js.map +1 -1
- package/dist/targeting/conditions/types.js +4 -1
- package/dist/targeting/conditions/types.js.map +1 -1
- package/dist/targeting/index.js +79 -13
- package/dist/targeting/index.js.map +1 -1
- package/dist/targeting/targetingNode.js +41 -33
- package/dist/targeting/targetingNode.js.map +1 -1
- package/dist/targeting/targetingTree.js +125 -104
- package/dist/targeting/targetingTree.js.map +1 -1
- package/dist/targeting/types.js +99 -91
- package/dist/targeting/types.js.map +1 -1
- package/dist/types.d.ts +17 -2
- package/dist/types.js +50 -21
- package/dist/types.js.map +1 -1
- package/dist/utilities/constants.js +6 -2
- package/dist/utilities/constants.js.map +1 -1
- package/dist/utilities/index.js +11 -4
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/types.d.ts +1 -1
- package/dist/utilities/types.js +4 -1
- package/dist/utilities/types.js.map +1 -1
- package/dist/utilities/utilities.d.ts +2 -2
- package/dist/utilities/utilities.js +117 -105
- package/dist/utilities/utilities.js.map +1 -1
- package/dist/variationConfiguration/index.js +24 -4
- package/dist/variationConfiguration/index.js.map +1 -1
- package/dist/variationConfiguration/types.js +4 -1
- package/dist/variationConfiguration/types.js.map +1 -1
- package/dist/variationConfiguration/variation.js +35 -28
- package/dist/variationConfiguration/variation.js.map +1 -1
- package/dist/variationConfiguration/variationConfiguration.d.ts +5 -5
- package/dist/variationConfiguration/variationConfiguration.js +270 -228
- package/dist/variationConfiguration/variationConfiguration.js.map +1 -1
- package/package.json +6 -4
|
@@ -1,119 +1,131 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
3
6
|
exports.Utilities = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const kameleoonData_1 = require("../kameleoonData");
|
|
7
|
+
var _tsRes = require("ts-res");
|
|
8
|
+
var _kameleoonError = require("../kameleoonError");
|
|
9
|
+
var _types = require("../types");
|
|
10
|
+
var _targeting = require("../targeting");
|
|
11
|
+
var _constants = require("./constants");
|
|
12
|
+
var _kameleoonData = require("../kameleoonData");
|
|
11
13
|
class Utilities {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (assignedVariationsResult.ok) {
|
|
22
|
-
variations = assignedVariationsResult.data;
|
|
23
|
-
}
|
|
24
|
-
const targetingTree = new targeting_1.TargetingTree(segment);
|
|
25
|
-
const result = targetingTree.evaluate({
|
|
26
|
-
targetingData: targetingData || [],
|
|
27
|
-
variationData: variations,
|
|
28
|
-
experimentId,
|
|
29
|
-
});
|
|
30
|
-
return result;
|
|
14
|
+
static checkTargeting({
|
|
15
|
+
segment,
|
|
16
|
+
visitorCode,
|
|
17
|
+
targetingData,
|
|
18
|
+
experimentId,
|
|
19
|
+
variationConfiguration
|
|
20
|
+
}) {
|
|
21
|
+
if (!segment || !segment.conditionsData.firstLevel.length) {
|
|
22
|
+
return (0, _tsRes.Ok)(true);
|
|
31
23
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
if (!variationConfiguration) {
|
|
25
|
+
return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.Initialization));
|
|
26
|
+
}
|
|
27
|
+
let variations = {};
|
|
28
|
+
const assignedVariationsResult = variationConfiguration.getAssignedVariations(visitorCode);
|
|
29
|
+
if (assignedVariationsResult.ok) {
|
|
30
|
+
variations = assignedVariationsResult.data;
|
|
37
31
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
const targetingTree = new _targeting.TargetingTree(segment);
|
|
33
|
+
const result = targetingTree.evaluate({
|
|
34
|
+
targetingData: targetingData || [],
|
|
35
|
+
variationData: variations,
|
|
36
|
+
experimentId
|
|
37
|
+
});
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
static validateVisitorCode(visitorCode) {
|
|
41
|
+
if (visitorCode.length > _constants.VISITOR_CODE_MAX_LENGTH) {
|
|
42
|
+
return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.VisitorCodeMaxLength));
|
|
44
43
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
return (0, _tsRes.Ok)();
|
|
45
|
+
}
|
|
46
|
+
static getDataUrl(visitorCode, campaignConfiguration) {
|
|
47
|
+
const unsentData = campaignConfiguration.getUnsentData(visitorCode);
|
|
48
|
+
return unsentData.map(item => item.url).join('\n');
|
|
49
|
+
}
|
|
50
|
+
static trackRule({
|
|
51
|
+
featureFlagVariation,
|
|
52
|
+
campaignConfiguration,
|
|
53
|
+
visitorCode,
|
|
54
|
+
requester,
|
|
55
|
+
userAgent
|
|
56
|
+
}) {
|
|
57
|
+
const {
|
|
58
|
+
variationId,
|
|
59
|
+
rule
|
|
60
|
+
} = featureFlagVariation;
|
|
61
|
+
if (!rule) {
|
|
62
|
+
throw new Error('Internal usage error, make sure to use `trackRule` for existing rule');
|
|
63
|
+
}
|
|
64
|
+
const dataUrl = this.getDataUrl(visitorCode, campaignConfiguration);
|
|
65
|
+
const resultVariationId = variationId || 0;
|
|
66
|
+
const isUnallocated = !variationId;
|
|
67
|
+
const callback = () => campaignConfiguration.clearUnsentData;
|
|
68
|
+
requester.trackExperiment({
|
|
69
|
+
visitorCode,
|
|
70
|
+
isUnallocated,
|
|
71
|
+
body: dataUrl,
|
|
72
|
+
callback,
|
|
73
|
+
experimentId: rule.experimentId,
|
|
74
|
+
variationId: resultVariationId,
|
|
75
|
+
userAgent
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
static parseFeatureVariable(variable) {
|
|
79
|
+
const {
|
|
80
|
+
type,
|
|
81
|
+
value
|
|
82
|
+
} = variable;
|
|
83
|
+
switch (type) {
|
|
84
|
+
case _types.VariableType.BOOLEAN:
|
|
85
|
+
return (0, _tsRes.Ok)({
|
|
86
|
+
type,
|
|
87
|
+
value: Boolean(value)
|
|
88
|
+
});
|
|
89
|
+
case _types.VariableType.STRING:
|
|
90
|
+
return (0, _tsRes.Ok)({
|
|
91
|
+
type,
|
|
92
|
+
value: String(value)
|
|
93
|
+
});
|
|
94
|
+
case _types.VariableType.NUMBER:
|
|
95
|
+
const numberValue = Number(value);
|
|
96
|
+
if (Number.isNaN(numberValue)) {
|
|
97
|
+
return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.NumberParse, String(value)));
|
|
49
98
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const callback = () => campaignConfiguration.clearUnsentData;
|
|
54
|
-
requester.trackExperiment({
|
|
55
|
-
visitorCode,
|
|
56
|
-
isUnallocated,
|
|
57
|
-
body: dataUrl,
|
|
58
|
-
callback,
|
|
59
|
-
// --- Note ---
|
|
60
|
-
// For `RuleType.EXPERIMENTATION` `experimentId` can not be null
|
|
61
|
-
experimentId: rule.experimentId,
|
|
62
|
-
variationId: resultVariationId,
|
|
63
|
-
userAgent,
|
|
99
|
+
return (0, _tsRes.Ok)({
|
|
100
|
+
type,
|
|
101
|
+
value: numberValue
|
|
64
102
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
case types_1.VariableType.STRING:
|
|
75
|
-
return (0, ts_res_1.Ok)({
|
|
76
|
-
type,
|
|
77
|
-
value: String(value),
|
|
78
|
-
});
|
|
79
|
-
case types_1.VariableType.NUMBER:
|
|
80
|
-
const numberValue = Number(value);
|
|
81
|
-
if (Number.isNaN(numberValue)) {
|
|
82
|
-
return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.NumberParse, String(value)));
|
|
83
|
-
}
|
|
84
|
-
return (0, ts_res_1.Ok)({
|
|
85
|
-
type,
|
|
86
|
-
value: numberValue,
|
|
87
|
-
});
|
|
88
|
-
case types_1.VariableType.JSON:
|
|
89
|
-
try {
|
|
90
|
-
const jsonValue = JSON.parse(String(variable.value));
|
|
91
|
-
return (0, ts_res_1.Ok)({
|
|
92
|
-
type,
|
|
93
|
-
value: jsonValue,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
catch (err) {
|
|
97
|
-
return (0, ts_res_1.Err)(new kameleoonError_1.KameleoonError(kameleoonError_1.KameleoonException.JSONParse, err));
|
|
98
|
-
}
|
|
99
|
-
default:
|
|
100
|
-
(0, kameleoonError_1.exhaustCheck)(type);
|
|
103
|
+
case _types.VariableType.JSON:
|
|
104
|
+
try {
|
|
105
|
+
const jsonValue = JSON.parse(String(variable.value));
|
|
106
|
+
return (0, _tsRes.Ok)({
|
|
107
|
+
type,
|
|
108
|
+
value: jsonValue
|
|
109
|
+
});
|
|
110
|
+
} catch (err) {
|
|
111
|
+
return (0, _tsRes.Err)(new _kameleoonError.KameleoonError(_kameleoonError.KameleoonException.JSONParse, err));
|
|
101
112
|
}
|
|
113
|
+
default:
|
|
114
|
+
(0, _kameleoonError.exhaustCheck)(type);
|
|
102
115
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return undefined;
|
|
116
|
+
}
|
|
117
|
+
static getUserAgent(visitorCode, campaignConfiguration) {
|
|
118
|
+
const isUserAgent = data => data.type === _kameleoonData.KameleoonData.UserAgent;
|
|
119
|
+
const targetingData = campaignConfiguration.storedTargetingData[visitorCode];
|
|
120
|
+
if (targetingData) {
|
|
121
|
+
const filteredData = targetingData.map(item => item.data).filter(isUserAgent);
|
|
122
|
+
if (filteredData.length) {
|
|
123
|
+
const [userAgentData] = filteredData;
|
|
124
|
+
return userAgentData.value;
|
|
125
|
+
}
|
|
116
126
|
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
117
129
|
}
|
|
118
130
|
exports.Utilities = Utilities;
|
|
119
131
|
//# sourceMappingURL=utilities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","
|
|
1
|
+
{"version":3,"file":"utilities.js","names":["_tsRes","require","_kameleoonError","_types","_targeting","_constants","_kameleoonData","Utilities","checkTargeting","segment","visitorCode","targetingData","experimentId","variationConfiguration","conditionsData","firstLevel","length","Ok","Err","KameleoonError","KameleoonException","Initialization","variations","assignedVariationsResult","getAssignedVariations","ok","data","targetingTree","TargetingTree","result","evaluate","variationData","validateVisitorCode","VISITOR_CODE_MAX_LENGTH","VisitorCodeMaxLength","getDataUrl","campaignConfiguration","unsentData","getUnsentData","map","item","url","join","trackRule","featureFlagVariation","requester","userAgent","variationId","rule","Error","dataUrl","resultVariationId","isUnallocated","callback","clearUnsentData","trackExperiment","body","parseFeatureVariable","variable","type","value","VariableType","BOOLEAN","Boolean","STRING","String","NUMBER","numberValue","Number","isNaN","NumberParse","JSON","jsonValue","parse","err","JSONParse","exhaustCheck","getUserAgent","isUserAgent","KameleoonData","UserAgent","storedTargetingData","filteredData","filter","userAgentData","undefined","exports"],"sources":["../../src/utilities/utilities.ts"],"sourcesContent":["import { Err, Ok, Result } from 'ts-res';\nimport {\n KameleoonError,\n KameleoonException,\n exhaustCheck,\n} from '../kameleoonError';\nimport { ExperimentVariationsType } from '../storage';\nimport { CheckTargetingParamsType, TrackRuleParamsType } from './types';\nimport { FeatureVariableResultType, VariableType } from '../types';\nimport { TargetingTree } from '../targeting';\nimport { VISITOR_CODE_MAX_LENGTH } from './constants';\nimport {\n CampaignConfiguration,\n FeatureVariableType,\n JSONType,\n} from '../campaignConfiguration';\nimport {\n KameleoonData,\n KameleoonDataItemType,\n UserAgentDataType,\n} from '../kameleoonData';\n\nexport class Utilities {\n static checkTargeting({\n segment,\n visitorCode,\n targetingData,\n experimentId,\n variationConfiguration,\n }: CheckTargetingParamsType): Result<boolean, KameleoonError> {\n if (!segment || !segment.conditionsData.firstLevel.length) {\n return Ok(true);\n }\n\n if (!variationConfiguration) {\n return Err(new KameleoonError(KameleoonException.Initialization));\n }\n\n let variations: ExperimentVariationsType = {};\n\n const assignedVariationsResult =\n variationConfiguration.getAssignedVariations(visitorCode);\n\n if (assignedVariationsResult.ok) {\n variations = assignedVariationsResult.data;\n }\n\n const targetingTree = new TargetingTree(segment);\n\n const result = targetingTree.evaluate({\n targetingData: targetingData || [],\n variationData: variations,\n experimentId,\n });\n\n return result;\n }\n\n static validateVisitorCode(\n visitorCode: string,\n ): Result<void, KameleoonError> {\n if (visitorCode.length > VISITOR_CODE_MAX_LENGTH) {\n return Err(new KameleoonError(KameleoonException.VisitorCodeMaxLength));\n }\n\n return Ok();\n }\n\n static getDataUrl(\n visitorCode: string,\n campaignConfiguration: CampaignConfiguration,\n ): string {\n const unsentData = campaignConfiguration.getUnsentData(visitorCode);\n\n return unsentData.map((item) => item.url).join('\\n');\n }\n\n static trackRule({\n featureFlagVariation,\n campaignConfiguration,\n visitorCode,\n requester,\n userAgent,\n }: TrackRuleParamsType): void {\n const { variationId, rule } = featureFlagVariation;\n\n if (!rule) {\n throw new Error(\n 'Internal usage error, make sure to use `trackRule` for existing rule',\n );\n }\n\n const dataUrl = this.getDataUrl(visitorCode, campaignConfiguration);\n\n const resultVariationId = variationId || 0;\n const isUnallocated = !variationId;\n const callback = () => campaignConfiguration.clearUnsentData;\n\n requester.trackExperiment({\n visitorCode,\n isUnallocated,\n body: dataUrl,\n callback,\n experimentId: rule.experimentId,\n variationId: resultVariationId,\n userAgent,\n });\n }\n\n static parseFeatureVariable(\n variable: FeatureVariableType,\n ): Result<FeatureVariableResultType, KameleoonError> {\n const { type, value } = variable;\n\n switch (type) {\n case VariableType.BOOLEAN:\n return Ok({\n type,\n value: Boolean(value),\n });\n case VariableType.STRING:\n return Ok({\n type,\n value: String(value),\n });\n case VariableType.NUMBER:\n const numberValue = Number(value);\n\n if (Number.isNaN(numberValue)) {\n return Err(\n new KameleoonError(KameleoonException.NumberParse, String(value)),\n );\n }\n\n return Ok({\n type,\n value: numberValue,\n });\n case VariableType.JSON:\n try {\n const jsonValue: JSONType = JSON.parse(String(variable.value));\n\n return Ok({\n type,\n value: jsonValue,\n });\n } catch (err) {\n return Err(new KameleoonError(KameleoonException.JSONParse, err));\n }\n default:\n exhaustCheck(type);\n }\n }\n\n static getUserAgent(\n visitorCode: string,\n campaignConfiguration: CampaignConfiguration,\n ): string | undefined {\n const isUserAgent = (\n data: KameleoonDataItemType,\n ): data is UserAgentDataType => data.type === KameleoonData.UserAgent;\n const targetingData =\n campaignConfiguration.storedTargetingData[visitorCode];\n\n if (targetingData) {\n const filteredData = targetingData\n .map((item) => item.data)\n .filter(isUserAgent);\n\n if (filteredData.length) {\n const [userAgentData] = filteredData;\n\n return userAgentData.value;\n }\n }\n\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
exports
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "FeatureFlagVariationType", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _types.FeatureFlagVariationType;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "VariationConfiguration", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _variationConfiguration.VariationConfiguration;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "VariationType", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _types.VariationType;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
var _variationConfiguration = require("./variationConfiguration");
|
|
25
|
+
var _types = require("./types");
|
|
6
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_variationConfiguration","require","_types"],"sources":["../../src/variationConfiguration/index.ts"],"sourcesContent":["export { VariationConfiguration } from './variationConfiguration';\nexport { VariationType, FeatureFlagVariationType } from './types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,uBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../src/variationConfiguration/types.ts"],"sourcesContent":["import { FeatureFlagType, RuleItemType } from '../campaignConfiguration';\nimport { TargetingDataItemType } from '../targeting';\n\nexport type VariationType = {\n variationId: number;\n assignmentDate: string;\n};\n\nexport type UpdateStorageParamsType = {\n visitorCode: string;\n experimentId: string;\n variationId: number;\n};\n\nexport type FeatureFlagVariationType = {\n variationKey: string;\n variationId: number | null;\n featureFlagId: number;\n featureKey: string;\n rule: RuleItemType | null;\n};\n\nexport type GetFeatureFlagVariationParametersType = {\n visitorCode: string;\n featureFlag: FeatureFlagType;\n targetingData?: TargetingDataItemType[];\n withAssignment?: boolean;\n};\n\nexport type GetAssignedRuleVariationResultType = Pick<\n FeatureFlagVariationType,\n 'variationId' | 'variationKey'\n>;\n"],"mappings":""}
|
|
@@ -1,38 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
3
6
|
exports.Variation = void 0;
|
|
4
|
-
|
|
7
|
+
var _types = require("../types");
|
|
8
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
9
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
10
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
5
11
|
class Variation {
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
constructor(variationData) {
|
|
13
|
+
_defineProperty(this, "variationData", void 0);
|
|
14
|
+
this.variationData = variationData;
|
|
15
|
+
}
|
|
16
|
+
get id() {
|
|
17
|
+
if (!this.variationData) {
|
|
18
|
+
throw new Error("Internal usage error: Check if the variation `isValid`, before getting it's `id`");
|
|
8
19
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
return this.variationData.variationId;
|
|
21
|
+
}
|
|
22
|
+
isValid(respoolTime) {
|
|
23
|
+
const variation = this.variationData;
|
|
24
|
+
if (!variation) {
|
|
25
|
+
return false;
|
|
14
26
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if (respoolTime === null || respoolTime === void 0 ? void 0 : respoolTime.length) {
|
|
26
|
-
const assignmentTime = new Date(Date.parse(variation.assignmentDate)).getTime() /
|
|
27
|
-
types_1.Milliseconds.Second;
|
|
28
|
-
const variationRespoolTime = respoolTime.find((respool) => respool.variationId === String(variation.variationId));
|
|
29
|
-
if (!variationRespoolTime) {
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
return assignmentTime > variationRespoolTime.value;
|
|
33
|
-
}
|
|
27
|
+
|
|
28
|
+
// --- Note ---
|
|
29
|
+
// - Respool is a kind of shuffle parameter
|
|
30
|
+
// it's presence indicates that variations assigned to
|
|
31
|
+
// user has changed at certain time (time is the value of `respoolTime` in seconds)
|
|
32
|
+
// - So the variation is valid unless it has been shuffled after it's assignment
|
|
33
|
+
if (respoolTime?.length) {
|
|
34
|
+
const assignmentTime = new Date(Date.parse(variation.assignmentDate)).getTime() / _types.Milliseconds.Second;
|
|
35
|
+
const variationRespoolTime = respoolTime.find(respool => respool.variationId === String(variation.variationId));
|
|
36
|
+
if (!variationRespoolTime) {
|
|
34
37
|
return true;
|
|
38
|
+
}
|
|
39
|
+
return assignmentTime > variationRespoolTime.value;
|
|
35
40
|
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
36
43
|
}
|
|
37
44
|
exports.Variation = Variation;
|
|
38
45
|
//# sourceMappingURL=variation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variation.js","
|
|
1
|
+
{"version":3,"file":"variation.js","names":["_types","require","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","Variation","constructor","variationData","id","Error","variationId","isValid","respoolTime","variation","length","assignmentTime","Date","parse","assignmentDate","getTime","Milliseconds","Second","variationRespoolTime","find","respool","exports"],"sources":["../../src/variationConfiguration/variation.ts"],"sourcesContent":["import { RespoolTimeType } from '../campaignConfiguration/types';\nimport { Milliseconds } from '../types';\nimport { VariationType } from './types';\n\ninterface IVariation {\n readonly id: number;\n isValid: (respoolTime?: RespoolTimeType[]) => boolean;\n}\n\nexport class Variation implements IVariation {\n variationData?: VariationType;\n\n constructor(variationData?: VariationType) {\n this.variationData = variationData;\n }\n\n get id(): number {\n if (!this.variationData) {\n throw new Error(\n \"Internal usage error: Check if the variation `isValid`, before getting it's `id`\",\n );\n }\n\n return this.variationData.variationId;\n }\n\n public isValid(respoolTime?: RespoolTimeType[]): boolean {\n const variation = this.variationData;\n\n if (!variation) {\n return false;\n }\n\n // --- Note ---\n // - Respool is a kind of shuffle parameter\n // it's presence indicates that variations assigned to\n // user has changed at certain time (time is the value of `respoolTime` in seconds)\n // - So the variation is valid unless it has been shuffled after it's assignment\n if (respoolTime?.length) {\n const assignmentTime =\n new Date(Date.parse(variation.assignmentDate)).getTime() /\n Milliseconds.Second;\n const variationRespoolTime = respoolTime.find(\n (respool) => respool.variationId === String(variation.variationId),\n );\n\n if (!variationRespoolTime) {\n return true;\n }\n\n return assignmentTime > variationRespoolTime.value;\n }\n\n return true;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAAwC,SAAAC,gBAAAC,GAAA,EAAAC,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAD,GAAA,IAAAI,MAAA,CAAAC,cAAA,CAAAL,GAAA,EAAAC,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAR,GAAA,CAAAC,GAAA,IAAAC,KAAA,WAAAF,GAAA;AAAA,SAAAG,eAAAM,GAAA,QAAAR,GAAA,GAAAS,YAAA,CAAAD,GAAA,2BAAAR,GAAA,gBAAAA,GAAA,GAAAU,MAAA,CAAAV,GAAA;AAAA,SAAAS,aAAAE,KAAA,EAAAC,IAAA,eAAAD,KAAA,iBAAAA,KAAA,kBAAAA,KAAA,MAAAE,IAAA,GAAAF,KAAA,CAAAG,MAAA,CAAAC,WAAA,OAAAF,IAAA,KAAAG,SAAA,QAAAC,GAAA,GAAAJ,IAAA,CAAAK,IAAA,CAAAP,KAAA,EAAAC,IAAA,2BAAAK,GAAA,sBAAAA,GAAA,YAAAE,SAAA,4DAAAP,IAAA,gBAAAF,MAAA,GAAAU,MAAA,EAAAT,KAAA;AAQjC,MAAMU,SAAS,CAAuB;EAG3CC,WAAWA,CAACC,aAA6B,EAAE;IAAAzB,eAAA;IACzC,IAAI,CAACyB,aAAa,GAAGA,aAAa;EACpC;EAEA,IAAIC,EAAEA,CAAA,EAAW;IACf,IAAI,CAAC,IAAI,CAACD,aAAa,EAAE;MACvB,MAAM,IAAIE,KAAK,CACb,kFAAkF,CACnF;IACH;IAEA,OAAO,IAAI,CAACF,aAAa,CAACG,WAAW;EACvC;EAEOC,OAAOA,CAACC,WAA+B,EAAW;IACvD,MAAMC,SAAS,GAAG,IAAI,CAACN,aAAa;IAEpC,IAAI,CAACM,SAAS,EAAE;MACd,OAAO,KAAK;IACd;;IAEA;IACA;IACA;IACA;IACA;IACA,IAAID,WAAW,EAAEE,MAAM,EAAE;MACvB,MAAMC,cAAc,GAClB,IAAIC,IAAI,CAACA,IAAI,CAACC,KAAK,CAACJ,SAAS,CAACK,cAAc,CAAC,CAAC,CAACC,OAAO,EAAE,GACxDC,mBAAY,CAACC,MAAM;MACrB,MAAMC,oBAAoB,GAAGV,WAAW,CAACW,IAAI,CAC1CC,OAAO,IAAKA,OAAO,CAACd,WAAW,KAAKhB,MAAM,CAACmB,SAAS,CAACH,WAAW,CAAC,CACnE;MAED,IAAI,CAACY,oBAAoB,EAAE;QACzB,OAAO,IAAI;MACb;MAEA,OAAOP,cAAc,GAAGO,oBAAoB,CAACrC,KAAK;IACpD;IAEA,OAAO,IAAI;EACb;AACF;AAACwC,OAAA,CAAApB,SAAA,GAAAA,SAAA"}
|
|
@@ -6,19 +6,19 @@ import { FeatureFlagVariationType, GetFeatureFlagVariationParametersType } from
|
|
|
6
6
|
interface IVariationConfiguration {
|
|
7
7
|
/**
|
|
8
8
|
* @method getAssociatedVariationId - gets the id of a variation assigned to a visitor with `visitorCode` from the storage. If the visitor doesn't have associated variation yet, assigns a new one, stores it and returns it's id.
|
|
9
|
-
|
|
9
|
+
*/
|
|
10
10
|
getAssociatedVariationId: (visitorCode: string, experimentId: number) => Result<number, KameleoonError>;
|
|
11
11
|
/**
|
|
12
|
-
* @method getAssignedVariations - obtains experiments with according variations that are *already assigned* and *stored* in the `variationStorage`. If `getAssociatedVariationId`
|
|
13
|
-
|
|
12
|
+
* @method getAssignedVariations - obtains experiments with according variations that are *already assigned* and *stored* in the `variationStorage`. If `getAssociatedVariationId` had not been called before, there will be no variations to get.
|
|
13
|
+
*/
|
|
14
14
|
getAssignedVariations(visitorCode: string): Result<ExperimentVariationsType, KameleoonError>;
|
|
15
15
|
/**
|
|
16
16
|
* @method getFeatureFlagVariation - obtains variation for the rule of the feature flag which is both targeted and has a variation, if no such rule was found, returns empty rule with default `variationKey`, given an option `withAssignment` of `true` will also assign a new variation and save it in the storage
|
|
17
|
-
|
|
17
|
+
*/
|
|
18
18
|
getFeatureFlagVariation: (params: GetFeatureFlagVariationParametersType) => Result<FeatureFlagVariationType, KameleoonError>;
|
|
19
19
|
/**
|
|
20
20
|
* @method getExperimentVariation - obtains variation for the experiment by calculating the variation for the visitor *without assigning* it to a visitor
|
|
21
|
-
|
|
21
|
+
*/
|
|
22
22
|
getExperimentVariation: (visitorCode: string, experiment: ExperimentItemType) => Result<number, KameleoonError>;
|
|
23
23
|
}
|
|
24
24
|
export declare class VariationConfiguration implements IVariationConfiguration {
|