@uniformdev/context 20.6.2-alpha.11 → 20.7.1-alpha.14

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/index.esm.js 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, quirks) {
519
+ function evaluateVariantMatch(variantId, match, vec, onLogMessage) {
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, quirks) {
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) => evaluateMatch(c, vec, quirks != null ? quirks : {}, onLogMessage));
527
+ result = match.crit.every((c) => evaluateDimensionMatch(c, vec, onLogMessage));
528
528
  } else {
529
- result = match.crit.some((c) => evaluateMatch(c, vec, quirks != null ? quirks : {}, onLogMessage));
529
+ result = match.crit.some((c) => evaluateDimensionMatch(c, vec, onLogMessage));
530
530
  }
531
531
  onLogMessage == null ? void 0 : onLogMessage(["info", 303, result]);
532
532
  } finally {
@@ -534,16 +534,9 @@ function evaluateVariantMatch(variantId, match, vec, onLogMessage, quirks) {
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
- }
544
537
  function evaluateDimensionMatch(crit, vec, onLogMessage) {
545
538
  var _a, _b;
546
- const { l: lhs, op } = crit;
539
+ const { op, l: lhs } = crit;
547
540
  const lhsScore = (_a = vec[lhs]) != null ? _a : 0;
548
541
  if (op === "^") {
549
542
  const [cat] = lhs.split(ENR_SEPARATOR);
@@ -610,65 +603,33 @@ function evaluateDimensionMatch(crit, vec, onLogMessage) {
610
603
  }
611
604
  if (op === ">") {
612
605
  const result = lhsScore > rhsScore;
613
- explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
606
+ explain(onLogMessage, result, crit, lhsScore, rhsScore);
614
607
  return result;
615
608
  } else if (op === ">=") {
616
609
  const result = lhsScore >= rhsScore;
617
- explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
610
+ explain(onLogMessage, result, crit, lhsScore, rhsScore);
618
611
  return result;
619
612
  } else if (op === "<") {
620
613
  const result = lhsScore < rhsScore;
621
- explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
614
+ explain(onLogMessage, result, crit, lhsScore, rhsScore);
622
615
  return result;
623
616
  } else if (op === "<=") {
624
617
  const result = lhsScore <= rhsScore;
625
- explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
618
+ explain(onLogMessage, result, crit, lhsScore, rhsScore);
626
619
  return result;
627
620
  } else if (op === "=") {
628
621
  const result = lhsScore === rhsScore;
629
- explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
622
+ explain(onLogMessage, result, crit, lhsScore, rhsScore);
630
623
  return result;
631
624
  } else if (op === "!=") {
632
625
  const result = lhsScore !== rhsScore;
633
- explainScore(onLogMessage, result, crit, lhsScore, rhsScore);
626
+ explain(onLogMessage, result, crit, lhsScore, rhsScore);
634
627
  return result;
635
628
  } 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);
658
- return result;
659
- } else {
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;
629
+ throw new Error(`Unknown op: ${op}`);
669
630
  }
670
631
  }
671
- function explainScore(onLogMessage, result, crit, lhsScore, rhsScore) {
632
+ function explain(onLogMessage, result, crit, lhsScore, rhsScore) {
672
633
  onLogMessage == null ? void 0 : onLogMessage([
673
634
  "info",
674
635
  302,
@@ -678,20 +639,9 @@ function explainScore(onLogMessage, result, crit, lhsScore, rhsScore) {
678
639
  }
679
640
  ]);
680
641
  }
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
- }
691
642
 
692
- // src/placement/topDownCriteriaPersonalizationSelectionAlgorithm.ts
693
- var TOP_DOWN_CRITERIA_PERSONALIZATION_ALGORITHM = "default";
694
- function topDownCriteriaPersonalizationSelectionAlgorithm({
643
+ // src/placement/personalize.ts
644
+ function personalizeVariations({
695
645
  name,
696
646
  context,
697
647
  variations,
@@ -701,35 +651,27 @@ function topDownCriteriaPersonalizationSelectionAlgorithm({
701
651
  var _a, _b, _c;
702
652
  onLogMessage == null ? void 0 : onLogMessage(["info", 300, "GROUP", { name, take }]);
703
653
  try {
704
- const variationMatches = [];
705
- const defaultVariations = [];
706
- const needsConsentToPersonalize = context.requireConsentForPersonalization;
707
- const personalizationAllowed = !needsConsentToPersonalize || context.storage.data.consent;
708
- for (const variation of variations) {
709
- const isInvalidFormat = variation.pz && (typeof variation.pz !== "object" || variation.pz === null || !("crit" in variation.pz && Array.isArray(variation.pz.crit)));
710
- let validVariation;
711
- if (isInvalidFormat) {
712
- const { pz, ...validParts } = variation;
713
- validVariation = validParts;
714
- } else {
715
- validVariation = variation;
716
- }
717
- if ((_a = validVariation.pz) == null ? void 0 : _a.crit.length) {
718
- if (personalizationAllowed && variationMatches.length !== take && evaluateVariantMatch(variation.id, validVariation.pz, context.scores, onLogMessage, context.quirks)) {
719
- variationMatches.push(validVariation);
654
+ const variantMatches = [];
655
+ const defaultVariants = [];
656
+ const needsConsent = context.requireConsentForPersonalization;
657
+ const canEvaluate = !needsConsent || context.storage.data.consent;
658
+ for (const variant of variations) {
659
+ if ((_a = variant.pz) == null ? void 0 : _a.crit.length) {
660
+ if (canEvaluate && variantMatches.length !== take && evaluateVariantMatch(variant.id, variant.pz, context.scores, onLogMessage)) {
661
+ variantMatches.push(variant);
720
662
  }
721
663
  } else {
722
- defaultVariations.push(validVariation);
664
+ defaultVariants.push(variant);
723
665
  }
724
666
  }
725
667
  const result = [];
726
- for (let i = 0; i < variationMatches.length; i++) {
668
+ for (let i = 0; i < variantMatches.length; i++) {
727
669
  let isControl = (_b = context.storage.data.controlGroup) != null ? _b : false;
728
- const variation = variationMatches[i];
729
- if (!isControl && typeof ((_c = variation.pz) == null ? void 0 : _c.control) === "number") {
670
+ const variant = variantMatches[i];
671
+ if (!isControl && typeof ((_c = variant.pz) == null ? void 0 : _c.control) === "number") {
730
672
  isControl = context.getPersonalizeVariantControl(name, i);
731
673
  if (typeof isControl === "undefined") {
732
- isControl = rollForControlGroup(variation.pz.control);
674
+ isControl = rollForControlGroup(variant.pz.control);
733
675
  context.storage.updateData([
734
676
  {
735
677
  type: "setpersonalizecontrol",
@@ -742,13 +684,13 @@ function topDownCriteriaPersonalizationSelectionAlgorithm({
742
684
  ]);
743
685
  }
744
686
  }
745
- let variantToAdd = variation;
687
+ let variantToAdd = variant;
746
688
  if (isControl) {
747
- const defaultReplacement = defaultVariations.shift();
689
+ const defaultReplacement = defaultVariants.shift();
748
690
  if (defaultReplacement) {
749
691
  variantToAdd = {
750
692
  ...defaultReplacement,
751
- id: variation.id
693
+ id: variant.id
752
694
  };
753
695
  } else {
754
696
  variantToAdd = void 0;
@@ -758,8 +700,8 @@ function topDownCriteriaPersonalizationSelectionAlgorithm({
758
700
  result.push({ ...variantToAdd, control: isControl });
759
701
  }
760
702
  }
761
- while (result.length < take && defaultVariations.length) {
762
- result.push({ ...defaultVariations.shift(), control: false });
703
+ while (result.length < take && defaultVariants.length) {
704
+ result.push({ ...defaultVariants.shift(), control: false });
763
705
  }
764
706
  const personalized = result.some((v) => {
765
707
  var _a2;
@@ -774,86 +716,7 @@ function topDownCriteriaPersonalizationSelectionAlgorithm({
774
716
  }
775
717
  }
776
718
 
777
- // src/placement/personalizeVariations.ts
778
- function personalizeVariations(options) {
779
- return topDownCriteriaPersonalizationSelectionAlgorithm(options);
780
- }
781
-
782
- // src/placement/strongestScorePersonalizationSelectionAlgorithm.ts
783
- var STRONGEST_SCORE_PERSONALIZATION_ALGORITHM = "ssc";
784
- function strongestScorePersonalizationSelectionAlgorithm({
785
- name,
786
- context,
787
- variations,
788
- take = 1,
789
- onLogMessage
790
- }) {
791
- var _a, _b;
792
- onLogMessage == null ? void 0 : onLogMessage(["info", 300, "GROUP", { name, take }]);
793
- try {
794
- const variationMatches = [];
795
- const defaultVariations = [];
796
- const needsConsentToPersonalize = context.requireConsentForPersonalization;
797
- const isInGlobalControlGroup = (_a = context.storage.data.controlGroup) != null ? _a : false;
798
- const personalizationAllowed = !needsConsentToPersonalize || context.storage.data.consent;
799
- for (const variation of variations) {
800
- const isInvalidFormat = variation.pz && typeof variation.pz !== "object";
801
- let validVariation;
802
- if (isInvalidFormat) {
803
- const { pz, ...validParts } = variation;
804
- validVariation = validParts;
805
- } else {
806
- validVariation = variation;
807
- }
808
- if ((_b = validVariation.pz) == null ? void 0 : _b.dim) {
809
- if (!personalizationAllowed) {
810
- continue;
811
- }
812
- const score = context.scores[validVariation.pz.dim];
813
- if (score === void 0 || score <= 0) {
814
- continue;
815
- }
816
- variationMatches.push({ variation: validVariation, score });
817
- } else {
818
- defaultVariations.push(validVariation);
819
- }
820
- }
821
- variationMatches.sort((a, b) => b.score - a.score);
822
- const result = [];
823
- for (let i = 0; i < variationMatches.length; i++) {
824
- const variationMatch = variationMatches[i];
825
- let variantToAdd = variationMatch.variation;
826
- if (i >= take) {
827
- continue;
828
- }
829
- if (isInGlobalControlGroup) {
830
- const defaultReplacement = defaultVariations.shift();
831
- if (defaultReplacement) {
832
- variantToAdd = {
833
- ...defaultReplacement,
834
- id: variationMatch.variation.id
835
- };
836
- } else {
837
- variantToAdd = void 0;
838
- }
839
- }
840
- if (variantToAdd) {
841
- result.push({ ...variantToAdd, control: isInGlobalControlGroup });
842
- }
843
- }
844
- while (result.length < take && defaultVariations.length) {
845
- result.push({ ...defaultVariations.shift(), control: false });
846
- }
847
- return {
848
- personalized: variationMatches.length > 0 && !isInGlobalControlGroup,
849
- variations: result
850
- };
851
- } finally {
852
- onLogMessage == null ? void 0 : onLogMessage(["info", 300, "ENDGROUP"]);
853
- }
854
- }
855
-
856
- // src/placement/normalizeVariationDistributions.ts
719
+ // src/placement/test.ts
857
720
  var normalizeVariationDistributions = (variations) => {
858
721
  const { values, total, missingDistribution } = variations.reduce(
859
722
  (previous, current) => {
@@ -872,12 +735,7 @@ var normalizeVariationDistributions = (variations) => {
872
735
  }
873
736
  );
874
737
  if (total > 100) {
875
- const autoScaleFactor = 100 / total;
876
- values.forEach((value, index) => {
877
- if (typeof value === "number") {
878
- values[index] = value * autoScaleFactor;
879
- }
880
- });
738
+ throw new Error(`Total distribution ${total} is over the maximum 100.`);
881
739
  } else if (total < 100) {
882
740
  const remainder = 100 - total;
883
741
  const missingSlice = remainder / missingDistribution;
@@ -889,8 +747,6 @@ var normalizeVariationDistributions = (variations) => {
889
747
  }
890
748
  return values;
891
749
  };
892
-
893
- // src/placement/testVariations.ts
894
750
  var testVariations = ({
895
751
  name,
896
752
  context,
@@ -1657,12 +1513,11 @@ import { dequal as dequal5 } from "dequal/lite";
1657
1513
  import mitt3 from "mitt";
1658
1514
  var CONTEXTUAL_EDITING_TEST_NAME = "contextual_editing_test";
1659
1515
  var CONTEXTUAL_EDITING_TEST_SELECTED_VARIANT_ID = "contextual_editing_test_selected_variant";
1660
- var _personalizationSelectionAlgorithms, _serverTransitionState, _scores, _state, _pzCache, _plugins, _commands, _requireConsentForPersonalization, _mitt3, _Context_instances, emitTest_fn, updateGoals_fn, updateComputedScores_fn, calculateScores_fn;
1516
+ var _serverTransitionState, _scores, _state, _pzCache, _plugins, _commands, _requireConsentForPersonalization, _mitt3, _Context_instances, emitTest_fn, updateGoals_fn, updateComputedScores_fn, calculateScores_fn;
1661
1517
  var Context = class {
1662
1518
  constructor(options) {
1663
1519
  __privateAdd(this, _Context_instances);
1664
1520
  __publicField(this, "manifest");
1665
- __privateAdd(this, _personalizationSelectionAlgorithms);
1666
1521
  __privateAdd(this, _serverTransitionState);
1667
1522
  __privateAdd(this, _scores, {});
1668
1523
  __privateAdd(this, _state);
@@ -1679,7 +1534,7 @@ var Context = class {
1679
1534
  off: __privateGet(this, _mitt3).off
1680
1535
  });
1681
1536
  __publicField(this, "storage");
1682
- var _a, _b, _c;
1537
+ var _a, _b;
1683
1538
  const { manifest, ...storageOptions } = options;
1684
1539
  __privateSet(this, _state, {});
1685
1540
  __privateSet(this, _plugins, options.plugins);
@@ -1687,20 +1542,7 @@ var Context = class {
1687
1542
  if (typeof options.transitionStore !== "undefined") {
1688
1543
  __privateSet(this, _commands, []);
1689
1544
  }
1690
- __privateSet(this, _personalizationSelectionAlgorithms, {
1691
- [TOP_DOWN_CRITERIA_PERSONALIZATION_ALGORITHM]: topDownCriteriaPersonalizationSelectionAlgorithm,
1692
- [STRONGEST_SCORE_PERSONALIZATION_ALGORITHM]: strongestScorePersonalizationSelectionAlgorithm
1693
- });
1694
1545
  (_a = __privateGet(this, _plugins)) == null ? void 0 : _a.forEach((plugin) => {
1695
- if (!plugin.personalizationSelectionAlgorithms) {
1696
- return;
1697
- }
1698
- __privateSet(this, _personalizationSelectionAlgorithms, {
1699
- ...__privateGet(this, _personalizationSelectionAlgorithms),
1700
- ...plugin.personalizationSelectionAlgorithms
1701
- });
1702
- });
1703
- (_b = __privateGet(this, _plugins)) == null ? void 0 : _b.forEach((plugin) => {
1704
1546
  if (!plugin.logDrain) {
1705
1547
  return;
1706
1548
  }
@@ -1751,7 +1593,7 @@ var Context = class {
1751
1593
  __privateGet(this, _mitt3).emit("quirksUpdated", quirks.quirks);
1752
1594
  __privateGet(this, _mitt3).emit("log", ["info", 4, quirks.quirks]);
1753
1595
  });
1754
- (_c = __privateGet(this, _plugins)) == null ? void 0 : _c.forEach((plugin) => {
1596
+ (_b = __privateGet(this, _plugins)) == null ? void 0 : _b.forEach((plugin) => {
1755
1597
  if (!plugin.init) {
1756
1598
  return;
1757
1599
  }
@@ -2001,17 +1843,7 @@ var Context = class {
2001
1843
  }
2002
1844
  /** Executes a personalized placement with a given set of variants */
2003
1845
  personalize(options) {
2004
- var _a;
2005
- const algorithmName = (_a = options.algorithm) != null ? _a : TOP_DOWN_CRITERIA_PERSONALIZATION_ALGORITHM;
2006
- const algorithm = __privateGet(this, _personalizationSelectionAlgorithms)[algorithmName];
2007
- if (!algorithm) {
2008
- __privateGet(this, _mitt3).emit("log", ["warn", 304, { algorithm: algorithmName }]);
2009
- return {
2010
- personalized: false,
2011
- variations: []
2012
- };
2013
- }
2014
- const value = algorithm({
1846
+ const value = personalizeVariations({
2015
1847
  ...options,
2016
1848
  context: this,
2017
1849
  onLogMessage: (message) => __privateGet(this, _mitt3).emit("log", message)
@@ -2085,7 +1917,6 @@ var Context = class {
2085
1917
  __privateGet(this, _mitt3).emit("personalizationResult", event);
2086
1918
  }
2087
1919
  };
2088
- _personalizationSelectionAlgorithms = new WeakMap();
2089
1920
  _serverTransitionState = new WeakMap();
2090
1921
  _scores = new WeakMap();
2091
1922
  _state = new WeakMap();
@@ -2681,10 +2512,6 @@ var messageContent = {
2681
2512
  301: ({ id, op }) => ["personalization", `testing variation ${id} (${op === "|" ? "OR" : "AND"})`],
2682
2513
  302: ({ matched, description }) => ["personalization", `${description} is ${matched}`],
2683
2514
  303: (selected) => ["personalization", selected ? "selected variation" : "did not select variation"],
2684
- 304: ({ algorithm }) => [
2685
- "personalization",
2686
- `personalization selection algorithm '${algorithm}' not found. Hiding placement.`
2687
- ],
2688
2515
  // TESTING
2689
2516
  400: (name) => ["testing", `executing A/B test '${name}'`],
2690
2517
  401: (testName) => ["testing", `${testName} is not registered in the manifest; it will not be run.`],
@@ -2789,9 +2616,7 @@ export {
2789
2616
  PAIR_SEP,
2790
2617
  QUIRK_SEP,
2791
2618
  SERVER_STATE_ID,
2792
- STRONGEST_SCORE_PERSONALIZATION_ALGORITHM,
2793
2619
  ScriptType,
2794
- TOP_DOWN_CRITERIA_PERSONALIZATION_ALGORITHM,
2795
2620
  TYPE_SEP,
2796
2621
  TransitionDataStore,
2797
2622
  UNIFORM_DEFAULT_COOKIE_NAME,
@@ -2833,7 +2658,5 @@ export {
2833
2658
  serializePersonalizeVariants,
2834
2659
  serializeQuickConnect,
2835
2660
  serializeQuirks,
2836
- strongestScorePersonalizationSelectionAlgorithm,
2837
- testVariations,
2838
- topDownCriteriaPersonalizationSelectionAlgorithm
2661
+ testVariations
2839
2662
  };