@featurevisor/sdk 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/index.js +1 -1
- package/dist/index.js.gz +0 -0
- package/dist/index.js.map +1 -1
- package/lib/client.d.ts +3 -0
- package/lib/client.js +23 -8
- package/lib/client.js.map +1 -1
- package/lib/createInstance.d.ts +12 -1
- package/lib/createInstance.js +72 -15
- package/lib/createInstance.js.map +1 -1
- package/lib/createInstance.spec.d.ts +1 -0
- package/package.json +3 -3
- package/src/client.ts +31 -9
- package/src/createInstance.spec.ts +138 -0
- package/src/createInstance.ts +106 -23
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://FeaturevisorSDK/webpack/universalModuleDefinition","webpack://FeaturevisorSDK/../../node_modules/murmurhash/murmurhash.js","webpack://FeaturevisorSDK/./src/bucket.ts","webpack://FeaturevisorSDK/./src/client.ts","webpack://FeaturevisorSDK/./src/conditions.ts","webpack://FeaturevisorSDK/./src/createInstance.ts","webpack://FeaturevisorSDK/./src/datafileReader.ts","webpack://FeaturevisorSDK/./src/feature.ts","webpack://FeaturevisorSDK/./src/index.ts","webpack://FeaturevisorSDK/./src/logger.ts","webpack://FeaturevisorSDK/./src/segments.ts","webpack://FeaturevisorSDK/./node_modules/semver/classes/semver.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/compare.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/eq.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/gt.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/gte.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/lt.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/lte.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/neq.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/constants.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/debug.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/identifiers.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/parse-options.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/re.js","webpack://FeaturevisorSDK/webpack/bootstrap","webpack://FeaturevisorSDK/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FeaturevisorSDK\"] = factory();\n\telse\n\t\troot[\"FeaturevisorSDK\"] = factory();\n})(this, () => {\nreturn ","(function(){\n const _global = this;\n\n const createBuffer = (val) => new TextEncoder().encode(val)\n\n /**\n * JS Implementation of MurmurHash2\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} str ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV2(str, seed) {\n if (typeof str === 'string') str = createBuffer(str);\n let\n l = str.length,\n h = seed ^ l,\n i = 0,\n k;\n\n while (l >= 4) {\n k =\n ((str[i] & 0xff)) |\n ((str[++i] & 0xff) << 8) |\n ((str[++i] & 0xff) << 16) |\n ((str[++i] & 0xff) << 24);\n\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n k ^= k >>> 24;\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;\n\n l -= 4;\n ++i;\n }\n\n switch (l) {\n case 3: h ^= (str[i + 2] & 0xff) << 16;\n case 2: h ^= (str[i + 1] & 0xff) << 8;\n case 1: h ^= (str[i] & 0xff);\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n }\n\n h ^= h >>> 13;\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n h ^= h >>> 15;\n\n return h >>> 0;\n };\n\n /*\n * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV3(key, seed) {\n if (typeof key === 'string') key = createBuffer(key);\n\n let remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;\n\n remainder = key.length & 3; // key.length % 4\n bytes = key.length - remainder;\n h1 = seed;\n c1 = 0xcc9e2d51;\n c2 = 0x1b873593;\n i = 0;\n\n while (i < bytes) {\n k1 =\n ((key[i] & 0xff)) |\n ((key[++i] & 0xff) << 8) |\n ((key[++i] & 0xff) << 16) |\n ((key[++i] & 0xff) << 24);\n ++i;\n\n k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\n h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\n }\n\n k1 = 0;\n\n switch (remainder) {\n case 3: k1 ^= (key[i + 2] & 0xff) << 16;\n case 2: k1 ^= (key[i + 1] & 0xff) << 8;\n case 1: k1 ^= (key[i] & 0xff);\n\n k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n }\n\n const murmur = MurmurHashV3;\n murmur.v2 = MurmurHashV2;\n murmur.v3 = MurmurHashV3;\n\n if (typeof(module) != 'undefined') {\n module.exports = murmur;\n } else {\n const _previousRoot = _global.murmur;\n murmur.noConflict = function() {\n _global.murmur = _previousRoot;\n return murmur;\n }\n _global.murmur = murmur;\n }\n}());\n","import * as murmurhash from \"murmurhash\";\n\nconst HASH_SEED = 1;\nconst MAX_HASH_VALUE = Math.pow(2, 32);\n\nexport const MAX_BUCKETED_NUMBER = 100000; // 100% * 1000 to include three decimal places in the same integer value\n\nexport function getBucketedNumber(bucketKey: string): number {\n const hashValue = murmurhash.v3(bucketKey, HASH_SEED);\n const ratio = hashValue / MAX_HASH_VALUE;\n\n return Math.floor(ratio * MAX_BUCKETED_NUMBER);\n}\n","import {\n Attributes,\n VariationValue,\n VariableValue,\n Feature,\n DatafileContent,\n BucketKey,\n BucketValue,\n FeatureKey,\n VariationType,\n VariableType,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport {\n getBucketedVariation,\n getBucketedVariableValue,\n getForcedVariation,\n getForcedVariableValue,\n} from \"./feature\";\nimport { getBucketedNumber } from \"./bucket\";\nimport { createLogger, Logger } from \"./logger\";\n\nexport type ActivationCallback = (\n featureName: string,\n variation: VariationValue,\n attributes: Attributes,\n captureAttributes: Attributes,\n) => void;\n\nexport type ConfigureBucketValue = (feature, attributes, bucketValue: BucketValue) => BucketValue;\n\nexport interface SdkOptions {\n datafile: DatafileContent | string;\n onActivation?: ActivationCallback; // @TODO: move it to FeaturevisorInstance in next breaking semver\n configureBucketValue?: ConfigureBucketValue;\n logger?: Logger; // TODO: keep it in FeaturevisorInstance only in next breaking semver\n}\n\ntype FieldType = VariationType | VariableType;\ntype ValueType = VariableValue;\n\nexport function getValueByType(value: ValueType, fieldType: FieldType): ValueType {\n if (value === undefined) {\n return undefined;\n }\n\n switch (fieldType) {\n case \"string\":\n return typeof value === \"string\" ? value : undefined;\n case \"integer\":\n return parseInt(value as string, 10);\n case \"double\":\n return parseFloat(value as string);\n case \"boolean\":\n return value === true;\n case \"array\":\n return Array.isArray(value) ? value : undefined;\n case \"object\":\n return typeof value === \"object\" ? value : undefined;\n // @NOTE: `json` is not handled here intentionally\n default:\n return value;\n }\n}\n\n// @TODO: change it to FeaturevisorEngine in next breaking semver\n// @TODO: move activate*() methods to FeaturevisorInstance in next breaking semver\nexport class FeaturevisorSDK {\n private onActivation?: ActivationCallback;\n private datafileReader: DatafileReader;\n private configureBucketValue?: ConfigureBucketValue;\n private logger: Logger;\n\n constructor(options: SdkOptions) {\n if (options.onActivation) {\n this.onActivation = options.onActivation;\n }\n\n if (options.configureBucketValue) {\n this.configureBucketValue = options.configureBucketValue;\n }\n\n this.logger = options.logger || createLogger();\n\n this.setDatafile(options.datafile);\n }\n\n setDatafile(datafile: DatafileContent | string) {\n try {\n this.datafileReader = new DatafileReader(\n typeof datafile === \"string\" ? JSON.parse(datafile) : datafile,\n );\n } catch (e) {\n this.logger.error(\"could not parse datafile\", { error: e });\n }\n }\n\n private getFeature(featureKey: string | Feature): Feature | undefined {\n return typeof featureKey === \"string\"\n ? this.datafileReader.getFeature(featureKey) // only key provided\n : featureKey; // full feature provided\n }\n\n /**\n * Bucketing\n */\n\n private getBucketKey(feature: Feature, attributes: Attributes): BucketKey {\n const featureKey = feature.key;\n\n const prefix =\n typeof feature.bucketBy === \"string\" ? feature.bucketBy : feature.bucketBy.join(\"_\");\n\n return `${prefix}_${featureKey}`;\n }\n\n private getBucketValue(feature: Feature, attributes: Attributes): BucketValue {\n const bucketKey = this.getBucketKey(feature, attributes);\n\n const value = getBucketedNumber(bucketKey);\n\n if (this.configureBucketValue) {\n return this.configureBucketValue(feature, attributes, value);\n }\n\n return value;\n }\n\n /**\n * Variation\n */\n\n getVariation(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): VariationValue | undefined {\n try {\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey });\n\n return undefined;\n }\n\n const forcedVariation = getForcedVariation(feature, attributes, this.datafileReader);\n\n if (forcedVariation) {\n this.logger.debug(\"forced variation found\", {\n featureKey,\n variation: forcedVariation.value,\n });\n\n return forcedVariation.value;\n }\n\n const bucketValue = this.getBucketValue(feature, attributes);\n\n const variation = getBucketedVariation(\n feature,\n attributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n\n if (!variation) {\n this.logger.debug(\"using default variation\", {\n featureKey,\n bucketValue,\n variation: feature.defaultVariation,\n });\n\n return feature.defaultVariation;\n }\n\n return variation.value;\n } catch (e) {\n this.logger.error(\"getVariation\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n getVariationBoolean(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n getVariationString(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): string | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n getVariationInteger(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n getVariationDouble(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Activate\n */\n activate(featureKey: FeatureKey, attributes: Attributes = {}): VariationValue | undefined {\n try {\n const variationValue = this.getVariation(featureKey, attributes);\n\n if (typeof variationValue === \"undefined\") {\n return undefined;\n }\n\n if (this.onActivation) {\n const captureAttributes: Attributes = {};\n\n const attributesForCapturing = this.datafileReader\n .getAllAttributes()\n .filter((a) => a.capture === true);\n\n attributesForCapturing.forEach((a) => {\n if (typeof attributes[a.key] !== \"undefined\") {\n captureAttributes[a.key] = attributes[a.key];\n }\n });\n\n this.onActivation(featureKey, variationValue, attributes, captureAttributes);\n }\n\n return variationValue;\n } catch (e) {\n this.logger.error(\"activate\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n activateBoolean(featureKey: FeatureKey, attributes: Attributes = {}): boolean | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n activateString(featureKey: FeatureKey, attributes: Attributes = {}): string | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n activateInteger(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n activateDouble(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Variable\n */\n\n getVariable(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): VariableValue | undefined {\n try {\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const variableSchema = Array.isArray(feature.variablesSchema)\n ? feature.variablesSchema.find((v) => v.key === variableKey)\n : undefined;\n\n if (!variableSchema) {\n this.logger.warn(\"variable schema not found\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const forcedVariableValue = getForcedVariableValue(\n feature,\n variableSchema,\n attributes,\n this.datafileReader,\n );\n\n if (typeof forcedVariableValue !== \"undefined\") {\n this.logger.debug(\"forced variable value found\", { featureKey, variableKey });\n\n return forcedVariableValue;\n }\n\n const bucketValue = this.getBucketValue(feature, attributes);\n\n return getBucketedVariableValue(\n feature,\n variableSchema,\n attributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n } catch (e) {\n this.logger.error(\"getVariable\", { featureKey, variableKey, error: e });\n\n return undefined;\n }\n }\n\n getVariableBoolean(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"boolean\") as boolean | undefined;\n }\n\n getVariableString(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"string\") as string | undefined;\n }\n\n getVariableInteger(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"integer\") as number | undefined;\n }\n\n getVariableDouble(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"double\") as number | undefined;\n }\n\n getVariableArray(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string[] | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"array\") as string[] | undefined;\n }\n\n getVariableObject<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"object\") as T | undefined;\n }\n\n getVariableJSON<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"json\") as T | undefined;\n }\n}\n","import { Attributes, Condition, PlainCondition } from \"@featurevisor/types\";\n\nimport * as semverGt from \"semver/functions/gt\";\nimport * as semverLt from \"semver/functions/lt\";\nimport * as semverEq from \"semver/functions/eq\";\nimport * as semverNeq from \"semver/functions/neq\";\nimport * as semverGte from \"semver/functions/gte\";\nimport * as semverLte from \"semver/functions/lte\";\n\nexport function conditionIsMatched(condition: PlainCondition, attributes: Attributes): boolean {\n const { attribute, operator, value } = condition;\n\n if (operator === \"equals\") {\n return attributes[attribute] === value;\n } else if (operator === \"notEquals\") {\n return attributes[attribute] !== value;\n } else if (typeof attributes[attribute] === \"string\" && Array.isArray(value)) {\n // array\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"in\") {\n return value.indexOf(valueInAttributes) !== -1;\n } else if (operator === \"notIn\") {\n return value.indexOf(valueInAttributes) === -1;\n }\n } else if (typeof attributes[attribute] === \"string\" && typeof value === \"string\") {\n // string\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"contains\") {\n return valueInAttributes.indexOf(value) !== -1;\n } else if (operator === \"notContains\") {\n return valueInAttributes.indexOf(value) === -1;\n } else if (operator === \"startsWith\") {\n return valueInAttributes.startsWith(value);\n } else if (operator === \"endsWith\") {\n return valueInAttributes.endsWith(value);\n } else if (operator === \"semverEquals\") {\n return semverEq(valueInAttributes, value);\n } else if (operator === \"semverNotEquals\") {\n return semverNeq(valueInAttributes, value);\n } else if (operator === \"semverGreaterThan\") {\n return semverGt(valueInAttributes, value);\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return semverGte(valueInAttributes, value);\n } else if (operator === \"semverLessThan\") {\n return semverLt(valueInAttributes, value);\n } else if (operator === \"semverLessThanOrEquals\") {\n return semverLte(valueInAttributes, value);\n }\n } else if (typeof attributes[attribute] === \"number\" && typeof value === \"number\") {\n // numeric\n const valueInAttributes = attributes[attribute] as number;\n\n if (operator === \"greaterThan\") {\n return valueInAttributes > value;\n } else if (operator === \"greaterThanOrEquals\") {\n return valueInAttributes >= value;\n } else if (operator === \"lessThan\") {\n return valueInAttributes < value;\n } else if (operator === \"lessThanOrEquals\") {\n return valueInAttributes <= value;\n }\n }\n\n return false;\n}\n\nexport function allConditionsAreMatched(\n conditions: Condition[] | Condition,\n attributes: Attributes,\n): boolean {\n if (\"attribute\" in conditions) {\n return conditionIsMatched(conditions, attributes);\n }\n\n if (\"and\" in conditions && Array.isArray(conditions.and)) {\n return conditions.and.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"or\" in conditions && Array.isArray(conditions.or)) {\n return conditions.or.some((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"not\" in conditions && Array.isArray(conditions.not)) {\n return conditions.not.every(\n (c) =>\n allConditionsAreMatched(\n {\n and: conditions.not,\n },\n attributes,\n ) === false,\n );\n }\n\n if (Array.isArray(conditions)) {\n return conditions.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n return false;\n}\n","import { DatafileContent } from \"@featurevisor/types\";\nimport { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from \"./client\";\nimport { createLogger, Logger } from \"./logger\";\n\nexport type ReadyCallback = () => void;\n\nexport interface InstanceOptions {\n // from SdkOptions\n datafile?: DatafileContent | string; // optional here, but not in SdkOptions\n onActivation?: ActivationCallback;\n configureBucketValue?: ConfigureBucketValue;\n\n // additions\n datafileUrl?: string;\n onReady?: ReadyCallback;\n handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;\n logger?: Logger;\n}\n\n// @TODO: consider renaming it to FeaturevisorSDK in next breaking semver\nexport interface FeaturevisorInstance {\n /**\n * From FeaturevisorSDK\n */\n\n // variation\n getVariation: FeaturevisorSDK[\"getVariation\"];\n getVariationBoolean: FeaturevisorSDK[\"getVariationBoolean\"];\n getVariationInteger: FeaturevisorSDK[\"getVariationInteger\"];\n getVariationDouble: FeaturevisorSDK[\"getVariationDouble\"];\n getVariationString: FeaturevisorSDK[\"getVariationString\"];\n\n // activate\n activate: FeaturevisorSDK[\"activate\"];\n activateBoolean: FeaturevisorSDK[\"activateBoolean\"];\n activateInteger: FeaturevisorSDK[\"activateInteger\"];\n activateDouble: FeaturevisorSDK[\"activateDouble\"];\n activateString: FeaturevisorSDK[\"activateString\"];\n\n // variable\n getVariable: FeaturevisorSDK[\"getVariable\"];\n getVariableBoolean: FeaturevisorSDK[\"getVariableBoolean\"];\n getVariableInteger: FeaturevisorSDK[\"getVariableInteger\"];\n getVariableDouble: FeaturevisorSDK[\"getVariableDouble\"];\n getVariableString: FeaturevisorSDK[\"getVariableString\"];\n getVariableArray: FeaturevisorSDK[\"getVariableArray\"];\n getVariableObject: FeaturevisorSDK[\"getVariableObject\"];\n\n /**\n * Additions\n *\n * @TODO\n */\n // start: () => void;\n // stop: () => void;\n // refresh: () => void;\n}\n\nfunction getInstanceFromSdk(sdk: FeaturevisorSDK, options: InstanceOptions): FeaturevisorInstance {\n return {\n // variation\n getVariation: sdk.getVariation.bind(sdk),\n getVariationBoolean: sdk.getVariationBoolean.bind(sdk),\n getVariationInteger: sdk.getVariationInteger.bind(sdk),\n getVariationDouble: sdk.getVariationDouble.bind(sdk),\n getVariationString: sdk.getVariationString.bind(sdk),\n\n // activate\n activate: sdk.activate,\n activateBoolean: sdk.activateBoolean.bind(sdk),\n activateInteger: sdk.activateInteger.bind(sdk),\n activateDouble: sdk.activateDouble.bind(sdk),\n activateString: sdk.activateString.bind(sdk),\n\n // variable\n getVariable: sdk.getVariable.bind(sdk),\n getVariableBoolean: sdk.getVariableBoolean.bind(sdk),\n getVariableInteger: sdk.getVariableInteger.bind(sdk),\n getVariableDouble: sdk.getVariableDouble.bind(sdk),\n getVariableString: sdk.getVariableString.bind(sdk),\n getVariableArray: sdk.getVariableArray.bind(sdk),\n getVariableObject: sdk.getVariableObject.bind(sdk),\n\n // additions\n // @TODO\n // start: () => {},\n // stop: () => {},\n // refresh: () => {},\n };\n}\n\nconst emptyDatafile: DatafileContent = {\n schemaVersion: \"1\",\n revision: \"unknown\",\n attributes: [],\n segments: [],\n features: [],\n};\n\nfunction fetchDatafileContent(datafileUrl, options: InstanceOptions): Promise<DatafileContent> {\n if (options.handleDatafileFetch) {\n return options.handleDatafileFetch(datafileUrl);\n }\n\n return fetch(datafileUrl).then((res) => res.json());\n}\n\nexport function createInstance(options: InstanceOptions) {\n if (!options.datafile && !options.datafileUrl) {\n throw new Error(\n \"Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options\",\n );\n }\n\n const logger = options.logger || createLogger();\n\n // datafile content is already provided\n if (options.datafile) {\n const sdk = new FeaturevisorSDK({\n datafile: options.datafile,\n onActivation: options.onActivation,\n configureBucketValue: options.configureBucketValue,\n logger,\n });\n\n if (typeof options.onReady === \"function\") {\n const onReady = options.onReady;\n\n setTimeout(function () {\n onReady();\n }, 0);\n }\n\n return getInstanceFromSdk(sdk, options);\n }\n\n // datafile has to be fetched\n const sdk = new FeaturevisorSDK({\n datafile: emptyDatafile,\n onActivation: options.onActivation,\n configureBucketValue: options.configureBucketValue,\n logger,\n });\n\n if (options.datafileUrl) {\n fetchDatafileContent(options.datafileUrl, options)\n .then((datafile) => {\n sdk.setDatafile(datafile);\n\n if (typeof options.onReady === \"function\") {\n options.onReady();\n }\n })\n .catch((e) => {\n console.error(\"Featurevisor failed to fetch datafile:\");\n console.error(e);\n });\n }\n\n return getInstanceFromSdk(sdk, options);\n}\n","import {\n Feature,\n Segment,\n DatafileContent,\n Attribute,\n AttributeKey,\n SegmentKey,\n FeatureKey,\n} from \"@featurevisor/types\";\n\nexport function parseJsonConditionsIfStringified<T>(record: T, key: string): T {\n if (typeof record[key] === \"string\" && record[key] !== \"*\") {\n try {\n record[key] = JSON.parse(record[key]);\n } catch (e) {\n console.error(\"Error parsing JSON\", e);\n }\n }\n\n return record;\n}\n\nexport class DatafileReader {\n private schemaVersion: string;\n private revision: string;\n private attributes: Attribute[];\n private segments: Segment[];\n private features: Feature[];\n\n constructor(datafileJson: DatafileContent) {\n this.schemaVersion = datafileJson.schemaVersion;\n this.revision = datafileJson.revision;\n this.segments = datafileJson.segments;\n this.attributes = datafileJson.attributes;\n this.features = datafileJson.features;\n }\n\n getRevision(): string {\n return this.revision;\n }\n\n getSchemaVersion(): string {\n return this.schemaVersion;\n }\n\n getAllAttributes(): Attribute[] {\n return this.attributes;\n }\n\n getAttribute(attributeKey: AttributeKey): Attribute | undefined {\n return this.attributes.find((a) => a.key === attributeKey);\n }\n\n getSegment(segmentKey: SegmentKey): Segment | undefined {\n const segment = this.segments.find((s) => s.key === segmentKey);\n\n if (!segment) {\n return undefined;\n }\n\n return parseJsonConditionsIfStringified(segment, \"conditions\");\n }\n\n getFeature(featureKey: FeatureKey): Feature | undefined {\n const feature = this.features.find((s) => s.key === featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n return feature;\n }\n}\n","import {\n Allocation,\n Attributes,\n Traffic,\n Feature,\n Variation,\n VariableValue,\n Force,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { allGroupSegmentsAreMatched } from \"./segments\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { VariableSchema } from \"@featurevisor/types/src\";\nimport { Logger } from \"./logger\";\n\nexport function getMatchedTraffic(\n traffic: Traffic[],\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): Traffic | undefined {\n return traffic.find((traffic) => {\n if (bucketValue > traffic.percentage) {\n // out of bucket range\n return false;\n }\n\n if (\n !allGroupSegmentsAreMatched(\n typeof traffic.segments === \"string\" && traffic.segments !== \"*\"\n ? JSON.parse(traffic.segments)\n : traffic.segments,\n attributes,\n datafileReader,\n )\n ) {\n return false;\n }\n\n logger.debug(\"matched rule\", {\n ruleKey: traffic.key,\n });\n\n return true;\n });\n}\n\n// @TODO: make this function better with tests\nexport function getMatchedAllocation(\n matchedTraffic: Traffic,\n bucketValue: number,\n): Allocation | undefined {\n let total = 0;\n\n for (const allocation of matchedTraffic.allocation) {\n total += allocation.percentage;\n\n if (bucketValue <= total) {\n return allocation;\n }\n }\n\n return undefined;\n}\n\nfunction findForceFromFeature(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Force | undefined {\n if (!feature.force) {\n return undefined;\n }\n\n return feature.force.find((f: Force) => {\n if (f.conditions) {\n return allConditionsAreMatched(f.conditions, attributes);\n }\n\n if (f.segments) {\n return allGroupSegmentsAreMatched(f.segments, attributes, datafileReader);\n }\n\n return false;\n });\n}\n\nexport function getForcedVariation(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Variation | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variation) {\n return undefined;\n }\n\n return feature.variations.find((v) => v.value === force.variation);\n}\n\nexport function getBucketedVariation(\n feature: Feature,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): Variation | undefined {\n const matchedTraffic = getMatchedTraffic(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const allocation = getMatchedAllocation(matchedTraffic, bucketValue);\n\n if (!allocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = allocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n featureKey: feature.key,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n logger.debug(\"matched variation\", {\n featureKey: feature.key,\n variation: variation.value,\n bucketValue,\n });\n\n return variation;\n}\n\nexport function getForcedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variables) {\n return undefined;\n }\n\n const value = force.variables[variableSchema.key];\n\n if (typeof value === \"string\" && variableSchema.type === \"json\") {\n return JSON.parse(value);\n }\n\n return value;\n}\n\nexport function getBucketedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): VariableValue | undefined {\n // get traffic\n const matchedTraffic = getMatchedTraffic(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n variableKey: variableSchema.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableKey = variableSchema.key;\n\n // see if variable is set at traffic/rule level\n if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== \"undefined\") {\n logger.debug(\"using variable from rule\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return matchedTraffic.variables[variableKey];\n }\n\n const allocation = getMatchedAllocation(matchedTraffic, bucketValue);\n\n if (!allocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = allocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableFromVariation = variation.variables?.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableFromVariation) {\n logger.debug(\"using default value as variation has no variable\", {\n featureKey: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableSchema.defaultValue as string);\n }\n\n return variableSchema.defaultValue;\n }\n\n if (variableFromVariation.overrides) {\n const override = variableFromVariation.overrides.find((o) => {\n if (o.conditions) {\n return allConditionsAreMatched(\n typeof o.conditions === \"string\" ? JSON.parse(o.conditions) : o.conditions,\n attributes,\n );\n }\n\n if (o.segments) {\n return allGroupSegmentsAreMatched(\n typeof o.segments === \"string\" && o.segments !== \"*\"\n ? JSON.parse(o.segments)\n : o.segments,\n attributes,\n datafileReader,\n );\n }\n\n return false;\n });\n\n if (override) {\n logger.debug(\"using override value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(override.value as string);\n }\n\n return override.value;\n }\n }\n\n logger.debug(\"using value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableFromVariation.value as string);\n }\n\n return variableFromVariation.value;\n}\n","export * from \"./bucket\";\nexport * from \"./client\";\nexport * from \"./createInstance\";\nexport * from \"./logger\";\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LogMessage = string;\n\nexport interface LogDetails {\n [key: string]: any;\n}\n\nexport type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;\n\nexport interface CreateLoggerOptions {\n levels?: LogLevel[];\n handler?: LogHandler;\n}\n\nexport const loggerPrefix = \"[Featurevisor]\";\n\nexport const defaultLogLevels: LogLevel[] = [\n // supported, but not enabled by default\n // \"debug\",\n // \"info\",\n\n // enabled by default\n \"warn\",\n \"error\",\n];\n\nexport const defaultLogHandler: LogHandler = function defaultLogHandler(\n level,\n message,\n details = {},\n) {\n switch (level) {\n case \"debug\":\n console.log(loggerPrefix, message, details);\n case \"info\":\n console.info(loggerPrefix, message, details);\n case \"warn\":\n console.warn(loggerPrefix, message, details);\n case \"error\":\n console.error(loggerPrefix, message, details);\n }\n};\n\nexport class Logger {\n private levels: LogLevel[];\n private handle: LogHandler;\n\n constructor(options: CreateLoggerOptions) {\n this.levels = options.levels as LogLevel[];\n this.handle = options.handler as LogHandler;\n }\n\n setLevels(levels: LogLevel[]) {\n this.levels = levels;\n }\n\n log(level: LogLevel, message: LogMessage, details?: LogDetails) {\n if (this.levels.indexOf(level) !== -1) {\n this.handle(level, message, details);\n }\n }\n\n debug(message: LogMessage, details?: LogDetails) {\n this.log(\"debug\", message, details);\n }\n\n info(message: LogMessage, details?: LogDetails) {\n this.log(\"info\", message, details);\n }\n\n warn(message: LogMessage, details?: LogDetails) {\n this.log(\"warn\", message, details);\n }\n\n error(message: LogMessage, details?: LogDetails) {\n this.log(\"error\", message, details);\n }\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n const levels = options.levels || defaultLogLevels;\n const logHandler = options.handler || defaultLogHandler;\n\n return new Logger({ levels, handler: logHandler });\n}\n","import { Attributes, GroupSegment, Segment, Condition } from \"@featurevisor/types\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { DatafileReader } from \"./datafileReader\";\n\nexport function segmentIsMatched(segment: Segment, attributes: Attributes): boolean {\n return allConditionsAreMatched(segment.conditions as Condition | Condition[], attributes);\n}\n\nexport function allGroupSegmentsAreMatched(\n groupSegments: GroupSegment | GroupSegment[] | \"*\",\n attributes: Attributes,\n datafileReader: DatafileReader,\n): boolean {\n if (groupSegments === \"*\") {\n return true;\n }\n\n if (typeof groupSegments === \"string\") {\n const segment = datafileReader.getSegment(groupSegments);\n\n if (segment) {\n return segmentIsMatched(segment, attributes);\n }\n\n return false;\n }\n\n if (typeof groupSegments === \"object\") {\n if (\"and\" in groupSegments && Array.isArray(groupSegments.and)) {\n return groupSegments.and.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"or\" in groupSegments && Array.isArray(groupSegments.or)) {\n return groupSegments.or.some((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"not\" in groupSegments && Array.isArray(groupSegments.not)) {\n return groupSegments.not.every(\n (groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader) === false,\n );\n }\n }\n\n if (Array.isArray(groupSegments)) {\n return groupSegments.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n return false;\n}\n","const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier)\n this.inc('pre', identifier)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier)\n }\n this.inc('pre', identifier)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0]\n }\n } else {\n this.prerelease = [identifier, 0]\n }\n }\n break\n\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.format()\n this.raw = this.version\n return this\n }\n}\n\nmodule.exports = SemVer\n","const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\nmodule.exports = {\n SEMVER_SPEC_VERSION,\n MAX_LENGTH,\n MAX_SAFE_INTEGER,\n MAX_SAFE_COMPONENT_LENGTH,\n}\n","const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","// parse out just the options we care about so we always get a consistent\n// obj with keys in a consistent order.\nconst opts = ['includePrerelease', 'loose', 'rtl']\nconst parseOptions = options =>\n !options ? {}\n : typeof options !== 'object' ? { loose: true }\n : opts.filter(k => options[k]).reduce((o, k) => {\n o[k] = true\n return o\n }, {})\nmodule.exports = parseOptions\n","const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst createToken = (name, value, isGlobal) => {\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '[0-9]+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*')\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+')\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCE', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(97);\n"],"names":["root","factory","exports","module","define","amd","this","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","i","length","murmur","v2","str","k","l","h","v3","MAX_HASH_VALUE","Math","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","getValueByType","value","fieldType","undefined","parseInt","parseFloat","Array","isArray","options","onActivation","configureBucketValue","logger","createLogger","setDatafile","datafile","datafileReader","DatafileReader","JSON","parse","e","error","getFeature","featureKey","getBucketKey","feature","attributes","prefix","bucketBy","join","getBucketValue","getBucketedNumber","getVariation","warn","forcedVariation","getForcedVariation","debug","variation","bucketValue","getBucketedVariation","defaultVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","variationValue","getAllAttributes","filter","a","capture","forEach","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variableKey","variableSchema","variablesSchema","find","v","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","getVariableJSON","FeaturevisorSDK","conditionIsMatched","condition","attribute","operator","valueInAttributes","indexOf","startsWith","endsWith","semverEq","semverNeq","semverGt","semverGte","semverLt","semverLte","allConditionsAreMatched","conditions","and","every","c","or","some","not","getInstanceFromSdk","sdk","bind","emptyDatafile","schemaVersion","revision","segments","features","datafileUrl","Error","onReady","setTimeout","handleDatafileFetch","fetch","then","res","json","fetchDatafileContent","catch","console","parseJsonConditionsIfStringified","record","datafileJson","getRevision","getSchemaVersion","getAttribute","attributeKey","getSegment","segmentKey","segment","s","getMatchedTraffic","traffic","percentage","allGroupSegmentsAreMatched","ruleKey","getMatchedAllocation","matchedTraffic","total","allocation","findForceFromFeature","force","f","variations","variables","type","variableFromVariation","defaultValue","overrides","override","o","loggerPrefix","defaultLogLevels","defaultLogHandler","level","message","details","log","info","levels","handle","handler","setLevels","Logger","logHandler","segmentIsMatched","groupSegments","groupSegment","MAX_LENGTH","MAX_SAFE_INTEGER","re","t","parseOptions","compareIdentifiers","SemVer","constructor","version","loose","includePrerelease","TypeError","m","trim","match","LOOSE","FULL","raw","major","minor","patch","prerelease","split","map","id","test","num","build","format","toString","compare","other","compareMain","comparePre","b","compareBuild","inc","release","identifier","push","isNaN","Number","SEMVER_SPEC_VERSION","MAX_SAFE_COMPONENT_LENGTH","process","env","NODE_DEBUG","args","numeric","anum","bnum","rcompareIdentifiers","opts","reduce","src","R","createToken","name","isGlobal","index","RegExp","NUMERICIDENTIFIER","NUMERICIDENTIFIERLOOSE","NONNUMERICIDENTIFIER","PRERELEASEIDENTIFIER","PRERELEASEIDENTIFIERLOOSE","BUILDIDENTIFIER","MAINVERSION","PRERELEASE","BUILD","FULLPLAIN","MAINVERSIONLOOSE","PRERELEASELOOSE","LOOSEPLAIN","XRANGEIDENTIFIER","XRANGEIDENTIFIERLOOSE","GTLT","XRANGEPLAIN","XRANGEPLAINLOOSE","COERCE","LONETILDE","tildeTrimReplace","LONECARET","caretTrimReplace","comparatorTrimReplace","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://FeaturevisorSDK/webpack/universalModuleDefinition","webpack://FeaturevisorSDK/../../node_modules/murmurhash/murmurhash.js","webpack://FeaturevisorSDK/./src/bucket.ts","webpack://FeaturevisorSDK/./src/client.ts","webpack://FeaturevisorSDK/./src/conditions.ts","webpack://FeaturevisorSDK/./src/createInstance.ts","webpack://FeaturevisorSDK/./src/datafileReader.ts","webpack://FeaturevisorSDK/./src/feature.ts","webpack://FeaturevisorSDK/./src/index.ts","webpack://FeaturevisorSDK/./src/logger.ts","webpack://FeaturevisorSDK/./src/segments.ts","webpack://FeaturevisorSDK/./node_modules/semver/classes/semver.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/compare.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/eq.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/gt.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/gte.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/lt.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/lte.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/neq.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/constants.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/debug.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/identifiers.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/parse-options.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/re.js","webpack://FeaturevisorSDK/webpack/bootstrap","webpack://FeaturevisorSDK/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FeaturevisorSDK\"] = factory();\n\telse\n\t\troot[\"FeaturevisorSDK\"] = factory();\n})(this, () => {\nreturn ","(function(){\n const _global = this;\n\n const createBuffer = (val) => new TextEncoder().encode(val)\n\n /**\n * JS Implementation of MurmurHash2\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} str ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV2(str, seed) {\n if (typeof str === 'string') str = createBuffer(str);\n let\n l = str.length,\n h = seed ^ l,\n i = 0,\n k;\n\n while (l >= 4) {\n k =\n ((str[i] & 0xff)) |\n ((str[++i] & 0xff) << 8) |\n ((str[++i] & 0xff) << 16) |\n ((str[++i] & 0xff) << 24);\n\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n k ^= k >>> 24;\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;\n\n l -= 4;\n ++i;\n }\n\n switch (l) {\n case 3: h ^= (str[i + 2] & 0xff) << 16;\n case 2: h ^= (str[i + 1] & 0xff) << 8;\n case 1: h ^= (str[i] & 0xff);\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n }\n\n h ^= h >>> 13;\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n h ^= h >>> 15;\n\n return h >>> 0;\n };\n\n /*\n * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV3(key, seed) {\n if (typeof key === 'string') key = createBuffer(key);\n\n let remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;\n\n remainder = key.length & 3; // key.length % 4\n bytes = key.length - remainder;\n h1 = seed;\n c1 = 0xcc9e2d51;\n c2 = 0x1b873593;\n i = 0;\n\n while (i < bytes) {\n k1 =\n ((key[i] & 0xff)) |\n ((key[++i] & 0xff) << 8) |\n ((key[++i] & 0xff) << 16) |\n ((key[++i] & 0xff) << 24);\n ++i;\n\n k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\n h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\n }\n\n k1 = 0;\n\n switch (remainder) {\n case 3: k1 ^= (key[i + 2] & 0xff) << 16;\n case 2: k1 ^= (key[i + 1] & 0xff) << 8;\n case 1: k1 ^= (key[i] & 0xff);\n\n k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n }\n\n const murmur = MurmurHashV3;\n murmur.v2 = MurmurHashV2;\n murmur.v3 = MurmurHashV3;\n\n if (typeof(module) != 'undefined') {\n module.exports = murmur;\n } else {\n const _previousRoot = _global.murmur;\n murmur.noConflict = function() {\n _global.murmur = _previousRoot;\n return murmur;\n }\n _global.murmur = murmur;\n }\n}());\n","import * as murmurhash from \"murmurhash\";\n\nconst HASH_SEED = 1;\nconst MAX_HASH_VALUE = Math.pow(2, 32);\n\nexport const MAX_BUCKETED_NUMBER = 100000; // 100% * 1000 to include three decimal places in the same integer value\n\nexport function getBucketedNumber(bucketKey: string): number {\n const hashValue = murmurhash.v3(bucketKey, HASH_SEED);\n const ratio = hashValue / MAX_HASH_VALUE;\n\n return Math.floor(ratio * MAX_BUCKETED_NUMBER);\n}\n","import {\n Attributes,\n VariationValue,\n VariableValue,\n Feature,\n DatafileContent,\n BucketKey,\n BucketValue,\n FeatureKey,\n VariationType,\n VariableType,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport {\n getBucketedVariation,\n getBucketedVariableValue,\n getForcedVariation,\n getForcedVariableValue,\n} from \"./feature\";\nimport { getBucketedNumber } from \"./bucket\";\nimport { createLogger, Logger } from \"./logger\";\n\nexport type ActivationCallback = (\n featureName: string,\n variation: VariationValue,\n attributes: Attributes,\n captureAttributes: Attributes,\n) => void;\n\nexport type ConfigureBucketValue = (feature, attributes, bucketValue: BucketValue) => BucketValue;\n\nexport interface SdkOptions {\n datafile: DatafileContent | string;\n onActivation?: ActivationCallback; // @TODO: move it to FeaturevisorInstance in next breaking semver\n configureBucketValue?: ConfigureBucketValue;\n logger?: Logger; // @TODO: keep it in FeaturevisorInstance only in next breaking semver\n interceptAttributes?: (attributes: Attributes) => Attributes; // @TODO: move it to FeaturevisorInstance in next breaking semver\n}\n\ntype FieldType = VariationType | VariableType;\ntype ValueType = VariableValue;\n\nexport function getValueByType(value: ValueType, fieldType: FieldType): ValueType {\n if (value === undefined) {\n return undefined;\n }\n\n switch (fieldType) {\n case \"string\":\n return typeof value === \"string\" ? value : undefined;\n case \"integer\":\n return parseInt(value as string, 10);\n case \"double\":\n return parseFloat(value as string);\n case \"boolean\":\n return value === true;\n case \"array\":\n return Array.isArray(value) ? value : undefined;\n case \"object\":\n return typeof value === \"object\" ? value : undefined;\n // @NOTE: `json` is not handled here intentionally\n default:\n return value;\n }\n}\n\n// @TODO: change it to FeaturevisorEngine in next breaking semver\n// @TODO: move activate*() methods to FeaturevisorInstance in next breaking semver\nexport class FeaturevisorSDK {\n private onActivation?: ActivationCallback;\n private datafileReader: DatafileReader;\n private configureBucketValue?: ConfigureBucketValue;\n private logger: Logger;\n private interceptAttributes?: (attributes: Attributes) => Attributes;\n\n constructor(options: SdkOptions) {\n if (options.onActivation) {\n this.onActivation = options.onActivation;\n }\n\n if (options.configureBucketValue) {\n this.configureBucketValue = options.configureBucketValue;\n }\n\n this.logger = options.logger || createLogger();\n\n if (options.interceptAttributes) {\n this.interceptAttributes = options.interceptAttributes;\n }\n\n this.setDatafile(options.datafile);\n }\n\n setDatafile(datafile: DatafileContent | string) {\n try {\n this.datafileReader = new DatafileReader(\n typeof datafile === \"string\" ? JSON.parse(datafile) : datafile,\n );\n } catch (e) {\n this.logger.error(\"could not parse datafile\", { error: e });\n }\n }\n\n getRevision(): string {\n return this.datafileReader.getRevision();\n }\n\n private getFeature(featureKey: string | Feature): Feature | undefined {\n return typeof featureKey === \"string\"\n ? this.datafileReader.getFeature(featureKey) // only key provided\n : featureKey; // full feature provided\n }\n\n /**\n * Bucketing\n */\n\n private getBucketKey(feature: Feature, attributes: Attributes): BucketKey {\n const featureKey = feature.key;\n\n const prefix =\n typeof feature.bucketBy === \"string\" ? feature.bucketBy : feature.bucketBy.join(\"_\");\n\n return `${prefix}_${featureKey}`;\n }\n\n private getBucketValue(feature: Feature, attributes: Attributes): BucketValue {\n const bucketKey = this.getBucketKey(feature, attributes);\n\n const value = getBucketedNumber(bucketKey);\n\n if (this.configureBucketValue) {\n return this.configureBucketValue(feature, attributes, value);\n }\n\n return value;\n }\n\n /**\n * Variation\n */\n\n getVariation(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): VariationValue | undefined {\n try {\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey });\n\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const forcedVariation = getForcedVariation(feature, finalAttributes, this.datafileReader);\n\n if (forcedVariation) {\n this.logger.debug(\"forced variation found\", {\n featureKey,\n variation: forcedVariation.value,\n });\n\n return forcedVariation.value;\n }\n\n const bucketValue = this.getBucketValue(feature, finalAttributes);\n\n const variation = getBucketedVariation(\n feature,\n finalAttributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n\n if (!variation) {\n this.logger.debug(\"using default variation\", {\n featureKey,\n bucketValue,\n variation: feature.defaultVariation,\n });\n\n return feature.defaultVariation;\n }\n\n return variation.value;\n } catch (e) {\n this.logger.error(\"getVariation\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n getVariationBoolean(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n getVariationString(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): string | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n getVariationInteger(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n getVariationDouble(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Activate\n */\n activate(featureKey: FeatureKey, attributes: Attributes = {}): VariationValue | undefined {\n try {\n const variationValue = this.getVariation(featureKey, attributes);\n\n if (typeof variationValue === \"undefined\") {\n return undefined;\n }\n\n if (this.onActivation) {\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const captureAttributes: Attributes = {};\n\n const attributesForCapturing = this.datafileReader\n .getAllAttributes()\n .filter((a) => a.capture === true);\n\n attributesForCapturing.forEach((a) => {\n if (typeof finalAttributes[a.key] !== \"undefined\") {\n captureAttributes[a.key] = attributes[a.key];\n }\n });\n\n this.onActivation(featureKey, variationValue, finalAttributes, captureAttributes);\n }\n\n return variationValue;\n } catch (e) {\n this.logger.error(\"activate\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n activateBoolean(featureKey: FeatureKey, attributes: Attributes = {}): boolean | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n activateString(featureKey: FeatureKey, attributes: Attributes = {}): string | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n activateInteger(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n activateDouble(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Variable\n */\n\n getVariable(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): VariableValue | undefined {\n try {\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const variableSchema = Array.isArray(feature.variablesSchema)\n ? feature.variablesSchema.find((v) => v.key === variableKey)\n : undefined;\n\n if (!variableSchema) {\n this.logger.warn(\"variable schema not found\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const forcedVariableValue = getForcedVariableValue(\n feature,\n variableSchema,\n finalAttributes,\n this.datafileReader,\n );\n\n if (typeof forcedVariableValue !== \"undefined\") {\n this.logger.debug(\"forced variable value found\", { featureKey, variableKey });\n\n return forcedVariableValue;\n }\n\n const bucketValue = this.getBucketValue(feature, finalAttributes);\n\n return getBucketedVariableValue(\n feature,\n variableSchema,\n finalAttributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n } catch (e) {\n this.logger.error(\"getVariable\", { featureKey, variableKey, error: e });\n\n return undefined;\n }\n }\n\n getVariableBoolean(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"boolean\") as boolean | undefined;\n }\n\n getVariableString(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"string\") as string | undefined;\n }\n\n getVariableInteger(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"integer\") as number | undefined;\n }\n\n getVariableDouble(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"double\") as number | undefined;\n }\n\n getVariableArray(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string[] | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"array\") as string[] | undefined;\n }\n\n getVariableObject<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"object\") as T | undefined;\n }\n\n getVariableJSON<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"json\") as T | undefined;\n }\n}\n","import { Attributes, Condition, PlainCondition } from \"@featurevisor/types\";\n\nimport * as semverGt from \"semver/functions/gt\";\nimport * as semverLt from \"semver/functions/lt\";\nimport * as semverEq from \"semver/functions/eq\";\nimport * as semverNeq from \"semver/functions/neq\";\nimport * as semverGte from \"semver/functions/gte\";\nimport * as semverLte from \"semver/functions/lte\";\n\nexport function conditionIsMatched(condition: PlainCondition, attributes: Attributes): boolean {\n const { attribute, operator, value } = condition;\n\n if (operator === \"equals\") {\n return attributes[attribute] === value;\n } else if (operator === \"notEquals\") {\n return attributes[attribute] !== value;\n } else if (typeof attributes[attribute] === \"string\" && Array.isArray(value)) {\n // array\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"in\") {\n return value.indexOf(valueInAttributes) !== -1;\n } else if (operator === \"notIn\") {\n return value.indexOf(valueInAttributes) === -1;\n }\n } else if (typeof attributes[attribute] === \"string\" && typeof value === \"string\") {\n // string\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"contains\") {\n return valueInAttributes.indexOf(value) !== -1;\n } else if (operator === \"notContains\") {\n return valueInAttributes.indexOf(value) === -1;\n } else if (operator === \"startsWith\") {\n return valueInAttributes.startsWith(value);\n } else if (operator === \"endsWith\") {\n return valueInAttributes.endsWith(value);\n } else if (operator === \"semverEquals\") {\n return semverEq(valueInAttributes, value);\n } else if (operator === \"semverNotEquals\") {\n return semverNeq(valueInAttributes, value);\n } else if (operator === \"semverGreaterThan\") {\n return semverGt(valueInAttributes, value);\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return semverGte(valueInAttributes, value);\n } else if (operator === \"semverLessThan\") {\n return semverLt(valueInAttributes, value);\n } else if (operator === \"semverLessThanOrEquals\") {\n return semverLte(valueInAttributes, value);\n }\n } else if (typeof attributes[attribute] === \"number\" && typeof value === \"number\") {\n // numeric\n const valueInAttributes = attributes[attribute] as number;\n\n if (operator === \"greaterThan\") {\n return valueInAttributes > value;\n } else if (operator === \"greaterThanOrEquals\") {\n return valueInAttributes >= value;\n } else if (operator === \"lessThan\") {\n return valueInAttributes < value;\n } else if (operator === \"lessThanOrEquals\") {\n return valueInAttributes <= value;\n }\n }\n\n return false;\n}\n\nexport function allConditionsAreMatched(\n conditions: Condition[] | Condition,\n attributes: Attributes,\n): boolean {\n if (\"attribute\" in conditions) {\n return conditionIsMatched(conditions, attributes);\n }\n\n if (\"and\" in conditions && Array.isArray(conditions.and)) {\n return conditions.and.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"or\" in conditions && Array.isArray(conditions.or)) {\n return conditions.or.some((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"not\" in conditions && Array.isArray(conditions.not)) {\n return conditions.not.every(\n (c) =>\n allConditionsAreMatched(\n {\n and: conditions.not,\n },\n attributes,\n ) === false,\n );\n }\n\n if (Array.isArray(conditions)) {\n return conditions.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n return false;\n}\n","import { DatafileContent, Attributes } from \"@featurevisor/types\";\nimport { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from \"./client\";\nimport { createLogger, Logger } from \"./logger\";\n\nexport type ReadyCallback = () => void;\n\nexport interface InstanceOptions {\n // from SdkOptions\n datafile?: DatafileContent | string; // optional here, but not in SdkOptions\n onActivation?: ActivationCallback;\n configureBucketValue?: ConfigureBucketValue;\n\n // additions\n datafileUrl?: string;\n onReady?: ReadyCallback;\n handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;\n logger?: Logger;\n interceptAttributes?: (attributes: Attributes) => Attributes;\n refreshInterval?: number; // seconds\n onRefresh?: () => void;\n onUpdate?: () => void;\n}\n\n// @TODO: consider renaming it to FeaturevisorSDK in next breaking semver\nexport interface FeaturevisorInstance {\n /**\n * From FeaturevisorSDK\n */\n\n // variation\n getVariation: FeaturevisorSDK[\"getVariation\"];\n getVariationBoolean: FeaturevisorSDK[\"getVariationBoolean\"];\n getVariationInteger: FeaturevisorSDK[\"getVariationInteger\"];\n getVariationDouble: FeaturevisorSDK[\"getVariationDouble\"];\n getVariationString: FeaturevisorSDK[\"getVariationString\"];\n\n // activate\n activate: FeaturevisorSDK[\"activate\"];\n activateBoolean: FeaturevisorSDK[\"activateBoolean\"];\n activateInteger: FeaturevisorSDK[\"activateInteger\"];\n activateDouble: FeaturevisorSDK[\"activateDouble\"];\n activateString: FeaturevisorSDK[\"activateString\"];\n\n // variable\n getVariable: FeaturevisorSDK[\"getVariable\"];\n getVariableBoolean: FeaturevisorSDK[\"getVariableBoolean\"];\n getVariableInteger: FeaturevisorSDK[\"getVariableInteger\"];\n getVariableDouble: FeaturevisorSDK[\"getVariableDouble\"];\n getVariableString: FeaturevisorSDK[\"getVariableString\"];\n getVariableArray: FeaturevisorSDK[\"getVariableArray\"];\n getVariableObject: FeaturevisorSDK[\"getVariableObject\"];\n\n /**\n * Additions\n */\n setLogLevels: Logger[\"setLevels\"];\n refresh: () => void;\n startRefreshing: () => void;\n stopRefreshing: () => void;\n}\n\nfunction fetchDatafileContent(datafileUrl, options: InstanceOptions): Promise<DatafileContent> {\n if (options.handleDatafileFetch) {\n return options.handleDatafileFetch(datafileUrl);\n }\n\n return fetch(datafileUrl).then((res) => res.json());\n}\n\nfunction getInstanceFromSdk(\n sdk: FeaturevisorSDK,\n options: InstanceOptions,\n logger: Logger,\n): FeaturevisorInstance {\n let intervalId;\n let refreshInProgress = false;\n\n const instance: FeaturevisorInstance = {\n // variation\n getVariation: sdk.getVariation.bind(sdk),\n getVariationBoolean: sdk.getVariationBoolean.bind(sdk),\n getVariationInteger: sdk.getVariationInteger.bind(sdk),\n getVariationDouble: sdk.getVariationDouble.bind(sdk),\n getVariationString: sdk.getVariationString.bind(sdk),\n\n // activate\n activate: sdk.activate,\n activateBoolean: sdk.activateBoolean.bind(sdk),\n activateInteger: sdk.activateInteger.bind(sdk),\n activateDouble: sdk.activateDouble.bind(sdk),\n activateString: sdk.activateString.bind(sdk),\n\n // variable\n getVariable: sdk.getVariable.bind(sdk),\n getVariableBoolean: sdk.getVariableBoolean.bind(sdk),\n getVariableInteger: sdk.getVariableInteger.bind(sdk),\n getVariableDouble: sdk.getVariableDouble.bind(sdk),\n getVariableString: sdk.getVariableString.bind(sdk),\n getVariableArray: sdk.getVariableArray.bind(sdk),\n getVariableObject: sdk.getVariableObject.bind(sdk),\n\n // additions\n setLogLevels: logger.setLevels.bind(logger),\n\n refresh() {\n logger.debug(\"refreshing datafile\");\n\n if (refreshInProgress) {\n return logger.warn(\"refresh in progress, skipping\");\n }\n\n if (!options.datafileUrl) {\n return logger.error(\"cannot refresh since `datafileUrl` is not provided\");\n }\n\n refreshInProgress = true;\n\n fetchDatafileContent(options.datafileUrl, options)\n .then((datafile) => {\n const currentRevision = sdk.getRevision();\n const newRevision = datafile.revision;\n const isNotSameRevision = currentRevision !== newRevision;\n\n sdk.setDatafile(datafile);\n logger.info(\"refreshed datafile\");\n\n if (typeof options.onRefresh === \"function\") {\n options.onRefresh();\n }\n\n if (isNotSameRevision && typeof options.onUpdate === \"function\") {\n options.onUpdate();\n }\n\n refreshInProgress = false;\n })\n .catch((e) => {\n logger.error(\"failed to refresh datafile\", { error: e });\n refreshInProgress = false;\n });\n },\n\n startRefreshing() {\n if (!options.datafileUrl) {\n return logger.error(\"cannot start refreshing since `datafileUrl` is not provided\");\n }\n\n if (intervalId) {\n return logger.warn(\"refreshing has already started\");\n }\n\n if (!options.refreshInterval) {\n return logger.warn(\"no `refreshInterval` option provided\");\n }\n\n intervalId = setInterval(() => {\n instance.refresh();\n }, options.refreshInterval * 1000);\n },\n\n stopRefreshing() {\n if (!intervalId) {\n return logger.warn(\"refreshing has not started yet\");\n }\n\n clearInterval(intervalId);\n },\n };\n\n if (options.datafileUrl && options.refreshInterval) {\n instance.startRefreshing();\n }\n\n return instance;\n}\n\nconst emptyDatafile: DatafileContent = {\n schemaVersion: \"1\",\n revision: \"unknown\",\n attributes: [],\n segments: [],\n features: [],\n};\n\nexport function createInstance(options: InstanceOptions) {\n if (!options.datafile && !options.datafileUrl) {\n throw new Error(\n \"Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options\",\n );\n }\n\n const logger = options.logger || createLogger();\n\n if (!options.datafileUrl && options.refreshInterval) {\n logger.warn(\"refreshing datafile requires `datafileUrl` option\");\n }\n\n // datafile content is already provided\n if (options.datafile) {\n const sdk = new FeaturevisorSDK({\n datafile: options.datafile,\n onActivation: options.onActivation,\n configureBucketValue: options.configureBucketValue,\n logger,\n interceptAttributes: options.interceptAttributes,\n });\n\n if (typeof options.onReady === \"function\") {\n const onReady = options.onReady;\n\n setTimeout(function () {\n onReady();\n }, 0);\n }\n\n return getInstanceFromSdk(sdk, options, logger);\n }\n\n // datafile has to be fetched\n const sdk = new FeaturevisorSDK({\n datafile: emptyDatafile,\n onActivation: options.onActivation,\n configureBucketValue: options.configureBucketValue,\n logger,\n interceptAttributes: options.interceptAttributes,\n });\n\n if (options.datafileUrl) {\n fetchDatafileContent(options.datafileUrl, options)\n .then((datafile) => {\n sdk.setDatafile(datafile);\n\n if (typeof options.onReady === \"function\") {\n options.onReady();\n }\n })\n .catch((e) => {\n logger.error(\"failed to fetch datafile:\");\n console.error(e);\n });\n }\n\n return getInstanceFromSdk(sdk, options, logger);\n}\n","import {\n Feature,\n Segment,\n DatafileContent,\n Attribute,\n AttributeKey,\n SegmentKey,\n FeatureKey,\n} from \"@featurevisor/types\";\n\nexport function parseJsonConditionsIfStringified<T>(record: T, key: string): T {\n if (typeof record[key] === \"string\" && record[key] !== \"*\") {\n try {\n record[key] = JSON.parse(record[key]);\n } catch (e) {\n console.error(\"Error parsing JSON\", e);\n }\n }\n\n return record;\n}\n\nexport class DatafileReader {\n private schemaVersion: string;\n private revision: string;\n private attributes: Attribute[];\n private segments: Segment[];\n private features: Feature[];\n\n constructor(datafileJson: DatafileContent) {\n this.schemaVersion = datafileJson.schemaVersion;\n this.revision = datafileJson.revision;\n this.segments = datafileJson.segments;\n this.attributes = datafileJson.attributes;\n this.features = datafileJson.features;\n }\n\n getRevision(): string {\n return this.revision;\n }\n\n getSchemaVersion(): string {\n return this.schemaVersion;\n }\n\n getAllAttributes(): Attribute[] {\n return this.attributes;\n }\n\n getAttribute(attributeKey: AttributeKey): Attribute | undefined {\n return this.attributes.find((a) => a.key === attributeKey);\n }\n\n getSegment(segmentKey: SegmentKey): Segment | undefined {\n const segment = this.segments.find((s) => s.key === segmentKey);\n\n if (!segment) {\n return undefined;\n }\n\n return parseJsonConditionsIfStringified(segment, \"conditions\");\n }\n\n getFeature(featureKey: FeatureKey): Feature | undefined {\n const feature = this.features.find((s) => s.key === featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n return feature;\n }\n}\n","import {\n Allocation,\n Attributes,\n Traffic,\n Feature,\n Variation,\n VariableValue,\n Force,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { allGroupSegmentsAreMatched } from \"./segments\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { VariableSchema } from \"@featurevisor/types/src\";\nimport { Logger } from \"./logger\";\n\nexport function getMatchedTraffic(\n traffic: Traffic[],\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): Traffic | undefined {\n return traffic.find((traffic) => {\n if (bucketValue > traffic.percentage) {\n // out of bucket range\n return false;\n }\n\n if (\n !allGroupSegmentsAreMatched(\n typeof traffic.segments === \"string\" && traffic.segments !== \"*\"\n ? JSON.parse(traffic.segments)\n : traffic.segments,\n attributes,\n datafileReader,\n )\n ) {\n return false;\n }\n\n logger.debug(\"matched rule\", {\n ruleKey: traffic.key,\n });\n\n return true;\n });\n}\n\n// @TODO: make this function better with tests\nexport function getMatchedAllocation(\n matchedTraffic: Traffic,\n bucketValue: number,\n): Allocation | undefined {\n let total = 0;\n\n for (const allocation of matchedTraffic.allocation) {\n total += allocation.percentage;\n\n if (bucketValue <= total) {\n return allocation;\n }\n }\n\n return undefined;\n}\n\nfunction findForceFromFeature(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Force | undefined {\n if (!feature.force) {\n return undefined;\n }\n\n return feature.force.find((f: Force) => {\n if (f.conditions) {\n return allConditionsAreMatched(f.conditions, attributes);\n }\n\n if (f.segments) {\n return allGroupSegmentsAreMatched(f.segments, attributes, datafileReader);\n }\n\n return false;\n });\n}\n\nexport function getForcedVariation(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Variation | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variation) {\n return undefined;\n }\n\n return feature.variations.find((v) => v.value === force.variation);\n}\n\nexport function getBucketedVariation(\n feature: Feature,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): Variation | undefined {\n const matchedTraffic = getMatchedTraffic(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const allocation = getMatchedAllocation(matchedTraffic, bucketValue);\n\n if (!allocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = allocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n featureKey: feature.key,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n logger.debug(\"matched variation\", {\n featureKey: feature.key,\n variation: variation.value,\n bucketValue,\n });\n\n return variation;\n}\n\nexport function getForcedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variables) {\n return undefined;\n }\n\n const value = force.variables[variableSchema.key];\n\n if (typeof value === \"string\" && variableSchema.type === \"json\") {\n return JSON.parse(value);\n }\n\n return value;\n}\n\nexport function getBucketedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): VariableValue | undefined {\n // get traffic\n const matchedTraffic = getMatchedTraffic(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n variableKey: variableSchema.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableKey = variableSchema.key;\n\n // see if variable is set at traffic/rule level\n if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== \"undefined\") {\n logger.debug(\"using variable from rule\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return matchedTraffic.variables[variableKey];\n }\n\n const allocation = getMatchedAllocation(matchedTraffic, bucketValue);\n\n if (!allocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = allocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableFromVariation = variation.variables?.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableFromVariation) {\n logger.debug(\"using default value as variation has no variable\", {\n featureKey: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableSchema.defaultValue as string);\n }\n\n return variableSchema.defaultValue;\n }\n\n if (variableFromVariation.overrides) {\n const override = variableFromVariation.overrides.find((o) => {\n if (o.conditions) {\n return allConditionsAreMatched(\n typeof o.conditions === \"string\" ? JSON.parse(o.conditions) : o.conditions,\n attributes,\n );\n }\n\n if (o.segments) {\n return allGroupSegmentsAreMatched(\n typeof o.segments === \"string\" && o.segments !== \"*\"\n ? JSON.parse(o.segments)\n : o.segments,\n attributes,\n datafileReader,\n );\n }\n\n return false;\n });\n\n if (override) {\n logger.debug(\"using override value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(override.value as string);\n }\n\n return override.value;\n }\n }\n\n logger.debug(\"using value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableFromVariation.value as string);\n }\n\n return variableFromVariation.value;\n}\n","export * from \"./bucket\";\nexport * from \"./client\";\nexport * from \"./createInstance\";\nexport * from \"./logger\";\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LogMessage = string;\n\nexport interface LogDetails {\n [key: string]: any;\n}\n\nexport type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;\n\nexport interface CreateLoggerOptions {\n levels?: LogLevel[];\n handler?: LogHandler;\n}\n\nexport const loggerPrefix = \"[Featurevisor]\";\n\nexport const defaultLogLevels: LogLevel[] = [\n // supported, but not enabled by default\n // \"debug\",\n // \"info\",\n\n // enabled by default\n \"warn\",\n \"error\",\n];\n\nexport const defaultLogHandler: LogHandler = function defaultLogHandler(\n level,\n message,\n details = {},\n) {\n switch (level) {\n case \"debug\":\n console.log(loggerPrefix, message, details);\n case \"info\":\n console.info(loggerPrefix, message, details);\n case \"warn\":\n console.warn(loggerPrefix, message, details);\n case \"error\":\n console.error(loggerPrefix, message, details);\n }\n};\n\nexport class Logger {\n private levels: LogLevel[];\n private handle: LogHandler;\n\n constructor(options: CreateLoggerOptions) {\n this.levels = options.levels as LogLevel[];\n this.handle = options.handler as LogHandler;\n }\n\n setLevels(levels: LogLevel[]) {\n this.levels = levels;\n }\n\n log(level: LogLevel, message: LogMessage, details?: LogDetails) {\n if (this.levels.indexOf(level) !== -1) {\n this.handle(level, message, details);\n }\n }\n\n debug(message: LogMessage, details?: LogDetails) {\n this.log(\"debug\", message, details);\n }\n\n info(message: LogMessage, details?: LogDetails) {\n this.log(\"info\", message, details);\n }\n\n warn(message: LogMessage, details?: LogDetails) {\n this.log(\"warn\", message, details);\n }\n\n error(message: LogMessage, details?: LogDetails) {\n this.log(\"error\", message, details);\n }\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n const levels = options.levels || defaultLogLevels;\n const logHandler = options.handler || defaultLogHandler;\n\n return new Logger({ levels, handler: logHandler });\n}\n","import { Attributes, GroupSegment, Segment, Condition } from \"@featurevisor/types\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { DatafileReader } from \"./datafileReader\";\n\nexport function segmentIsMatched(segment: Segment, attributes: Attributes): boolean {\n return allConditionsAreMatched(segment.conditions as Condition | Condition[], attributes);\n}\n\nexport function allGroupSegmentsAreMatched(\n groupSegments: GroupSegment | GroupSegment[] | \"*\",\n attributes: Attributes,\n datafileReader: DatafileReader,\n): boolean {\n if (groupSegments === \"*\") {\n return true;\n }\n\n if (typeof groupSegments === \"string\") {\n const segment = datafileReader.getSegment(groupSegments);\n\n if (segment) {\n return segmentIsMatched(segment, attributes);\n }\n\n return false;\n }\n\n if (typeof groupSegments === \"object\") {\n if (\"and\" in groupSegments && Array.isArray(groupSegments.and)) {\n return groupSegments.and.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"or\" in groupSegments && Array.isArray(groupSegments.or)) {\n return groupSegments.or.some((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"not\" in groupSegments && Array.isArray(groupSegments.not)) {\n return groupSegments.not.every(\n (groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader) === false,\n );\n }\n }\n\n if (Array.isArray(groupSegments)) {\n return groupSegments.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n return false;\n}\n","const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier)\n this.inc('pre', identifier)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier)\n }\n this.inc('pre', identifier)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0]\n }\n } else {\n this.prerelease = [identifier, 0]\n }\n }\n break\n\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.format()\n this.raw = this.version\n return this\n }\n}\n\nmodule.exports = SemVer\n","const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\nmodule.exports = {\n SEMVER_SPEC_VERSION,\n MAX_LENGTH,\n MAX_SAFE_INTEGER,\n MAX_SAFE_COMPONENT_LENGTH,\n}\n","const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","// parse out just the options we care about so we always get a consistent\n// obj with keys in a consistent order.\nconst opts = ['includePrerelease', 'loose', 'rtl']\nconst parseOptions = options =>\n !options ? {}\n : typeof options !== 'object' ? { loose: true }\n : opts.filter(k => options[k]).reduce((o, k) => {\n o[k] = true\n return o\n }, {})\nmodule.exports = parseOptions\n","const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst createToken = (name, value, isGlobal) => {\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '[0-9]+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*')\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+')\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCE', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(97);\n"],"names":["root","factory","exports","module","define","amd","this","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","i","length","murmur","v2","str","k","l","h","v3","MAX_HASH_VALUE","Math","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","getValueByType","value","fieldType","undefined","parseInt","parseFloat","Array","isArray","options","onActivation","configureBucketValue","logger","createLogger","interceptAttributes","setDatafile","datafile","datafileReader","DatafileReader","JSON","parse","e","error","getRevision","getFeature","featureKey","getBucketKey","feature","attributes","prefix","bucketBy","join","getBucketValue","getBucketedNumber","getVariation","warn","finalAttributes","forcedVariation","getForcedVariation","debug","variation","bucketValue","getBucketedVariation","defaultVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","variationValue","getAllAttributes","filter","a","capture","forEach","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variableKey","variableSchema","variablesSchema","find","v","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","getVariableJSON","FeaturevisorSDK","conditionIsMatched","condition","attribute","operator","valueInAttributes","indexOf","startsWith","endsWith","semverEq","semverNeq","semverGt","semverGte","semverLt","semverLte","allConditionsAreMatched","conditions","and","every","c","or","some","not","fetchDatafileContent","datafileUrl","handleDatafileFetch","fetch","then","res","json","getInstanceFromSdk","sdk","intervalId","refreshInProgress","instance","bind","setLogLevels","setLevels","refresh","isNotSameRevision","revision","info","onRefresh","onUpdate","catch","startRefreshing","refreshInterval","setInterval","stopRefreshing","clearInterval","emptyDatafile","schemaVersion","segments","features","Error","onReady","setTimeout","console","parseJsonConditionsIfStringified","record","datafileJson","getSchemaVersion","getAttribute","attributeKey","getSegment","segmentKey","segment","s","getMatchedTraffic","traffic","percentage","allGroupSegmentsAreMatched","ruleKey","getMatchedAllocation","matchedTraffic","total","allocation","findForceFromFeature","force","f","variations","variables","type","variableFromVariation","defaultValue","overrides","override","o","loggerPrefix","defaultLogLevels","defaultLogHandler","level","message","details","log","levels","handle","handler","Logger","logHandler","segmentIsMatched","groupSegments","groupSegment","MAX_LENGTH","MAX_SAFE_INTEGER","re","t","parseOptions","compareIdentifiers","SemVer","constructor","version","loose","includePrerelease","TypeError","m","trim","match","LOOSE","FULL","raw","major","minor","patch","prerelease","split","map","id","test","num","build","format","toString","compare","other","compareMain","comparePre","b","compareBuild","inc","release","identifier","push","isNaN","Number","SEMVER_SPEC_VERSION","MAX_SAFE_COMPONENT_LENGTH","process","env","NODE_DEBUG","args","numeric","anum","bnum","rcompareIdentifiers","opts","reduce","src","R","createToken","name","isGlobal","index","RegExp","NUMERICIDENTIFIER","NUMERICIDENTIFIERLOOSE","NONNUMERICIDENTIFIER","PRERELEASEIDENTIFIER","PRERELEASEIDENTIFIERLOOSE","BUILDIDENTIFIER","MAINVERSION","PRERELEASE","BUILD","FULLPLAIN","MAINVERSIONLOOSE","PRERELEASELOOSE","LOOSEPLAIN","XRANGEIDENTIFIER","XRANGEIDENTIFIERLOOSE","GTLT","XRANGEPLAIN","XRANGEPLAINLOOSE","COERCE","LONETILDE","tildeTrimReplace","LONECARET","caretTrimReplace","comparatorTrimReplace","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
package/lib/client.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export interface SdkOptions {
|
|
|
7
7
|
onActivation?: ActivationCallback;
|
|
8
8
|
configureBucketValue?: ConfigureBucketValue;
|
|
9
9
|
logger?: Logger;
|
|
10
|
+
interceptAttributes?: (attributes: Attributes) => Attributes;
|
|
10
11
|
}
|
|
11
12
|
type FieldType = VariationType | VariableType;
|
|
12
13
|
type ValueType = VariableValue;
|
|
@@ -16,8 +17,10 @@ export declare class FeaturevisorSDK {
|
|
|
16
17
|
private datafileReader;
|
|
17
18
|
private configureBucketValue?;
|
|
18
19
|
private logger;
|
|
20
|
+
private interceptAttributes?;
|
|
19
21
|
constructor(options: SdkOptions);
|
|
20
22
|
setDatafile(datafile: DatafileContent | string): void;
|
|
23
|
+
getRevision(): string;
|
|
21
24
|
private getFeature;
|
|
22
25
|
/**
|
|
23
26
|
* Bucketing
|
package/lib/client.js
CHANGED
|
@@ -35,6 +35,9 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
35
35
|
this.configureBucketValue = options.configureBucketValue;
|
|
36
36
|
}
|
|
37
37
|
this.logger = options.logger || createLogger();
|
|
38
|
+
if (options.interceptAttributes) {
|
|
39
|
+
this.interceptAttributes = options.interceptAttributes;
|
|
40
|
+
}
|
|
38
41
|
this.setDatafile(options.datafile);
|
|
39
42
|
}
|
|
40
43
|
FeaturevisorSDK.prototype.setDatafile = function (datafile) {
|
|
@@ -45,6 +48,9 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
45
48
|
this.logger.error("could not parse datafile", { error: e });
|
|
46
49
|
}
|
|
47
50
|
};
|
|
51
|
+
FeaturevisorSDK.prototype.getRevision = function () {
|
|
52
|
+
return this.datafileReader.getRevision();
|
|
53
|
+
};
|
|
48
54
|
FeaturevisorSDK.prototype.getFeature = function (featureKey) {
|
|
49
55
|
return typeof featureKey === "string"
|
|
50
56
|
? this.datafileReader.getFeature(featureKey) // only key provided
|
|
@@ -77,7 +83,10 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
77
83
|
this.logger.warn("feature not found in datafile", { featureKey: featureKey });
|
|
78
84
|
return undefined;
|
|
79
85
|
}
|
|
80
|
-
var
|
|
86
|
+
var finalAttributes = this.interceptAttributes
|
|
87
|
+
? this.interceptAttributes(attributes)
|
|
88
|
+
: attributes;
|
|
89
|
+
var forcedVariation = getForcedVariation(feature, finalAttributes, this.datafileReader);
|
|
81
90
|
if (forcedVariation) {
|
|
82
91
|
this.logger.debug("forced variation found", {
|
|
83
92
|
featureKey: featureKey,
|
|
@@ -85,8 +94,8 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
85
94
|
});
|
|
86
95
|
return forcedVariation.value;
|
|
87
96
|
}
|
|
88
|
-
var bucketValue = this.getBucketValue(feature,
|
|
89
|
-
var variation = getBucketedVariation(feature,
|
|
97
|
+
var bucketValue = this.getBucketValue(feature, finalAttributes);
|
|
98
|
+
var variation = getBucketedVariation(feature, finalAttributes, bucketValue, this.datafileReader, this.logger);
|
|
90
99
|
if (!variation) {
|
|
91
100
|
this.logger.debug("using default variation", {
|
|
92
101
|
featureKey: featureKey,
|
|
@@ -133,16 +142,19 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
133
142
|
return undefined;
|
|
134
143
|
}
|
|
135
144
|
if (this.onActivation) {
|
|
145
|
+
var finalAttributes_1 = this.interceptAttributes
|
|
146
|
+
? this.interceptAttributes(attributes)
|
|
147
|
+
: attributes;
|
|
136
148
|
var captureAttributes_1 = {};
|
|
137
149
|
var attributesForCapturing = this.datafileReader
|
|
138
150
|
.getAllAttributes()
|
|
139
151
|
.filter(function (a) { return a.capture === true; });
|
|
140
152
|
attributesForCapturing.forEach(function (a) {
|
|
141
|
-
if (typeof
|
|
153
|
+
if (typeof finalAttributes_1[a.key] !== "undefined") {
|
|
142
154
|
captureAttributes_1[a.key] = attributes[a.key];
|
|
143
155
|
}
|
|
144
156
|
});
|
|
145
|
-
this.onActivation(featureKey, variationValue,
|
|
157
|
+
this.onActivation(featureKey, variationValue, finalAttributes_1, captureAttributes_1);
|
|
146
158
|
}
|
|
147
159
|
return variationValue;
|
|
148
160
|
}
|
|
@@ -189,13 +201,16 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
189
201
|
this.logger.warn("variable schema not found", { featureKey: featureKey, variableKey: variableKey });
|
|
190
202
|
return undefined;
|
|
191
203
|
}
|
|
192
|
-
var
|
|
204
|
+
var finalAttributes = this.interceptAttributes
|
|
205
|
+
? this.interceptAttributes(attributes)
|
|
206
|
+
: attributes;
|
|
207
|
+
var forcedVariableValue = getForcedVariableValue(feature, variableSchema, finalAttributes, this.datafileReader);
|
|
193
208
|
if (typeof forcedVariableValue !== "undefined") {
|
|
194
209
|
this.logger.debug("forced variable value found", { featureKey: featureKey, variableKey: variableKey });
|
|
195
210
|
return forcedVariableValue;
|
|
196
211
|
}
|
|
197
|
-
var bucketValue = this.getBucketValue(feature,
|
|
198
|
-
return getBucketedVariableValue(feature, variableSchema,
|
|
212
|
+
var bucketValue = this.getBucketValue(feature, finalAttributes);
|
|
213
|
+
return getBucketedVariableValue(feature, variableSchema, finalAttributes, bucketValue, this.datafileReader, this.logger);
|
|
199
214
|
}
|
|
200
215
|
catch (e) {
|
|
201
216
|
this.logger.error("getVariable", { featureKey: featureKey, variableKey: variableKey, error: e });
|