@uniformdev/context 20.3.1 → 20.4.1-alpha.15
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/api/api.d.mts +1 -1
- package/dist/api/api.d.ts +1 -1
- package/dist/index.d.mts +20 -4
- package/dist/index.d.ts +20 -4
- package/dist/index.esm.js +120 -25
- package/dist/index.js +122 -26
- package/dist/index.mjs +120 -25
- package/dist/{types-EJl31yuP.d.mts → types-BPchcX4k.d.mts} +91 -24
- package/dist/{types-EJl31yuP.d.ts → types-BPchcX4k.d.ts} +91 -24
- package/package.json +2 -2
package/dist/index.js
CHANGED
@@ -95,7 +95,8 @@ __export(src_exports, {
|
|
95
95
|
serializePersonalizeVariants: () => serializePersonalizeVariants,
|
96
96
|
serializeQuickConnect: () => serializeQuickConnect,
|
97
97
|
serializeQuirks: () => serializeQuirks,
|
98
|
-
testVariations: () => testVariations
|
98
|
+
testVariations: () => testVariations,
|
99
|
+
topDownCriteriaPersonalizationSelectionAlgorithm: () => topDownCriteriaPersonalizationSelectionAlgorithm
|
99
100
|
});
|
100
101
|
module.exports = __toCommonJS(src_exports);
|
101
102
|
|
@@ -605,7 +606,7 @@ var GroupCriteriaEvaluator = class {
|
|
605
606
|
_evaluators = new WeakMap();
|
606
607
|
|
607
608
|
// src/placement/criteria/evaluateVariantMatch.ts
|
608
|
-
function evaluateVariantMatch(variantId, match, vec, onLogMessage) {
|
609
|
+
function evaluateVariantMatch(variantId, match, vec, onLogMessage, quirks) {
|
609
610
|
onLogMessage == null ? void 0 : onLogMessage(["info", 301, "GROUP", { id: variantId, op: match == null ? void 0 : match.op }]);
|
610
611
|
let result;
|
611
612
|
try {
|
@@ -613,9 +614,9 @@ function evaluateVariantMatch(variantId, match, vec, onLogMessage) {
|
|
613
614
|
onLogMessage == null ? void 0 : onLogMessage(["info", 302, { matched: true, description: "default variation" }]);
|
614
615
|
result = true;
|
615
616
|
} else if (!match.op || match.op === "&") {
|
616
|
-
result = match.crit.every((c) =>
|
617
|
+
result = match.crit.every((c) => evaluateMatch(c, vec, quirks != null ? quirks : {}, onLogMessage));
|
617
618
|
} else {
|
618
|
-
result = match.crit.some((c) =>
|
619
|
+
result = match.crit.some((c) => evaluateMatch(c, vec, quirks != null ? quirks : {}, onLogMessage));
|
619
620
|
}
|
620
621
|
onLogMessage == null ? void 0 : onLogMessage(["info", 303, result]);
|
621
622
|
} finally {
|
@@ -623,9 +624,16 @@ function evaluateVariantMatch(variantId, match, vec, onLogMessage) {
|
|
623
624
|
}
|
624
625
|
return result;
|
625
626
|
}
|
627
|
+
function evaluateMatch(crit, vec, quirks, onLogMessage) {
|
628
|
+
if ("t" in crit && crit.t === "q") {
|
629
|
+
return evaluateQuirkMatch(crit, quirks, onLogMessage);
|
630
|
+
} else {
|
631
|
+
return evaluateDimensionMatch(crit, vec, onLogMessage);
|
632
|
+
}
|
633
|
+
}
|
626
634
|
function evaluateDimensionMatch(crit, vec, onLogMessage) {
|
627
635
|
var _a, _b;
|
628
|
-
const {
|
636
|
+
const { l: lhs, op } = crit;
|
629
637
|
const lhsScore = (_a = vec[lhs]) != null ? _a : 0;
|
630
638
|
if (op === "^") {
|
631
639
|
const [cat] = lhs.split(ENR_SEPARATOR);
|
@@ -692,33 +700,65 @@ function evaluateDimensionMatch(crit, vec, onLogMessage) {
|
|
692
700
|
}
|
693
701
|
if (op === ">") {
|
694
702
|
const result = lhsScore > rhsScore;
|
695
|
-
|
703
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
696
704
|
return result;
|
697
705
|
} else if (op === ">=") {
|
698
706
|
const result = lhsScore >= rhsScore;
|
699
|
-
|
707
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
700
708
|
return result;
|
701
709
|
} else if (op === "<") {
|
702
710
|
const result = lhsScore < rhsScore;
|
703
|
-
|
711
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
704
712
|
return result;
|
705
713
|
} else if (op === "<=") {
|
706
714
|
const result = lhsScore <= rhsScore;
|
707
|
-
|
715
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
708
716
|
return result;
|
709
717
|
} else if (op === "=") {
|
710
718
|
const result = lhsScore === rhsScore;
|
711
|
-
|
719
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
712
720
|
return result;
|
713
721
|
} else if (op === "!=") {
|
714
722
|
const result = lhsScore !== rhsScore;
|
715
|
-
|
723
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
724
|
+
return result;
|
725
|
+
} else {
|
726
|
+
onLogMessage == null ? void 0 : onLogMessage([
|
727
|
+
"error",
|
728
|
+
302,
|
729
|
+
{
|
730
|
+
matched: false,
|
731
|
+
description: `${crit.l} ${crit.op} ${crit.rDim ? `${crit.rDim}` : crit.r}: Unknown op ${crit.op}.`
|
732
|
+
}
|
733
|
+
]);
|
734
|
+
return false;
|
735
|
+
}
|
736
|
+
}
|
737
|
+
function evaluateQuirkMatch(crit, quirks, onLogMessage) {
|
738
|
+
var _a;
|
739
|
+
const { l: targetQuirk, op, r: targetValue } = crit;
|
740
|
+
const targetQuirkValue = (_a = quirks[targetQuirk]) != null ? _a : "";
|
741
|
+
if (op === "=") {
|
742
|
+
const result = targetQuirkValue === targetValue;
|
743
|
+
explainQuirk(onLogMessage, result, crit, targetQuirkValue);
|
744
|
+
return result;
|
745
|
+
} else if (op === "!=") {
|
746
|
+
const result = targetQuirkValue !== targetValue;
|
747
|
+
explainQuirk(onLogMessage, result, crit, targetQuirkValue);
|
716
748
|
return result;
|
717
749
|
} else {
|
718
|
-
|
750
|
+
onLogMessage == null ? void 0 : onLogMessage([
|
751
|
+
"error",
|
752
|
+
302,
|
753
|
+
{
|
754
|
+
matched: false,
|
755
|
+
description: `Quirk ${crit.l} ${crit.op} ${crit.r}: Unknown quirk op ${crit.op}.`
|
756
|
+
}
|
757
|
+
]);
|
758
|
+
return false;
|
719
759
|
}
|
720
760
|
}
|
721
|
-
function
|
761
|
+
function explainScore(onLogMessage, result, crit, lhsScore, rhsScore) {
|
722
762
|
onLogMessage == null ? void 0 : onLogMessage([
|
723
763
|
"info",
|
724
764
|
302,
|
@@ -728,9 +768,19 @@ function explain(onLogMessage, result, crit, lhsScore, rhsScore) {
|
|
728
768
|
}
|
729
769
|
]);
|
730
770
|
}
|
771
|
+
function explainQuirk(onLogMessage, result, crit, lhs) {
|
772
|
+
onLogMessage == null ? void 0 : onLogMessage([
|
773
|
+
"info",
|
774
|
+
302,
|
775
|
+
{
|
776
|
+
matched: result,
|
777
|
+
description: `Quirk ${crit.l}[${lhs}] ${crit.op} ${crit.r}`
|
778
|
+
}
|
779
|
+
]);
|
780
|
+
}
|
731
781
|
|
732
|
-
// src/placement/
|
733
|
-
function
|
782
|
+
// src/placement/topDownCriteriaPersonalizationSelectionAlgorithm.ts
|
783
|
+
function topDownCriteriaPersonalizationSelectionAlgorithm({
|
734
784
|
name,
|
735
785
|
context,
|
736
786
|
variations,
|
@@ -745,12 +795,19 @@ function personalizeVariations({
|
|
745
795
|
const needsConsent = context.requireConsentForPersonalization;
|
746
796
|
const canEvaluate = !needsConsent || context.storage.data.consent;
|
747
797
|
for (const variant of variations) {
|
748
|
-
|
749
|
-
|
750
|
-
|
798
|
+
const isInvalidFormat = variant.pz && (typeof variant.pz !== "object" || variant.pz === null || !("crit" in variant.pz && Array.isArray(variant.pz.crit)));
|
799
|
+
let validVariant;
|
800
|
+
if (isInvalidFormat) {
|
801
|
+
validVariant = { id: variant.id };
|
802
|
+
} else {
|
803
|
+
validVariant = variant;
|
804
|
+
}
|
805
|
+
if ((_a = validVariant.pz) == null ? void 0 : _a.crit.length) {
|
806
|
+
if (canEvaluate && variantMatches.length !== take && evaluateVariantMatch(variant.id, validVariant.pz, context.scores, onLogMessage, context.quirks)) {
|
807
|
+
variantMatches.push(validVariant);
|
751
808
|
}
|
752
809
|
} else {
|
753
|
-
defaultVariants.push(
|
810
|
+
defaultVariants.push(validVariant);
|
754
811
|
}
|
755
812
|
}
|
756
813
|
const result = [];
|
@@ -805,7 +862,12 @@ function personalizeVariations({
|
|
805
862
|
}
|
806
863
|
}
|
807
864
|
|
808
|
-
// src/placement/
|
865
|
+
// src/placement/personalizeVariations.ts
|
866
|
+
function personalizeVariations(options) {
|
867
|
+
return topDownCriteriaPersonalizationSelectionAlgorithm(options);
|
868
|
+
}
|
869
|
+
|
870
|
+
// src/placement/normalizeVariationDistributions.ts
|
809
871
|
var normalizeVariationDistributions = (variations) => {
|
810
872
|
const { values, total, missingDistribution } = variations.reduce(
|
811
873
|
(previous, current) => {
|
@@ -824,7 +886,12 @@ var normalizeVariationDistributions = (variations) => {
|
|
824
886
|
}
|
825
887
|
);
|
826
888
|
if (total > 100) {
|
827
|
-
|
889
|
+
const autoScaleFactor = 100 / total;
|
890
|
+
values.forEach((value, index) => {
|
891
|
+
if (typeof value === "number") {
|
892
|
+
values[index] = value * autoScaleFactor;
|
893
|
+
}
|
894
|
+
});
|
828
895
|
} else if (total < 100) {
|
829
896
|
const remainder = 100 - total;
|
830
897
|
const missingSlice = remainder / missingDistribution;
|
@@ -836,6 +903,8 @@ var normalizeVariationDistributions = (variations) => {
|
|
836
903
|
}
|
837
904
|
return values;
|
838
905
|
};
|
906
|
+
|
907
|
+
// src/placement/testVariations.ts
|
839
908
|
var testVariations = ({
|
840
909
|
name,
|
841
910
|
context,
|
@@ -1602,11 +1671,12 @@ var import_lite5 = require("dequal/lite");
|
|
1602
1671
|
var import_mitt3 = __toESM(require("mitt"));
|
1603
1672
|
var CONTEXTUAL_EDITING_TEST_NAME = "contextual_editing_test";
|
1604
1673
|
var CONTEXTUAL_EDITING_TEST_SELECTED_VARIANT_ID = "contextual_editing_test_selected_variant";
|
1605
|
-
var _serverTransitionState, _scores, _state, _pzCache, _plugins, _commands, _requireConsentForPersonalization, _mitt3, _Context_instances, emitTest_fn, updateGoals_fn, updateComputedScores_fn, calculateScores_fn;
|
1674
|
+
var _personalizationSelectionAlgorithms, _serverTransitionState, _scores, _state, _pzCache, _plugins, _commands, _requireConsentForPersonalization, _mitt3, _Context_instances, emitTest_fn, updateGoals_fn, updateComputedScores_fn, calculateScores_fn;
|
1606
1675
|
var Context = class {
|
1607
1676
|
constructor(options) {
|
1608
1677
|
__privateAdd(this, _Context_instances);
|
1609
1678
|
__publicField(this, "manifest");
|
1679
|
+
__privateAdd(this, _personalizationSelectionAlgorithms);
|
1610
1680
|
__privateAdd(this, _serverTransitionState);
|
1611
1681
|
__privateAdd(this, _scores, {});
|
1612
1682
|
__privateAdd(this, _state);
|
@@ -1623,7 +1693,7 @@ var Context = class {
|
|
1623
1693
|
off: __privateGet(this, _mitt3).off
|
1624
1694
|
});
|
1625
1695
|
__publicField(this, "storage");
|
1626
|
-
var _a, _b;
|
1696
|
+
var _a, _b, _c;
|
1627
1697
|
const { manifest, ...storageOptions } = options;
|
1628
1698
|
__privateSet(this, _state, {});
|
1629
1699
|
__privateSet(this, _plugins, options.plugins);
|
@@ -1631,7 +1701,17 @@ var Context = class {
|
|
1631
1701
|
if (typeof options.transitionStore !== "undefined") {
|
1632
1702
|
__privateSet(this, _commands, []);
|
1633
1703
|
}
|
1704
|
+
__privateSet(this, _personalizationSelectionAlgorithms, { default: topDownCriteriaPersonalizationSelectionAlgorithm });
|
1634
1705
|
(_a = __privateGet(this, _plugins)) == null ? void 0 : _a.forEach((plugin) => {
|
1706
|
+
if (!plugin.personalizationSelectionAlgorithms) {
|
1707
|
+
return;
|
1708
|
+
}
|
1709
|
+
__privateSet(this, _personalizationSelectionAlgorithms, {
|
1710
|
+
...__privateGet(this, _personalizationSelectionAlgorithms),
|
1711
|
+
...plugin.personalizationSelectionAlgorithms
|
1712
|
+
});
|
1713
|
+
});
|
1714
|
+
(_b = __privateGet(this, _plugins)) == null ? void 0 : _b.forEach((plugin) => {
|
1635
1715
|
if (!plugin.logDrain) {
|
1636
1716
|
return;
|
1637
1717
|
}
|
@@ -1682,7 +1762,7 @@ var Context = class {
|
|
1682
1762
|
__privateGet(this, _mitt3).emit("quirksUpdated", quirks.quirks);
|
1683
1763
|
__privateGet(this, _mitt3).emit("log", ["info", 4, quirks.quirks]);
|
1684
1764
|
});
|
1685
|
-
(
|
1765
|
+
(_c = __privateGet(this, _plugins)) == null ? void 0 : _c.forEach((plugin) => {
|
1686
1766
|
if (!plugin.init) {
|
1687
1767
|
return;
|
1688
1768
|
}
|
@@ -1932,7 +2012,17 @@ var Context = class {
|
|
1932
2012
|
}
|
1933
2013
|
/** Executes a personalized placement with a given set of variants */
|
1934
2014
|
personalize(options) {
|
1935
|
-
|
2015
|
+
var _a;
|
2016
|
+
const algorithmName = (_a = options.algorithm) != null ? _a : "default";
|
2017
|
+
const algorithm = __privateGet(this, _personalizationSelectionAlgorithms)[algorithmName];
|
2018
|
+
if (!algorithm) {
|
2019
|
+
__privateGet(this, _mitt3).emit("log", ["warn", 304, { algorithm: algorithmName }]);
|
2020
|
+
return {
|
2021
|
+
personalized: false,
|
2022
|
+
variations: []
|
2023
|
+
};
|
2024
|
+
}
|
2025
|
+
const value = algorithm({
|
1936
2026
|
...options,
|
1937
2027
|
context: this,
|
1938
2028
|
onLogMessage: (message) => __privateGet(this, _mitt3).emit("log", message)
|
@@ -2006,6 +2096,7 @@ var Context = class {
|
|
2006
2096
|
__privateGet(this, _mitt3).emit("personalizationResult", event);
|
2007
2097
|
}
|
2008
2098
|
};
|
2099
|
+
_personalizationSelectionAlgorithms = new WeakMap();
|
2009
2100
|
_serverTransitionState = new WeakMap();
|
2010
2101
|
_scores = new WeakMap();
|
2011
2102
|
_state = new WeakMap();
|
@@ -2601,6 +2692,10 @@ var messageContent = {
|
|
2601
2692
|
301: ({ id, op }) => ["personalization", `testing variation ${id} (${op === "|" ? "OR" : "AND"})`],
|
2602
2693
|
302: ({ matched, description }) => ["personalization", `${description} is ${matched}`],
|
2603
2694
|
303: (selected) => ["personalization", selected ? "selected variation" : "did not select variation"],
|
2695
|
+
304: ({ algorithm }) => [
|
2696
|
+
"personalization",
|
2697
|
+
`personalization selection algorithm '${algorithm}' not found. Hiding placement.`
|
2698
|
+
],
|
2604
2699
|
// TESTING
|
2605
2700
|
400: (name) => ["testing", `executing A/B test '${name}'`],
|
2606
2701
|
401: (testName) => ["testing", `${testName} is not registered in the manifest; it will not be run.`],
|
@@ -2748,5 +2843,6 @@ function parseQuickConnect(serialized) {
|
|
2748
2843
|
serializePersonalizeVariants,
|
2749
2844
|
serializeQuickConnect,
|
2750
2845
|
serializeQuirks,
|
2751
|
-
testVariations
|
2846
|
+
testVariations,
|
2847
|
+
topDownCriteriaPersonalizationSelectionAlgorithm
|
2752
2848
|
});
|
package/dist/index.mjs
CHANGED
@@ -516,7 +516,7 @@ var GroupCriteriaEvaluator = class {
|
|
516
516
|
_evaluators = new WeakMap();
|
517
517
|
|
518
518
|
// src/placement/criteria/evaluateVariantMatch.ts
|
519
|
-
function evaluateVariantMatch(variantId, match, vec, onLogMessage) {
|
519
|
+
function evaluateVariantMatch(variantId, match, vec, onLogMessage, quirks) {
|
520
520
|
onLogMessage == null ? void 0 : onLogMessage(["info", 301, "GROUP", { id: variantId, op: match == null ? void 0 : match.op }]);
|
521
521
|
let result;
|
522
522
|
try {
|
@@ -524,9 +524,9 @@ function evaluateVariantMatch(variantId, match, vec, onLogMessage) {
|
|
524
524
|
onLogMessage == null ? void 0 : onLogMessage(["info", 302, { matched: true, description: "default variation" }]);
|
525
525
|
result = true;
|
526
526
|
} else if (!match.op || match.op === "&") {
|
527
|
-
result = match.crit.every((c) =>
|
527
|
+
result = match.crit.every((c) => evaluateMatch(c, vec, quirks != null ? quirks : {}, onLogMessage));
|
528
528
|
} else {
|
529
|
-
result = match.crit.some((c) =>
|
529
|
+
result = match.crit.some((c) => evaluateMatch(c, vec, quirks != null ? quirks : {}, onLogMessage));
|
530
530
|
}
|
531
531
|
onLogMessage == null ? void 0 : onLogMessage(["info", 303, result]);
|
532
532
|
} finally {
|
@@ -534,9 +534,16 @@ function evaluateVariantMatch(variantId, match, vec, onLogMessage) {
|
|
534
534
|
}
|
535
535
|
return result;
|
536
536
|
}
|
537
|
+
function evaluateMatch(crit, vec, quirks, onLogMessage) {
|
538
|
+
if ("t" in crit && crit.t === "q") {
|
539
|
+
return evaluateQuirkMatch(crit, quirks, onLogMessage);
|
540
|
+
} else {
|
541
|
+
return evaluateDimensionMatch(crit, vec, onLogMessage);
|
542
|
+
}
|
543
|
+
}
|
537
544
|
function evaluateDimensionMatch(crit, vec, onLogMessage) {
|
538
545
|
var _a, _b;
|
539
|
-
const {
|
546
|
+
const { l: lhs, op } = crit;
|
540
547
|
const lhsScore = (_a = vec[lhs]) != null ? _a : 0;
|
541
548
|
if (op === "^") {
|
542
549
|
const [cat] = lhs.split(ENR_SEPARATOR);
|
@@ -603,33 +610,65 @@ function evaluateDimensionMatch(crit, vec, onLogMessage) {
|
|
603
610
|
}
|
604
611
|
if (op === ">") {
|
605
612
|
const result = lhsScore > rhsScore;
|
606
|
-
|
613
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
607
614
|
return result;
|
608
615
|
} else if (op === ">=") {
|
609
616
|
const result = lhsScore >= rhsScore;
|
610
|
-
|
617
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
611
618
|
return result;
|
612
619
|
} else if (op === "<") {
|
613
620
|
const result = lhsScore < rhsScore;
|
614
|
-
|
621
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
615
622
|
return result;
|
616
623
|
} else if (op === "<=") {
|
617
624
|
const result = lhsScore <= rhsScore;
|
618
|
-
|
625
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
619
626
|
return result;
|
620
627
|
} else if (op === "=") {
|
621
628
|
const result = lhsScore === rhsScore;
|
622
|
-
|
629
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
623
630
|
return result;
|
624
631
|
} else if (op === "!=") {
|
625
632
|
const result = lhsScore !== rhsScore;
|
626
|
-
|
633
|
+
explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
|
634
|
+
return result;
|
635
|
+
} else {
|
636
|
+
onLogMessage == null ? void 0 : onLogMessage([
|
637
|
+
"error",
|
638
|
+
302,
|
639
|
+
{
|
640
|
+
matched: false,
|
641
|
+
description: `${crit.l} ${crit.op} ${crit.rDim ? `${crit.rDim}` : crit.r}: Unknown op ${crit.op}.`
|
642
|
+
}
|
643
|
+
]);
|
644
|
+
return false;
|
645
|
+
}
|
646
|
+
}
|
647
|
+
function evaluateQuirkMatch(crit, quirks, onLogMessage) {
|
648
|
+
var _a;
|
649
|
+
const { l: targetQuirk, op, r: targetValue } = crit;
|
650
|
+
const targetQuirkValue = (_a = quirks[targetQuirk]) != null ? _a : "";
|
651
|
+
if (op === "=") {
|
652
|
+
const result = targetQuirkValue === targetValue;
|
653
|
+
explainQuirk(onLogMessage, result, crit, targetQuirkValue);
|
654
|
+
return result;
|
655
|
+
} else if (op === "!=") {
|
656
|
+
const result = targetQuirkValue !== targetValue;
|
657
|
+
explainQuirk(onLogMessage, result, crit, targetQuirkValue);
|
627
658
|
return result;
|
628
659
|
} else {
|
629
|
-
|
660
|
+
onLogMessage == null ? void 0 : onLogMessage([
|
661
|
+
"error",
|
662
|
+
302,
|
663
|
+
{
|
664
|
+
matched: false,
|
665
|
+
description: `Quirk ${crit.l} ${crit.op} ${crit.r}: Unknown quirk op ${crit.op}.`
|
666
|
+
}
|
667
|
+
]);
|
668
|
+
return false;
|
630
669
|
}
|
631
670
|
}
|
632
|
-
function
|
671
|
+
function explainScore(onLogMessage, result, crit, lhsScore, rhsScore) {
|
633
672
|
onLogMessage == null ? void 0 : onLogMessage([
|
634
673
|
"info",
|
635
674
|
302,
|
@@ -639,9 +678,19 @@ function explain(onLogMessage, result, crit, lhsScore, rhsScore) {
|
|
639
678
|
}
|
640
679
|
]);
|
641
680
|
}
|
681
|
+
function explainQuirk(onLogMessage, result, crit, lhs) {
|
682
|
+
onLogMessage == null ? void 0 : onLogMessage([
|
683
|
+
"info",
|
684
|
+
302,
|
685
|
+
{
|
686
|
+
matched: result,
|
687
|
+
description: `Quirk ${crit.l}[${lhs}] ${crit.op} ${crit.r}`
|
688
|
+
}
|
689
|
+
]);
|
690
|
+
}
|
642
691
|
|
643
|
-
// src/placement/
|
644
|
-
function
|
692
|
+
// src/placement/topDownCriteriaPersonalizationSelectionAlgorithm.ts
|
693
|
+
function topDownCriteriaPersonalizationSelectionAlgorithm({
|
645
694
|
name,
|
646
695
|
context,
|
647
696
|
variations,
|
@@ -656,12 +705,19 @@ function personalizeVariations({
|
|
656
705
|
const needsConsent = context.requireConsentForPersonalization;
|
657
706
|
const canEvaluate = !needsConsent || context.storage.data.consent;
|
658
707
|
for (const variant of variations) {
|
659
|
-
|
660
|
-
|
661
|
-
|
708
|
+
const isInvalidFormat = variant.pz && (typeof variant.pz !== "object" || variant.pz === null || !("crit" in variant.pz && Array.isArray(variant.pz.crit)));
|
709
|
+
let validVariant;
|
710
|
+
if (isInvalidFormat) {
|
711
|
+
validVariant = { id: variant.id };
|
712
|
+
} else {
|
713
|
+
validVariant = variant;
|
714
|
+
}
|
715
|
+
if ((_a = validVariant.pz) == null ? void 0 : _a.crit.length) {
|
716
|
+
if (canEvaluate && variantMatches.length !== take && evaluateVariantMatch(variant.id, validVariant.pz, context.scores, onLogMessage, context.quirks)) {
|
717
|
+
variantMatches.push(validVariant);
|
662
718
|
}
|
663
719
|
} else {
|
664
|
-
defaultVariants.push(
|
720
|
+
defaultVariants.push(validVariant);
|
665
721
|
}
|
666
722
|
}
|
667
723
|
const result = [];
|
@@ -716,7 +772,12 @@ function personalizeVariations({
|
|
716
772
|
}
|
717
773
|
}
|
718
774
|
|
719
|
-
// src/placement/
|
775
|
+
// src/placement/personalizeVariations.ts
|
776
|
+
function personalizeVariations(options) {
|
777
|
+
return topDownCriteriaPersonalizationSelectionAlgorithm(options);
|
778
|
+
}
|
779
|
+
|
780
|
+
// src/placement/normalizeVariationDistributions.ts
|
720
781
|
var normalizeVariationDistributions = (variations) => {
|
721
782
|
const { values, total, missingDistribution } = variations.reduce(
|
722
783
|
(previous, current) => {
|
@@ -735,7 +796,12 @@ var normalizeVariationDistributions = (variations) => {
|
|
735
796
|
}
|
736
797
|
);
|
737
798
|
if (total > 100) {
|
738
|
-
|
799
|
+
const autoScaleFactor = 100 / total;
|
800
|
+
values.forEach((value, index) => {
|
801
|
+
if (typeof value === "number") {
|
802
|
+
values[index] = value * autoScaleFactor;
|
803
|
+
}
|
804
|
+
});
|
739
805
|
} else if (total < 100) {
|
740
806
|
const remainder = 100 - total;
|
741
807
|
const missingSlice = remainder / missingDistribution;
|
@@ -747,6 +813,8 @@ var normalizeVariationDistributions = (variations) => {
|
|
747
813
|
}
|
748
814
|
return values;
|
749
815
|
};
|
816
|
+
|
817
|
+
// src/placement/testVariations.ts
|
750
818
|
var testVariations = ({
|
751
819
|
name,
|
752
820
|
context,
|
@@ -1513,11 +1581,12 @@ import { dequal as dequal5 } from "dequal/lite";
|
|
1513
1581
|
import mitt3 from "mitt";
|
1514
1582
|
var CONTEXTUAL_EDITING_TEST_NAME = "contextual_editing_test";
|
1515
1583
|
var CONTEXTUAL_EDITING_TEST_SELECTED_VARIANT_ID = "contextual_editing_test_selected_variant";
|
1516
|
-
var _serverTransitionState, _scores, _state, _pzCache, _plugins, _commands, _requireConsentForPersonalization, _mitt3, _Context_instances, emitTest_fn, updateGoals_fn, updateComputedScores_fn, calculateScores_fn;
|
1584
|
+
var _personalizationSelectionAlgorithms, _serverTransitionState, _scores, _state, _pzCache, _plugins, _commands, _requireConsentForPersonalization, _mitt3, _Context_instances, emitTest_fn, updateGoals_fn, updateComputedScores_fn, calculateScores_fn;
|
1517
1585
|
var Context = class {
|
1518
1586
|
constructor(options) {
|
1519
1587
|
__privateAdd(this, _Context_instances);
|
1520
1588
|
__publicField(this, "manifest");
|
1589
|
+
__privateAdd(this, _personalizationSelectionAlgorithms);
|
1521
1590
|
__privateAdd(this, _serverTransitionState);
|
1522
1591
|
__privateAdd(this, _scores, {});
|
1523
1592
|
__privateAdd(this, _state);
|
@@ -1534,7 +1603,7 @@ var Context = class {
|
|
1534
1603
|
off: __privateGet(this, _mitt3).off
|
1535
1604
|
});
|
1536
1605
|
__publicField(this, "storage");
|
1537
|
-
var _a, _b;
|
1606
|
+
var _a, _b, _c;
|
1538
1607
|
const { manifest, ...storageOptions } = options;
|
1539
1608
|
__privateSet(this, _state, {});
|
1540
1609
|
__privateSet(this, _plugins, options.plugins);
|
@@ -1542,7 +1611,17 @@ var Context = class {
|
|
1542
1611
|
if (typeof options.transitionStore !== "undefined") {
|
1543
1612
|
__privateSet(this, _commands, []);
|
1544
1613
|
}
|
1614
|
+
__privateSet(this, _personalizationSelectionAlgorithms, { default: topDownCriteriaPersonalizationSelectionAlgorithm });
|
1545
1615
|
(_a = __privateGet(this, _plugins)) == null ? void 0 : _a.forEach((plugin) => {
|
1616
|
+
if (!plugin.personalizationSelectionAlgorithms) {
|
1617
|
+
return;
|
1618
|
+
}
|
1619
|
+
__privateSet(this, _personalizationSelectionAlgorithms, {
|
1620
|
+
...__privateGet(this, _personalizationSelectionAlgorithms),
|
1621
|
+
...plugin.personalizationSelectionAlgorithms
|
1622
|
+
});
|
1623
|
+
});
|
1624
|
+
(_b = __privateGet(this, _plugins)) == null ? void 0 : _b.forEach((plugin) => {
|
1546
1625
|
if (!plugin.logDrain) {
|
1547
1626
|
return;
|
1548
1627
|
}
|
@@ -1593,7 +1672,7 @@ var Context = class {
|
|
1593
1672
|
__privateGet(this, _mitt3).emit("quirksUpdated", quirks.quirks);
|
1594
1673
|
__privateGet(this, _mitt3).emit("log", ["info", 4, quirks.quirks]);
|
1595
1674
|
});
|
1596
|
-
(
|
1675
|
+
(_c = __privateGet(this, _plugins)) == null ? void 0 : _c.forEach((plugin) => {
|
1597
1676
|
if (!plugin.init) {
|
1598
1677
|
return;
|
1599
1678
|
}
|
@@ -1843,7 +1922,17 @@ var Context = class {
|
|
1843
1922
|
}
|
1844
1923
|
/** Executes a personalized placement with a given set of variants */
|
1845
1924
|
personalize(options) {
|
1846
|
-
|
1925
|
+
var _a;
|
1926
|
+
const algorithmName = (_a = options.algorithm) != null ? _a : "default";
|
1927
|
+
const algorithm = __privateGet(this, _personalizationSelectionAlgorithms)[algorithmName];
|
1928
|
+
if (!algorithm) {
|
1929
|
+
__privateGet(this, _mitt3).emit("log", ["warn", 304, { algorithm: algorithmName }]);
|
1930
|
+
return {
|
1931
|
+
personalized: false,
|
1932
|
+
variations: []
|
1933
|
+
};
|
1934
|
+
}
|
1935
|
+
const value = algorithm({
|
1847
1936
|
...options,
|
1848
1937
|
context: this,
|
1849
1938
|
onLogMessage: (message) => __privateGet(this, _mitt3).emit("log", message)
|
@@ -1917,6 +2006,7 @@ var Context = class {
|
|
1917
2006
|
__privateGet(this, _mitt3).emit("personalizationResult", event);
|
1918
2007
|
}
|
1919
2008
|
};
|
2009
|
+
_personalizationSelectionAlgorithms = new WeakMap();
|
1920
2010
|
_serverTransitionState = new WeakMap();
|
1921
2011
|
_scores = new WeakMap();
|
1922
2012
|
_state = new WeakMap();
|
@@ -2512,6 +2602,10 @@ var messageContent = {
|
|
2512
2602
|
301: ({ id, op }) => ["personalization", `testing variation ${id} (${op === "|" ? "OR" : "AND"})`],
|
2513
2603
|
302: ({ matched, description }) => ["personalization", `${description} is ${matched}`],
|
2514
2604
|
303: (selected) => ["personalization", selected ? "selected variation" : "did not select variation"],
|
2605
|
+
304: ({ algorithm }) => [
|
2606
|
+
"personalization",
|
2607
|
+
`personalization selection algorithm '${algorithm}' not found. Hiding placement.`
|
2608
|
+
],
|
2515
2609
|
// TESTING
|
2516
2610
|
400: (name) => ["testing", `executing A/B test '${name}'`],
|
2517
2611
|
401: (testName) => ["testing", `${testName} is not registered in the manifest; it will not be run.`],
|
@@ -2658,5 +2752,6 @@ export {
|
|
2658
2752
|
serializePersonalizeVariants,
|
2659
2753
|
serializeQuickConnect,
|
2660
2754
|
serializeQuirks,
|
2661
|
-
testVariations
|
2755
|
+
testVariations,
|
2756
|
+
topDownCriteriaPersonalizationSelectionAlgorithm
|
2662
2757
|
};
|