@zuplo/cli 7.8.4 → 7.8.6

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.
@@ -29,7 +29,18 @@ export declare function parseFeatureFlagSemver(value: string, parsingPolicy?: Fe
29
29
  export declare function relativeDateParseForFeatureFlagMatching(value: string): Date | null;
30
30
  export declare function matchFeatureFlagProperty(property: FeatureFlagProperty, propertyValues: Record<string, any>, options?: MatchFeatureFlagPropertyOptions): boolean;
31
31
  export declare function hashSHA1(text: string): Promise<string>;
32
- export declare function getFeatureFlagHash(key: string, bucketingValue: string, salt?: string): Promise<number>;
32
+ export declare function getFeatureFlagHash(key: string, bucketingValue: string, salt?: string, separator?: string): Promise<number>;
33
+ /**
34
+ * The `holdout-<id>` variant this bucketing value is held out into, or undefined.
35
+ *
36
+ * The separator is the whole point: the server hashes `holdout-<value>`, while flag rollout
37
+ * hashing joins with a dot. Taking the default separator here would still look uniform and
38
+ * deterministic while holding out a different set of people than the server does.
39
+ */
40
+ export declare function getHoldoutVariant(holdout: {
41
+ id: number;
42
+ exclusion_percentage: number;
43
+ } | null | undefined, bucketingValue: string): Promise<string | undefined>;
33
44
  export declare function getFeatureFlagVariantLookupTable(variants: readonly FeatureFlagVariant[]): FeatureFlagVariantLookupEntry[];
34
45
  export declare function getFeatureFlagVariant(key: string, bucketingValue: string, variants: readonly FeatureFlagVariant[]): Promise<string | undefined>;
35
46
  export declare function resolveFeatureFlagPayload(payloads: Readonly<Record<string, JsonType | undefined>> | null | undefined, flagValue: FeatureFlagValue | null | undefined): JsonType | null;
@@ -1 +1 @@
1
- {"version":3,"file":"featureFlagLocalEvaluation.d.ts","sourceRoot":"","sources":["../src/featureFlagLocalEvaluation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEzD,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAA;AAE/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,wBAAwB,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,QAAQ,GAAG,mBAAmB,CAAA;AAE3E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,mBAAmB,CAAC,EAAE,8BAA8B,CAAA;IACpD,mGAAmG;IACnG,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AASD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAO,EAAE,MAAM,EAI1B;CACF;AAsLD,KAAK,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAa3C,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,8BAAyC,GACvD,WAAW,CAeb;AAwED,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAmBlF;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,EAC7B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAwKT;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5D;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhH;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GACtC,6BAA6B,EAAE,CASjC;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GACtC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK7B;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3E,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAC7C,QAAQ,GAAG,IAAI,CAMjB"}
1
+ {"version":3,"file":"featureFlagLocalEvaluation.d.ts","sourceRoot":"","sources":["../src/featureFlagLocalEvaluation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEzD,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAA;AAE/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,wBAAwB,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,QAAQ,GAAG,mBAAmB,CAAA;AAE3E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,mBAAmB,CAAC,EAAE,8BAA8B,CAAA;IACpD,mGAAmG;IACnG,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AASD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAO,EAAE,MAAM,EAI1B;CACF;AAsLD,KAAK,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAa3C,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,aAAa,GAAE,8BAAyC,GACvD,WAAW,CAeb;AAwED,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAmBlF;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,EAC7B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAwKT;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5D;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,MAAW,EACjB,SAAS,GAAE,MAAY,GACtB,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACxE,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA0B7B;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GACtC,6BAA6B,EAAE,CASjC;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GACtC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK7B;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3E,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAC7C,QAAQ,GAAG,IAAI,CAMjB"}
@@ -32,6 +32,7 @@ __webpack_require__.d(__webpack_exports__, {
32
32
  getFeatureFlagHash: ()=>getFeatureFlagHash,
33
33
  getFeatureFlagVariant: ()=>getFeatureFlagVariant,
34
34
  getFeatureFlagVariantLookupTable: ()=>getFeatureFlagVariantLookupTable,
35
+ getHoldoutVariant: ()=>getHoldoutVariant,
35
36
  hashSHA1: ()=>hashSHA1,
36
37
  matchFeatureFlagProperty: ()=>matchFeatureFlagProperty,
37
38
  parseFeatureFlagSemver: ()=>parseFeatureFlagSemver,
@@ -444,10 +445,21 @@ async function hashSHA1(text) {
444
445
  const hashBuffer = await subtle.digest('SHA-1', new TextEncoder().encode(text));
445
446
  return Array.from(new Uint8Array(hashBuffer)).map((byte)=>byte.toString(16).padStart(2, '0')).join('');
446
447
  }
447
- async function getFeatureFlagHash(key, bucketingValue, salt = '') {
448
- const hashString = await hashSHA1(`${key}.${bucketingValue}${salt}`);
448
+ async function getFeatureFlagHash(key, bucketingValue, salt = '', separator = '.') {
449
+ const hashString = await hashSHA1(`${key}${separator}${bucketingValue}${salt}`);
449
450
  return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE;
450
451
  }
452
+ async function getHoldoutVariant(holdout, bucketingValue) {
453
+ if (null == holdout || null == holdout.id || null == holdout.exclusion_percentage) return;
454
+ const rawPercentage = Number(holdout.exclusion_percentage);
455
+ if (!Number.isFinite(rawPercentage)) return;
456
+ const percentage = Math.min(Math.max(rawPercentage, 0), 100);
457
+ if (100 !== percentage) {
458
+ const hash = await getFeatureFlagHash('holdout', bucketingValue, '', '-');
459
+ if (hash > percentage / 100) return;
460
+ }
461
+ return `holdout-${holdout.id}`;
462
+ }
451
463
  function getFeatureFlagVariantLookupTable(variants) {
452
464
  const table = [];
453
465
  let valueMin = 0;
@@ -476,6 +488,7 @@ exports.InconclusiveMatchError = __webpack_exports__.InconclusiveMatchError;
476
488
  exports.getFeatureFlagHash = __webpack_exports__.getFeatureFlagHash;
477
489
  exports.getFeatureFlagVariant = __webpack_exports__.getFeatureFlagVariant;
478
490
  exports.getFeatureFlagVariantLookupTable = __webpack_exports__.getFeatureFlagVariantLookupTable;
491
+ exports.getHoldoutVariant = __webpack_exports__.getHoldoutVariant;
479
492
  exports.hashSHA1 = __webpack_exports__.hashSHA1;
480
493
  exports.matchFeatureFlagProperty = __webpack_exports__.matchFeatureFlagProperty;
481
494
  exports.parseFeatureFlagSemver = __webpack_exports__.parseFeatureFlagSemver;
@@ -486,6 +499,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
486
499
  "getFeatureFlagHash",
487
500
  "getFeatureFlagVariant",
488
501
  "getFeatureFlagVariantLookupTable",
502
+ "getHoldoutVariant",
489
503
  "hashSHA1",
490
504
  "matchFeatureFlagProperty",
491
505
  "parseFeatureFlagSemver",
@@ -404,10 +404,21 @@ async function hashSHA1(text) {
404
404
  const hashBuffer = await subtle.digest('SHA-1', new TextEncoder().encode(text));
405
405
  return Array.from(new Uint8Array(hashBuffer)).map((byte)=>byte.toString(16).padStart(2, '0')).join('');
406
406
  }
407
- async function getFeatureFlagHash(key, bucketingValue, salt = '') {
408
- const hashString = await hashSHA1(`${key}.${bucketingValue}${salt}`);
407
+ async function getFeatureFlagHash(key, bucketingValue, salt = '', separator = '.') {
408
+ const hashString = await hashSHA1(`${key}${separator}${bucketingValue}${salt}`);
409
409
  return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE;
410
410
  }
411
+ async function getHoldoutVariant(holdout, bucketingValue) {
412
+ if (null == holdout || null == holdout.id || null == holdout.exclusion_percentage) return;
413
+ const rawPercentage = Number(holdout.exclusion_percentage);
414
+ if (!Number.isFinite(rawPercentage)) return;
415
+ const percentage = Math.min(Math.max(rawPercentage, 0), 100);
416
+ if (100 !== percentage) {
417
+ const hash = await getFeatureFlagHash('holdout', bucketingValue, '', '-');
418
+ if (hash > percentage / 100) return;
419
+ }
420
+ return `holdout-${holdout.id}`;
421
+ }
411
422
  function getFeatureFlagVariantLookupTable(variants) {
412
423
  const table = [];
413
424
  let valueMin = 0;
@@ -432,4 +443,4 @@ function resolveFeatureFlagPayload(payloads, flagValue) {
432
443
  const payload = payloads[payloadKey] || null;
433
444
  return null == payload ? null : parsePayload(payload);
434
445
  }
435
- export { InconclusiveMatchError, getFeatureFlagHash, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, hashSHA1, matchFeatureFlagProperty, parseFeatureFlagSemver, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload };
446
+ export { InconclusiveMatchError, getFeatureFlagHash, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, getHoldoutVariant, hashSHA1, matchFeatureFlagProperty, parseFeatureFlagSemver, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload };
@@ -1,5 +1,5 @@
1
1
  export { getFeatureFlagValue, getEnabledFromValue, getVariantFromValue, parsePayload, flagDetailsToResults, MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, minimizeFlagCalledEventProperties, } from './featureFlagUtils';
2
- export { getFeatureFlagHash, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, hashSHA1, InconclusiveMatchError, matchFeatureFlagProperty, parseFeatureFlagSemver, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload, } from './featureFlagLocalEvaluation';
2
+ export { getFeatureFlagHash, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, getHoldoutVariant, hashSHA1, InconclusiveMatchError, matchFeatureFlagProperty, parseFeatureFlagSemver, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload, } from './featureFlagLocalEvaluation';
3
3
  export type { FeatureFlagProperty, FeatureFlagPropertyValue, FeatureFlagSemverParsingPolicy, FeatureFlagVariant, FeatureFlagVariantLookupEntry, MatchFeatureFlagPropertyOptions, } from './featureFlagLocalEvaluation';
4
4
  export { gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError, } from './gzip';
5
5
  export * from './utils';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,6CAA6C,EAC7C,iCAAiC,GAClC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,QAAQ,EACR,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,uCAAuC,EACvC,yBAAyB,GAC1B,MAAM,8BAA8B,CAAA;AACrC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,8BAA8B,EAC9B,kBAAkB,EAClB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA;AACvB,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAIrB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAGhE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,GACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAG/F,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAClE,YAAY,EACV,IAAI,EACJ,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,6CAA6C,EAC7C,iCAAiC,GAClC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,iBAAiB,EACjB,QAAQ,EACR,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,uCAAuC,EACvC,yBAAyB,GAC1B,MAAM,8BAA8B,CAAA;AACrC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,8BAA8B,EAC9B,kBAAkB,EAClB,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA;AACvB,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAIrB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAGhE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,GACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAG/F,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAClE,YAAY,EACV,IAAI,EACJ,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -141,9 +141,10 @@ var __webpack_exports__ = {};
141
141
  "getEnabledFromValue",
142
142
  "parsePayload",
143
143
  "isNativeAsyncGzipError",
144
+ "getHoldoutVariant",
144
145
  "buildResourceAttributes",
145
- "resolveMetricsConfig",
146
146
  "MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
147
+ "resolveMetricsConfig",
147
148
  "runWithActiveSpan",
148
149
  "toOtlpAnyValue",
149
150
  "PostHogLogs",
@@ -204,9 +205,10 @@ var __webpack_exports__ = {};
204
205
  "getEnabledFromValue",
205
206
  "parsePayload",
206
207
  "isNativeAsyncGzipError",
208
+ "getHoldoutVariant",
207
209
  "buildResourceAttributes",
208
- "resolveMetricsConfig",
209
210
  "MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
211
+ "resolveMetricsConfig",
210
212
  "runWithActiveSpan",
211
213
  "toOtlpAnyValue",
212
214
  "PostHogLogs",
@@ -256,9 +258,10 @@ var __webpack_exports__ = {};
256
258
  "getEnabledFromValue",
257
259
  "parsePayload",
258
260
  "isNativeAsyncGzipError",
261
+ "getHoldoutVariant",
259
262
  "buildResourceAttributes",
260
- "resolveMetricsConfig",
261
263
  "MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
264
+ "resolveMetricsConfig",
262
265
  "runWithActiveSpan",
263
266
  "toOtlpAnyValue",
264
267
  "PostHogLogs",
@@ -308,9 +311,10 @@ var __webpack_exports__ = {};
308
311
  "getEnabledFromValue",
309
312
  "parsePayload",
310
313
  "isNativeAsyncGzipError",
314
+ "getHoldoutVariant",
311
315
  "buildResourceAttributes",
312
- "resolveMetricsConfig",
313
316
  "MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
317
+ "resolveMetricsConfig",
314
318
  "runWithActiveSpan",
315
319
  "toOtlpAnyValue",
316
320
  "PostHogLogs",
@@ -360,9 +364,10 @@ var __webpack_exports__ = {};
360
364
  "getEnabledFromValue",
361
365
  "parsePayload",
362
366
  "isNativeAsyncGzipError",
367
+ "getHoldoutVariant",
363
368
  "buildResourceAttributes",
364
- "resolveMetricsConfig",
365
369
  "MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
370
+ "resolveMetricsConfig",
366
371
  "runWithActiveSpan",
367
372
  "toOtlpAnyValue",
368
373
  "PostHogLogs",
@@ -412,9 +417,10 @@ var __webpack_exports__ = {};
412
417
  "getEnabledFromValue",
413
418
  "parsePayload",
414
419
  "isNativeAsyncGzipError",
420
+ "getHoldoutVariant",
415
421
  "buildResourceAttributes",
416
- "resolveMetricsConfig",
417
422
  "MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
423
+ "resolveMetricsConfig",
418
424
  "runWithActiveSpan",
419
425
  "toOtlpAnyValue",
420
426
  "PostHogLogs",
@@ -458,6 +464,7 @@ var __webpack_exports__ = {};
458
464
  getFeatureFlagValue: ()=>_featureFlagUtils__rspack_import_0.getFeatureFlagValue,
459
465
  getFeatureFlagVariant: ()=>_featureFlagLocalEvaluation__rspack_import_1.getFeatureFlagVariant,
460
466
  getFeatureFlagVariantLookupTable: ()=>_featureFlagLocalEvaluation__rspack_import_1.getFeatureFlagVariantLookupTable,
467
+ getHoldoutVariant: ()=>_featureFlagLocalEvaluation__rspack_import_1.getHoldoutVariant,
461
468
  getLengthFromRules: ()=>_surveys_validation__rspack_import_20.getLengthFromRules,
462
469
  getOtlpSeverityNumber: ()=>_logs_logs_utils__rspack_import_5.getOtlpSeverityNumber,
463
470
  getOtlpSeverityText: ()=>_logs_logs_utils__rspack_import_5.getOtlpSeverityText,
@@ -506,6 +513,7 @@ exports.getFeatureFlagHash = __webpack_exports__.getFeatureFlagHash;
506
513
  exports.getFeatureFlagValue = __webpack_exports__.getFeatureFlagValue;
507
514
  exports.getFeatureFlagVariant = __webpack_exports__.getFeatureFlagVariant;
508
515
  exports.getFeatureFlagVariantLookupTable = __webpack_exports__.getFeatureFlagVariantLookupTable;
516
+ exports.getHoldoutVariant = __webpack_exports__.getHoldoutVariant;
509
517
  exports.getLengthFromRules = __webpack_exports__.getLengthFromRules;
510
518
  exports.getOtlpSeverityNumber = __webpack_exports__.getOtlpSeverityNumber;
511
519
  exports.getOtlpSeverityText = __webpack_exports__.getOtlpSeverityText;
@@ -553,6 +561,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
553
561
  "getFeatureFlagValue",
554
562
  "getFeatureFlagVariant",
555
563
  "getFeatureFlagVariantLookupTable",
564
+ "getHoldoutVariant",
556
565
  "getLengthFromRules",
557
566
  "getOtlpSeverityNumber",
558
567
  "getOtlpSeverityText",
@@ -6,7 +6,7 @@ export * from "./posthog-core-stateless.mjs";
6
6
  export * from "./tracing-headers.mjs";
7
7
  export * from "./types.mjs";
8
8
  export { MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getVariantFromValue, minimizeFlagCalledEventProperties, parsePayload } from "./featureFlagUtils.mjs";
9
- export { InconclusiveMatchError, getFeatureFlagHash, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, hashSHA1, matchFeatureFlagProperty, parseFeatureFlagSemver, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload } from "./featureFlagLocalEvaluation.mjs";
9
+ export { InconclusiveMatchError, getFeatureFlagHash, getFeatureFlagVariant, getFeatureFlagVariantLookupTable, getHoldoutVariant, hashSHA1, matchFeatureFlagProperty, parseFeatureFlagSemver, relativeDateParseForFeatureFlagMatching, resolveFeatureFlagPayload } from "./featureFlagLocalEvaluation.mjs";
10
10
  export { gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError } from "./gzip.mjs";
11
11
  export { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText } from "./logs/logs-utils.mjs";
12
12
  export { toOtlpAnyValue, toOtlpKeyValueList } from "./utils/otlp-any-value.mjs";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/core",
3
- "version": "1.55.1",
3
+ "version": "1.55.2",
4
4
  "bugs": {
5
5
  "url": "https://github.com/PostHog/posthog-js/issues"
6
6
  },
@@ -70,7 +70,7 @@
70
70
  }
71
71
  },
72
72
  "dependencies": {
73
- "@posthog/types": "^1.412.3"
73
+ "@posthog/types": "^1.412.4"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@rslib/core": "0.23.2",
@@ -532,11 +532,54 @@ export async function hashSHA1(text: string): Promise<string> {
532
532
  .join('')
533
533
  }
534
534
 
535
- export async function getFeatureFlagHash(key: string, bucketingValue: string, salt: string = ''): Promise<number> {
536
- const hashString = await hashSHA1(`${key}.${bucketingValue}${salt}`)
535
+ export async function getFeatureFlagHash(
536
+ key: string,
537
+ bucketingValue: string,
538
+ salt: string = '',
539
+ separator: string = '.'
540
+ ): Promise<number> {
541
+ const hashString = await hashSHA1(`${key}${separator}${bucketingValue}${salt}`)
537
542
  return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE
538
543
  }
539
544
 
545
+ /**
546
+ * The `holdout-<id>` variant this bucketing value is held out into, or undefined.
547
+ *
548
+ * The separator is the whole point: the server hashes `holdout-<value>`, while flag rollout
549
+ * hashing joins with a dot. Taking the default separator here would still look uniform and
550
+ * deterministic while holding out a different set of people than the server does.
551
+ */
552
+ export async function getHoldoutVariant(
553
+ holdout: { id: number; exclusion_percentage: number } | null | undefined,
554
+ bucketingValue: string
555
+ ): Promise<string | undefined> {
556
+ // Loose null checks on purpose: the payload can carry an explicit null for either field, and
557
+ // a null id would otherwise reach the template below and produce the variant `holdout-null`.
558
+ if (holdout == null || holdout.id == null || holdout.exclusion_percentage == null) {
559
+ return undefined
560
+ }
561
+
562
+ // A non-numeric percentage would clamp to NaN, and `hash > NaN` is false for every hash, which
563
+ // holds out everyone. The server deserializes this field as a float, so it rejects the value
564
+ // instead; treat it as no holdout rather than the most damaging reading.
565
+ const rawPercentage = Number(holdout.exclusion_percentage)
566
+ if (!Number.isFinite(rawPercentage)) {
567
+ return undefined
568
+ }
569
+
570
+ // Clamped because the server clamps rather than rejects. The 100 short-circuit mirrors the
571
+ // server's is_in_rollout and skips a digest that cannot change the answer.
572
+ const percentage = Math.min(Math.max(rawPercentage, 0), 100)
573
+ if (percentage !== 100) {
574
+ const hash = await getFeatureFlagHash('holdout', bucketingValue, '', '-')
575
+ if (hash > percentage / 100) {
576
+ return undefined
577
+ }
578
+ }
579
+
580
+ return `holdout-${holdout.id}`
581
+ }
582
+
540
583
  export function getFeatureFlagVariantLookupTable(
541
584
  variants: readonly FeatureFlagVariant[]
542
585
  ): FeatureFlagVariantLookupEntry[] {
@@ -11,6 +11,7 @@ export {
11
11
  getFeatureFlagHash,
12
12
  getFeatureFlagVariant,
13
13
  getFeatureFlagVariantLookupTable,
14
+ getHoldoutVariant,
14
15
  hashSHA1,
15
16
  InconclusiveMatchError,
16
17
  matchFeatureFlagProperty,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/core",
3
- "version": "7.8.4",
3
+ "version": "7.8.6",
4
4
  "repository": "https://github.com/zuplo/zuplo",
5
5
  "author": "Zuplo, Inc.",
6
6
  "type": "module",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zuplo/graphql",
3
3
  "type": "module",
4
- "version": "7.8.4",
4
+ "version": "7.8.6",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",
7
7
  "exports": {
@@ -2,7 +2,7 @@
2
2
  "name": "@zuplo/openapi-tools",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "7.8.4",
5
+ "version": "7.8.6",
6
6
  "description": "Tooling for OpenAPI files",
7
7
  "repository": {
8
8
  "type": "git",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zuplo/otel",
3
3
  "type": "module",
4
- "version": "7.8.4",
4
+ "version": "7.8.6",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",
7
7
  "exports": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zuplo/runtime",
3
3
  "type": "module",
4
- "version": "7.8.4",
4
+ "version": "7.8.6",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",
7
7
  "exports": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/cli",
3
- "version": "7.8.4",
3
+ "version": "7.8.6",
4
4
  "repository": "https://github.com/zuplo/zuplo",
5
5
  "author": "Zuplo, Inc.",
6
6
  "type": "module",
@@ -28,10 +28,10 @@
28
28
  "@opentelemetry/api": "1.9.0",
29
29
  "@opentelemetry/api-logs": "0.220.0",
30
30
  "@swc/core": "1.10.18",
31
- "@zuplo/core": "7.8.4",
31
+ "@zuplo/core": "7.8.6",
32
32
  "@zuplo/editor": "1.0.33162667821",
33
- "@zuplo/openapi-tools": "7.8.4",
34
- "@zuplo/runtime": "7.8.4",
33
+ "@zuplo/openapi-tools": "7.8.6",
34
+ "@zuplo/runtime": "7.8.6",
35
35
  "chalk": "5.4.1",
36
36
  "chokidar": "3.5.3",
37
37
  "cookie": "1.0.2",
@@ -59,18 +59,18 @@
59
59
  "strip-ansi": "7.1.0",
60
60
  "tar": "7.5.22",
61
61
  "undici": "7.29.0",
62
- "workerd": "1.20241230.0",
62
+ "workerd": "1.20250821.0",
63
63
  "yargs": "17.7.2",
64
64
  "zod": "4.4.3",
65
- "@zuplo/graphql": "7.8.4",
66
- "@zuplo/otel": "7.8.4"
65
+ "@zuplo/graphql": "7.8.6",
66
+ "@zuplo/otel": "7.8.6"
67
67
  },
68
68
  "optionalDependencies": {
69
- "@zuplo/lint-darwin-arm64": "7.8.4",
70
- "@zuplo/lint-darwin-x64": "7.8.4",
71
- "@zuplo/lint-linux-x64": "7.8.4",
72
- "@zuplo/lint-linux-arm64": "7.8.4",
73
- "@zuplo/lint-win32-x64": "7.8.4"
69
+ "@zuplo/lint-darwin-arm64": "7.8.6",
70
+ "@zuplo/lint-darwin-x64": "7.8.6",
71
+ "@zuplo/lint-linux-x64": "7.8.6",
72
+ "@zuplo/lint-linux-arm64": "7.8.6",
73
+ "@zuplo/lint-win32-x64": "7.8.6"
74
74
  },
75
75
  "bundleDependencies": [
76
76
  "@inquirer/prompts",