@uniformdev/next-app-router 20.80.0 → 20.80.1-alpha.10.sha-e0cfb4ce44

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
@@ -4510,6 +4510,7 @@ var bton = (base64) => {
4510
4510
  }
4511
4511
  return sign ? -number : number;
4512
4512
  };
4513
+ var isZeroCookieScore = (score) => Math.abs(score) < 1;
4513
4514
  var ssr = typeof document === "undefined";
4514
4515
  var UNIFORM_DEFAULT_COOKIE_NAME = "ufvd";
4515
4516
  var UNIFORM_DEFAULT_QUIRK_COOKIE_NAME = `ufvdqk`;
@@ -4517,6 +4518,7 @@ var _cookieName;
4517
4518
  var _quirkCookieName;
4518
4519
  var _cookieAttributes;
4519
4520
  var _quirksEnabled;
4521
+ var _maxBytes;
4520
4522
  var CookieTransitionDataStore = class extends TransitionDataStore {
4521
4523
  constructor({
4522
4524
  serverCookieValue,
@@ -4524,7 +4526,9 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4524
4526
  quirkCookieValue,
4525
4527
  quirkCookieName = UNIFORM_DEFAULT_QUIRK_COOKIE_NAME,
4526
4528
  cookieName = UNIFORM_DEFAULT_COOKIE_NAME,
4527
- cookieAttributes = { sameSite: "lax" }
4529
+ cookieAttributes = { sameSite: "lax" },
4530
+ maxBytes,
4531
+ onLogMessage
4528
4532
  }) {
4529
4533
  super({
4530
4534
  initialData: ssr ? parseScoreCookie(serverCookieValue, experimental_quirksEnabled ? quirkCookieValue : void 0) : void 0
@@ -4533,10 +4537,20 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4533
4537
  __privateAdd5(this, _quirkCookieName);
4534
4538
  __privateAdd5(this, _cookieAttributes);
4535
4539
  __privateAdd5(this, _quirksEnabled);
4540
+ __privateAdd5(this, _maxBytes);
4541
+ __publicField3(this, "onLogMessage");
4536
4542
  __privateSet3(this, _cookieName, cookieName);
4537
4543
  __privateSet3(this, _cookieAttributes, cookieAttributes);
4538
4544
  __privateSet3(this, _quirkCookieName, quirkCookieName);
4539
4545
  __privateSet3(this, _quirksEnabled, experimental_quirksEnabled || false);
4546
+ __privateSet3(this, _maxBytes, maxBytes);
4547
+ this.onLogMessage = onLogMessage;
4548
+ const minimumBytes = minimumCookieBytes(cookieName);
4549
+ if (maxBytes !== void 0 && maxBytes < minimumBytes) {
4550
+ throw new Error(
4551
+ `maxBytes of ${maxBytes} is below the ${minimumBytes} bytes the "${cookieName}" cookie costs when it carries nothing but control group membership, so no visitor could ever meet it.`
4552
+ );
4553
+ }
4540
4554
  }
4541
4555
  handleDelete() {
4542
4556
  if (ssr) return Promise.resolve();
@@ -4546,7 +4560,15 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4546
4560
  async handleUpdateData(_, computedValue) {
4547
4561
  if (ssr) return;
4548
4562
  if (computedValue.consent) {
4549
- api.set(__privateGet5(this, _cookieName), serializeCookie(computedValue), __privateGet5(this, _cookieAttributes));
4563
+ const cookieValue = serializeCookie(computedValue, {
4564
+ maxBytes: __privateGet5(this, _maxBytes),
4565
+ cookieName: __privateGet5(this, _cookieName),
4566
+ onBudgetExceeded: (dropped, bytes, maxBytes) => {
4567
+ var _a;
4568
+ return (_a = this.onLogMessage) == null ? void 0 : _a.call(this, ["info", 151, { dropped, bytes, maxBytes }]);
4569
+ }
4570
+ });
4571
+ api.set(__privateGet5(this, _cookieName), cookieValue, __privateGet5(this, _cookieAttributes));
4550
4572
  if (__privateGet5(this, _quirksEnabled) && Object.keys(computedValue.quirks || {}).length) {
4551
4573
  const quirkCookieValue = serializeQuirks(computedValue.quirks || {});
4552
4574
  api.set(__privateGet5(this, _quirkCookieName), quirkCookieValue, __privateGet5(this, _cookieAttributes));
@@ -4563,6 +4585,7 @@ _cookieName = /* @__PURE__ */ new WeakMap();
4563
4585
  _quirkCookieName = /* @__PURE__ */ new WeakMap();
4564
4586
  _cookieAttributes = /* @__PURE__ */ new WeakMap();
4565
4587
  _quirksEnabled = /* @__PURE__ */ new WeakMap();
4588
+ _maxBytes = /* @__PURE__ */ new WeakMap();
4566
4589
  var TYPE_SEP = "~";
4567
4590
  var PAIR_SEP = "!";
4568
4591
  var KV_SEP = "-";
@@ -4634,18 +4657,66 @@ function decodeCookieType(type) {
4634
4657
  return acc;
4635
4658
  }, {});
4636
4659
  }
4637
- function serializeCookie(data) {
4660
+ function serializeCookie(data, options = {}) {
4661
+ const { maxBytes, cookieName = UNIFORM_DEFAULT_COOKIE_NAME, onBudgetExceeded } = options;
4662
+ const parts = {
4663
+ tests: { ...data.tests },
4664
+ sessionScores: encodeCookieType(data.sessionScores),
4665
+ scores: encodeCookieType(data.scores),
4666
+ controlGroup: data.controlGroup ? "1" : "0",
4667
+ personalizeVariants: encodePersonalizeVariants(data.personalizeVariants)
4668
+ };
4669
+ let value = serializeCookieParts(parts);
4670
+ if (maxBytes === void 0) {
4671
+ return value;
4672
+ }
4673
+ const overhead = encodeCookieName(cookieName).length + 1;
4674
+ const measure = () => overhead + api.converter.write(value, cookieName).length;
4675
+ if (measure() <= maxBytes) {
4676
+ return value;
4677
+ }
4678
+ const candidates = dropCandidates(parts, data);
4679
+ const dropped = [];
4680
+ for (let i = 0; i < candidates.length && measure() > maxBytes; i++) {
4681
+ const { bucket, key } = candidates[i];
4682
+ delete parts[bucket][key];
4683
+ dropped.push(`${bucket}.${key}`);
4684
+ value = serializeCookieParts(parts);
4685
+ }
4686
+ if (dropped.length) {
4687
+ onBudgetExceeded == null ? void 0 : onBudgetExceeded(dropped, measure(), maxBytes);
4688
+ }
4689
+ return value;
4690
+ }
4691
+ function serializeCookieParts(parts) {
4638
4692
  return [
4639
- serializeCookieType(data.tests),
4640
- serializeCookieType(encodeCookieType(data.sessionScores)),
4641
- serializeCookieType(encodeCookieType(data.scores)),
4642
- data.controlGroup ? "1" : "0",
4643
- serializePersonalizeVariants(data)
4693
+ serializeCookieType(parts.tests),
4694
+ serializeCookieType(parts.sessionScores),
4695
+ serializeCookieType(parts.scores),
4696
+ parts.controlGroup,
4697
+ serializeCookieType(parts.personalizeVariants)
4644
4698
  ].join(TYPE_SEP);
4645
4699
  }
4646
- function serializePersonalizeVariants({
4647
- personalizeVariants
4648
- }) {
4700
+ function dropCandidates(parts, data) {
4701
+ const dimensions = ["sessionScores", "scores"].flatMap(
4702
+ (bucket, order) => Object.keys(parts[bucket]).map((key) => {
4703
+ var _a;
4704
+ return { bucket, key, order, score: (_a = data[bucket][key]) != null ? _a : 0 };
4705
+ })
4706
+ );
4707
+ dimensions.sort(
4708
+ (a, b) => Number(isZeroCookieScore(b.score)) - Number(isZeroCookieScore(a.score)) || a.score - b.score || a.order - b.order || (a.key < b.key ? -1 : 1)
4709
+ );
4710
+ const keysOf = (bucket) => Object.keys(parts[bucket]).sort().map((key) => ({ bucket, key }));
4711
+ return [...dimensions, ...keysOf("personalizeVariants"), ...keysOf("tests")];
4712
+ }
4713
+ function minimumCookieBytes(cookieName) {
4714
+ return encodeCookieName(cookieName).length + 6;
4715
+ }
4716
+ function encodeCookieName(name) {
4717
+ return encodeURIComponent(name).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/\(/g, "%28").replace(/\)/g, "%29");
4718
+ }
4719
+ function encodePersonalizeVariants(personalizeVariants) {
4649
4720
  const data = {};
4650
4721
  if (typeof personalizeVariants === "object") {
4651
4722
  Object.keys(personalizeVariants).forEach((personalizationName) => {
@@ -4657,8 +4728,7 @@ function serializePersonalizeVariants({
4657
4728
  data[personalizationName] = results.join(",");
4658
4729
  });
4659
4730
  }
4660
- const serialized = serializeCookieType(data);
4661
- return serialized;
4731
+ return data;
4662
4732
  }
4663
4733
  function decodePersonalizeVariants(data) {
4664
4734
  const parsed = parseCookieType(data);
@@ -4705,6 +4775,7 @@ fetchData_fn = async function() {
4705
4775
  this.signalAsyncDataUpdate(serviceData);
4706
4776
  }
4707
4777
  };
4778
+ var isSystemDimension = (dimension) => dimension.startsWith("$");
4708
4779
  var emptyVisitorData = () => ({
4709
4780
  quirks: {},
4710
4781
  scores: {},
@@ -4840,6 +4911,9 @@ var replaceData_fn;
4840
4911
  var setVisitTimeout_fn;
4841
4912
  var isExpired_fn;
4842
4913
  var handleCaps_fn;
4914
+ var pruningManifest_get;
4915
+ var handlePruning_fn;
4916
+ var pruneScores_fn;
4843
4917
  var defaultData_fn;
4844
4918
  var VisitorDataStore = class {
4845
4919
  constructor(options) {
@@ -4950,6 +5024,7 @@ replaceData_fn = function(data, quiet = false) {
4950
5024
  sessionScores: data.sessionScores,
4951
5025
  onLogMessage: __privateGet5(this, _options).onLogMessage
4952
5026
  });
5027
+ __privateMethod2(this, _VisitorDataStore_instances, handlePruning_fn).call(this, data);
4953
5028
  const haveScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.scores, data.scores);
4954
5029
  const haveSessionScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.sessionScores, data.sessionScores);
4955
5030
  const haveQuirksChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.quirks, data.quirks);
@@ -5022,6 +5097,48 @@ handleCaps_fn = function(scores) {
5022
5097
  }
5023
5098
  }
5024
5099
  };
5100
+ pruningManifest_get = function() {
5101
+ var _a, _b, _c, _d, _e;
5102
+ const project = (_b = (_a = __privateGet5(this, _options).manifest) == null ? void 0 : _a.data) == null ? void 0 : _b.project;
5103
+ const populated = [(_c = project == null ? void 0 : project.pz) == null ? void 0 : _c.sig, (_d = project == null ? void 0 : project.pz) == null ? void 0 : _d.enr, (_e = project == null ? void 0 : project.pz) == null ? void 0 : _e.agg, project == null ? void 0 : project.test].some(
5104
+ (definitions) => definitions && Object.keys(definitions).length > 0
5105
+ );
5106
+ return populated ? __privateGet5(this, _options).manifest : void 0;
5107
+ };
5108
+ handlePruning_fn = function(data) {
5109
+ var _a, _b;
5110
+ const { pruneUnknownTests, pruneUnknownDimensions } = __privateGet5(this, _options);
5111
+ const manifest = pruneUnknownTests || pruneUnknownDimensions ? __privateGet5(this, _VisitorDataStore_instances, pruningManifest_get) : void 0;
5112
+ const pruned = [];
5113
+ if (pruneUnknownTests && manifest) {
5114
+ for (const test in data.tests) {
5115
+ if (!manifest.getTest(test)) {
5116
+ delete data.tests[test];
5117
+ pruned.push(`tests.${test}`);
5118
+ }
5119
+ }
5120
+ }
5121
+ __privateMethod2(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.scores, "scores", pruned, manifest);
5122
+ __privateMethod2(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.sessionScores, "sessionScores", pruned, manifest);
5123
+ if (pruned.length) {
5124
+ (_b = (_a = __privateGet5(this, _options)).onLogMessage) == null ? void 0 : _b.call(_a, ["info", 150, pruned]);
5125
+ }
5126
+ };
5127
+ pruneScores_fn = function(scores, bucket, pruned, manifest) {
5128
+ const { pruneUnknownDimensions, pruneZeroScores } = __privateGet5(this, _options);
5129
+ if (!pruneUnknownDimensions && !pruneZeroScores) {
5130
+ return;
5131
+ }
5132
+ const pruneUnknown = pruneUnknownDimensions && manifest;
5133
+ for (const dim in scores) {
5134
+ const isUnknown = pruneUnknown && !isSystemDimension(dim) && !manifest.getDimensionByKey(dim);
5135
+ const isZero = pruneZeroScores && (pruneZeroScores === "round" ? isZeroCookieScore(scores[dim]) : scores[dim] === 0);
5136
+ if (isUnknown || isZero) {
5137
+ delete scores[dim];
5138
+ pruned.push(`${bucket}.${dim}`);
5139
+ }
5140
+ }
5141
+ };
5025
5142
  defaultData_fn = function() {
5026
5143
  var _a, _b, _c;
5027
5144
  return {
@@ -5555,6 +5672,9 @@ var dc2 = (0, import_rfdc3.default)();
5555
5672
 
5556
5673
  // src/config/helpers.ts
5557
5674
  import config from "@uniformdev/next-app-router/config/resolved";
5675
+ var getServerConfig = () => {
5676
+ return config;
5677
+ };
5558
5678
  var getDisabledDevTools = () => {
5559
5679
  var _a;
5560
5680
  if (typeof ((_a = config.context) == null ? void 0 : _a.disableDevTools) === "boolean") {
@@ -6258,6 +6378,7 @@ var UniformContext = async ({ clientContextComponent, result }) => {
6258
6378
  const disableDevTools = getDisabledDevTools();
6259
6379
  const defaultConsent = (_a = result == null ? void 0 : result.pageState.defaultConsent) != null ? _a : getDefaultConsent();
6260
6380
  const experimentalQuirkSerialization = getQuirkSerialization();
6381
+ const contextConfig = getServerConfig().context;
6261
6382
  return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(
6262
6383
  ContextComponent,
6263
6384
  {
@@ -6265,6 +6386,10 @@ var UniformContext = async ({ clientContextComponent, result }) => {
6265
6386
  disableDevTools,
6266
6387
  defaultConsent,
6267
6388
  experimentalQuirkSerialization,
6389
+ cookieMaxBytes: contextConfig == null ? void 0 : contextConfig.cookieMaxBytes,
6390
+ pruneUnknownTests: contextConfig == null ? void 0 : contextConfig.pruneUnknownTests,
6391
+ pruneUnknownDimensions: contextConfig == null ? void 0 : contextConfig.pruneUnknownDimensions,
6392
+ pruneZeroScores: contextConfig == null ? void 0 : contextConfig.pruneZeroScores,
6268
6393
  compositionMetadata
6269
6394
  }
6270
6395
  ));
package/dist/index.js CHANGED
@@ -4536,6 +4536,7 @@ var bton = (base64) => {
4536
4536
  }
4537
4537
  return sign ? -number : number;
4538
4538
  };
4539
+ var isZeroCookieScore = (score) => Math.abs(score) < 1;
4539
4540
  var ssr = typeof document === "undefined";
4540
4541
  var UNIFORM_DEFAULT_COOKIE_NAME = "ufvd";
4541
4542
  var UNIFORM_DEFAULT_QUIRK_COOKIE_NAME = `ufvdqk`;
@@ -4543,6 +4544,7 @@ var _cookieName;
4543
4544
  var _quirkCookieName;
4544
4545
  var _cookieAttributes;
4545
4546
  var _quirksEnabled;
4547
+ var _maxBytes;
4546
4548
  var CookieTransitionDataStore = class extends TransitionDataStore {
4547
4549
  constructor({
4548
4550
  serverCookieValue,
@@ -4550,7 +4552,9 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4550
4552
  quirkCookieValue,
4551
4553
  quirkCookieName = UNIFORM_DEFAULT_QUIRK_COOKIE_NAME,
4552
4554
  cookieName = UNIFORM_DEFAULT_COOKIE_NAME,
4553
- cookieAttributes = { sameSite: "lax" }
4555
+ cookieAttributes = { sameSite: "lax" },
4556
+ maxBytes,
4557
+ onLogMessage
4554
4558
  }) {
4555
4559
  super({
4556
4560
  initialData: ssr ? parseScoreCookie(serverCookieValue, experimental_quirksEnabled ? quirkCookieValue : void 0) : void 0
@@ -4559,10 +4563,20 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4559
4563
  __privateAdd5(this, _quirkCookieName);
4560
4564
  __privateAdd5(this, _cookieAttributes);
4561
4565
  __privateAdd5(this, _quirksEnabled);
4566
+ __privateAdd5(this, _maxBytes);
4567
+ __publicField3(this, "onLogMessage");
4562
4568
  __privateSet3(this, _cookieName, cookieName);
4563
4569
  __privateSet3(this, _cookieAttributes, cookieAttributes);
4564
4570
  __privateSet3(this, _quirkCookieName, quirkCookieName);
4565
4571
  __privateSet3(this, _quirksEnabled, experimental_quirksEnabled || false);
4572
+ __privateSet3(this, _maxBytes, maxBytes);
4573
+ this.onLogMessage = onLogMessage;
4574
+ const minimumBytes = minimumCookieBytes(cookieName);
4575
+ if (maxBytes !== void 0 && maxBytes < minimumBytes) {
4576
+ throw new Error(
4577
+ `maxBytes of ${maxBytes} is below the ${minimumBytes} bytes the "${cookieName}" cookie costs when it carries nothing but control group membership, so no visitor could ever meet it.`
4578
+ );
4579
+ }
4566
4580
  }
4567
4581
  handleDelete() {
4568
4582
  if (ssr) return Promise.resolve();
@@ -4572,7 +4586,15 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4572
4586
  async handleUpdateData(_, computedValue) {
4573
4587
  if (ssr) return;
4574
4588
  if (computedValue.consent) {
4575
- api.set(__privateGet5(this, _cookieName), serializeCookie(computedValue), __privateGet5(this, _cookieAttributes));
4589
+ const cookieValue = serializeCookie(computedValue, {
4590
+ maxBytes: __privateGet5(this, _maxBytes),
4591
+ cookieName: __privateGet5(this, _cookieName),
4592
+ onBudgetExceeded: (dropped, bytes, maxBytes) => {
4593
+ var _a;
4594
+ return (_a = this.onLogMessage) == null ? void 0 : _a.call(this, ["info", 151, { dropped, bytes, maxBytes }]);
4595
+ }
4596
+ });
4597
+ api.set(__privateGet5(this, _cookieName), cookieValue, __privateGet5(this, _cookieAttributes));
4576
4598
  if (__privateGet5(this, _quirksEnabled) && Object.keys(computedValue.quirks || {}).length) {
4577
4599
  const quirkCookieValue = serializeQuirks(computedValue.quirks || {});
4578
4600
  api.set(__privateGet5(this, _quirkCookieName), quirkCookieValue, __privateGet5(this, _cookieAttributes));
@@ -4589,6 +4611,7 @@ _cookieName = /* @__PURE__ */ new WeakMap();
4589
4611
  _quirkCookieName = /* @__PURE__ */ new WeakMap();
4590
4612
  _cookieAttributes = /* @__PURE__ */ new WeakMap();
4591
4613
  _quirksEnabled = /* @__PURE__ */ new WeakMap();
4614
+ _maxBytes = /* @__PURE__ */ new WeakMap();
4592
4615
  var TYPE_SEP = "~";
4593
4616
  var PAIR_SEP = "!";
4594
4617
  var KV_SEP = "-";
@@ -4660,18 +4683,66 @@ function decodeCookieType(type) {
4660
4683
  return acc;
4661
4684
  }, {});
4662
4685
  }
4663
- function serializeCookie(data) {
4686
+ function serializeCookie(data, options = {}) {
4687
+ const { maxBytes, cookieName = UNIFORM_DEFAULT_COOKIE_NAME, onBudgetExceeded } = options;
4688
+ const parts = {
4689
+ tests: { ...data.tests },
4690
+ sessionScores: encodeCookieType(data.sessionScores),
4691
+ scores: encodeCookieType(data.scores),
4692
+ controlGroup: data.controlGroup ? "1" : "0",
4693
+ personalizeVariants: encodePersonalizeVariants(data.personalizeVariants)
4694
+ };
4695
+ let value = serializeCookieParts(parts);
4696
+ if (maxBytes === void 0) {
4697
+ return value;
4698
+ }
4699
+ const overhead = encodeCookieName(cookieName).length + 1;
4700
+ const measure = () => overhead + api.converter.write(value, cookieName).length;
4701
+ if (measure() <= maxBytes) {
4702
+ return value;
4703
+ }
4704
+ const candidates = dropCandidates(parts, data);
4705
+ const dropped = [];
4706
+ for (let i = 0; i < candidates.length && measure() > maxBytes; i++) {
4707
+ const { bucket, key } = candidates[i];
4708
+ delete parts[bucket][key];
4709
+ dropped.push(`${bucket}.${key}`);
4710
+ value = serializeCookieParts(parts);
4711
+ }
4712
+ if (dropped.length) {
4713
+ onBudgetExceeded == null ? void 0 : onBudgetExceeded(dropped, measure(), maxBytes);
4714
+ }
4715
+ return value;
4716
+ }
4717
+ function serializeCookieParts(parts) {
4664
4718
  return [
4665
- serializeCookieType(data.tests),
4666
- serializeCookieType(encodeCookieType(data.sessionScores)),
4667
- serializeCookieType(encodeCookieType(data.scores)),
4668
- data.controlGroup ? "1" : "0",
4669
- serializePersonalizeVariants(data)
4719
+ serializeCookieType(parts.tests),
4720
+ serializeCookieType(parts.sessionScores),
4721
+ serializeCookieType(parts.scores),
4722
+ parts.controlGroup,
4723
+ serializeCookieType(parts.personalizeVariants)
4670
4724
  ].join(TYPE_SEP);
4671
4725
  }
4672
- function serializePersonalizeVariants({
4673
- personalizeVariants
4674
- }) {
4726
+ function dropCandidates(parts, data) {
4727
+ const dimensions = ["sessionScores", "scores"].flatMap(
4728
+ (bucket, order) => Object.keys(parts[bucket]).map((key) => {
4729
+ var _a;
4730
+ return { bucket, key, order, score: (_a = data[bucket][key]) != null ? _a : 0 };
4731
+ })
4732
+ );
4733
+ dimensions.sort(
4734
+ (a, b) => Number(isZeroCookieScore(b.score)) - Number(isZeroCookieScore(a.score)) || a.score - b.score || a.order - b.order || (a.key < b.key ? -1 : 1)
4735
+ );
4736
+ const keysOf = (bucket) => Object.keys(parts[bucket]).sort().map((key) => ({ bucket, key }));
4737
+ return [...dimensions, ...keysOf("personalizeVariants"), ...keysOf("tests")];
4738
+ }
4739
+ function minimumCookieBytes(cookieName) {
4740
+ return encodeCookieName(cookieName).length + 6;
4741
+ }
4742
+ function encodeCookieName(name) {
4743
+ return encodeURIComponent(name).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/\(/g, "%28").replace(/\)/g, "%29");
4744
+ }
4745
+ function encodePersonalizeVariants(personalizeVariants) {
4675
4746
  const data = {};
4676
4747
  if (typeof personalizeVariants === "object") {
4677
4748
  Object.keys(personalizeVariants).forEach((personalizationName) => {
@@ -4683,8 +4754,7 @@ function serializePersonalizeVariants({
4683
4754
  data[personalizationName] = results.join(",");
4684
4755
  });
4685
4756
  }
4686
- const serialized = serializeCookieType(data);
4687
- return serialized;
4757
+ return data;
4688
4758
  }
4689
4759
  function decodePersonalizeVariants(data) {
4690
4760
  const parsed = parseCookieType(data);
@@ -4731,6 +4801,7 @@ fetchData_fn = async function() {
4731
4801
  this.signalAsyncDataUpdate(serviceData);
4732
4802
  }
4733
4803
  };
4804
+ var isSystemDimension = (dimension) => dimension.startsWith("$");
4734
4805
  var emptyVisitorData = () => ({
4735
4806
  quirks: {},
4736
4807
  scores: {},
@@ -4866,6 +4937,9 @@ var replaceData_fn;
4866
4937
  var setVisitTimeout_fn;
4867
4938
  var isExpired_fn;
4868
4939
  var handleCaps_fn;
4940
+ var pruningManifest_get;
4941
+ var handlePruning_fn;
4942
+ var pruneScores_fn;
4869
4943
  var defaultData_fn;
4870
4944
  var VisitorDataStore = class {
4871
4945
  constructor(options) {
@@ -4976,6 +5050,7 @@ replaceData_fn = function(data, quiet = false) {
4976
5050
  sessionScores: data.sessionScores,
4977
5051
  onLogMessage: __privateGet5(this, _options).onLogMessage
4978
5052
  });
5053
+ __privateMethod2(this, _VisitorDataStore_instances, handlePruning_fn).call(this, data);
4979
5054
  const haveScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.scores, data.scores);
4980
5055
  const haveSessionScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.sessionScores, data.sessionScores);
4981
5056
  const haveQuirksChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.quirks, data.quirks);
@@ -5048,6 +5123,48 @@ handleCaps_fn = function(scores) {
5048
5123
  }
5049
5124
  }
5050
5125
  };
5126
+ pruningManifest_get = function() {
5127
+ var _a, _b, _c, _d, _e;
5128
+ const project = (_b = (_a = __privateGet5(this, _options).manifest) == null ? void 0 : _a.data) == null ? void 0 : _b.project;
5129
+ const populated = [(_c = project == null ? void 0 : project.pz) == null ? void 0 : _c.sig, (_d = project == null ? void 0 : project.pz) == null ? void 0 : _d.enr, (_e = project == null ? void 0 : project.pz) == null ? void 0 : _e.agg, project == null ? void 0 : project.test].some(
5130
+ (definitions) => definitions && Object.keys(definitions).length > 0
5131
+ );
5132
+ return populated ? __privateGet5(this, _options).manifest : void 0;
5133
+ };
5134
+ handlePruning_fn = function(data) {
5135
+ var _a, _b;
5136
+ const { pruneUnknownTests, pruneUnknownDimensions } = __privateGet5(this, _options);
5137
+ const manifest = pruneUnknownTests || pruneUnknownDimensions ? __privateGet5(this, _VisitorDataStore_instances, pruningManifest_get) : void 0;
5138
+ const pruned = [];
5139
+ if (pruneUnknownTests && manifest) {
5140
+ for (const test in data.tests) {
5141
+ if (!manifest.getTest(test)) {
5142
+ delete data.tests[test];
5143
+ pruned.push(`tests.${test}`);
5144
+ }
5145
+ }
5146
+ }
5147
+ __privateMethod2(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.scores, "scores", pruned, manifest);
5148
+ __privateMethod2(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.sessionScores, "sessionScores", pruned, manifest);
5149
+ if (pruned.length) {
5150
+ (_b = (_a = __privateGet5(this, _options)).onLogMessage) == null ? void 0 : _b.call(_a, ["info", 150, pruned]);
5151
+ }
5152
+ };
5153
+ pruneScores_fn = function(scores, bucket, pruned, manifest) {
5154
+ const { pruneUnknownDimensions, pruneZeroScores } = __privateGet5(this, _options);
5155
+ if (!pruneUnknownDimensions && !pruneZeroScores) {
5156
+ return;
5157
+ }
5158
+ const pruneUnknown = pruneUnknownDimensions && manifest;
5159
+ for (const dim in scores) {
5160
+ const isUnknown = pruneUnknown && !isSystemDimension(dim) && !manifest.getDimensionByKey(dim);
5161
+ const isZero = pruneZeroScores && (pruneZeroScores === "round" ? isZeroCookieScore(scores[dim]) : scores[dim] === 0);
5162
+ if (isUnknown || isZero) {
5163
+ delete scores[dim];
5164
+ pruned.push(`${bucket}.${dim}`);
5165
+ }
5166
+ }
5167
+ };
5051
5168
  defaultData_fn = function() {
5052
5169
  var _a, _b, _c;
5053
5170
  return {
@@ -5581,6 +5698,9 @@ var dc2 = (0, import_rfdc3.default)();
5581
5698
 
5582
5699
  // src/config/helpers.ts
5583
5700
  var import_resolved = __toESM(require("@uniformdev/next-app-router/config/resolved"));
5701
+ var getServerConfig = () => {
5702
+ return import_resolved.default;
5703
+ };
5584
5704
  var getDisabledDevTools = () => {
5585
5705
  var _a;
5586
5706
  if (typeof ((_a = import_resolved.default.context) == null ? void 0 : _a.disableDevTools) === "boolean") {
@@ -6277,6 +6397,7 @@ var UniformContext = async ({ clientContextComponent, result }) => {
6277
6397
  const disableDevTools = getDisabledDevTools();
6278
6398
  const defaultConsent = (_a = result == null ? void 0 : result.pageState.defaultConsent) != null ? _a : getDefaultConsent();
6279
6399
  const experimentalQuirkSerialization = getQuirkSerialization();
6400
+ const contextConfig = getServerConfig().context;
6280
6401
  return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(
6281
6402
  ContextComponent,
6282
6403
  {
@@ -6284,6 +6405,10 @@ var UniformContext = async ({ clientContextComponent, result }) => {
6284
6405
  disableDevTools,
6285
6406
  defaultConsent,
6286
6407
  experimentalQuirkSerialization,
6408
+ cookieMaxBytes: contextConfig == null ? void 0 : contextConfig.cookieMaxBytes,
6409
+ pruneUnknownTests: contextConfig == null ? void 0 : contextConfig.pruneUnknownTests,
6410
+ pruneUnknownDimensions: contextConfig == null ? void 0 : contextConfig.pruneUnknownDimensions,
6411
+ pruneZeroScores: contextConfig == null ? void 0 : contextConfig.pruneZeroScores,
6287
6412
  compositionMetadata
6288
6413
  }
6289
6414
  ));
package/dist/index.mjs CHANGED
@@ -4510,6 +4510,7 @@ var bton = (base64) => {
4510
4510
  }
4511
4511
  return sign ? -number : number;
4512
4512
  };
4513
+ var isZeroCookieScore = (score) => Math.abs(score) < 1;
4513
4514
  var ssr = typeof document === "undefined";
4514
4515
  var UNIFORM_DEFAULT_COOKIE_NAME = "ufvd";
4515
4516
  var UNIFORM_DEFAULT_QUIRK_COOKIE_NAME = `ufvdqk`;
@@ -4517,6 +4518,7 @@ var _cookieName;
4517
4518
  var _quirkCookieName;
4518
4519
  var _cookieAttributes;
4519
4520
  var _quirksEnabled;
4521
+ var _maxBytes;
4520
4522
  var CookieTransitionDataStore = class extends TransitionDataStore {
4521
4523
  constructor({
4522
4524
  serverCookieValue,
@@ -4524,7 +4526,9 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4524
4526
  quirkCookieValue,
4525
4527
  quirkCookieName = UNIFORM_DEFAULT_QUIRK_COOKIE_NAME,
4526
4528
  cookieName = UNIFORM_DEFAULT_COOKIE_NAME,
4527
- cookieAttributes = { sameSite: "lax" }
4529
+ cookieAttributes = { sameSite: "lax" },
4530
+ maxBytes,
4531
+ onLogMessage
4528
4532
  }) {
4529
4533
  super({
4530
4534
  initialData: ssr ? parseScoreCookie(serverCookieValue, experimental_quirksEnabled ? quirkCookieValue : void 0) : void 0
@@ -4533,10 +4537,20 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4533
4537
  __privateAdd5(this, _quirkCookieName);
4534
4538
  __privateAdd5(this, _cookieAttributes);
4535
4539
  __privateAdd5(this, _quirksEnabled);
4540
+ __privateAdd5(this, _maxBytes);
4541
+ __publicField3(this, "onLogMessage");
4536
4542
  __privateSet3(this, _cookieName, cookieName);
4537
4543
  __privateSet3(this, _cookieAttributes, cookieAttributes);
4538
4544
  __privateSet3(this, _quirkCookieName, quirkCookieName);
4539
4545
  __privateSet3(this, _quirksEnabled, experimental_quirksEnabled || false);
4546
+ __privateSet3(this, _maxBytes, maxBytes);
4547
+ this.onLogMessage = onLogMessage;
4548
+ const minimumBytes = minimumCookieBytes(cookieName);
4549
+ if (maxBytes !== void 0 && maxBytes < minimumBytes) {
4550
+ throw new Error(
4551
+ `maxBytes of ${maxBytes} is below the ${minimumBytes} bytes the "${cookieName}" cookie costs when it carries nothing but control group membership, so no visitor could ever meet it.`
4552
+ );
4553
+ }
4540
4554
  }
4541
4555
  handleDelete() {
4542
4556
  if (ssr) return Promise.resolve();
@@ -4546,7 +4560,15 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4546
4560
  async handleUpdateData(_, computedValue) {
4547
4561
  if (ssr) return;
4548
4562
  if (computedValue.consent) {
4549
- api.set(__privateGet5(this, _cookieName), serializeCookie(computedValue), __privateGet5(this, _cookieAttributes));
4563
+ const cookieValue = serializeCookie(computedValue, {
4564
+ maxBytes: __privateGet5(this, _maxBytes),
4565
+ cookieName: __privateGet5(this, _cookieName),
4566
+ onBudgetExceeded: (dropped, bytes, maxBytes) => {
4567
+ var _a;
4568
+ return (_a = this.onLogMessage) == null ? void 0 : _a.call(this, ["info", 151, { dropped, bytes, maxBytes }]);
4569
+ }
4570
+ });
4571
+ api.set(__privateGet5(this, _cookieName), cookieValue, __privateGet5(this, _cookieAttributes));
4550
4572
  if (__privateGet5(this, _quirksEnabled) && Object.keys(computedValue.quirks || {}).length) {
4551
4573
  const quirkCookieValue = serializeQuirks(computedValue.quirks || {});
4552
4574
  api.set(__privateGet5(this, _quirkCookieName), quirkCookieValue, __privateGet5(this, _cookieAttributes));
@@ -4563,6 +4585,7 @@ _cookieName = /* @__PURE__ */ new WeakMap();
4563
4585
  _quirkCookieName = /* @__PURE__ */ new WeakMap();
4564
4586
  _cookieAttributes = /* @__PURE__ */ new WeakMap();
4565
4587
  _quirksEnabled = /* @__PURE__ */ new WeakMap();
4588
+ _maxBytes = /* @__PURE__ */ new WeakMap();
4566
4589
  var TYPE_SEP = "~";
4567
4590
  var PAIR_SEP = "!";
4568
4591
  var KV_SEP = "-";
@@ -4634,18 +4657,66 @@ function decodeCookieType(type) {
4634
4657
  return acc;
4635
4658
  }, {});
4636
4659
  }
4637
- function serializeCookie(data) {
4660
+ function serializeCookie(data, options = {}) {
4661
+ const { maxBytes, cookieName = UNIFORM_DEFAULT_COOKIE_NAME, onBudgetExceeded } = options;
4662
+ const parts = {
4663
+ tests: { ...data.tests },
4664
+ sessionScores: encodeCookieType(data.sessionScores),
4665
+ scores: encodeCookieType(data.scores),
4666
+ controlGroup: data.controlGroup ? "1" : "0",
4667
+ personalizeVariants: encodePersonalizeVariants(data.personalizeVariants)
4668
+ };
4669
+ let value = serializeCookieParts(parts);
4670
+ if (maxBytes === void 0) {
4671
+ return value;
4672
+ }
4673
+ const overhead = encodeCookieName(cookieName).length + 1;
4674
+ const measure = () => overhead + api.converter.write(value, cookieName).length;
4675
+ if (measure() <= maxBytes) {
4676
+ return value;
4677
+ }
4678
+ const candidates = dropCandidates(parts, data);
4679
+ const dropped = [];
4680
+ for (let i = 0; i < candidates.length && measure() > maxBytes; i++) {
4681
+ const { bucket, key } = candidates[i];
4682
+ delete parts[bucket][key];
4683
+ dropped.push(`${bucket}.${key}`);
4684
+ value = serializeCookieParts(parts);
4685
+ }
4686
+ if (dropped.length) {
4687
+ onBudgetExceeded == null ? void 0 : onBudgetExceeded(dropped, measure(), maxBytes);
4688
+ }
4689
+ return value;
4690
+ }
4691
+ function serializeCookieParts(parts) {
4638
4692
  return [
4639
- serializeCookieType(data.tests),
4640
- serializeCookieType(encodeCookieType(data.sessionScores)),
4641
- serializeCookieType(encodeCookieType(data.scores)),
4642
- data.controlGroup ? "1" : "0",
4643
- serializePersonalizeVariants(data)
4693
+ serializeCookieType(parts.tests),
4694
+ serializeCookieType(parts.sessionScores),
4695
+ serializeCookieType(parts.scores),
4696
+ parts.controlGroup,
4697
+ serializeCookieType(parts.personalizeVariants)
4644
4698
  ].join(TYPE_SEP);
4645
4699
  }
4646
- function serializePersonalizeVariants({
4647
- personalizeVariants
4648
- }) {
4700
+ function dropCandidates(parts, data) {
4701
+ const dimensions = ["sessionScores", "scores"].flatMap(
4702
+ (bucket, order) => Object.keys(parts[bucket]).map((key) => {
4703
+ var _a;
4704
+ return { bucket, key, order, score: (_a = data[bucket][key]) != null ? _a : 0 };
4705
+ })
4706
+ );
4707
+ dimensions.sort(
4708
+ (a, b) => Number(isZeroCookieScore(b.score)) - Number(isZeroCookieScore(a.score)) || a.score - b.score || a.order - b.order || (a.key < b.key ? -1 : 1)
4709
+ );
4710
+ const keysOf = (bucket) => Object.keys(parts[bucket]).sort().map((key) => ({ bucket, key }));
4711
+ return [...dimensions, ...keysOf("personalizeVariants"), ...keysOf("tests")];
4712
+ }
4713
+ function minimumCookieBytes(cookieName) {
4714
+ return encodeCookieName(cookieName).length + 6;
4715
+ }
4716
+ function encodeCookieName(name) {
4717
+ return encodeURIComponent(name).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/\(/g, "%28").replace(/\)/g, "%29");
4718
+ }
4719
+ function encodePersonalizeVariants(personalizeVariants) {
4649
4720
  const data = {};
4650
4721
  if (typeof personalizeVariants === "object") {
4651
4722
  Object.keys(personalizeVariants).forEach((personalizationName) => {
@@ -4657,8 +4728,7 @@ function serializePersonalizeVariants({
4657
4728
  data[personalizationName] = results.join(",");
4658
4729
  });
4659
4730
  }
4660
- const serialized = serializeCookieType(data);
4661
- return serialized;
4731
+ return data;
4662
4732
  }
4663
4733
  function decodePersonalizeVariants(data) {
4664
4734
  const parsed = parseCookieType(data);
@@ -4705,6 +4775,7 @@ fetchData_fn = async function() {
4705
4775
  this.signalAsyncDataUpdate(serviceData);
4706
4776
  }
4707
4777
  };
4778
+ var isSystemDimension = (dimension) => dimension.startsWith("$");
4708
4779
  var emptyVisitorData = () => ({
4709
4780
  quirks: {},
4710
4781
  scores: {},
@@ -4840,6 +4911,9 @@ var replaceData_fn;
4840
4911
  var setVisitTimeout_fn;
4841
4912
  var isExpired_fn;
4842
4913
  var handleCaps_fn;
4914
+ var pruningManifest_get;
4915
+ var handlePruning_fn;
4916
+ var pruneScores_fn;
4843
4917
  var defaultData_fn;
4844
4918
  var VisitorDataStore = class {
4845
4919
  constructor(options) {
@@ -4950,6 +5024,7 @@ replaceData_fn = function(data, quiet = false) {
4950
5024
  sessionScores: data.sessionScores,
4951
5025
  onLogMessage: __privateGet5(this, _options).onLogMessage
4952
5026
  });
5027
+ __privateMethod2(this, _VisitorDataStore_instances, handlePruning_fn).call(this, data);
4953
5028
  const haveScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.scores, data.scores);
4954
5029
  const haveSessionScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.sessionScores, data.sessionScores);
4955
5030
  const haveQuirksChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.quirks, data.quirks);
@@ -5022,6 +5097,48 @@ handleCaps_fn = function(scores) {
5022
5097
  }
5023
5098
  }
5024
5099
  };
5100
+ pruningManifest_get = function() {
5101
+ var _a, _b, _c, _d, _e;
5102
+ const project = (_b = (_a = __privateGet5(this, _options).manifest) == null ? void 0 : _a.data) == null ? void 0 : _b.project;
5103
+ const populated = [(_c = project == null ? void 0 : project.pz) == null ? void 0 : _c.sig, (_d = project == null ? void 0 : project.pz) == null ? void 0 : _d.enr, (_e = project == null ? void 0 : project.pz) == null ? void 0 : _e.agg, project == null ? void 0 : project.test].some(
5104
+ (definitions) => definitions && Object.keys(definitions).length > 0
5105
+ );
5106
+ return populated ? __privateGet5(this, _options).manifest : void 0;
5107
+ };
5108
+ handlePruning_fn = function(data) {
5109
+ var _a, _b;
5110
+ const { pruneUnknownTests, pruneUnknownDimensions } = __privateGet5(this, _options);
5111
+ const manifest = pruneUnknownTests || pruneUnknownDimensions ? __privateGet5(this, _VisitorDataStore_instances, pruningManifest_get) : void 0;
5112
+ const pruned = [];
5113
+ if (pruneUnknownTests && manifest) {
5114
+ for (const test in data.tests) {
5115
+ if (!manifest.getTest(test)) {
5116
+ delete data.tests[test];
5117
+ pruned.push(`tests.${test}`);
5118
+ }
5119
+ }
5120
+ }
5121
+ __privateMethod2(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.scores, "scores", pruned, manifest);
5122
+ __privateMethod2(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.sessionScores, "sessionScores", pruned, manifest);
5123
+ if (pruned.length) {
5124
+ (_b = (_a = __privateGet5(this, _options)).onLogMessage) == null ? void 0 : _b.call(_a, ["info", 150, pruned]);
5125
+ }
5126
+ };
5127
+ pruneScores_fn = function(scores, bucket, pruned, manifest) {
5128
+ const { pruneUnknownDimensions, pruneZeroScores } = __privateGet5(this, _options);
5129
+ if (!pruneUnknownDimensions && !pruneZeroScores) {
5130
+ return;
5131
+ }
5132
+ const pruneUnknown = pruneUnknownDimensions && manifest;
5133
+ for (const dim in scores) {
5134
+ const isUnknown = pruneUnknown && !isSystemDimension(dim) && !manifest.getDimensionByKey(dim);
5135
+ const isZero = pruneZeroScores && (pruneZeroScores === "round" ? isZeroCookieScore(scores[dim]) : scores[dim] === 0);
5136
+ if (isUnknown || isZero) {
5137
+ delete scores[dim];
5138
+ pruned.push(`${bucket}.${dim}`);
5139
+ }
5140
+ }
5141
+ };
5025
5142
  defaultData_fn = function() {
5026
5143
  var _a, _b, _c;
5027
5144
  return {
@@ -5555,6 +5672,9 @@ var dc2 = (0, import_rfdc3.default)();
5555
5672
 
5556
5673
  // src/config/helpers.ts
5557
5674
  import config from "@uniformdev/next-app-router/config/resolved";
5675
+ var getServerConfig = () => {
5676
+ return config;
5677
+ };
5558
5678
  var getDisabledDevTools = () => {
5559
5679
  var _a;
5560
5680
  if (typeof ((_a = config.context) == null ? void 0 : _a.disableDevTools) === "boolean") {
@@ -6258,6 +6378,7 @@ var UniformContext = async ({ clientContextComponent, result }) => {
6258
6378
  const disableDevTools = getDisabledDevTools();
6259
6379
  const defaultConsent = (_a = result == null ? void 0 : result.pageState.defaultConsent) != null ? _a : getDefaultConsent();
6260
6380
  const experimentalQuirkSerialization = getQuirkSerialization();
6381
+ const contextConfig = getServerConfig().context;
6261
6382
  return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(
6262
6383
  ContextComponent,
6263
6384
  {
@@ -6265,6 +6386,10 @@ var UniformContext = async ({ clientContextComponent, result }) => {
6265
6386
  disableDevTools,
6266
6387
  defaultConsent,
6267
6388
  experimentalQuirkSerialization,
6389
+ cookieMaxBytes: contextConfig == null ? void 0 : contextConfig.cookieMaxBytes,
6390
+ pruneUnknownTests: contextConfig == null ? void 0 : contextConfig.pruneUnknownTests,
6391
+ pruneUnknownDimensions: contextConfig == null ? void 0 : contextConfig.pruneUnknownDimensions,
6392
+ pruneZeroScores: contextConfig == null ? void 0 : contextConfig.pruneZeroScores,
6268
6393
  compositionMetadata
6269
6394
  }
6270
6395
  ));
@@ -4487,6 +4487,7 @@ var bton = (base64) => {
4487
4487
  }
4488
4488
  return sign ? -number : number;
4489
4489
  };
4490
+ var isZeroCookieScore = (score) => Math.abs(score) < 1;
4490
4491
  var ssr = typeof document === "undefined";
4491
4492
  var UNIFORM_DEFAULT_COOKIE_NAME = "ufvd";
4492
4493
  var UNIFORM_DEFAULT_QUIRK_COOKIE_NAME = `ufvdqk`;
@@ -4494,6 +4495,7 @@ var _cookieName;
4494
4495
  var _quirkCookieName;
4495
4496
  var _cookieAttributes;
4496
4497
  var _quirksEnabled;
4498
+ var _maxBytes;
4497
4499
  var CookieTransitionDataStore = class extends TransitionDataStore {
4498
4500
  constructor({
4499
4501
  serverCookieValue,
@@ -4501,7 +4503,9 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4501
4503
  quirkCookieValue,
4502
4504
  quirkCookieName = UNIFORM_DEFAULT_QUIRK_COOKIE_NAME,
4503
4505
  cookieName = UNIFORM_DEFAULT_COOKIE_NAME,
4504
- cookieAttributes = { sameSite: "lax" }
4506
+ cookieAttributes = { sameSite: "lax" },
4507
+ maxBytes,
4508
+ onLogMessage
4505
4509
  }) {
4506
4510
  super({
4507
4511
  initialData: ssr ? parseScoreCookie(serverCookieValue, experimental_quirksEnabled ? quirkCookieValue : void 0) : void 0
@@ -4510,10 +4514,20 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4510
4514
  __privateAdd4(this, _quirkCookieName);
4511
4515
  __privateAdd4(this, _cookieAttributes);
4512
4516
  __privateAdd4(this, _quirksEnabled);
4517
+ __privateAdd4(this, _maxBytes);
4518
+ __publicField3(this, "onLogMessage");
4513
4519
  __privateSet2(this, _cookieName, cookieName);
4514
4520
  __privateSet2(this, _cookieAttributes, cookieAttributes);
4515
4521
  __privateSet2(this, _quirkCookieName, quirkCookieName);
4516
4522
  __privateSet2(this, _quirksEnabled, experimental_quirksEnabled || false);
4523
+ __privateSet2(this, _maxBytes, maxBytes);
4524
+ this.onLogMessage = onLogMessage;
4525
+ const minimumBytes = minimumCookieBytes(cookieName);
4526
+ if (maxBytes !== void 0 && maxBytes < minimumBytes) {
4527
+ throw new Error(
4528
+ `maxBytes of ${maxBytes} is below the ${minimumBytes} bytes the "${cookieName}" cookie costs when it carries nothing but control group membership, so no visitor could ever meet it.`
4529
+ );
4530
+ }
4517
4531
  }
4518
4532
  handleDelete() {
4519
4533
  if (ssr) return Promise.resolve();
@@ -4523,7 +4537,15 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4523
4537
  async handleUpdateData(_, computedValue) {
4524
4538
  if (ssr) return;
4525
4539
  if (computedValue.consent) {
4526
- api.set(__privateGet4(this, _cookieName), serializeCookie(computedValue), __privateGet4(this, _cookieAttributes));
4540
+ const cookieValue = serializeCookie(computedValue, {
4541
+ maxBytes: __privateGet4(this, _maxBytes),
4542
+ cookieName: __privateGet4(this, _cookieName),
4543
+ onBudgetExceeded: (dropped, bytes, maxBytes) => {
4544
+ var _a;
4545
+ return (_a = this.onLogMessage) == null ? void 0 : _a.call(this, ["info", 151, { dropped, bytes, maxBytes }]);
4546
+ }
4547
+ });
4548
+ api.set(__privateGet4(this, _cookieName), cookieValue, __privateGet4(this, _cookieAttributes));
4527
4549
  if (__privateGet4(this, _quirksEnabled) && Object.keys(computedValue.quirks || {}).length) {
4528
4550
  const quirkCookieValue = serializeQuirks(computedValue.quirks || {});
4529
4551
  api.set(__privateGet4(this, _quirkCookieName), quirkCookieValue, __privateGet4(this, _cookieAttributes));
@@ -4540,6 +4562,7 @@ _cookieName = /* @__PURE__ */ new WeakMap();
4540
4562
  _quirkCookieName = /* @__PURE__ */ new WeakMap();
4541
4563
  _cookieAttributes = /* @__PURE__ */ new WeakMap();
4542
4564
  _quirksEnabled = /* @__PURE__ */ new WeakMap();
4565
+ _maxBytes = /* @__PURE__ */ new WeakMap();
4543
4566
  var TYPE_SEP = "~";
4544
4567
  var PAIR_SEP = "!";
4545
4568
  var KV_SEP = "-";
@@ -4611,18 +4634,66 @@ function decodeCookieType(type) {
4611
4634
  return acc;
4612
4635
  }, {});
4613
4636
  }
4614
- function serializeCookie(data) {
4637
+ function serializeCookie(data, options = {}) {
4638
+ const { maxBytes, cookieName = UNIFORM_DEFAULT_COOKIE_NAME, onBudgetExceeded } = options;
4639
+ const parts = {
4640
+ tests: { ...data.tests },
4641
+ sessionScores: encodeCookieType(data.sessionScores),
4642
+ scores: encodeCookieType(data.scores),
4643
+ controlGroup: data.controlGroup ? "1" : "0",
4644
+ personalizeVariants: encodePersonalizeVariants(data.personalizeVariants)
4645
+ };
4646
+ let value = serializeCookieParts(parts);
4647
+ if (maxBytes === void 0) {
4648
+ return value;
4649
+ }
4650
+ const overhead = encodeCookieName(cookieName).length + 1;
4651
+ const measure = () => overhead + api.converter.write(value, cookieName).length;
4652
+ if (measure() <= maxBytes) {
4653
+ return value;
4654
+ }
4655
+ const candidates = dropCandidates(parts, data);
4656
+ const dropped = [];
4657
+ for (let i = 0; i < candidates.length && measure() > maxBytes; i++) {
4658
+ const { bucket, key } = candidates[i];
4659
+ delete parts[bucket][key];
4660
+ dropped.push(`${bucket}.${key}`);
4661
+ value = serializeCookieParts(parts);
4662
+ }
4663
+ if (dropped.length) {
4664
+ onBudgetExceeded == null ? void 0 : onBudgetExceeded(dropped, measure(), maxBytes);
4665
+ }
4666
+ return value;
4667
+ }
4668
+ function serializeCookieParts(parts) {
4615
4669
  return [
4616
- serializeCookieType(data.tests),
4617
- serializeCookieType(encodeCookieType(data.sessionScores)),
4618
- serializeCookieType(encodeCookieType(data.scores)),
4619
- data.controlGroup ? "1" : "0",
4620
- serializePersonalizeVariants(data)
4670
+ serializeCookieType(parts.tests),
4671
+ serializeCookieType(parts.sessionScores),
4672
+ serializeCookieType(parts.scores),
4673
+ parts.controlGroup,
4674
+ serializeCookieType(parts.personalizeVariants)
4621
4675
  ].join(TYPE_SEP);
4622
4676
  }
4623
- function serializePersonalizeVariants({
4624
- personalizeVariants
4625
- }) {
4677
+ function dropCandidates(parts, data) {
4678
+ const dimensions = ["sessionScores", "scores"].flatMap(
4679
+ (bucket, order) => Object.keys(parts[bucket]).map((key) => {
4680
+ var _a;
4681
+ return { bucket, key, order, score: (_a = data[bucket][key]) != null ? _a : 0 };
4682
+ })
4683
+ );
4684
+ dimensions.sort(
4685
+ (a, b) => Number(isZeroCookieScore(b.score)) - Number(isZeroCookieScore(a.score)) || a.score - b.score || a.order - b.order || (a.key < b.key ? -1 : 1)
4686
+ );
4687
+ const keysOf = (bucket) => Object.keys(parts[bucket]).sort().map((key) => ({ bucket, key }));
4688
+ return [...dimensions, ...keysOf("personalizeVariants"), ...keysOf("tests")];
4689
+ }
4690
+ function minimumCookieBytes(cookieName) {
4691
+ return encodeCookieName(cookieName).length + 6;
4692
+ }
4693
+ function encodeCookieName(name) {
4694
+ return encodeURIComponent(name).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/\(/g, "%28").replace(/\)/g, "%29");
4695
+ }
4696
+ function encodePersonalizeVariants(personalizeVariants) {
4626
4697
  const data = {};
4627
4698
  if (typeof personalizeVariants === "object") {
4628
4699
  Object.keys(personalizeVariants).forEach((personalizationName) => {
@@ -4634,8 +4705,7 @@ function serializePersonalizeVariants({
4634
4705
  data[personalizationName] = results.join(",");
4635
4706
  });
4636
4707
  }
4637
- const serialized = serializeCookieType(data);
4638
- return serialized;
4708
+ return data;
4639
4709
  }
4640
4710
  function decodePersonalizeVariants(data) {
4641
4711
  const parsed = parseCookieType(data);
@@ -4682,6 +4752,7 @@ fetchData_fn = async function() {
4682
4752
  this.signalAsyncDataUpdate(serviceData);
4683
4753
  }
4684
4754
  };
4755
+ var isSystemDimension = (dimension) => dimension.startsWith("$");
4685
4756
  var emptyVisitorData = () => ({
4686
4757
  quirks: {},
4687
4758
  scores: {},
@@ -4817,6 +4888,9 @@ var replaceData_fn;
4817
4888
  var setVisitTimeout_fn;
4818
4889
  var isExpired_fn;
4819
4890
  var handleCaps_fn;
4891
+ var pruningManifest_get;
4892
+ var handlePruning_fn;
4893
+ var pruneScores_fn;
4820
4894
  var defaultData_fn;
4821
4895
  var VisitorDataStore = class {
4822
4896
  constructor(options) {
@@ -4927,6 +5001,7 @@ replaceData_fn = function(data, quiet = false) {
4927
5001
  sessionScores: data.sessionScores,
4928
5002
  onLogMessage: __privateGet4(this, _options).onLogMessage
4929
5003
  });
5004
+ __privateMethod(this, _VisitorDataStore_instances, handlePruning_fn).call(this, data);
4930
5005
  const haveScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.scores, data.scores);
4931
5006
  const haveSessionScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.sessionScores, data.sessionScores);
4932
5007
  const haveQuirksChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.quirks, data.quirks);
@@ -4999,6 +5074,48 @@ handleCaps_fn = function(scores) {
4999
5074
  }
5000
5075
  }
5001
5076
  };
5077
+ pruningManifest_get = function() {
5078
+ var _a, _b, _c, _d, _e;
5079
+ const project = (_b = (_a = __privateGet4(this, _options).manifest) == null ? void 0 : _a.data) == null ? void 0 : _b.project;
5080
+ const populated = [(_c = project == null ? void 0 : project.pz) == null ? void 0 : _c.sig, (_d = project == null ? void 0 : project.pz) == null ? void 0 : _d.enr, (_e = project == null ? void 0 : project.pz) == null ? void 0 : _e.agg, project == null ? void 0 : project.test].some(
5081
+ (definitions) => definitions && Object.keys(definitions).length > 0
5082
+ );
5083
+ return populated ? __privateGet4(this, _options).manifest : void 0;
5084
+ };
5085
+ handlePruning_fn = function(data) {
5086
+ var _a, _b;
5087
+ const { pruneUnknownTests, pruneUnknownDimensions } = __privateGet4(this, _options);
5088
+ const manifest = pruneUnknownTests || pruneUnknownDimensions ? __privateGet4(this, _VisitorDataStore_instances, pruningManifest_get) : void 0;
5089
+ const pruned = [];
5090
+ if (pruneUnknownTests && manifest) {
5091
+ for (const test in data.tests) {
5092
+ if (!manifest.getTest(test)) {
5093
+ delete data.tests[test];
5094
+ pruned.push(`tests.${test}`);
5095
+ }
5096
+ }
5097
+ }
5098
+ __privateMethod(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.scores, "scores", pruned, manifest);
5099
+ __privateMethod(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.sessionScores, "sessionScores", pruned, manifest);
5100
+ if (pruned.length) {
5101
+ (_b = (_a = __privateGet4(this, _options)).onLogMessage) == null ? void 0 : _b.call(_a, ["info", 150, pruned]);
5102
+ }
5103
+ };
5104
+ pruneScores_fn = function(scores, bucket, pruned, manifest) {
5105
+ const { pruneUnknownDimensions, pruneZeroScores } = __privateGet4(this, _options);
5106
+ if (!pruneUnknownDimensions && !pruneZeroScores) {
5107
+ return;
5108
+ }
5109
+ const pruneUnknown = pruneUnknownDimensions && manifest;
5110
+ for (const dim in scores) {
5111
+ const isUnknown = pruneUnknown && !isSystemDimension(dim) && !manifest.getDimensionByKey(dim);
5112
+ const isZero = pruneZeroScores && (pruneZeroScores === "round" ? isZeroCookieScore(scores[dim]) : scores[dim] === 0);
5113
+ if (isUnknown || isZero) {
5114
+ delete scores[dim];
5115
+ pruned.push(`${bucket}.${dim}`);
5116
+ }
5117
+ }
5118
+ };
5002
5119
  defaultData_fn = function() {
5003
5120
  var _a, _b, _c;
5004
5121
  return {
@@ -4479,6 +4479,7 @@ var bton = (base64) => {
4479
4479
  }
4480
4480
  return sign ? -number : number;
4481
4481
  };
4482
+ var isZeroCookieScore = (score) => Math.abs(score) < 1;
4482
4483
  var ssr = typeof document === "undefined";
4483
4484
  var UNIFORM_DEFAULT_COOKIE_NAME = "ufvd";
4484
4485
  var UNIFORM_DEFAULT_QUIRK_COOKIE_NAME = `ufvdqk`;
@@ -4486,6 +4487,7 @@ var _cookieName;
4486
4487
  var _quirkCookieName;
4487
4488
  var _cookieAttributes;
4488
4489
  var _quirksEnabled;
4490
+ var _maxBytes;
4489
4491
  var CookieTransitionDataStore = class extends TransitionDataStore {
4490
4492
  constructor({
4491
4493
  serverCookieValue,
@@ -4493,7 +4495,9 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4493
4495
  quirkCookieValue,
4494
4496
  quirkCookieName = UNIFORM_DEFAULT_QUIRK_COOKIE_NAME,
4495
4497
  cookieName = UNIFORM_DEFAULT_COOKIE_NAME,
4496
- cookieAttributes = { sameSite: "lax" }
4498
+ cookieAttributes = { sameSite: "lax" },
4499
+ maxBytes,
4500
+ onLogMessage
4497
4501
  }) {
4498
4502
  super({
4499
4503
  initialData: ssr ? parseScoreCookie(serverCookieValue, experimental_quirksEnabled ? quirkCookieValue : void 0) : void 0
@@ -4502,10 +4506,20 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4502
4506
  __privateAdd4(this, _quirkCookieName);
4503
4507
  __privateAdd4(this, _cookieAttributes);
4504
4508
  __privateAdd4(this, _quirksEnabled);
4509
+ __privateAdd4(this, _maxBytes);
4510
+ __publicField3(this, "onLogMessage");
4505
4511
  __privateSet2(this, _cookieName, cookieName);
4506
4512
  __privateSet2(this, _cookieAttributes, cookieAttributes);
4507
4513
  __privateSet2(this, _quirkCookieName, quirkCookieName);
4508
4514
  __privateSet2(this, _quirksEnabled, experimental_quirksEnabled || false);
4515
+ __privateSet2(this, _maxBytes, maxBytes);
4516
+ this.onLogMessage = onLogMessage;
4517
+ const minimumBytes = minimumCookieBytes(cookieName);
4518
+ if (maxBytes !== void 0 && maxBytes < minimumBytes) {
4519
+ throw new Error(
4520
+ `maxBytes of ${maxBytes} is below the ${minimumBytes} bytes the "${cookieName}" cookie costs when it carries nothing but control group membership, so no visitor could ever meet it.`
4521
+ );
4522
+ }
4509
4523
  }
4510
4524
  handleDelete() {
4511
4525
  if (ssr) return Promise.resolve();
@@ -4515,7 +4529,15 @@ var CookieTransitionDataStore = class extends TransitionDataStore {
4515
4529
  async handleUpdateData(_, computedValue) {
4516
4530
  if (ssr) return;
4517
4531
  if (computedValue.consent) {
4518
- api.set(__privateGet4(this, _cookieName), serializeCookie(computedValue), __privateGet4(this, _cookieAttributes));
4532
+ const cookieValue = serializeCookie(computedValue, {
4533
+ maxBytes: __privateGet4(this, _maxBytes),
4534
+ cookieName: __privateGet4(this, _cookieName),
4535
+ onBudgetExceeded: (dropped, bytes, maxBytes) => {
4536
+ var _a;
4537
+ return (_a = this.onLogMessage) == null ? void 0 : _a.call(this, ["info", 151, { dropped, bytes, maxBytes }]);
4538
+ }
4539
+ });
4540
+ api.set(__privateGet4(this, _cookieName), cookieValue, __privateGet4(this, _cookieAttributes));
4519
4541
  if (__privateGet4(this, _quirksEnabled) && Object.keys(computedValue.quirks || {}).length) {
4520
4542
  const quirkCookieValue = serializeQuirks(computedValue.quirks || {});
4521
4543
  api.set(__privateGet4(this, _quirkCookieName), quirkCookieValue, __privateGet4(this, _cookieAttributes));
@@ -4532,6 +4554,7 @@ _cookieName = /* @__PURE__ */ new WeakMap();
4532
4554
  _quirkCookieName = /* @__PURE__ */ new WeakMap();
4533
4555
  _cookieAttributes = /* @__PURE__ */ new WeakMap();
4534
4556
  _quirksEnabled = /* @__PURE__ */ new WeakMap();
4557
+ _maxBytes = /* @__PURE__ */ new WeakMap();
4535
4558
  var TYPE_SEP = "~";
4536
4559
  var PAIR_SEP = "!";
4537
4560
  var KV_SEP = "-";
@@ -4603,18 +4626,66 @@ function decodeCookieType(type) {
4603
4626
  return acc;
4604
4627
  }, {});
4605
4628
  }
4606
- function serializeCookie(data) {
4629
+ function serializeCookie(data, options = {}) {
4630
+ const { maxBytes, cookieName = UNIFORM_DEFAULT_COOKIE_NAME, onBudgetExceeded } = options;
4631
+ const parts = {
4632
+ tests: { ...data.tests },
4633
+ sessionScores: encodeCookieType(data.sessionScores),
4634
+ scores: encodeCookieType(data.scores),
4635
+ controlGroup: data.controlGroup ? "1" : "0",
4636
+ personalizeVariants: encodePersonalizeVariants(data.personalizeVariants)
4637
+ };
4638
+ let value = serializeCookieParts(parts);
4639
+ if (maxBytes === void 0) {
4640
+ return value;
4641
+ }
4642
+ const overhead = encodeCookieName(cookieName).length + 1;
4643
+ const measure = () => overhead + api.converter.write(value, cookieName).length;
4644
+ if (measure() <= maxBytes) {
4645
+ return value;
4646
+ }
4647
+ const candidates = dropCandidates(parts, data);
4648
+ const dropped = [];
4649
+ for (let i = 0; i < candidates.length && measure() > maxBytes; i++) {
4650
+ const { bucket, key } = candidates[i];
4651
+ delete parts[bucket][key];
4652
+ dropped.push(`${bucket}.${key}`);
4653
+ value = serializeCookieParts(parts);
4654
+ }
4655
+ if (dropped.length) {
4656
+ onBudgetExceeded == null ? void 0 : onBudgetExceeded(dropped, measure(), maxBytes);
4657
+ }
4658
+ return value;
4659
+ }
4660
+ function serializeCookieParts(parts) {
4607
4661
  return [
4608
- serializeCookieType(data.tests),
4609
- serializeCookieType(encodeCookieType(data.sessionScores)),
4610
- serializeCookieType(encodeCookieType(data.scores)),
4611
- data.controlGroup ? "1" : "0",
4612
- serializePersonalizeVariants(data)
4662
+ serializeCookieType(parts.tests),
4663
+ serializeCookieType(parts.sessionScores),
4664
+ serializeCookieType(parts.scores),
4665
+ parts.controlGroup,
4666
+ serializeCookieType(parts.personalizeVariants)
4613
4667
  ].join(TYPE_SEP);
4614
4668
  }
4615
- function serializePersonalizeVariants({
4616
- personalizeVariants
4617
- }) {
4669
+ function dropCandidates(parts, data) {
4670
+ const dimensions = ["sessionScores", "scores"].flatMap(
4671
+ (bucket, order) => Object.keys(parts[bucket]).map((key) => {
4672
+ var _a;
4673
+ return { bucket, key, order, score: (_a = data[bucket][key]) != null ? _a : 0 };
4674
+ })
4675
+ );
4676
+ dimensions.sort(
4677
+ (a, b) => Number(isZeroCookieScore(b.score)) - Number(isZeroCookieScore(a.score)) || a.score - b.score || a.order - b.order || (a.key < b.key ? -1 : 1)
4678
+ );
4679
+ const keysOf = (bucket) => Object.keys(parts[bucket]).sort().map((key) => ({ bucket, key }));
4680
+ return [...dimensions, ...keysOf("personalizeVariants"), ...keysOf("tests")];
4681
+ }
4682
+ function minimumCookieBytes(cookieName) {
4683
+ return encodeCookieName(cookieName).length + 6;
4684
+ }
4685
+ function encodeCookieName(name) {
4686
+ return encodeURIComponent(name).replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent).replace(/\(/g, "%28").replace(/\)/g, "%29");
4687
+ }
4688
+ function encodePersonalizeVariants(personalizeVariants) {
4618
4689
  const data = {};
4619
4690
  if (typeof personalizeVariants === "object") {
4620
4691
  Object.keys(personalizeVariants).forEach((personalizationName) => {
@@ -4626,8 +4697,7 @@ function serializePersonalizeVariants({
4626
4697
  data[personalizationName] = results.join(",");
4627
4698
  });
4628
4699
  }
4629
- const serialized = serializeCookieType(data);
4630
- return serialized;
4700
+ return data;
4631
4701
  }
4632
4702
  function decodePersonalizeVariants(data) {
4633
4703
  const parsed = parseCookieType(data);
@@ -4674,6 +4744,7 @@ fetchData_fn = async function() {
4674
4744
  this.signalAsyncDataUpdate(serviceData);
4675
4745
  }
4676
4746
  };
4747
+ var isSystemDimension = (dimension) => dimension.startsWith("$");
4677
4748
  var emptyVisitorData = () => ({
4678
4749
  quirks: {},
4679
4750
  scores: {},
@@ -4809,6 +4880,9 @@ var replaceData_fn;
4809
4880
  var setVisitTimeout_fn;
4810
4881
  var isExpired_fn;
4811
4882
  var handleCaps_fn;
4883
+ var pruningManifest_get;
4884
+ var handlePruning_fn;
4885
+ var pruneScores_fn;
4812
4886
  var defaultData_fn;
4813
4887
  var VisitorDataStore = class {
4814
4888
  constructor(options) {
@@ -4919,6 +4993,7 @@ replaceData_fn = function(data, quiet = false) {
4919
4993
  sessionScores: data.sessionScores,
4920
4994
  onLogMessage: __privateGet4(this, _options).onLogMessage
4921
4995
  });
4996
+ __privateMethod(this, _VisitorDataStore_instances, handlePruning_fn).call(this, data);
4922
4997
  const haveScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.scores, data.scores);
4923
4998
  const haveSessionScoresChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.sessionScores, data.sessionScores);
4924
4999
  const haveQuirksChanged = !dequal(oldData == null ? void 0 : oldData.visitorData.quirks, data.quirks);
@@ -4991,6 +5066,48 @@ handleCaps_fn = function(scores) {
4991
5066
  }
4992
5067
  }
4993
5068
  };
5069
+ pruningManifest_get = function() {
5070
+ var _a, _b, _c, _d, _e;
5071
+ const project = (_b = (_a = __privateGet4(this, _options).manifest) == null ? void 0 : _a.data) == null ? void 0 : _b.project;
5072
+ const populated = [(_c = project == null ? void 0 : project.pz) == null ? void 0 : _c.sig, (_d = project == null ? void 0 : project.pz) == null ? void 0 : _d.enr, (_e = project == null ? void 0 : project.pz) == null ? void 0 : _e.agg, project == null ? void 0 : project.test].some(
5073
+ (definitions) => definitions && Object.keys(definitions).length > 0
5074
+ );
5075
+ return populated ? __privateGet4(this, _options).manifest : void 0;
5076
+ };
5077
+ handlePruning_fn = function(data) {
5078
+ var _a, _b;
5079
+ const { pruneUnknownTests, pruneUnknownDimensions } = __privateGet4(this, _options);
5080
+ const manifest = pruneUnknownTests || pruneUnknownDimensions ? __privateGet4(this, _VisitorDataStore_instances, pruningManifest_get) : void 0;
5081
+ const pruned = [];
5082
+ if (pruneUnknownTests && manifest) {
5083
+ for (const test in data.tests) {
5084
+ if (!manifest.getTest(test)) {
5085
+ delete data.tests[test];
5086
+ pruned.push(`tests.${test}`);
5087
+ }
5088
+ }
5089
+ }
5090
+ __privateMethod(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.scores, "scores", pruned, manifest);
5091
+ __privateMethod(this, _VisitorDataStore_instances, pruneScores_fn).call(this, data.sessionScores, "sessionScores", pruned, manifest);
5092
+ if (pruned.length) {
5093
+ (_b = (_a = __privateGet4(this, _options)).onLogMessage) == null ? void 0 : _b.call(_a, ["info", 150, pruned]);
5094
+ }
5095
+ };
5096
+ pruneScores_fn = function(scores, bucket, pruned, manifest) {
5097
+ const { pruneUnknownDimensions, pruneZeroScores } = __privateGet4(this, _options);
5098
+ if (!pruneUnknownDimensions && !pruneZeroScores) {
5099
+ return;
5100
+ }
5101
+ const pruneUnknown = pruneUnknownDimensions && manifest;
5102
+ for (const dim in scores) {
5103
+ const isUnknown = pruneUnknown && !isSystemDimension(dim) && !manifest.getDimensionByKey(dim);
5104
+ const isZero = pruneZeroScores && (pruneZeroScores === "round" ? isZeroCookieScore(scores[dim]) : scores[dim] === 0);
5105
+ if (isUnknown || isZero) {
5106
+ delete scores[dim];
5107
+ pruned.push(`${bucket}.${dim}`);
5108
+ }
5109
+ }
5110
+ };
4994
5111
  defaultData_fn = function() {
4995
5112
  var _a, _b, _c;
4996
5113
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniformdev/next-app-router",
3
- "version": "20.80.0",
3
+ "version": "20.80.1-alpha.10.sha-e0cfb4ce44",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
5
  "scripts": {
6
6
  "build": "tsup",
@@ -100,12 +100,12 @@
100
100
  "vitest": "4.1.11"
101
101
  },
102
102
  "dependencies": {
103
- "@uniformdev/canvas-react": "20.80.0",
104
- "@uniformdev/next-app-router-client": "20.80.0",
105
- "@uniformdev/next-app-router-shared": "20.80.0",
106
- "@uniformdev/redirect": "20.80.0",
107
- "@uniformdev/richtext": "20.80.0",
108
- "@uniformdev/webhooks": "20.80.0",
103
+ "@uniformdev/canvas-react": "20.80.1-alpha.10.sha-e0cfb4ce44",
104
+ "@uniformdev/next-app-router-client": "20.80.1-alpha.10.sha-e0cfb4ce44",
105
+ "@uniformdev/next-app-router-shared": "20.80.1-alpha.10.sha-e0cfb4ce44",
106
+ "@uniformdev/redirect": "20.80.1-alpha.10.sha-e0cfb4ce44",
107
+ "@uniformdev/richtext": "20.80.1-alpha.10.sha-e0cfb4ce44",
108
+ "@uniformdev/webhooks": "20.80.1-alpha.10.sha-e0cfb4ce44",
109
109
  "@vercel/functions": "^3.7.2",
110
110
  "encoding": "^0.1.13",
111
111
  "server-only": "^0.0.1",
@@ -122,5 +122,5 @@
122
122
  "publishConfig": {
123
123
  "access": "public"
124
124
  },
125
- "gitHead": "6eec8f028463f30667b59af913a74d56960dde11"
125
+ "gitHead": "e0cfb4ce4435ea507f36d3246fc886c24f8ebe16"
126
126
  }