@uniformdev/context 20.6.2-alpha.10 → 20.6.5-alpha.1

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.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, 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,34 +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
- validVariation = { id: variation.id };
713
- } else {
714
- validVariation = variation;
715
- }
716
- if ((_a = validVariation.pz) == null ? void 0 : _a.crit.length) {
717
- if (personalizationAllowed && variationMatches.length !== take && evaluateVariantMatch(variation.id, validVariation.pz, context.scores, onLogMessage, context.quirks)) {
718
- 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);
719
662
  }
720
663
  } else {
721
- defaultVariations.push(validVariation);
664
+ defaultVariants.push(variant);
722
665
  }
723
666
  }
724
667
  const result = [];
725
- for (let i = 0; i < variationMatches.length; i++) {
668
+ for (let i = 0; i < variantMatches.length; i++) {
726
669
  let isControl = (_b = context.storage.data.controlGroup) != null ? _b : false;
727
- const variation = variationMatches[i];
728
- 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") {
729
672
  isControl = context.getPersonalizeVariantControl(name, i);
730
673
  if (typeof isControl === "undefined") {
731
- isControl = rollForControlGroup(variation.pz.control);
674
+ isControl = rollForControlGroup(variant.pz.control);
732
675
  context.storage.updateData([
733
676
  {
734
677
  type: "setpersonalizecontrol",
@@ -741,13 +684,13 @@ function topDownCriteriaPersonalizationSelectionAlgorithm({
741
684
  ]);
742
685
  }
743
686
  }
744
- let variantToAdd = variation;
687
+ let variantToAdd = variant;
745
688
  if (isControl) {
746
- const defaultReplacement = defaultVariations.shift();
689
+ const defaultReplacement = defaultVariants.shift();
747
690
  if (defaultReplacement) {
748
691
  variantToAdd = {
749
692
  ...defaultReplacement,
750
- id: variation.id
693
+ id: variant.id
751
694
  };
752
695
  } else {
753
696
  variantToAdd = void 0;
@@ -757,8 +700,8 @@ function topDownCriteriaPersonalizationSelectionAlgorithm({
757
700
  result.push({ ...variantToAdd, control: isControl });
758
701
  }
759
702
  }
760
- while (result.length < take && defaultVariations.length) {
761
- result.push({ ...defaultVariations.shift(), control: false });
703
+ while (result.length < take && defaultVariants.length) {
704
+ result.push({ ...defaultVariants.shift(), control: false });
762
705
  }
763
706
  const personalized = result.some((v) => {
764
707
  var _a2;
@@ -773,82 +716,7 @@ function topDownCriteriaPersonalizationSelectionAlgorithm({
773
716
  }
774
717
  }
775
718
 
776
- // src/placement/personalizeVariations.ts
777
- function personalizeVariations(options) {
778
- return topDownCriteriaPersonalizationSelectionAlgorithm(options);
779
- }
780
-
781
- // src/placement/strongestScorePersonalizationSelectionAlgorithm.ts
782
- var STRONGEST_SCORE_PERSONALIZATION_ALGORITHM = "ssc";
783
- function strongestScorePersonalizationSelectionAlgorithm({
784
- name,
785
- context,
786
- variations,
787
- take = 1,
788
- onLogMessage
789
- }) {
790
- var _a, _b;
791
- onLogMessage == null ? void 0 : onLogMessage(["info", 300, "GROUP", { name, take }]);
792
- try {
793
- const variationMatches = [];
794
- const defaultVariations = [];
795
- const needsConsentToPersonalize = context.requireConsentForPersonalization;
796
- const isInGlobalControlGroup = (_a = context.storage.data.controlGroup) != null ? _a : false;
797
- const personalizationAllowed = !needsConsentToPersonalize || context.storage.data.consent;
798
- for (const variation of variations) {
799
- const isInvalidFormat = variation.pz && (typeof variation.pz !== "object" || variation.pz === null);
800
- let validVariation;
801
- if (isInvalidFormat) {
802
- validVariation = { id: variation.id };
803
- } else {
804
- validVariation = variation;
805
- }
806
- if ((_b = validVariation.pz) == null ? void 0 : _b.dim) {
807
- if (!personalizationAllowed) {
808
- continue;
809
- }
810
- const score = context.scores[validVariation.pz.dim];
811
- if (score === void 0 || score <= 0) {
812
- continue;
813
- }
814
- variationMatches.push({ variation: validVariation, score });
815
- } else {
816
- defaultVariations.push(validVariation);
817
- }
818
- }
819
- variationMatches.sort((a, b) => b.score - a.score);
820
- const result = [];
821
- for (let i = 0; i < variationMatches.length; i++) {
822
- const variationMatch = variationMatches[i];
823
- let variantToAdd = variationMatch.variation;
824
- if (isInGlobalControlGroup) {
825
- const defaultReplacement = defaultVariations.shift();
826
- if (defaultReplacement) {
827
- variantToAdd = {
828
- ...defaultReplacement,
829
- id: variationMatch.variation.id
830
- };
831
- } else {
832
- variantToAdd = void 0;
833
- }
834
- }
835
- if (variantToAdd) {
836
- result.push({ ...variantToAdd, control: isInGlobalControlGroup });
837
- }
838
- }
839
- while (result.length < take && defaultVariations.length) {
840
- result.push({ ...defaultVariations.shift(), control: false });
841
- }
842
- return {
843
- personalized: variationMatches.length > 0 && !isInGlobalControlGroup,
844
- variations: result
845
- };
846
- } finally {
847
- onLogMessage == null ? void 0 : onLogMessage(["info", 300, "ENDGROUP"]);
848
- }
849
- }
850
-
851
- // src/placement/normalizeVariationDistributions.ts
719
+ // src/placement/test.ts
852
720
  var normalizeVariationDistributions = (variations) => {
853
721
  const { values, total, missingDistribution } = variations.reduce(
854
722
  (previous, current) => {
@@ -867,12 +735,7 @@ var normalizeVariationDistributions = (variations) => {
867
735
  }
868
736
  );
869
737
  if (total > 100) {
870
- const autoScaleFactor = 100 / total;
871
- values.forEach((value, index) => {
872
- if (typeof value === "number") {
873
- values[index] = value * autoScaleFactor;
874
- }
875
- });
738
+ throw new Error(`Total distribution ${total} is over the maximum 100.`);
876
739
  } else if (total < 100) {
877
740
  const remainder = 100 - total;
878
741
  const missingSlice = remainder / missingDistribution;
@@ -884,8 +747,6 @@ var normalizeVariationDistributions = (variations) => {
884
747
  }
885
748
  return values;
886
749
  };
887
-
888
- // src/placement/testVariations.ts
889
750
  var testVariations = ({
890
751
  name,
891
752
  context,
@@ -912,11 +773,11 @@ var testVariations = ({
912
773
  }
913
774
  if (!selectedVariant) {
914
775
  const distributions = normalizeVariationDistributions(variations);
915
- const random = Math.floor(Math.random() * 100);
776
+ const random = Math.random() * 100;
916
777
  let distributionOffset = 0;
917
778
  selectedVariant = variations.find((variant, index) => {
918
779
  const distribution = distributions[index];
919
- if ((random > distributionOffset || random === 0) && random <= distributionOffset + distribution) {
780
+ if (random >= distributionOffset && random < distributionOffset + distribution) {
920
781
  return variant;
921
782
  }
922
783
  distributionOffset += distribution;
@@ -1652,12 +1513,11 @@ import { dequal as dequal5 } from "dequal/lite";
1652
1513
  import mitt3 from "mitt";
1653
1514
  var CONTEXTUAL_EDITING_TEST_NAME = "contextual_editing_test";
1654
1515
  var CONTEXTUAL_EDITING_TEST_SELECTED_VARIANT_ID = "contextual_editing_test_selected_variant";
1655
- 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;
1656
1517
  var Context = class {
1657
1518
  constructor(options) {
1658
1519
  __privateAdd(this, _Context_instances);
1659
1520
  __publicField(this, "manifest");
1660
- __privateAdd(this, _personalizationSelectionAlgorithms);
1661
1521
  __privateAdd(this, _serverTransitionState);
1662
1522
  __privateAdd(this, _scores, {});
1663
1523
  __privateAdd(this, _state);
@@ -1674,7 +1534,7 @@ var Context = class {
1674
1534
  off: __privateGet(this, _mitt3).off
1675
1535
  });
1676
1536
  __publicField(this, "storage");
1677
- var _a, _b, _c;
1537
+ var _a, _b;
1678
1538
  const { manifest, ...storageOptions } = options;
1679
1539
  __privateSet(this, _state, {});
1680
1540
  __privateSet(this, _plugins, options.plugins);
@@ -1682,20 +1542,7 @@ var Context = class {
1682
1542
  if (typeof options.transitionStore !== "undefined") {
1683
1543
  __privateSet(this, _commands, []);
1684
1544
  }
1685
- __privateSet(this, _personalizationSelectionAlgorithms, {
1686
- [TOP_DOWN_CRITERIA_PERSONALIZATION_ALGORITHM]: topDownCriteriaPersonalizationSelectionAlgorithm,
1687
- [STRONGEST_SCORE_PERSONALIZATION_ALGORITHM]: strongestScorePersonalizationSelectionAlgorithm
1688
- });
1689
1545
  (_a = __privateGet(this, _plugins)) == null ? void 0 : _a.forEach((plugin) => {
1690
- if (!plugin.personalizationSelectionAlgorithms) {
1691
- return;
1692
- }
1693
- __privateSet(this, _personalizationSelectionAlgorithms, {
1694
- ...__privateGet(this, _personalizationSelectionAlgorithms),
1695
- ...plugin.personalizationSelectionAlgorithms
1696
- });
1697
- });
1698
- (_b = __privateGet(this, _plugins)) == null ? void 0 : _b.forEach((plugin) => {
1699
1546
  if (!plugin.logDrain) {
1700
1547
  return;
1701
1548
  }
@@ -1746,7 +1593,7 @@ var Context = class {
1746
1593
  __privateGet(this, _mitt3).emit("quirksUpdated", quirks.quirks);
1747
1594
  __privateGet(this, _mitt3).emit("log", ["info", 4, quirks.quirks]);
1748
1595
  });
1749
- (_c = __privateGet(this, _plugins)) == null ? void 0 : _c.forEach((plugin) => {
1596
+ (_b = __privateGet(this, _plugins)) == null ? void 0 : _b.forEach((plugin) => {
1750
1597
  if (!plugin.init) {
1751
1598
  return;
1752
1599
  }
@@ -1996,17 +1843,7 @@ var Context = class {
1996
1843
  }
1997
1844
  /** Executes a personalized placement with a given set of variants */
1998
1845
  personalize(options) {
1999
- var _a;
2000
- const algorithmName = (_a = options.algorithm) != null ? _a : TOP_DOWN_CRITERIA_PERSONALIZATION_ALGORITHM;
2001
- const algorithm = __privateGet(this, _personalizationSelectionAlgorithms)[algorithmName];
2002
- if (!algorithm) {
2003
- __privateGet(this, _mitt3).emit("log", ["warn", 304, { algorithm: algorithmName }]);
2004
- return {
2005
- personalized: false,
2006
- variations: []
2007
- };
2008
- }
2009
- const value = algorithm({
1846
+ const value = personalizeVariations({
2010
1847
  ...options,
2011
1848
  context: this,
2012
1849
  onLogMessage: (message) => __privateGet(this, _mitt3).emit("log", message)
@@ -2080,7 +1917,6 @@ var Context = class {
2080
1917
  __privateGet(this, _mitt3).emit("personalizationResult", event);
2081
1918
  }
2082
1919
  };
2083
- _personalizationSelectionAlgorithms = new WeakMap();
2084
1920
  _serverTransitionState = new WeakMap();
2085
1921
  _scores = new WeakMap();
2086
1922
  _state = new WeakMap();
@@ -2676,10 +2512,6 @@ var messageContent = {
2676
2512
  301: ({ id, op }) => ["personalization", `testing variation ${id} (${op === "|" ? "OR" : "AND"})`],
2677
2513
  302: ({ matched, description }) => ["personalization", `${description} is ${matched}`],
2678
2514
  303: (selected) => ["personalization", selected ? "selected variation" : "did not select variation"],
2679
- 304: ({ algorithm }) => [
2680
- "personalization",
2681
- `personalization selection algorithm '${algorithm}' not found. Hiding placement.`
2682
- ],
2683
2515
  // TESTING
2684
2516
  400: (name) => ["testing", `executing A/B test '${name}'`],
2685
2517
  401: (testName) => ["testing", `${testName} is not registered in the manifest; it will not be run.`],
@@ -2784,9 +2616,7 @@ export {
2784
2616
  PAIR_SEP,
2785
2617
  QUIRK_SEP,
2786
2618
  SERVER_STATE_ID,
2787
- STRONGEST_SCORE_PERSONALIZATION_ALGORITHM,
2788
2619
  ScriptType,
2789
- TOP_DOWN_CRITERIA_PERSONALIZATION_ALGORITHM,
2790
2620
  TYPE_SEP,
2791
2621
  TransitionDataStore,
2792
2622
  UNIFORM_DEFAULT_COOKIE_NAME,
@@ -2828,7 +2658,5 @@ export {
2828
2658
  serializePersonalizeVariants,
2829
2659
  serializeQuickConnect,
2830
2660
  serializeQuirks,
2831
- strongestScorePersonalizationSelectionAlgorithm,
2832
- testVariations,
2833
- topDownCriteriaPersonalizationSelectionAlgorithm
2661
+ testVariations
2834
2662
  };
@@ -859,10 +859,6 @@ type LogMessages = {
859
859
  }>;
860
860
  /** Final result for a personalized variation */
861
861
  303: MessageFunc<boolean>;
862
- /** Personalization algorithm not found */
863
- 304: MessageFunc<{
864
- algorithm: string;
865
- }>;
866
862
  /** A/B test placement executing */
867
863
  400: MessageFunc<string>;
868
864
  /** A/B Test definition did not exist */
@@ -902,34 +898,23 @@ type LogMessageSingle<TID extends keyof LogMessages = keyof LogMessages> = [
902
898
  type LogMessageGroup<TID extends keyof LogMessages = keyof LogMessages> = [severity: Severity, id: TID, group: 'GROUP', ...args: Parameters<LogMessages[TID]>] | [severity: Severity, id: TID, group: 'ENDGROUP'];
903
899
  type LogDrain = (message: LogMessage) => void;
904
900
 
905
- /** Data for a personalization variation using the top-down criteria selection algorithm */
906
- interface VariantMatchCriteria extends VariationMatchMetadata {
901
+ type VariantMatchCriteria = {
907
902
  /**
908
903
  * Operation for match criteria
909
904
  *
910
905
  * @defaultValue `&`
911
906
  */
912
907
  op?: '&' | '|';
913
- crit: Array<DimensionMatch | QuirkMatch>;
908
+ crit: DimensionMatch[];
914
909
  /**
915
- * Control group percentage for the variant.
910
+ * Name of the variant for analytics tracking.
916
911
  */
917
- control?: number;
918
- }
919
- /** Data for a personalization variation using the TODO selection algorithm */
920
- interface VariationMatchDimensionCriteria extends VariationMatchMetadata {
921
- /** The dimension this content is relevant to */
922
- dim: string | undefined;
923
- }
924
- /** Data that must exist on a personalization variation regardless of selection algorithm */
925
- interface VariationMatchMetadata {
912
+ name?: string;
926
913
  /**
927
- * Name of the variation for analytics tracking.
928
- * NOTE: name is optional for backwards compatibility, but it is HIGHLY recommended to specify a name
929
- * as the default fallback is not helpfully named and is reliant on the order of the variations array.
914
+ * Control group percentage for the variant.
930
915
  */
931
- name?: string;
932
- }
916
+ control?: number;
917
+ };
933
918
  type DimensionMatch = {
934
919
  /**
935
920
  * Left hand side of the match expression (name of dimension in score vector)
@@ -968,48 +953,17 @@ type DimensionMatch = {
968
953
  */
969
954
  rDim?: string;
970
955
  };
971
- type QuirkMatch = {
972
- /**
973
- * Type of match expression; 'q' discriminates quirk matches from dimension matches
974
- */
975
- t: 'q';
976
- /**
977
- * Left hand side of the match expression (name of quirk)
978
- * NOTE: if the quirk is not present
979
- */
980
- l: string;
981
- /**
982
- * Operator of the match expression
983
- * Comparison operators:
984
- * =: `l` is equal to the right hand side expression
985
- * !=: `l` is not equal to the right hand side expression
986
- */
987
- op: '=' | '!=';
988
- /**
989
- * Right hand side of the match expression
990
- * This value is treated as a constant value, if it is present. If it's a string, it is parsed to an integer.
991
- * To reference another score dimension as the RHS, use the `rDim` property instead.
992
- * `r` and `rDim` are mutually exclusive; if both are specified, then `rDim` wins.
993
- */
994
- r: string;
995
- /**
996
- * Only here to maintain object compatibility with DimensionMatch.
997
- * Completely ignored.
998
- * @deprecated this is not used with QuirkMatch.
999
- */
1000
- rDim?: string;
1001
- };
1002
956
 
1003
957
  /** Content that is tagged for adding enrichment score when triggered by behavior (i.e. being shown that content) */
1004
958
  type BehaviorTag = {
1005
959
  beh?: EnrichmentData[];
1006
960
  };
1007
961
  /** Defines the shape of a personalized content variant */
1008
- type PersonalizedVariant<TCriteria = VariantMatchCriteria> = {
962
+ type PersonalizedVariant = {
1009
963
  /** A unique identifier for this variation */
1010
964
  id: string;
1011
965
  /** Match criteria for this variation */
1012
- pz?: TCriteria;
966
+ pz?: VariantMatchCriteria;
1013
967
  };
1014
968
  /** The result of computing personalized content from variations */
1015
969
  type PersonalizedResult<TVariant> = {
@@ -1017,7 +971,6 @@ type PersonalizedResult<TVariant> = {
1017
971
  personalized: boolean;
1018
972
  /** Matching variations */
1019
973
  variations: Array<TVariant & {
1020
- /** Whether the visitor is part of this variation's local control group (also true if part of global control group) */
1021
974
  control: boolean;
1022
975
  }>;
1023
976
  };
@@ -1042,28 +995,19 @@ type TestResult<TVariant> = {
1042
995
  */
1043
996
  variantAssigned: boolean;
1044
997
  };
1045
- interface PersonalizeOptions<TVariant> {
1046
- /** Name of placement (sent to analytics) */
1047
- name: string;
1048
- /** Possible variations to place */
1049
- variations: Iterable<TVariant>;
1050
- /** Maximum number of variants to place (default: 1) */
1051
- take?: number;
1052
- /** Name of the personalization selection algorithm to use. Defaults to top-down criteria when not specified. */
1053
- algorithm?: string;
1054
- }
1055
- interface PersonalizationSelectionAlgorithmOptions<TCriteria, TVariant extends PersonalizedVariant<TCriteria> = PersonalizedVariant<TCriteria>> {
998
+
999
+ type PersonalizeOptions<TVariant> = {
1056
1000
  /** Name of placement (sent to analytics) */
1057
1001
  name: string;
1058
- /** Possible variations to place */
1002
+ /** Possible variants to place */
1059
1003
  variations: Iterable<TVariant>;
1060
1004
  /** Maximum number of variants to place (default: 1) */
1061
1005
  take?: number;
1062
- /** Callback for logging messages */
1063
1006
  onLogMessage?: (message: LogMessage) => void;
1064
- /** Context instance */
1007
+ };
1008
+ declare function personalizeVariations<TVariant extends PersonalizedVariant>({ name, context, variations, take, onLogMessage, }: PersonalizeOptions<TVariant> & {
1065
1009
  context: Context;
1066
- }
1010
+ }): PersonalizedResult<TVariant>;
1067
1011
 
1068
1012
  type TestOptions<TVariant extends TestVariant> = {
1069
1013
  /** The name of the test that is being run, must be included in the manifest. */
@@ -1078,31 +1022,18 @@ declare const testVariations: <TVariant extends TestVariant>({ name, context, va
1078
1022
 
1079
1023
  declare const CONTEXTUAL_EDITING_TEST_NAME = "contextual_editing_test";
1080
1024
  declare const CONTEXTUAL_EDITING_TEST_SELECTED_VARIANT_ID = "contextual_editing_test_selected_variant";
1081
- type PersonalizationSelectionAlgorithm<TCriteria = unknown> = (options: PersonalizationSelectionAlgorithmOptions<TCriteria>) => PersonalizedResult<PersonalizedVariant<TCriteria>>;
1082
- type PersonalizationSelectionAlgorithms<TCriteria = unknown> = Record<string, PersonalizationSelectionAlgorithm<TCriteria>>;
1083
1025
  /**
1084
1026
  * Defines a plugin for Uniform Context.
1085
1027
  * The plugin should attach event handlers in its creation function.
1086
1028
  * @returns A function that detaches any event handlers when called
1087
1029
  */
1088
1030
  type ContextPlugin = {
1089
- /** Defines a log drain for the plugin, which all log messages are sent to */
1090
1031
  logDrain?: LogDrain;
1091
- /** Initializes the plugin (attach event handlers here if needed) */
1092
1032
  init?: (context: Context) => () => void;
1093
- /** Plugin-specific actions to perform when a user is forgotten */
1094
1033
  forget?: () => Promise<void> | void;
1095
- /** Plugin-specific actions to perform when the visitor context is updated */
1096
1034
  update?: (newData: Partial<ContextState>) => Promise<void> | void;
1097
- /**
1098
- * Allows the plugin to register named personalization selection algorithms
1099
- *
1100
- * Important: the `default` and `strongestMatch` algorithms are automatically registered.
1101
- * We strongly advise against replacing these.
1102
- */
1103
- personalizationSelectionAlgorithms?: PersonalizationSelectionAlgorithms<any>;
1104
1035
  };
1105
- interface ContextOptions extends Omit<VisitorDataStoreOptions, 'manifest' | 'onServerTransitionScoresReceived'> {
1036
+ type ContextOptions = {
1106
1037
  /** The Context Manifest to load (from the Context API) */
1107
1038
  manifest: ManifestV2;
1108
1039
  /**
@@ -1119,19 +1050,16 @@ interface ContextOptions extends Omit<VisitorDataStoreOptions, 'manifest' | 'onS
1119
1050
  * `true`: personalization is not run at all unless storage consent is given
1120
1051
  */
1121
1052
  requireConsentForPersonalization?: boolean;
1122
- }
1123
- type PersonalizationEventVariantId = {
1124
- /** The variant ID that was selected */
1125
- id: string;
1126
- /** Whether the visitor is part of this variant's local control group (also true if part of global control group) */
1127
- control: boolean;
1128
- };
1053
+ } & Omit<VisitorDataStoreOptions, 'manifest' | 'onServerTransitionScoresReceived'>;
1129
1054
  /** Emitted when a personalization runs */
1130
1055
  type PersonalizationEvent = {
1131
1056
  /** Name of the personalized placement */
1132
1057
  name: string;
1133
1058
  /** Selected variant ID(s) */
1134
- variantIds: PersonalizationEventVariantId[];
1059
+ variantIds: {
1060
+ id: string;
1061
+ control: boolean;
1062
+ }[];
1135
1063
  /** Whether the user was part of the control group (and did not receive any personalization) */
1136
1064
  control: boolean | undefined;
1137
1065
  /**
@@ -1185,7 +1113,7 @@ interface ContextInstance {
1185
1113
  setTestVariantId(testName: string, variantId: string): void;
1186
1114
  log(...message: LogMessage): void;
1187
1115
  test<TVariant extends TestVariant>(options: TestOptions<TVariant>): TestResult<TVariant>;
1188
- personalize<TVariant extends PersonalizedVariant<any>>(options: PersonalizeOptions<TVariant>): PersonalizedResult<TVariant>;
1116
+ personalize<TVariant extends PersonalizedVariant>(options: PersonalizeOptions<TVariant>): PersonalizedResult<TVariant>;
1189
1117
  forget(fromAllDevices: boolean): Promise<void>;
1190
1118
  getServerToClientTransitionState(): ServerToClientTransitionState;
1191
1119
  readonly manifest: ManifestInstance;
@@ -1250,7 +1178,7 @@ declare class Context implements ContextInstance {
1250
1178
  /** Executes an A/B test with a given set of variants, showing the visitor's assigned variant (or selecting one to assign, if none is set yet) */
1251
1179
  test<TVariant extends TestVariant>(options: TestOptions<TVariant>): TestResult<TVariant>;
1252
1180
  /** Executes a personalized placement with a given set of variants */
1253
- personalize<TVariant extends PersonalizedVariant<any>>(options: PersonalizeOptions<TVariant>): PersonalizedResult<TVariant>;
1181
+ personalize<TVariant extends PersonalizedVariant>(options: PersonalizeOptions<TVariant>): PersonalizedResult<TVariant>;
1254
1182
  /**
1255
1183
  * Forgets the visitor's data and resets the Context to its initial state.
1256
1184
  * @param fromAllDevices for an identified user, whether to delete all their data (for the entire account) - true, or data for this device (sign out) - false
@@ -1337,4 +1265,4 @@ declare global {
1337
1265
  }
1338
1266
  }
1339
1267
 
1340
- export { type ManifestV2 as $, type AggregateDimension as A, type DevToolsLogEvent as B, type ContextPlugin as C, type DecayFunction as D, type DevToolsDataEvent as E, type DevToolsHelloEvent as F, type DevToolsUpdateEvent as G, type DevToolsRawCommandsEvent as H, type DevToolsForgetEvent as I, type LogMessages as J, type Severity as K, type LogDrain as L, type MessageCategory as M, type MessageFunc as N, type OutputSeverity as O, type PersonalizedVariant as P, type Quirks as Q, type LogMessageSingle as R, type ScoreVector as S, TransitionDataStore as T, type LogMessageGroup as U, type VisitorData as V, ManifestInstance as W, GroupCriteriaEvaluator as X, type CriteriaEvaluatorResult as Y, type CriteriaEvaluatorParameters as Z, type SignalData as _, type StorageCommands as a, type PersonalizationManifest as a0, type Signal as a1, type SignalCriteriaGroup as a2, type SignalCriteria as a3, type EnrichmentCategory as a4, type NumberMatch as a5, type TestDefinition as a6, type AggregateDimensionInput as a7, type TestOptions as a8, testVariations as a9, type EnrichmentData as aA, type PersonalizeControlVariant as aB, type PersonalizeVariants as aC, type EventData as aD, emptyVisitorData as aE, type ContextState as aF, type ContextStateUpdate as aG, type GoalStateUpdate as aH, type paths as aI, type VariationMatchMetadata as aa, type DimensionMatch as ab, type QuirkMatch as ac, type BehaviorTag as ad, type TestVariant as ae, type TestResult as af, type StorageCommand as ag, type SetGoalCommand as ah, type ModifyScoreCommand as ai, type ModifySessionScoreCommand as aj, type SetConsentCommand as ak, type SetQuirkCommand as al, type SetTestCommand as am, type IdentifyCommand as an, type SetControlGroupCommand as ao, type SetPersonalizeVariantControlCommand as ap, areCommandsEqual as aq, type ServerToClientTransitionState as ar, SERVER_STATE_ID as as, type TransitionDataStoreEvents as at, type DecayOptions as au, type VisitorDataStoreOptions as av, type VisitorDataStoreEvents as aw, VisitorDataStore as ax, type Tests as ay, type Goals as az, type TransitionDataStoreOptions as b, type CriteriaEvaluator as c, type StringMatch as d, type VariantMatchCriteria as e, type LogMessage as f, type PersonalizeOptions as g, Context as h, type PersonalizedResult as i, type VariationMatchDimensionCriteria as j, type PersonalizationSelectionAlgorithmOptions as k, type DevToolsEvents as l, CONTEXTUAL_EDITING_TEST_NAME as m, CONTEXTUAL_EDITING_TEST_SELECTED_VARIANT_ID as n, type PersonalizationSelectionAlgorithm as o, type PersonalizationSelectionAlgorithms as p, type ContextOptions as q, type PersonalizationEventVariantId as r, type PersonalizationEvent as s, type TestEvent as t, type ContextEvents as u, type ContextInstance as v, type DevToolsUiVersion as w, type DevToolsState as x, type DevToolsActions as y, type DevToolsEvent as z };
1268
+ export { type AggregateDimensionInput as $, type AggregateDimension as A, type MessageFunc as B, type ContextPlugin as C, type DecayFunction as D, type LogMessageSingle as E, type LogMessageGroup as F, ManifestInstance as G, GroupCriteriaEvaluator as H, type CriteriaEvaluatorResult as I, type CriteriaEvaluatorParameters as J, type SignalData as K, type LogDrain as L, type MessageCategory as M, type ManifestV2 as N, type OutputSeverity as O, type PersonalizationEvent as P, type Quirks as Q, type PersonalizationManifest as R, type ScoreVector as S, TransitionDataStore as T, type Signal as U, type VisitorData as V, type SignalCriteriaGroup as W, type SignalCriteria as X, type EnrichmentCategory as Y, type NumberMatch as Z, type TestDefinition as _, type StorageCommands as a, type TestOptions as a0, testVariations as a1, type DimensionMatch as a2, type PersonalizeOptions as a3, personalizeVariations as a4, type BehaviorTag as a5, type PersonalizedVariant as a6, type PersonalizedResult as a7, type TestVariant as a8, type TestResult as a9, type ContextStateUpdate as aA, type GoalStateUpdate as aB, type paths as aC, type StorageCommand as aa, type SetGoalCommand as ab, type ModifyScoreCommand as ac, type ModifySessionScoreCommand as ad, type SetConsentCommand as ae, type SetQuirkCommand as af, type SetTestCommand as ag, type IdentifyCommand as ah, type SetControlGroupCommand as ai, type SetPersonalizeVariantControlCommand as aj, areCommandsEqual as ak, type ServerToClientTransitionState as al, SERVER_STATE_ID as am, type TransitionDataStoreEvents as an, type DecayOptions as ao, type VisitorDataStoreOptions as ap, type VisitorDataStoreEvents as aq, VisitorDataStore as ar, type Tests as as, type Goals as at, type EnrichmentData as au, type PersonalizeControlVariant as av, type PersonalizeVariants as aw, type EventData as ax, emptyVisitorData as ay, type ContextState as az, type TransitionDataStoreOptions as b, type CriteriaEvaluator as c, type StringMatch as d, type VariantMatchCriteria as e, type LogMessage as f, type DevToolsEvents as g, CONTEXTUAL_EDITING_TEST_NAME as h, CONTEXTUAL_EDITING_TEST_SELECTED_VARIANT_ID as i, type ContextOptions as j, type TestEvent as k, type ContextEvents as l, type ContextInstance as m, Context as n, type DevToolsUiVersion as o, type DevToolsState as p, type DevToolsActions as q, type DevToolsEvent as r, type DevToolsLogEvent as s, type DevToolsDataEvent as t, type DevToolsHelloEvent as u, type DevToolsUpdateEvent as v, type DevToolsRawCommandsEvent as w, type DevToolsForgetEvent as x, type LogMessages as y, type Severity as z };