@featurevisor/sdk 1.35.3 → 2.0.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.
Files changed (86) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +2 -381
  3. package/coverage/clover.xml +707 -645
  4. package/coverage/coverage-final.json +11 -9
  5. package/coverage/lcov-report/{segments.ts.html → bucketer.ts.html} +155 -77
  6. package/coverage/lcov-report/child.ts.html +940 -0
  7. package/coverage/lcov-report/conditions.ts.html +107 -158
  8. package/coverage/lcov-report/datafileReader.ts.html +763 -103
  9. package/coverage/lcov-report/emitter.ts.html +77 -59
  10. package/coverage/lcov-report/evaluate.ts.html +689 -416
  11. package/coverage/lcov-report/events.ts.html +334 -0
  12. package/coverage/lcov-report/helpers.ts.html +184 -0
  13. package/coverage/lcov-report/{bucket.ts.html → hooks.ts.html} +86 -239
  14. package/coverage/lcov-report/index.html +119 -89
  15. package/coverage/lcov-report/instance.ts.html +341 -773
  16. package/coverage/lcov-report/logger.ts.html +64 -64
  17. package/coverage/lcov.info +1433 -1226
  18. package/dist/bucketer.d.ts +11 -0
  19. package/dist/child.d.ts +26 -0
  20. package/dist/compareVersions.d.ts +4 -0
  21. package/dist/conditions.d.ts +4 -4
  22. package/dist/datafileReader.d.ts +26 -6
  23. package/dist/emitter.d.ts +8 -9
  24. package/dist/evaluate.d.ts +31 -29
  25. package/dist/events.d.ts +5 -0
  26. package/dist/helpers.d.ts +5 -0
  27. package/dist/hooks.d.ts +45 -0
  28. package/dist/index.d.ts +3 -2
  29. package/dist/index.js +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +1 -1
  32. package/dist/index.mjs.gz +0 -0
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/instance.d.ts +40 -72
  35. package/dist/logger.d.ts +6 -5
  36. package/dist/murmurhash.d.ts +1 -0
  37. package/jest.config.js +2 -0
  38. package/lib/bucketer.d.ts +11 -0
  39. package/lib/child.d.ts +26 -0
  40. package/lib/compareVersions.d.ts +4 -0
  41. package/lib/conditions.d.ts +4 -4
  42. package/lib/datafileReader.d.ts +26 -6
  43. package/lib/emitter.d.ts +8 -9
  44. package/lib/evaluate.d.ts +31 -29
  45. package/lib/events.d.ts +5 -0
  46. package/lib/helpers.d.ts +5 -0
  47. package/lib/hooks.d.ts +45 -0
  48. package/lib/index.d.ts +3 -2
  49. package/lib/instance.d.ts +40 -72
  50. package/lib/logger.d.ts +6 -5
  51. package/lib/murmurhash.d.ts +1 -0
  52. package/package.json +3 -5
  53. package/src/bucketer.spec.ts +165 -0
  54. package/src/bucketer.ts +84 -0
  55. package/src/child.spec.ts +267 -0
  56. package/src/child.ts +285 -0
  57. package/src/compareVersions.ts +93 -0
  58. package/src/conditions.spec.ts +563 -353
  59. package/src/conditions.ts +46 -63
  60. package/src/datafileReader.spec.ts +396 -84
  61. package/src/datafileReader.ts +280 -60
  62. package/src/emitter.spec.ts +27 -86
  63. package/src/emitter.ts +38 -32
  64. package/src/evaluate.ts +349 -258
  65. package/src/events.spec.ts +154 -0
  66. package/src/events.ts +83 -0
  67. package/src/helpers.ts +33 -0
  68. package/src/hooks.ts +88 -0
  69. package/src/index.ts +3 -2
  70. package/src/instance.spec.ts +305 -489
  71. package/src/instance.ts +247 -391
  72. package/src/logger.spec.ts +212 -134
  73. package/src/logger.ts +36 -36
  74. package/src/murmurhash.ts +71 -0
  75. package/coverage/lcov-report/feature.ts.html +0 -508
  76. package/dist/bucket.d.ts +0 -30
  77. package/dist/feature.d.ts +0 -16
  78. package/dist/segments.d.ts +0 -5
  79. package/lib/bucket.d.ts +0 -30
  80. package/lib/feature.d.ts +0 -16
  81. package/lib/segments.d.ts +0 -5
  82. package/src/bucket.spec.ts +0 -37
  83. package/src/bucket.ts +0 -139
  84. package/src/feature.ts +0 -141
  85. package/src/segments.spec.ts +0 -468
  86. package/src/segments.ts +0 -58
@@ -0,0 +1,11 @@
1
+ import type { BucketKey, Context, FeatureKey, BucketBy } from "@featurevisor/types";
2
+ import { Logger } from "./logger";
3
+ export declare const MAX_BUCKETED_NUMBER = 100000;
4
+ export declare function getBucketedNumber(bucketKey: string): number;
5
+ export interface GetBucketKeyOptions {
6
+ featureKey: FeatureKey;
7
+ bucketBy: BucketBy;
8
+ context: Context;
9
+ logger: Logger;
10
+ }
11
+ export declare function getBucketKey(options: GetBucketKeyOptions): BucketKey;
@@ -0,0 +1,26 @@
1
+ import type { Context, StickyFeatures, FeatureKey, VariationValue, VariableValue, EvaluatedFeatures } from "@featurevisor/types";
2
+ import { EventName, EventCallback } from "./emitter";
3
+ import type { OverrideOptions } from "./instance";
4
+ export declare class FeaturevisorChildInstance {
5
+ private parent;
6
+ private context;
7
+ private sticky;
8
+ private emitter;
9
+ constructor(options: any);
10
+ on(eventName: EventName, callback: EventCallback): () => void;
11
+ close(): void;
12
+ setContext(context: Context, replace?: boolean): void;
13
+ getContext(context?: Context): Context;
14
+ setSticky(sticky: StickyFeatures, replace?: boolean): void;
15
+ isEnabled(featureKey: FeatureKey, context?: Context, options?: OverrideOptions): boolean;
16
+ getVariation(featureKey: FeatureKey, context?: Context, options?: OverrideOptions): VariationValue | null;
17
+ getVariable(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): VariableValue | null;
18
+ getVariableBoolean(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): boolean | null;
19
+ getVariableString(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): string | null;
20
+ getVariableInteger(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): number | null;
21
+ getVariableDouble(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): number | null;
22
+ getVariableArray(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): string[] | null;
23
+ getVariableObject<T>(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): T | null;
24
+ getVariableJSON<T>(featureKey: FeatureKey, variableKey: string, context?: Context, options?: OverrideOptions): T | null;
25
+ getAllEvaluations(context?: Context, featureKeys?: string[], options?: OverrideOptions): EvaluatedFeatures;
26
+ }
@@ -0,0 +1,4 @@
1
+ export declare const semver: RegExp;
2
+ export declare const validateAndParse: (version: string) => RegExpMatchArray;
3
+ export declare const compareSegments: (a: string | string[] | RegExpMatchArray, b: string | string[] | RegExpMatchArray) => 0 | 1 | -1;
4
+ export declare const compareVersions: (v1: string, v2: string) => 0 | 1 | -1;
@@ -1,4 +1,4 @@
1
- import { Context, Condition, PlainCondition } from "@featurevisor/types";
2
- import { Logger } from "./logger";
3
- export declare function conditionIsMatched(condition: PlainCondition, context: Context): boolean;
4
- export declare function allConditionsAreMatched(conditions: Condition[] | Condition, context: Context, logger: Logger): boolean;
1
+ import type { Context, PlainCondition, AttributeValue } from "@featurevisor/types";
2
+ import { GetRegex } from "./datafileReader";
3
+ export declare function getValueFromContext(obj: any, path: any): AttributeValue;
4
+ export declare function conditionIsMatched(condition: PlainCondition, context: Context, getRegex: GetRegex): boolean;
@@ -1,16 +1,36 @@
1
- import { Feature, Segment, DatafileContentV1, DatafileContentV2, Attribute, AttributeKey, SegmentKey, FeatureKey } from "@featurevisor/types";
2
- export declare function parseJsonConditionsIfStringified<T>(record: T, key: string): T;
1
+ import type { Feature, Segment, DatafileContent, SegmentKey, FeatureKey, Context, Traffic, Allocation, GroupSegment, Condition, Force } from "@featurevisor/types";
2
+ import { Logger } from "./logger";
3
+ export type GetRegex = (regexString: string, regexFlags: string) => RegExp;
4
+ export interface DatafileReaderOptions {
5
+ datafile: DatafileContent;
6
+ logger: Logger;
7
+ }
8
+ export interface ForceResult {
9
+ force?: Force;
10
+ forceIndex?: number;
11
+ }
3
12
  export declare class DatafileReader {
4
13
  private schemaVersion;
5
14
  private revision;
6
- private attributes;
7
15
  private segments;
8
16
  private features;
9
- constructor(datafileJson: DatafileContentV1 | DatafileContentV2);
17
+ private logger;
18
+ private regexCache;
19
+ constructor(options: DatafileReaderOptions);
10
20
  getRevision(): string;
11
21
  getSchemaVersion(): string;
12
- getAllAttributes(): Attribute[];
13
- getAttribute(attributeKey: AttributeKey): Attribute | undefined;
14
22
  getSegment(segmentKey: SegmentKey): Segment | undefined;
23
+ getFeatureKeys(): string[];
15
24
  getFeature(featureKey: FeatureKey): Feature | undefined;
25
+ getVariableKeys(featureKey: FeatureKey): string[];
26
+ hasVariations(featureKey: FeatureKey): boolean;
27
+ getRegex(regexString: string, regexFlags?: string): RegExp;
28
+ allConditionsAreMatched(conditions: Condition[] | Condition, context: Context): boolean;
29
+ segmentIsMatched(segment: Segment, context: Context): boolean;
30
+ allSegmentsAreMatched(groupSegments: GroupSegment | GroupSegment[] | "*", context: Context): boolean;
31
+ getMatchedTraffic(traffic: Traffic[], context: Context): Traffic | undefined;
32
+ getMatchedAllocation(traffic: Traffic, bucketValue: number): Allocation | undefined;
33
+ getMatchedForce(featureKey: FeatureKey | Feature, context: Context): ForceResult;
34
+ parseConditionsIfStringified(conditions: Condition | Condition[]): Condition | Condition[];
35
+ parseSegmentsIfStringified(segments: GroupSegment | GroupSegment[]): GroupSegment | GroupSegment[];
16
36
  }
package/dist/emitter.d.ts CHANGED
@@ -1,12 +1,11 @@
1
- export type EventName = "ready" | "refresh" | "update" | "activation";
2
- export interface Listeners {
3
- [key: string]: Function[];
4
- }
1
+ export type EventName = "datafile_set" | "context_set" | "sticky_set";
2
+ export type EventDetails = Record<string, unknown>;
3
+ export type EventCallback = (details: EventDetails) => void;
4
+ export type Listeners = Record<EventName, EventCallback[]> | {};
5
5
  export declare class Emitter {
6
- private _listeners;
6
+ listeners: Listeners;
7
7
  constructor();
8
- addListener(eventName: EventName, fn: Function): void;
9
- removeListener(eventName: EventName, fn: Function): void;
10
- removeAllListeners(eventName?: EventName): void;
11
- emit(eventName: EventName, ...args: any[]): void;
8
+ on(eventName: EventName, callback: EventCallback): () => void;
9
+ trigger(eventName: EventName, details?: EventDetails): void;
10
+ clearAll(): void;
12
11
  }
@@ -1,26 +1,28 @@
1
- import { Feature, FeatureKey, Context, BucketKey, BucketValue, RuleKey, Traffic, Force, Required, OverrideFeature, Variation, VariationValue, VariableKey, VariableValue, VariableSchema, StickyFeatures, InitialFeatures } from "@featurevisor/types";
1
+ import type { FeatureKey, Context, BucketKey, BucketValue, RuleKey, Traffic, Force, Required, Variation, VariationValue, VariableKey, VariableValue, VariableSchema, EvaluatedFeature, StickyFeatures } from "@featurevisor/types";
2
2
  import { Logger } from "./logger";
3
+ import { HooksManager } from "./hooks";
3
4
  import { DatafileReader } from "./datafileReader";
4
- import { ConfigureBucketKey, ConfigureBucketValue } from "./bucket";
5
- import type { Statuses, InterceptContext } from "./instance";
6
5
  export declare enum EvaluationReason {
7
- NOT_FOUND = "not_found",
8
- NO_VARIATIONS = "no_variations",
9
- NO_MATCH = "no_match",
10
- DISABLED = "disabled",
11
- REQUIRED = "required",
12
- OUT_OF_RANGE = "out_of_range",
13
- FORCED = "forced",
14
- INITIAL = "initial",
15
- STICKY = "sticky",
16
- RULE = "rule",
17
- ALLOCATED = "allocated",
18
- DEFAULTED = "defaulted",
19
- OVERRIDE = "override",
6
+ FEATURE_NOT_FOUND = "feature_not_found",// feature is not found in datafile
7
+ DISABLED = "disabled",// feature is disabled
8
+ REQUIRED = "required",// required features are not enabled
9
+ OUT_OF_RANGE = "out_of_range",// out of range when mutually exclusive experiments are involved via Groups
10
+ NO_VARIATIONS = "no_variations",// feature has no variations
11
+ VARIATION_DISABLED = "variation_disabled",// feature is disabled, and variation's disabledVariationValue is used
12
+ VARIABLE_NOT_FOUND = "variable_not_found",// variable's schema is not defined in the feature
13
+ VARIABLE_DEFAULT = "variable_default",// default variable value used
14
+ VARIABLE_DISABLED = "variable_disabled",// feature is disabled, and variable's disabledValue is used
15
+ VARIABLE_OVERRIDE = "variable_override",// variable overridden from inside a variation
16
+ NO_MATCH = "no_match",// no rules matched
17
+ FORCED = "forced",// against a forced rule
18
+ STICKY = "sticky",// against a sticky feature
19
+ RULE = "rule",// against a regular rule
20
+ ALLOCATED = "allocated",// regular allocation based on bucketing
20
21
  ERROR = "error"
21
22
  }
22
23
  type EvaluationType = "flag" | "variation" | "variable";
23
24
  export interface Evaluation {
25
+ type: EvaluationType;
24
26
  featureKey: FeatureKey;
25
27
  reason: EvaluationReason;
26
28
  bucketKey?: BucketKey;
@@ -32,28 +34,28 @@ export interface Evaluation {
32
34
  forceIndex?: number;
33
35
  force?: Force;
34
36
  required?: Required[];
35
- sticky?: OverrideFeature;
36
- initial?: OverrideFeature;
37
+ sticky?: EvaluatedFeature;
37
38
  variation?: Variation;
38
39
  variationValue?: VariationValue;
39
40
  variableKey?: VariableKey;
40
41
  variableValue?: VariableValue;
41
42
  variableSchema?: VariableSchema;
42
43
  }
43
- export interface EvaluateOptions {
44
- type: EvaluationType;
45
- featureKey: FeatureKey | Feature;
46
- variableKey?: VariableKey;
44
+ export interface EvaluateDependencies {
47
45
  context: Context;
48
46
  logger: Logger;
47
+ hooksManager: HooksManager;
49
48
  datafileReader: DatafileReader;
50
- statuses?: Statuses;
51
- interceptContext?: InterceptContext;
52
- stickyFeatures?: StickyFeatures;
53
- initialFeatures?: InitialFeatures;
54
- bucketKeySeparator?: string;
55
- configureBucketKey?: ConfigureBucketKey;
56
- configureBucketValue?: ConfigureBucketValue;
49
+ sticky?: StickyFeatures;
50
+ defaultVariationValue?: VariationValue;
51
+ defaultVariableValue?: VariableValue;
52
+ }
53
+ export interface EvaluateParams {
54
+ type: EvaluationType;
55
+ featureKey: FeatureKey;
56
+ variableKey?: VariableKey;
57
57
  }
58
+ export type EvaluateOptions = EvaluateParams & EvaluateDependencies;
59
+ export declare function evaluateWithHooks(opts: EvaluateOptions): Evaluation;
58
60
  export declare function evaluate(options: EvaluateOptions): Evaluation;
59
61
  export {};
@@ -0,0 +1,5 @@
1
+ import type { StickyFeatures } from "@featurevisor/types";
2
+ import type { EventDetails } from "./emitter";
3
+ import type { DatafileReader } from "./datafileReader";
4
+ export declare function getParamsForStickySetEvent(previousStickyFeatures: StickyFeatures, newStickyFeatures: StickyFeatures, replace: any): EventDetails;
5
+ export declare function getParamsForDatafileSetEvent(previousDatafileReader: DatafileReader, newDatafileReader: DatafileReader): EventDetails;
@@ -0,0 +1,5 @@
1
+ import type { VariableType, VariableValue } from "@featurevisor/types";
2
+ type FieldType = string | VariableType;
3
+ type ValueType = VariableValue;
4
+ export declare function getValueByType(value: ValueType, fieldType: FieldType): ValueType;
5
+ export {};
@@ -0,0 +1,45 @@
1
+ import type { BucketBy, BucketKey, BucketValue, Context, FeatureKey } from "@featurevisor/types";
2
+ import type { EvaluateOptions, Evaluation } from "./evaluate";
3
+ import type { Logger } from "./logger";
4
+ /**
5
+ * bucketKey
6
+ */
7
+ export interface ConfigureBucketKeyOptions {
8
+ featureKey: FeatureKey;
9
+ context: Context;
10
+ bucketBy: BucketBy;
11
+ bucketKey: string;
12
+ }
13
+ export type ConfigureBucketKey = (options: ConfigureBucketKeyOptions) => BucketKey;
14
+ /**
15
+ * bucketValue
16
+ */
17
+ export interface ConfigureBucketValueOptions {
18
+ featureKey: FeatureKey;
19
+ bucketKey: string;
20
+ context: Context;
21
+ bucketValue: number;
22
+ }
23
+ export type ConfigureBucketValue = (options: ConfigureBucketValueOptions) => BucketValue;
24
+ /**
25
+ * Hooks
26
+ */
27
+ export interface Hook {
28
+ name: string;
29
+ before?: (options: EvaluateOptions) => EvaluateOptions;
30
+ bucketKey?: ConfigureBucketKey;
31
+ bucketValue?: ConfigureBucketValue;
32
+ after?: (evaluation: Evaluation, options: EvaluateOptions) => Evaluation;
33
+ }
34
+ export interface HooksManagerOptions {
35
+ hooks?: Hook[];
36
+ logger: Logger;
37
+ }
38
+ export declare class HooksManager {
39
+ private hooks;
40
+ private logger;
41
+ constructor(options: HooksManagerOptions);
42
+ add(hook: Hook): (() => void) | undefined;
43
+ remove(name: string): void;
44
+ getAll(): Hook[];
45
+ }
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export * from "./bucket";
1
+ export * from "./bucketer";
2
2
  export * from "./instance";
3
3
  export * from "./logger";
4
4
  export * from "./conditions";
5
- export * from "./emitter";
6
5
  export * from "./evaluate";
6
+ export * from "./datafileReader";
7
+ export * from "./child";
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FeaturevisorSDK=t():e.FeaturevisorSDK=t()}(this,(()=>(()=>{var e={393:(e,t,r)=>{"use strict";r.r(t),r.d(t,{compare:()=>n,compareVersions:()=>i,satisfies:()=>o,validate:()=>a});const i=(e,t)=>{const r=u(e),i=u(t),a=r.pop(),n=i.pop(),o=d(r,i);return 0!==o?o:a&&n?d(a.split("."),n.split(".")):a||n?a?-1:1:0},a=e=>"string"==typeof e&&/^[v\d]/.test(e)&&s.test(e),n=(e,t,r)=>{g(r);const a=i(e,t);return v[r].includes(a)},o=(e,t)=>{if(t.includes("||"))return t.split("||").some((t=>o(e,t)));if(t.includes(" "))return t.trim().replace(/\s{2,}/g," ").split(" ").every((t=>o(e,t)));const r=t.match(/^([<>=~^]+)/),i=r?r[1]:"=";if("^"!==i&&"~"!==i)return n(e,t,i);const[a,s,f,,c]=u(e),[l,v,y,,g]=u(t),h=[a,s,f],b=[l,null!=v?v:"x",null!=y?y:"x"];if(g){if(!c)return!1;if(0!==d(h,b))return!1;if(-1===d(c.split("."),g.split(".")))return!1}const p=b.findIndex((e=>"0"!==e))+1,k="~"===i?2:p>1?p:1;return 0===d(h.slice(0,k),b.slice(0,k))&&-1!==d(h.slice(k),b.slice(k))},s=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,u=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(s);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},f=e=>"*"===e||"x"===e||"X"===e,c=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},l=(e,t)=>{if(f(e)||f(t))return 0;const[r,i]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(c(e),c(t));return r>i?1:r<i?-1:0},d=(e,t)=>{for(let r=0;r<Math.max(e.length,t.length);r++){const i=l(e[r]||"0",t[r]||"0");if(0!==i)return i}return 0},v={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},y=Object.keys(v),g=e=>{if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===y.indexOf(e))throw new Error(`Invalid operator, expected one of ${y.join("|")}`)}},784:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,a,n,o,s,u,f,c;for("string"==typeof e&&(e=t(e)),i=3&e.length,a=e.length-i,n=r,s=3432918353,u=461845907,c=0;c<a;)f=255&e[c]|(255&e[++c])<<8|(255&e[++c])<<16|(255&e[++c])<<24,++c,f=(65535&f)*s+(((f>>>16)*s&65535)<<16)&4294967295,f=f<<15|f>>>17,f=(65535&f)*u+(((f>>>16)*u&65535)<<16)&4294967295,n^=f,n=n<<13|n>>>19,o=5*(65535&n)+((5*(n>>>16)&65535)<<16)&4294967295,n=27492+(65535&o)+((58964+(o>>>16)&65535)<<16);switch(f=0,i){case 3:f^=(255&e[c+2])<<16;case 2:f^=(255&e[c+1])<<8;case 1:f^=255&e[c],f=(65535&f)*s+(((f>>>16)*s&65535)<<16)&4294967295,f=f<<15|f>>>17,f=(65535&f)*u+(((f>>>16)*u&65535)<<16)&4294967295,n^=f}return n^=e.length,n^=n>>>16,n=2246822507*(65535&n)+((2246822507*(n>>>16)&65535)<<16)&4294967295,n^=n>>>13,n=3266489909*(65535&n)+((3266489909*(n>>>16)&65535)<<16)&4294967295,n^=n>>>16,n>>>0}const i=r;i.v2=function(e,r){"string"==typeof e&&(e=t(e));let i,a=e.length,n=r^a,o=0;for(;a>=4;)i=255&e[o]|(255&e[++o])<<8|(255&e[++o])<<16|(255&e[++o])<<24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),i^=i>>>24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16)^i,a-=4,++o;switch(a){case 3:n^=(255&e[o+2])<<16;case 2:n^=(255&e[o+1])<<8;case 1:n^=255&e[o],n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16)}return n^=n>>>13,n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16),n^=n>>>15,n>>>0},i.v3=r,e.exports=i}()},906:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MAX_BUCKETED_NUMBER=void 0,t.getBucketedNumber=o,t.getBucketKey=s,t.getBucket=function(e){var t=e.feature,r=e.context,i=e.logger,a=e.bucketKeySeparator,n=e.configureBucketKey,u=e.configureBucketValue,f=s({feature:t,context:r,logger:i,bucketKeySeparator:a,configureBucketKey:n}),c=o(f);return u?{bucketKey:f,bucketValue:u(t,r,c)}:{bucketKey:f,bucketValue:c}};var i=r(784),a=1,n=Math.pow(2,32);function o(e){var r=i.v3(e,a)/n;return Math.floor(r*t.MAX_BUCKETED_NUMBER)}function s(e){var t,r,i=e.feature,a=e.context,n=e.logger,o=e.bucketKeySeparator,s=void 0===o?".":o,u=e.configureBucketKey,f=i.key;if("string"==typeof i.bucketBy)t="plain",r=[i.bucketBy];else if(Array.isArray(i.bucketBy))t="and",r=i.bucketBy;else{if("object"!=typeof i.bucketBy||!Array.isArray(i.bucketBy.or))throw n.error("invalid bucketBy",{featureKey:f,bucketBy:i.bucketBy}),new Error("invalid bucketBy");t="or",r=i.bucketBy.or}var c=[];r.forEach((function(e){var r=a[e];void 0!==r&&("plain"===t||"and"===t||0===c.length)&&c.push(r)})),c.push(f);var l=c.join(s);return u?u(i,a,l):l}t.MAX_BUCKETED_NUMBER=1e5},186:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conditionIsMatched=a,t.allConditionsAreMatched=function e(t,r,i){if("attribute"in t)try{return a(t,r)}catch(e){return i.warn(e.message,{error:e,details:{condition:t,context:r}}),!1}return"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,r,i)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,r,i)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(){return!1===e({and:t.not},r,i)})):!!Array.isArray(t)&&t.every((function(t){return e(t,r,i)}))};var i=r(393);function a(e,t){var r=e.attribute,a=e.operator,n=e.value;if("equals"===a)return t[r]===n;if("notEquals"===a)return t[r]!==n;if("before"===a||"after"===a){var o=(u=t[r])instanceof Date?u:new Date(u),s=n instanceof Date?n:new Date(n);return"before"===a?o<s:o>s}if(!Array.isArray(n)||-1===["string","number"].indexOf(typeof t[r])&&null!==t[r]){if("string"==typeof t[r]&&"string"==typeof n){if(u=t[r],"contains"===a)return-1!==u.indexOf(n);if("notContains"===a)return-1===u.indexOf(n);if("startsWith"===a)return u.startsWith(n);if("endsWith"===a)return u.endsWith(n);if("semverEquals"===a)return 0===(0,i.compareVersions)(u,n);if("semverNotEquals"===a)return 0!==(0,i.compareVersions)(u,n);if("semverGreaterThan"===a)return 1===(0,i.compareVersions)(u,n);if("semverGreaterThanOrEquals"===a)return(0,i.compareVersions)(u,n)>=0;if("semverLessThan"===a)return-1===(0,i.compareVersions)(u,n);if("semverLessThanOrEquals"===a)return(0,i.compareVersions)(u,n)<=0}else if("number"==typeof t[r]&&"number"==typeof n){if(u=t[r],"greaterThan"===a)return u>n;if("greaterThanOrEquals"===a)return u>=n;if("lessThan"===a)return u<n;if("lessThanOrEquals"===a)return u<=n}}else{var u=t[r];if("in"===a)return-1!==n.indexOf(u);if("notIn"===a)return-1===n.indexOf(u)}return!1}},649:(e,t)=>{"use strict";function r(e,t){if("string"==typeof e[t]&&"*"!==e[t])try{e[t]=JSON.parse(e[t])}catch(e){console.error("Error parsing JSON",e)}return e}Object.defineProperty(t,"__esModule",{value:!0}),t.DatafileReader=void 0,t.parseJsonConditionsIfStringified=r;var i=function(){function e(e){var t=this;if(this.schemaVersion=e.schemaVersion,this.revision=e.revision,"2"===this.schemaVersion){var r=e;this.attributes=r.attributes,this.segments=r.segments,this.features=r.features}else{var i=e;this.attributes={},i.attributes.forEach((function(e){t.attributes[e.key]=e})),this.segments={},i.segments.forEach((function(e){t.segments[e.key]=e})),this.features={},i.features.forEach((function(e){Array.isArray(e.variablesSchema)&&(e.variablesSchema=e.variablesSchema.reduce((function(e,t){return e[t.key]=t,e}),{})),t.features[e.key]=e}))}}return e.prototype.getRevision=function(){return this.revision},e.prototype.getSchemaVersion=function(){return this.schemaVersion},e.prototype.getAllAttributes=function(){var e=this,t=[];return Object.keys(this.attributes).forEach((function(r){t.push(e.attributes[r])})),t},e.prototype.getAttribute=function(e){return this.attributes[e]},e.prototype.getSegment=function(e){var t=this.segments[e];if(t)return r(t,"conditions")},e.prototype.getFeature=function(e){return this.features[e]},e}();t.DatafileReader=i},40:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=void 0;var r=function(){function e(){this._listeners={}}return e.prototype.addListener=function(e,t){void 0===this._listeners[e]&&(this._listeners[e]=[]),this._listeners[e].push(t)},e.prototype.removeListener=function(e,t){if(void 0!==this._listeners[e]){var r=this._listeners[e].indexOf(t);-1!==r&&this._listeners[e].splice(r,1)}},e.prototype.removeAllListeners=function(e){var t=this;e?this._listeners[e]=[]:Object.keys(this._listeners).forEach((function(e){t._listeners[e]=[]}))},e.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];void 0!==this._listeners[e]&&this._listeners[e].forEach((function(e){e.apply(void 0,t)}))},e}();t.Emitter=r},335:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EvaluationReason=void 0,t.evaluate=function e(t){var r,u=t.type,f=t.featureKey,c=t.variableKey,l=t.context,d=t.logger,v=t.datafileReader,y=t.statuses,g=t.stickyFeatures,h=t.initialFeatures,b=t.interceptContext,p=t.bucketKeySeparator,k=t.configureBucketKey,m=t.configureBucketValue;try{var K="string"==typeof f?f:f.key;if("flag"!==u&&!1===e({type:"flag",featureKey:K,context:l,logger:d,datafileReader:v,statuses:y,stickyFeatures:g,initialFeatures:h,bucketKeySeparator:p,configureBucketKey:k,configureBucketValue:m}).enabled)return r={featureKey:K,reason:i.DISABLED},d.debug("feature is disabled",r),r;if(g&&g[K]){if("flag"===u&&void 0!==g[K].enabled)return r={featureKey:K,reason:i.STICKY,sticky:g[K],enabled:g[K].enabled},d.debug("using sticky enabled",r),r;if("variation"===u&&void 0!==(A=g[K].variation))return r={featureKey:K,reason:i.STICKY,variationValue:A},d.debug("using sticky variation",r),r;if(c&&(O=g[K].variables)){var V=O[c];if(void 0!==V)return r={featureKey:K,reason:i.STICKY,variableKey:c,variableValue:V},d.debug("using sticky variable",r),r}}if(y&&!y.ready&&h&&h[K]){if("flag"===u&&void 0!==h[K].enabled)return r={featureKey:K,reason:i.INITIAL,initial:h[K],enabled:h[K].enabled},d.debug("using initial enabled",r),r;if("variation"===u&&void 0!==h[K].variation){var A=h[K].variation;return r={featureKey:K,reason:i.INITIAL,variationValue:A},d.debug("using initial variation",r),r}var O;if(c&&(O=h[K].variables)&&void 0!==O[c])return r={featureKey:K,reason:i.INITIAL,variableKey:c,variableValue:O[c]},d.debug("using initial variable",r),r}var E="string"==typeof f?v.getFeature(f):f;if(!E)return r={featureKey:K,reason:i.NOT_FOUND},d.warn("feature not found",r),r;"flag"===u&&E.deprecated&&d.warn("feature is deprecated",{featureKey:E.key});var S=void 0;if(c){if(E.variablesSchema&&E.variablesSchema[c]&&(S=E.variablesSchema[c]),!S)return r={featureKey:K,reason:i.NOT_FOUND,variableKey:c},d.warn("variable schema not found",r),r;S.deprecated&&d.warn("variable is deprecated",{featureKey:E.key,variableKey:c})}if("variation"===u&&(!E.variations||0===E.variations.length))return r={featureKey:K,reason:i.NO_VARIATIONS},d.warn("no variations",r),r;var x=b?b(l):l,I=(0,n.findForceFromFeature)(E,l,v,d),R=I.force,_=I.forceIndex;if(R){if("flag"===u&&void 0!==R.enabled)return r={featureKey:E.key,reason:i.FORCED,forceIndex:_,force:R,enabled:R.enabled},d.debug("forced enabled found",r),r;if("variation"===u&&R.variation&&E.variations&&(C=E.variations.find((function(e){return e.value===R.variation}))))return r={featureKey:E.key,reason:i.FORCED,forceIndex:_,force:R,variation:C},d.debug("forced variation found",r),r;if(c&&R.variables&&void 0!==R.variables[c])return r={featureKey:E.key,reason:i.FORCED,forceIndex:_,force:R,variableKey:c,variableSchema:S,variableValue:R.variables[c]},d.debug("forced variable",r),r}if("flag"===u&&E.required&&E.required.length>0){var F=E.required.every((function(t){var r,i;if("string"==typeof t?r=t:(r=t.key,i=t.variation),!e({type:"flag",featureKey:r,context:x,logger:d,datafileReader:v,statuses:y,stickyFeatures:g,initialFeatures:h,bucketKeySeparator:p,configureBucketKey:k,configureBucketValue:m}).enabled)return!1;if(void 0!==i){var a=e({type:"variation",featureKey:r,context:x,logger:d,datafileReader:v,statuses:y,stickyFeatures:g,initialFeatures:h,bucketKeySeparator:p,configureBucketKey:k,configureBucketValue:m}),n=void 0;return a.variationValue?n=a.variationValue:a.variation&&(n=a.variation.value),n===i}return!0}));if(!F)return r={featureKey:E.key,reason:i.REQUIRED,required:E.required,enabled:F},d.debug("required features not enabled",r),r}var B,L,T=(0,a.getBucket)({feature:E,context:x,logger:d,bucketKeySeparator:p,configureBucketKey:k,configureBucketValue:m}),D=T.bucketKey,w=T.bucketValue;if("flag"!==u){var M=(0,n.getMatchedTrafficAndAllocation)(E.traffic,x,w,v,d);B=M.matchedTraffic,L=M.matchedAllocation}else B=(0,n.getMatchedTraffic)(E.traffic,x,v,d);if(B){if("flag"===u){if(E.ranges&&E.ranges.length>0)return E.ranges.find((function(e){return w>=e[0]&&w<e[1]}))?(r={featureKey:E.key,reason:i.ALLOCATED,bucketKey:D,bucketValue:w,ruleKey:B.key,traffic:B,enabled:void 0===B.enabled||B.enabled},d.debug("matched",r),r):(r={featureKey:E.key,reason:i.OUT_OF_RANGE,bucketKey:D,bucketValue:w,enabled:!1},d.debug("not matched",r),r);if(void 0!==B.enabled)return r={featureKey:E.key,reason:i.OVERRIDE,bucketKey:D,bucketValue:w,ruleKey:B.key,traffic:B,enabled:B.enabled},d.debug("override from rule",r),r;if(w<=B.percentage)return r={featureKey:E.key,reason:i.RULE,bucketKey:D,bucketValue:w,ruleKey:B.key,traffic:B,enabled:!0},d.debug("matched traffic",r),r}if("variation"===u&&E.variations){if(B.variation&&(C=E.variations.find((function(e){return e.value===B.variation}))))return r={featureKey:E.key,reason:i.RULE,bucketKey:D,bucketValue:w,ruleKey:B.key,traffic:B,variation:C},d.debug("override from rule",r),r;if(L&&L.variation&&(C=E.variations.find((function(e){return e.value===L.variation}))))return r={featureKey:E.key,reason:i.ALLOCATED,bucketKey:D,bucketValue:w,ruleKey:B.key,traffic:B,variation:C},d.debug("allocated variation",r),r}}if("variable"===u&&c){if(B&&B.variables&&void 0!==B.variables[c])return r={featureKey:E.key,reason:i.RULE,bucketKey:D,bucketValue:w,ruleKey:B.key,traffic:B,variableKey:c,variableSchema:S,variableValue:B.variables[c]},d.debug("override from rule",r),r;var j,C;if(R&&R.variation?j=R.variation:B&&B.variation?j=B.variation:L&&L.variation&&(j=L.variation),j&&Array.isArray(E.variations)&&(C=E.variations.find((function(e){return e.value===j})))&&C.variables){var N=C.variables.find((function(e){return e.key===c}));if(N){if(N.overrides){var U=N.overrides.find((function(e){return e.conditions?(0,o.allConditionsAreMatched)("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,x,d):!!e.segments&&(0,s.allGroupSegmentsAreMatched)((0,n.parseFromStringifiedSegments)(e.segments),x,v,d)}));if(U)return r={featureKey:E.key,reason:i.OVERRIDE,bucketKey:D,bucketValue:w,ruleKey:null==B?void 0:B.key,traffic:B,variableKey:c,variableSchema:S,variableValue:U.value},d.debug("variable override",r),r}if(void 0!==N.value)return r={featureKey:E.key,reason:i.ALLOCATED,bucketKey:D,bucketValue:w,ruleKey:null==B?void 0:B.key,traffic:B,variableKey:c,variableSchema:S,variableValue:N.value},d.debug("allocated variable",r),r}}}return"variation"===u?(r={featureKey:E.key,reason:i.NO_MATCH,bucketKey:D,bucketValue:w},d.debug("no matched variation",r),r):"variable"===u&&S?(r={featureKey:E.key,reason:i.DEFAULTED,bucketKey:D,bucketValue:w,variableKey:c,variableSchema:S,variableValue:S.defaultValue},d.debug("using default value",r),r):(r={featureKey:E.key,reason:i.NO_MATCH,bucketKey:D,bucketValue:w,enabled:!1},d.debug("nothing matched",r),r)}catch(e){return r={featureKey:"string"==typeof f?f:f.key,reason:i.ERROR,error:e},d.error("error",r),r}};var i,a=r(906),n=r(512),o=r(186),s=r(826);!function(e){e.NOT_FOUND="not_found",e.NO_VARIATIONS="no_variations",e.NO_MATCH="no_match",e.DISABLED="disabled",e.REQUIRED="required",e.OUT_OF_RANGE="out_of_range",e.FORCED="forced",e.INITIAL="initial",e.STICKY="sticky",e.RULE="rule",e.ALLOCATED="allocated",e.DEFAULTED="defaulted",e.OVERRIDE="override",e.ERROR="error"}(i||(t.EvaluationReason=i={}))},512:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getMatchedAllocation=n,t.parseFromStringifiedSegments=o,t.getMatchedTraffic=function(e,t,r,a){var n=e.find((function(e){return!!(0,i.allGroupSegmentsAreMatched)(o(e.segments),t,r,a)}));if(n&&n.percentage>0)return n},t.getMatchedTrafficAndAllocation=function(e,t,r,a,s){var u=e.find((function(e){return(0,i.allGroupSegmentsAreMatched)(o(e.segments),t,a,s)}));return u?{matchedTraffic:u,matchedAllocation:n(u,r)}:{matchedTraffic:void 0,matchedAllocation:void 0}},t.findForceFromFeature=function(e,t,r,n){var o={force:void 0,forceIndex:void 0};if(!e.force)return o;for(var s=0;s<e.force.length;s++){var u=e.force[s];if(u.conditions&&(0,a.allConditionsAreMatched)(u.conditions,t,n)){o.force=u,o.forceIndex=s;break}if(u.segments&&(0,i.allGroupSegmentsAreMatched)(u.segments,t,r,n)){o.force=u,o.forceIndex=s;break}}return o};var i=r(826),a=r(186);function n(e,t){if(e.allocation)for(var r=0,i=e.allocation;r<i.length;r++){var a=i[r],n=a.range,o=n[0],s=n[1];if(a.range&&o<=t&&s>=t)return a}}function o(e){return"string"==typeof e&&(e.startsWith("{")||e.startsWith("["))?JSON.parse(e):e}},166:function(e,t,r){"use strict";var i=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var a=Object.getOwnPropertyDescriptor(t,r);a&&!("get"in a?!t.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,a)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),a=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||i(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),a(r(906),t),a(r(247),t),a(r(584),t),a(r(186),t),a(r(40),t),a(r(335),t)},247:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FeaturevisorInstance=void 0,t.getValueByType=f,t.createInstance=function(e){return new c(e)};var i=r(584),a=r(649),n=r(40),o=r(335),s={schemaVersion:"1",revision:"unknown",attributes:[],segments:[],features:[]};function u(e,t){return t?t(e):fetch(e).then((function(e){return e.json()}))}function f(e,t){try{if(void 0===e)return;switch(t){case"string":return"string"==typeof e?e:void 0;case"integer":return parseInt(e,10);case"double":return parseFloat(e);case"boolean":return!0===e;case"array":return Array.isArray(e)?e:void 0;case"object":return"object"==typeof e?e:void 0;default:return e}}catch(e){return}}var c=function(){function e(e){var t=this;this.bucketKeySeparator=e.bucketKeySeparator||".",this.configureBucketKey=e.configureBucketKey,this.configureBucketValue=e.configureBucketValue,this.datafileUrl=e.datafileUrl,this.handleDatafileFetch=e.handleDatafileFetch,this.initialFeatures=e.initialFeatures,this.interceptContext=e.interceptContext,this.logger=e.logger||(0,i.createLogger)(),this.refreshInterval=e.refreshInterval,this.stickyFeatures=e.stickyFeatures,this.emitter=new n.Emitter,this.statuses={ready:!1,refreshInProgress:!1},e.onReady&&this.emitter.addListener("ready",e.onReady),e.onRefresh&&this.emitter.addListener("refresh",e.onRefresh),e.onUpdate&&this.emitter.addListener("update",e.onUpdate),e.onActivation&&this.emitter.addListener("activation",e.onActivation);var r=this.emitter.addListener.bind(this.emitter);this.on=r,this.addListener=r;var a=this.emitter.removeListener.bind(this.emitter);if(this.off=a,this.removeListener=a,this.removeAllListeners=this.emitter.removeAllListeners.bind(this.emitter),e.datafileUrl)this.setDatafile(e.datafile||s),u(e.datafileUrl,e.handleDatafileFetch).then((function(e){t.setDatafile(e),t.statuses.ready=!0,t.emitter.emit("ready"),t.refreshInterval&&t.startRefreshing()})).catch((function(e){t.logger.error("failed to fetch datafile",{error:e})}));else{if(!e.datafile)throw new Error("Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options");this.setDatafile(e.datafile),this.statuses.ready=!0,setTimeout((function(){t.emitter.emit("ready")}),0)}}return e.prototype.setLogLevels=function(e){this.logger.setLevels(e)},e.prototype.onReady=function(){var e=this;return new Promise((function(t){if(e.statuses.ready)return t(e);var r=function(){e.emitter.removeListener("ready",r),t(e)};e.emitter.addListener("ready",r)}))},e.prototype.setDatafile=function(e){try{this.datafileReader=new a.DatafileReader("string"==typeof e?JSON.parse(e):e)}catch(e){this.logger.error("could not parse datafile",{error:e})}},e.prototype.setStickyFeatures=function(e){this.stickyFeatures=e},e.prototype.getRevision=function(){return this.datafileReader.getRevision()},e.prototype.getFeature=function(e){return"string"==typeof e?this.datafileReader.getFeature(e):e},e.prototype.isReady=function(){return this.statuses.ready},e.prototype.refresh=function(){var e=this;return this.logger.debug("refreshing datafile"),this.statuses.refreshInProgress?this.logger.warn("refresh in progress, skipping"):this.datafileUrl?(this.statuses.refreshInProgress=!0,void u(this.datafileUrl,this.handleDatafileFetch).then((function(t){var r=e.getRevision()!==t.revision;e.setDatafile(t),e.logger.info("refreshed datafile"),e.emitter.emit("refresh"),r&&e.emitter.emit("update"),e.statuses.refreshInProgress=!1})).catch((function(t){e.logger.error("failed to refresh datafile",{error:t}),e.statuses.refreshInProgress=!1}))):this.logger.error("cannot refresh since `datafileUrl` is not provided")},e.prototype.startRefreshing=function(){var e=this;return this.datafileUrl?this.intervalId?this.logger.warn("refreshing has already started"):this.refreshInterval?void(this.intervalId=setInterval((function(){e.refresh()}),1e3*this.refreshInterval)):this.logger.warn("no `refreshInterval` option provided"):this.logger.error("cannot start refreshing since `datafileUrl` is not provided")},e.prototype.stopRefreshing=function(){if(!this.intervalId)return this.logger.warn("refreshing has not started yet");clearInterval(this.intervalId)},e.prototype.evaluateFlag=function(e,t){return void 0===t&&(t={}),(0,o.evaluate)({type:"flag",featureKey:e,context:t,logger:this.logger,datafileReader:this.datafileReader,statuses:this.statuses,interceptContext:this.interceptContext,stickyFeatures:this.stickyFeatures,initialFeatures:this.initialFeatures,bucketKeySeparator:this.bucketKeySeparator,configureBucketKey:this.configureBucketKey,configureBucketValue:this.configureBucketValue})},e.prototype.isEnabled=function(e,t){void 0===t&&(t={});try{return!0===this.evaluateFlag(e,t).enabled}catch(t){return this.logger.error("isEnabled",{featureKey:e,error:t}),!1}},e.prototype.evaluateVariation=function(e,t){return void 0===t&&(t={}),(0,o.evaluate)({type:"variation",featureKey:e,context:t,logger:this.logger,datafileReader:this.datafileReader,statuses:this.statuses,interceptContext:this.interceptContext,stickyFeatures:this.stickyFeatures,initialFeatures:this.initialFeatures,bucketKeySeparator:this.bucketKeySeparator,configureBucketKey:this.configureBucketKey,configureBucketValue:this.configureBucketValue})},e.prototype.getVariation=function(e,t){void 0===t&&(t={});try{var r=this.evaluateVariation(e,t);return void 0!==r.variationValue?r.variationValue:r.variation?r.variation.value:void 0}catch(t){return void this.logger.error("getVariation",{featureKey:e,error:t})}},e.prototype.activate=function(e,t){void 0===t&&(t={});try{var r=this.evaluateVariation(e,t),i=r.variation?r.variation.value:r.variationValue;if(void 0===i)return;var a=this.interceptContext?this.interceptContext(t):t,n={};return this.datafileReader.getAllAttributes().filter((function(e){return!0===e.capture})).forEach((function(e){void 0!==a[e.key]&&(n[e.key]=t[e.key])})),this.emitter.emit("activation",e,i,a,n,r),i}catch(t){return void this.logger.error("activate",{featureKey:e,error:t})}},e.prototype.evaluateVariable=function(e,t,r){return void 0===r&&(r={}),(0,o.evaluate)({type:"variable",featureKey:e,variableKey:t,context:r,logger:this.logger,datafileReader:this.datafileReader,statuses:this.statuses,interceptContext:this.interceptContext,stickyFeatures:this.stickyFeatures,initialFeatures:this.initialFeatures,bucketKeySeparator:this.bucketKeySeparator,configureBucketKey:this.configureBucketKey,configureBucketValue:this.configureBucketValue})},e.prototype.getVariable=function(e,t,r){void 0===r&&(r={});try{var i=this.evaluateVariable(e,t,r);return void 0!==i.variableValue?i.variableSchema&&"json"===i.variableSchema.type&&"string"==typeof i.variableValue?JSON.parse(i.variableValue):i.variableValue:void 0}catch(r){return void this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r})}},e.prototype.getVariableBoolean=function(e,t,r){return void 0===r&&(r={}),f(this.getVariable(e,t,r),"boolean")},e.prototype.getVariableString=function(e,t,r){return void 0===r&&(r={}),f(this.getVariable(e,t,r),"string")},e.prototype.getVariableInteger=function(e,t,r){return void 0===r&&(r={}),f(this.getVariable(e,t,r),"integer")},e.prototype.getVariableDouble=function(e,t,r){return void 0===r&&(r={}),f(this.getVariable(e,t,r),"double")},e.prototype.getVariableArray=function(e,t,r){return void 0===r&&(r={}),f(this.getVariable(e,t,r),"array")},e.prototype.getVariableObject=function(e,t,r){return void 0===r&&(r={}),f(this.getVariable(e,t,r),"object")},e.prototype.getVariableJSON=function(e,t,r){return void 0===r&&(r={}),f(this.getVariable(e,t,r),"json")},e}();t.FeaturevisorInstance=c},584:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=t.defaultLogHandler=t.defaultLogLevels=t.loggerPrefix=void 0,t.createLogger=function(e){void 0===e&&(e={});var i=e.levels||t.defaultLogLevels,a=e.handler||t.defaultLogHandler;return new r({levels:i,handler:a})},t.loggerPrefix="[Featurevisor]",t.defaultLogLevels=["warn","error"],t.defaultLogHandler=function(e,r,i){switch(void 0===i&&(i={}),e){case"debug":console.log(t.loggerPrefix,r,i);break;case"info":console.info(t.loggerPrefix,r,i);break;case"warn":console.warn(t.loggerPrefix,r,i);break;case"error":console.error(t.loggerPrefix,r,i)}};var r=function(){function e(e){this.levels=e.levels,this.handle=e.handler}return e.prototype.setLevels=function(e){this.levels=e},e.prototype.log=function(e,t,r){-1!==this.levels.indexOf(e)&&this.handle(e,t,r)},e.prototype.debug=function(e,t){this.log("debug",e,t)},e.prototype.info=function(e,t){this.log("info",e,t)},e.prototype.warn=function(e,t){this.log("warn",e,t)},e.prototype.error=function(e,t){this.log("error",e,t)},e}();t.Logger=r},826:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.segmentIsMatched=a,t.allGroupSegmentsAreMatched=function e(t,r,i,n){if("*"===t)return!0;if("string"==typeof t){var o=i.getSegment(t);return!!o&&a(o,r,n)}if("object"==typeof t){if("and"in t&&Array.isArray(t.and))return t.and.every((function(t){return e(t,r,i,n)}));if("or"in t&&Array.isArray(t.or))return t.or.some((function(t){return e(t,r,i,n)}));if("not"in t&&Array.isArray(t.not))return t.not.every((function(t){return!1===e(t,r,i,n)}))}return!!Array.isArray(t)&&t.every((function(t){return e(t,r,i,n)}))};var i=r(186);function a(e,t,r){return(0,i.allConditionsAreMatched)(e.conditions,t,r)}}},t={};function r(i){var a=t[i];if(void 0!==a)return a.exports;var n=t[i]={exports:{}};return e[i].call(n.exports,n,n.exports,r),n.exports}return r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(166)})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FeaturevisorSDK=t():e.FeaturevisorSDK=t()}(this,(()=>(()=>{"use strict";var e={481:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MAX_BUCKETED_NUMBER=void 0,t.getBucketedNumber=function(e){var r=(0,i.MurmurHashV3)(e,n)/o;return Math.floor(r*t.MAX_BUCKETED_NUMBER)},t.getBucketKey=function(e){var t,r,i=e.featureKey,n=e.bucketBy,o=e.context,u=e.logger;if("string"==typeof n)t="plain",r=[n];else if(Array.isArray(n))t="and",r=n;else{if("object"!=typeof n||!Array.isArray(n.or))throw u.error("invalid bucketBy",{featureKey:i,bucketBy:n}),new Error("invalid bucketBy");t="or",r=n.or}var l=[];return r.forEach((function(e){var r=(0,a.getValueFromContext)(o,e);void 0!==r&&("plain"===t||"and"===t||0===l.length)&&l.push(r)})),l.push(i),l.join(s)};var a=r(186),i=r(400),n=1,o=Math.pow(2,32);t.MAX_BUCKETED_NUMBER=1e5;var s="."},608:function(e,t,r){var a=this&&this.__assign||function(){return a=Object.assign||function(e){for(var t,r=1,a=arguments.length;r<a;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},a.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0}),t.FeaturevisorChildInstance=void 0;var i=r(40),n=r(985),o=function(){function e(e){this.parent=e.parent,this.context=e.context,this.sticky=e.sticky||{},this.emitter=new i.Emitter}return e.prototype.on=function(e,t){return"context_set"===e||"sticky_set"===e?this.emitter.on(e,t):this.parent.on(e,t)},e.prototype.close=function(){this.emitter.clearAll()},e.prototype.setContext=function(e,t){void 0===t&&(t=!1),this.context=t?e:a(a({},this.context),e),this.emitter.trigger("context_set",{context:this.context,replaced:t})},e.prototype.getContext=function(e){return this.parent.getContext(a(a({},this.context),e))},e.prototype.setSticky=function(e,t){void 0===t&&(t=!1);var r=this.sticky||{};this.sticky=a(t?{}:a({},this.sticky),e);var i=(0,n.getParamsForStickySetEvent)(r,this.sticky,t);this.emitter.trigger("sticky_set",i)},e.prototype.isEnabled=function(e,t,r){return void 0===t&&(t={}),void 0===r&&(r={}),this.parent.isEnabled(e,a(a({},this.context),t),a({sticky:this.sticky},r))},e.prototype.getVariation=function(e,t,r){return void 0===t&&(t={}),void 0===r&&(r={}),this.parent.getVariation(e,a(a({},this.context),t),a({sticky:this.sticky},r))},e.prototype.getVariable=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariable(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getVariableBoolean=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariableBoolean(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getVariableString=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariableString(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getVariableInteger=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariableInteger(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getVariableDouble=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariableDouble(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getVariableArray=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariableArray(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getVariableObject=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariableObject(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getVariableJSON=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),this.parent.getVariableJSON(e,t,a(a({},this.context),r),a({sticky:this.sticky},i))},e.prototype.getAllEvaluations=function(e,t,r){return void 0===e&&(e={}),void 0===t&&(t=[]),void 0===r&&(r={}),this.parent.getAllEvaluations(a(a({},this.context),e),t,a({sticky:this.sticky},r))},e}();t.FeaturevisorChildInstance=o},108:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.compareVersions=t.compareSegments=t.validateAndParse=t.semver=void 0,t.semver=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,t.validateAndParse=function(e){if("string"!=typeof e)throw new TypeError("Invalid argument expected string");var r=e.match(t.semver);if(!r)throw new Error("Invalid argument not valid semver ('".concat(e,"' received)"));return r.shift(),r};var r=function(e){return"*"===e||"x"===e||"X"===e},a=function(e){var t=parseInt(e,10);return isNaN(t)?e:t},i=function(e,t){if(r(e)||r(t))return 0;var i=function(e,t){return typeof e!=typeof t?[String(e),String(t)]:[e,t]}(a(e),a(t)),n=i[0],o=i[1];return n>o?1:n<o?-1:0};t.compareSegments=function(e,t){for(var r=0;r<Math.max(e.length,t.length);r++){var a=i(e[r]||"0",t[r]||"0");if(0!==a)return a}return 0},t.compareVersions=function(e,r){var a=(0,t.validateAndParse)(e),i=(0,t.validateAndParse)(r),n=a.pop(),o=i.pop(),s=(0,t.compareSegments)(a,i);return 0!==s?s:n&&o?(0,t.compareSegments)(n.split("."),o.split(".")):n||o?n?-1:1:0}},186:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getValueFromContext=i,t.conditionIsMatched=function(e,t,r){var n=e.attribute,o=e.operator,s=e.value,u=e.regexFlags,l=i(t,n);if("equals"===o)return l===s;if("notEquals"===o)return l!==s;if("before"===o||"after"===o){var c=(d=l)instanceof Date?d:new Date(d),f=s instanceof Date?s:new Date(s);return"before"===o?c<f:c>f}if(!Array.isArray(s)||-1===["string","number"].indexOf(typeof l)&&null!==l)if("string"==typeof l&&"string"==typeof s){if(d=l,"contains"===o)return-1!==d.indexOf(s);if("notContains"===o)return-1===d.indexOf(s);if("startsWith"===o)return d.startsWith(s);if("endsWith"===o)return d.endsWith(s);if("semverEquals"===o)return 0===(0,a.compareVersions)(d,s);if("semverNotEquals"===o)return 0!==(0,a.compareVersions)(d,s);if("semverGreaterThan"===o)return 1===(0,a.compareVersions)(d,s);if("semverGreaterThanOrEquals"===o)return(0,a.compareVersions)(d,s)>=0;if("semverLessThan"===o)return-1===(0,a.compareVersions)(d,s);if("semverLessThanOrEquals"===o)return(0,a.compareVersions)(d,s)<=0;if("matches"===o)return r(s,u||"").test(d);if("notMatches"===o)return!r(s,u||"").test(d)}else if("number"==typeof l&&"number"==typeof s){if(d=l,"greaterThan"===o)return d>s;if("greaterThanOrEquals"===o)return d>=s;if("lessThan"===o)return d<s;if("lessThanOrEquals"===o)return d<=s}else{if("exists"===o)return void 0!==l;if("notExists"===o)return void 0===l;if(Array.isArray(l)&&"string"==typeof s){if(d=l,"includes"===o)return d.indexOf(s)>-1;if("notIncludes"===o)return-1===d.indexOf(s)}}else{var d=l;if("in"===o)return-1!==s.indexOf(d);if("notIn"===o)return-1===s.indexOf(d)}return!1};var a=r(108);function i(e,t){return-1===t.indexOf(".")?e[t]:t.split(".").reduce((function(e,t){return e?e[t]:void 0}),e)}},649:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DatafileReader=void 0;var a=r(186),i=function(){function e(e){var t=e.datafile,r=e.logger;this.logger=r,this.schemaVersion=t.schemaVersion,this.revision=t.revision,this.segments=t.segments,this.features=t.features,this.regexCache={}}return e.prototype.getRevision=function(){return this.revision},e.prototype.getSchemaVersion=function(){return this.schemaVersion},e.prototype.getSegment=function(e){var t=this.segments[e];if(t)return t.conditions=this.parseConditionsIfStringified(t.conditions),t},e.prototype.getFeatureKeys=function(){return Object.keys(this.features)},e.prototype.getFeature=function(e){return this.features[e]},e.prototype.getVariableKeys=function(e){var t=this.getFeature(e);return t?Object.keys(t.variablesSchema||{}):[]},e.prototype.hasVariations=function(e){var t=this.getFeature(e);return!!t&&Array.isArray(t.variations)&&t.variations.length>0},e.prototype.getRegex=function(e,t){var r=t||"",a="".concat(e,"-").concat(r);if(this.regexCache[a])return this.regexCache[a];var i=new RegExp(e,r);return this.regexCache[a]=i,i},e.prototype.allConditionsAreMatched=function(e,t){var r=this;if("string"==typeof e)return"*"===e;if("attribute"in e)try{return(0,a.conditionIsMatched)(e,t,(function(e,t){return r.getRegex(e,t)}))}catch(r){return this.logger.warn(r.message,{error:r,details:{condition:e,context:t}}),!1}return"and"in e&&Array.isArray(e.and)?e.and.every((function(e){return r.allConditionsAreMatched(e,t)})):"or"in e&&Array.isArray(e.or)?e.or.some((function(e){return r.allConditionsAreMatched(e,t)})):"not"in e&&Array.isArray(e.not)?e.not.every((function(){return!1===r.allConditionsAreMatched({and:e.not},t)})):!!Array.isArray(e)&&e.every((function(e){return r.allConditionsAreMatched(e,t)}))},e.prototype.segmentIsMatched=function(e,t){return this.allConditionsAreMatched(e.conditions,t)},e.prototype.allSegmentsAreMatched=function(e,t){var r=this;if("*"===e)return!0;if("string"==typeof e){var a=this.getSegment(e);return!!a&&this.segmentIsMatched(a,t)}if("object"==typeof e){if("and"in e&&Array.isArray(e.and))return e.and.every((function(e){return r.allSegmentsAreMatched(e,t)}));if("or"in e&&Array.isArray(e.or))return e.or.some((function(e){return r.allSegmentsAreMatched(e,t)}));if("not"in e&&Array.isArray(e.not))return e.not.every((function(e){return!1===r.allSegmentsAreMatched(e,t)}))}return!!Array.isArray(e)&&e.every((function(e){return r.allSegmentsAreMatched(e,t)}))},e.prototype.getMatchedTraffic=function(e,t){var r=this;return e.find((function(e){return!!r.allSegmentsAreMatched(r.parseSegmentsIfStringified(e.segments),t)}))},e.prototype.getMatchedAllocation=function(e,t){if(e.allocation)for(var r=0,a=e.allocation;r<a.length;r++){var i=a[r],n=i.range,o=n[0],s=n[1];if(i.range&&o<=t&&s>=t)return i}},e.prototype.getMatchedForce=function(e,t){var r={force:void 0,forceIndex:void 0},a="string"==typeof e?this.getFeature(e):e;if(!a||!a.force)return r;for(var i=0;i<a.force.length;i++){var n=a.force[i];if(n.conditions&&this.allConditionsAreMatched(this.parseConditionsIfStringified(n.conditions),t)){r.force=n,r.forceIndex=i;break}if(n.segments&&this.allSegmentsAreMatched(this.parseSegmentsIfStringified(n.segments),t)){r.force=n,r.forceIndex=i;break}}return r},e.prototype.parseConditionsIfStringified=function(e){if("string"!=typeof e)return e;if("*"===e)return e;try{return JSON.parse(e)}catch(t){return this.logger.error("Error parsing conditions",{error:t,details:{conditions:e}}),e}},e.prototype.parseSegmentsIfStringified=function(e){return"string"==typeof e&&(e.startsWith("{")||e.startsWith("["))?JSON.parse(e):e},e}();t.DatafileReader=i},40:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=void 0;var r=function(){function e(){this.listeners={}}return e.prototype.on=function(e,t){this.listeners[e]||(this.listeners[e]=[]);var r=this.listeners[e];r.push(t);var a=!0;return function(){if(a){a=!1;var e=r.indexOf(t);-1!==e&&r.splice(e,1)}}},e.prototype.trigger=function(e,t){void 0===t&&(t={});var r=this.listeners[e];r&&r.forEach((function(e){try{e(t)}catch(e){console.error(e)}}))},e.prototype.clearAll=function(){this.listeners={}},e}();t.Emitter=r},335:function(e,t,r){var a=this&&this.__assign||function(){return a=Object.assign||function(e){for(var t,r=1,a=arguments.length;r<a;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},a.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0}),t.EvaluationReason=void 0,t.evaluateWithHooks=function(e){try{for(var t=e.hooksManager,r=t.getAll(),a=e,n=0,s=t.getAll();n<s.length;n++)(f=s[n]).before&&(a=f.before(a));var u=o(a);void 0!==a.defaultVariationValue&&"variation"===u.type&&void 0===u.variationValue&&(u.variationValue=a.defaultVariationValue),void 0!==a.defaultVariableValue&&"variable"===u.type&&void 0===u.variableValue&&(u.variableValue=a.defaultVariableValue);for(var l=0,c=r;l<c.length;l++){var f;(f=c[l]).after&&(u=f.after(u,a))}return u}catch(t){var d=e.type,v=e.featureKey,y=e.variableKey,g=e.logger;return u={type:d,featureKey:v,variableKey:y,reason:i.ERROR,error:t},g.error("error during evaluation",u),u}},t.evaluate=o;var i,n=r(481);function o(e){var t,r=e.type,s=e.featureKey,u=e.variableKey,l=e.context,c=e.logger,f=e.datafileReader,d=e.sticky,v=e.hooksManager.getAll();try{if("flag"!==r&&!1===o(a(a({},e),{type:"flag"})).enabled){t={type:r,featureKey:s,reason:i.DISABLED};var y=f.getFeature(s);if("variable"===r&&y&&u&&y.variablesSchema&&y.variablesSchema[u]){var g=y.variablesSchema[u];void 0!==g.disabledValue?t={type:r,featureKey:s,reason:i.VARIABLE_DISABLED,variableKey:u,variableValue:g.disabledValue,variableSchema:g,enabled:!1}:g.useDefaultWhenDisabled&&(t={type:r,featureKey:s,reason:i.VARIABLE_DEFAULT,variableKey:u,variableValue:g.defaultValue,variableSchema:g,enabled:!1})}return"variation"===r&&y&&y.disabledVariationValue&&(t={type:r,featureKey:s,reason:i.VARIATION_DISABLED,variationValue:y.disabledVariationValue,enabled:!1}),c.debug("feature is disabled",t),t}if(d&&d[s]){if("flag"===r&&void 0!==d[s].enabled)return t={type:r,featureKey:s,reason:i.STICKY,sticky:d[s],enabled:d[s].enabled},c.debug("using sticky enabled",t),t;if("variation"===r){var h=d[s].variation;if(void 0!==h)return t={type:r,featureKey:s,reason:i.STICKY,variationValue:h},c.debug("using sticky variation",t),t}if(u){var p=d[s].variables;if(p){var b=p[u];if(void 0!==b)return t={type:r,featureKey:s,reason:i.STICKY,variableKey:u,variableValue:b},c.debug("using sticky variable",t),t}}}var V="string"==typeof s?f.getFeature(s):s;if(!V)return t={type:r,featureKey:s,reason:i.FEATURE_NOT_FOUND},c.warn("feature not found",t),t;"flag"===r&&V.deprecated&&c.warn("feature is deprecated",{featureKey:s});var k=void 0;if(u){if(V.variablesSchema&&V.variablesSchema[u]&&(k=V.variablesSchema[u]),!k)return t={type:r,featureKey:s,reason:i.VARIABLE_NOT_FOUND,variableKey:u},c.warn("variable schema not found",t),t;k.deprecated&&c.warn("variable is deprecated",{featureKey:s,variableKey:u})}if("variation"===r&&(!V.variations||0===V.variations.length))return t={type:r,featureKey:s,reason:i.NO_VARIATIONS},c.warn("no variations",t),t;var m=f.getMatchedForce(V,l),A=m.force,K=m.forceIndex;if(A){if("flag"===r&&void 0!==A.enabled)return t={type:r,featureKey:s,reason:i.FORCED,forceIndex:K,force:A,enabled:A.enabled},c.debug("forced enabled found",t),t;if("variation"===r&&A.variation&&V.variations&&(T=V.variations.find((function(e){return e.value===A.variation}))))return t={type:r,featureKey:s,reason:i.FORCED,forceIndex:K,force:A,variation:T},c.debug("forced variation found",t),t;if(u&&A.variables&&void 0!==A.variables[u])return t={type:r,featureKey:s,reason:i.FORCED,forceIndex:K,force:A,variableKey:u,variableSchema:k,variableValue:A.variables[u]},c.debug("forced variable",t),t}if("flag"===r&&V.required&&V.required.length>0){var x=V.required.every((function(t){var r,i;if("string"==typeof t?r=t:(r=t.key,i=t.variation),!o(a(a({},e),{type:"flag",featureKey:r})).enabled)return!1;if(void 0!==i){var n=o(a(a({},e),{type:"variation",featureKey:r})),s=void 0;return n.variationValue?s=n.variationValue:n.variation&&(s=n.variation.value),s===i}return!0}));if(!x)return t={type:r,featureKey:s,reason:i.REQUIRED,required:V.required,enabled:x},c.debug("required features not enabled",t),t}for(var O=(0,n.getBucketKey)({featureKey:s,bucketBy:V.bucketBy,context:l,logger:c}),E=0,_=v;E<_.length;E++)(L=_[E]).bucketKey&&(O=L.bucketKey({featureKey:s,context:l,bucketBy:V.bucketBy,bucketKey:O}));for(var S,R,M=(0,n.getBucketedNumber)(O),I=0,D=v;I<D.length;I++){var L;(L=D[I]).bucketValue&&(M=L.bucketValue({featureKey:s,bucketKey:O,context:l,bucketValue:M}))}if("flag"!==r?(S=f.getMatchedTraffic(V.traffic,l))&&(R=f.getMatchedAllocation(S,M)):S=f.getMatchedTraffic(V.traffic,l),S){if(0===S.percentage)return t={type:r,featureKey:s,reason:i.RULE,bucketKey:O,bucketValue:M,ruleKey:S.key,traffic:S,enabled:!1},c.debug("matched rule with 0 percentage",t),t;if("flag"===r){if(V.ranges&&V.ranges.length>0)return V.ranges.find((function(e){return M>=e[0]&&M<e[1]}))?(t={type:r,featureKey:s,reason:i.ALLOCATED,bucketKey:O,bucketValue:M,ruleKey:S.key,traffic:S,enabled:void 0===S.enabled||S.enabled},c.debug("matched",t),t):(t={type:r,featureKey:s,reason:i.OUT_OF_RANGE,bucketKey:O,bucketValue:M,enabled:!1},c.debug("not matched",t),t);if(void 0!==S.enabled)return t={type:r,featureKey:s,reason:i.RULE,bucketKey:O,bucketValue:M,ruleKey:S.key,traffic:S,enabled:S.enabled},c.debug("override from rule",t),t;if(M<=S.percentage)return t={type:r,featureKey:s,reason:i.RULE,bucketKey:O,bucketValue:M,ruleKey:S.key,traffic:S,enabled:!0},c.debug("matched traffic",t),t}if("variation"===r&&V.variations){if(S.variation&&(T=V.variations.find((function(e){return e.value===S.variation}))))return t={type:r,featureKey:s,reason:i.RULE,bucketKey:O,bucketValue:M,ruleKey:S.key,traffic:S,variation:T},c.debug("override from rule",t),t;if(R&&R.variation&&(T=V.variations.find((function(e){return e.value===R.variation}))))return t={type:r,featureKey:s,reason:i.ALLOCATED,bucketKey:O,bucketValue:M,ruleKey:S.key,traffic:S,variation:T},c.debug("allocated variation",t),t}}if("variable"===r&&u){if(S&&S.variables&&void 0!==S.variables[u])return t={type:r,featureKey:s,reason:i.RULE,bucketKey:O,bucketValue:M,ruleKey:S.key,traffic:S,variableKey:u,variableSchema:k,variableValue:S.variables[u]},c.debug("override from rule",t),t;var F;if(A&&A.variation?F=A.variation:S&&S.variation?F=S.variation:R&&R.variation&&(F=R.variation),F&&Array.isArray(V.variations)){var T;if((T=V.variations.find((function(e){return e.value===F})))&&T.variableOverrides&&T.variableOverrides[u]){var C=T.variableOverrides[u].find((function(e){return e.conditions?f.allConditionsAreMatched("string"==typeof e.conditions&&"*"!==e.conditions?JSON.parse(e.conditions):e.conditions,l):!!e.segments&&f.allSegmentsAreMatched(f.parseSegmentsIfStringified(e.segments),l)}));if(C)return t={type:r,featureKey:s,reason:i.VARIABLE_OVERRIDE,bucketKey:O,bucketValue:M,ruleKey:null==S?void 0:S.key,traffic:S,variableKey:u,variableSchema:k,variableValue:C.value},c.debug("variable override",t),t}if(T&&T.variables&&void 0!==T.variables[u])return t={type:r,featureKey:s,reason:i.ALLOCATED,bucketKey:O,bucketValue:M,ruleKey:null==S?void 0:S.key,traffic:S,variableKey:u,variableSchema:k,variableValue:T.variables[u]},c.debug("allocated variable",t),t}}return"variation"===r?(t={type:r,featureKey:s,reason:i.NO_MATCH,bucketKey:O,bucketValue:M},c.debug("no matched variation",t),t):"variable"===r?k?(t={type:r,featureKey:s,reason:i.VARIABLE_DEFAULT,bucketKey:O,bucketValue:M,variableKey:u,variableSchema:k,variableValue:k.defaultValue},c.debug("using default value",t),t):(t={type:r,featureKey:s,reason:i.VARIABLE_NOT_FOUND,variableKey:u,bucketKey:O,bucketValue:M},c.debug("variable not found",t),t):(t={type:r,featureKey:s,reason:i.NO_MATCH,bucketKey:O,bucketValue:M,enabled:!1},c.debug("nothing matched",t),t)}catch(e){return t={type:r,featureKey:s,variableKey:u,reason:i.ERROR,error:e},c.error("error",t),t}}!function(e){e.FEATURE_NOT_FOUND="feature_not_found",e.DISABLED="disabled",e.REQUIRED="required",e.OUT_OF_RANGE="out_of_range",e.NO_VARIATIONS="no_variations",e.VARIATION_DISABLED="variation_disabled",e.VARIABLE_NOT_FOUND="variable_not_found",e.VARIABLE_DEFAULT="variable_default",e.VARIABLE_DISABLED="variable_disabled",e.VARIABLE_OVERRIDE="variable_override",e.NO_MATCH="no_match",e.FORCED="forced",e.STICKY="sticky",e.RULE="rule",e.ALLOCATED="allocated",e.ERROR="error"}(i||(t.EvaluationReason=i={}))},985:function(e,t){var r=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var a,i=0,n=t.length;i<n;i++)!a&&i in t||(a||(a=Array.prototype.slice.call(t,0,i)),a[i]=t[i]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.getParamsForStickySetEvent=function(e,t,a){void 0===e&&(e={}),void 0===t&&(t={});var i=Object.keys(e),n=Object.keys(t),o=r(r([],i,!0),n,!0);return{features:o.filter((function(e,t){return o.indexOf(e)===t})),replaced:a}},t.getParamsForDatafileSetEvent=function(e,t){for(var a=e.getRevision(),i=e.getFeatureKeys(),n=t.getRevision(),o=t.getFeatureKeys(),s=[],u=[],l=[],c=0,f=i;c<f.length;c++){var d=f[c];if(-1!==o.indexOf(d)){var v=e.getFeature(d),y=t.getFeature(d);(null==v?void 0:v.hash)!==(null==y?void 0:y.hash)&&u.push(d)}else s.push(d)}for(var g=0,h=o;g<h.length;g++){var p=h[g];-1===i.indexOf(p)&&l.push(p)}return{revision:n,previousRevision:a,revisionChanged:a!==n,features:r(r(r([],s,!0),u,!0),l,!0).filter((function(e,t,r){return r.indexOf(e)===t}))}}},943:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getValueByType=function(e,t){try{if(void 0===e)return null;switch(t){case"string":return"string"==typeof e?e:null;case"integer":return parseInt(e,10);case"double":return parseFloat(e);case"boolean":return!0===e;case"array":return Array.isArray(e)?e:null;case"object":return"object"==typeof e?e:null;default:return e}}catch(e){return null}}},438:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HooksManager=void 0;var r=function(){function e(e){var t=this;this.hooks=[],this.logger=e.logger,e.hooks&&e.hooks.forEach((function(e){t.add(e)}))}return e.prototype.add=function(e){var t=this;if(!this.hooks.some((function(t){return t.name===e.name})))return this.hooks.push(e),function(){t.remove(e.name)};this.logger.error('Hook with name "'.concat(e.name,'" already exists.'),{name:e.name,hook:e})},e.prototype.remove=function(e){this.hooks=this.hooks.filter((function(t){return t.name!==e}))},e.prototype.getAll=function(){return this.hooks},e}();t.HooksManager=r},166:function(e,t,r){var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),i(r(481),t),i(r(247),t),i(r(584),t),i(r(186),t),i(r(335),t),i(r(649),t),i(r(608),t)},247:function(e,t,r){var a=this&&this.__assign||function(){return a=Object.assign||function(e){for(var t,r=1,a=arguments.length;r<a;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},a.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0}),t.FeaturevisorInstance=void 0,t.createInstance=function(e){return new v(e)};var i=r(584),n=r(438),o=r(40),s=r(649),u=r(335),l=r(608),c=r(985),f=r(943),d={schemaVersion:"2",revision:"unknown",segments:{},features:{}},v=function(){function e(e){this.context={},this.context=e.context||{},this.logger=e.logger||(0,i.createLogger)({level:e.logLevel||i.Logger.defaultLevel}),this.hooksManager=new n.HooksManager({hooks:e.hooks||[],logger:this.logger}),this.emitter=new o.Emitter,this.sticky=e.sticky,this.datafileReader=new s.DatafileReader({datafile:d,logger:this.logger}),e.datafile&&(this.datafileReader=new s.DatafileReader({datafile:"string"==typeof e.datafile?JSON.parse(e.datafile):e.datafile,logger:this.logger})),this.logger.info("Featurevisor SDK initialized")}return e.prototype.setLogLevel=function(e){this.logger.setLevel(e)},e.prototype.setDatafile=function(e){try{var t=new s.DatafileReader({datafile:"string"==typeof e?JSON.parse(e):e,logger:this.logger}),r=(0,c.getParamsForDatafileSetEvent)(this.datafileReader,t);this.datafileReader=t,this.logger.info("datafile set",r),this.emitter.trigger("datafile_set",r)}catch(e){this.logger.error("could not parse datafile",{error:e})}},e.prototype.setSticky=function(e,t){void 0===t&&(t=!1);var r=this.sticky||{};this.sticky=a(t?{}:a({},this.sticky),e);var i=(0,c.getParamsForStickySetEvent)(r,this.sticky,t);this.logger.info("sticky features set",i),this.emitter.trigger("sticky_set",i)},e.prototype.getRevision=function(){return this.datafileReader.getRevision()},e.prototype.getFeature=function(e){return this.datafileReader.getFeature(e)},e.prototype.addHook=function(e){return this.hooksManager.add(e)},e.prototype.on=function(e,t){return this.emitter.on(e,t)},e.prototype.close=function(){this.emitter.clearAll()},e.prototype.setContext=function(e,t){void 0===t&&(t=!1),this.context=t?e:a(a({},this.context),e),this.emitter.trigger("context_set",{context:this.context,replaced:t}),this.logger.debug(t?"context replaced":"context updated",{context:this.context,replaced:t})},e.prototype.getContext=function(e){return e?a(a({},this.context),e):this.context},e.prototype.spawn=function(e,t){return void 0===e&&(e={}),void 0===t&&(t={}),new l.FeaturevisorChildInstance({parent:this,context:this.getContext(e),sticky:t.sticky})},e.prototype.getEvaluationDependencies=function(e,t){return void 0===t&&(t={}),{context:this.getContext(e),logger:this.logger,hooksManager:this.hooksManager,datafileReader:this.datafileReader,sticky:t.sticky?a(a({},this.sticky),t.sticky):this.sticky,defaultVariationValue:t.defaultVariationValue,defaultVariableValue:t.defaultVariableValue}},e.prototype.evaluateFlag=function(e,t,r){return void 0===t&&(t={}),void 0===r&&(r={}),(0,u.evaluateWithHooks)(a(a({},this.getEvaluationDependencies(t,r)),{type:"flag",featureKey:e}))},e.prototype.isEnabled=function(e,t,r){void 0===t&&(t={}),void 0===r&&(r={});try{return!0===this.evaluateFlag(e,t,r).enabled}catch(t){return this.logger.error("isEnabled",{featureKey:e,error:t}),!1}},e.prototype.evaluateVariation=function(e,t,r){return void 0===t&&(t={}),void 0===r&&(r={}),(0,u.evaluateWithHooks)(a(a({},this.getEvaluationDependencies(t,r)),{type:"variation",featureKey:e}))},e.prototype.getVariation=function(e,t,r){void 0===t&&(t={}),void 0===r&&(r={});try{var a=this.evaluateVariation(e,t,r);return void 0!==a.variationValue?a.variationValue:a.variation?a.variation.value:null}catch(t){return this.logger.error("getVariation",{featureKey:e,error:t}),null}},e.prototype.evaluateVariable=function(e,t,r,i){return void 0===r&&(r={}),void 0===i&&(i={}),(0,u.evaluateWithHooks)(a(a({},this.getEvaluationDependencies(r,i)),{type:"variable",featureKey:e,variableKey:t}))},e.prototype.getVariable=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});try{var i=this.evaluateVariable(e,t,r,a);return void 0!==i.variableValue?i.variableSchema&&"json"===i.variableSchema.type&&"string"==typeof i.variableValue?JSON.parse(i.variableValue):i.variableValue:null}catch(r){return this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r}),null}},e.prototype.getVariableBoolean=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});var i=this.getVariable(e,t,r,a);return(0,f.getValueByType)(i,"boolean")},e.prototype.getVariableString=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});var i=this.getVariable(e,t,r,a);return(0,f.getValueByType)(i,"string")},e.prototype.getVariableInteger=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});var i=this.getVariable(e,t,r,a);return(0,f.getValueByType)(i,"integer")},e.prototype.getVariableDouble=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});var i=this.getVariable(e,t,r,a);return(0,f.getValueByType)(i,"double")},e.prototype.getVariableArray=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});var i=this.getVariable(e,t,r,a);return(0,f.getValueByType)(i,"array")},e.prototype.getVariableObject=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});var i=this.getVariable(e,t,r,a);return(0,f.getValueByType)(i,"object")},e.prototype.getVariableJSON=function(e,t,r,a){void 0===r&&(r={}),void 0===a&&(a={});var i=this.getVariable(e,t,r,a);return(0,f.getValueByType)(i,"json")},e.prototype.getAllEvaluations=function(e,t,r){void 0===e&&(e={}),void 0===t&&(t=[]),void 0===r&&(r={});for(var a={},i=0,n=t.length>0?t:this.datafileReader.getFeatureKeys();i<n.length;i++){var o=n[i],s={enabled:this.isEnabled(o,e,r)};if(this.datafileReader.hasVariations(o)){var u=this.getVariation(o,e,r);u&&(s.variation=u)}var l=this.datafileReader.getVariableKeys(o);if(l.length>0){s.variables={};for(var c=0,f=l;c<f.length;c++){var d=f[c];s.variables[d]=this.getVariable(o,d,e,r)}}a[o]=s}return a},e}();t.FeaturevisorInstance=v},584:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=t.defaultLogHandler=t.loggerPrefix=void 0,t.createLogger=function(e){return void 0===e&&(e={}),new r(e)},t.loggerPrefix="[Featurevisor]",t.defaultLogHandler=function(e,r,a){void 0===a&&(a={});var i="log";"info"===e?i="info":"warn"===e?i="warn":"error"===e&&(i="error"),console[i](t.loggerPrefix,r,a)};var r=function(){function e(r){this.level=r.level||e.defaultLevel,this.handle=r.handler||t.defaultLogHandler}return e.prototype.setLevel=function(e){this.level=e},e.prototype.log=function(t,r,a){e.allLevels.indexOf(this.level)>=e.allLevels.indexOf(t)&&this.handle(t,r,a)},e.prototype.debug=function(e,t){this.log("debug",e,t)},e.prototype.info=function(e,t){this.log("info",e,t)},e.prototype.warn=function(e,t){this.log("warn",e,t)},e.prototype.error=function(e,t){this.log("error",e,t)},e.allLevels=["fatal","error","warn","info","debug"],e.defaultLevel="info",e}();t.Logger=r},400:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MurmurHashV3=function(e,t){var a,i,n,o,s,u,l,c;for("string"==typeof e&&(e=r(e)),a=3&e.length,i=e.length-a,n=t,s=3432918353,u=461845907,c=0;c<i;)l=255&e[c]|(255&e[++c])<<8|(255&e[++c])<<16|(255&e[++c])<<24,++c,n=27492+(65535&(o=5*(65535&(n=(n^=l=(65535&(l=(l=(65535&l)*s+(((l>>>16)*s&65535)<<16)&4294967295)<<15|l>>>17))*u+(((l>>>16)*u&65535)<<16)&4294967295)<<13|n>>>19))+((5*(n>>>16)&65535)<<16)&4294967295))+((58964+(o>>>16)&65535)<<16);switch(l=0,a){case 3:l^=(255&e[c+2])<<16;case 2:l^=(255&e[c+1])<<8;case 1:n^=l=(65535&(l=(l=(65535&(l^=255&e[c]))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<15|l>>>17))*u+(((l>>>16)*u&65535)<<16)&4294967295}return n^=e.length,n=2246822507*(65535&(n^=n>>>16))+((2246822507*(n>>>16)&65535)<<16)&4294967295,n=3266489909*(65535&(n^=n>>>13))+((3266489909*(n>>>16)&65535)<<16)&4294967295,(n^=n>>>16)>>>0};var r=function(e){return(new TextEncoder).encode(e)}}},t={};return function r(a){var i=t[a];if(void 0!==i)return i.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,r),n.exports}(166)})()));
2
2
  //# sourceMappingURL=index.js.map