@featurevisor/sdk 0.12.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.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/compare-versions/lib/esm/index.js","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/webpack/bootstrap","webpack://FeaturevisorSDK/webpack/runtime/define property getters","webpack://FeaturevisorSDK/webpack/runtime/hasOwnProperty shorthand","webpack://FeaturevisorSDK/webpack/runtime/make namespace object","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 ","/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n/**\n * Validate [semver](https://semver.org/) version strings.\n *\n * @param version Version number to validate\n * @returns `true` if the version number is a valid semver version number, `false` otherwise.\n *\n * @example\n * ```\n * validate('1.0.0-rc.1'); // return true\n * validate('1.0-rc.1'); // return false\n * validate('foo'); // return false\n * ```\n */\nexport const validate = (version) => typeof version === 'string' && /^[v\\d]/.test(version) && semver.test(version);\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\n/**\n * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.\n *\n * @param version Version number to match\n * @param range Range pattern for version\n * @returns `true` if the version number is within the range, `false` otherwise.\n *\n * @example\n * ```\n * satisfies('1.1.0', '^1.0.0'); // return true\n * satisfies('1.1.0', '~1.0.0'); // return false\n * ```\n */\nexport const satisfies = (version, range) => {\n // handle multiple comparators\n if (range.includes('||')) {\n return range.split('||').some((r) => satisfies(version, r));\n }\n else if (range.includes(' ')) {\n return range\n .trim()\n .replace(/\\s{2,}/g, ' ')\n .split(' ')\n .every((r) => satisfies(version, r));\n }\n // if no range operator then \"=\"\n const m = range.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~')\n return compare(version, range, op);\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3, , vp] = validateAndParse(version);\n const [r1, r2, r3, , rp] = validateAndParse(range);\n const v = [v1, v2, v3];\n const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];\n // validate pre-release\n if (rp) {\n if (!vp)\n return false;\n if (compareSegments(v, r) !== 0)\n return false;\n if (compareSegments(vp.split('.'), rp.split('.')) === -1)\n return false;\n }\n // first non-zero number\n const nonZero = r.findIndex((v) => v !== '0') + 1;\n // pointer to where segments can be >=\n const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;\n // before pointer must be equal\n if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)\n return false;\n // after pointer must be >=\n if (compareSegments(v.slice(i), r.slice(i)) === -1)\n return false;\n return true;\n};\nconst semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nconst validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nconst compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=index.js.map","(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 { compareVersions } from \"compare-versions\";\n\nimport { Attributes, Condition, PlainCondition } from \"@featurevisor/types\";\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 compareVersions(valueInAttributes, value) === 0;\n } else if (operator === \"semverNotEquals\") {\n return compareVersions(valueInAttributes, value) !== 0;\n } else if (operator === \"semverGreaterThan\") {\n return compareVersions(valueInAttributes, value) === 1;\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return compareVersions(valueInAttributes, value) >= 0;\n } else if (operator === \"semverLessThan\") {\n return compareVersions(valueInAttributes, value) === -1;\n } else if (operator === \"semverLessThanOrEquals\") {\n return compareVersions(valueInAttributes, value) <= 0;\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 if (matchedTraffic.variation) {\n const variation = feature.variations.find((v) => {\n return v.value === matchedTraffic.variation;\n });\n\n if (variation) {\n logger.debug(\"using variation from rule\", {\n featureKey: feature.key,\n variation: variation.value,\n ruleKey: matchedTraffic.key,\n });\n\n return variation;\n }\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","// 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","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\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","compareVersions","v1","v2","n1","validateAndParse","n2","p1","pop","p2","r","compareSegments","split","validate","version","test","semver","compare","operator","assertValidOperator","res","operatorResMap","includes","satisfies","range","some","trim","replace","every","m","match","op","v3","vp","r1","r2","r3","rp","v","nonZero","findIndex","i","slice","TypeError","Error","shift","isWildcard","s","tryParse","n","parseInt","isNaN","compareStrings","a","b","ap","bp","String","forceType","Math","max","length","allowedOperators","Object","keys","indexOf","join","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","murmur","str","k","l","h","MAX_HASH_VALUE","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","getValueByType","value","fieldType","undefined","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","getBucketValue","getBucketedNumber","getVariation","warn","finalAttributes","forcedVariation","getForcedVariation","debug","variation","bucketValue","getBucketedVariation","defaultVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","variationValue","getAllAttributes","filter","capture","forEach","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variableKey","variableSchema","variablesSchema","find","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","getVariableJSON","FeaturevisorSDK","conditionIsMatched","condition","attribute","valueInAttributes","startsWith","endsWith","allConditionsAreMatched","conditions","and","c","or","not","fetchDatafileContent","datafileUrl","handleDatafileFetch","fetch","then","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","onReady","setTimeout","console","parseJsonConditionsIfStringified","record","datafileJson","getSchemaVersion","getAttribute","attributeKey","getSegment","segmentKey","segment","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","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","d","definition","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag"],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack://FeaturevisorSDK/webpack/universalModuleDefinition","webpack://FeaturevisorSDK/../../node_modules/compare-versions/lib/esm/index.js","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/emitter.ts","webpack://FeaturevisorSDK/./src/feature.ts","webpack://FeaturevisorSDK/./src/index.ts","webpack://FeaturevisorSDK/./src/logger.ts","webpack://FeaturevisorSDK/./src/segments.ts","webpack://FeaturevisorSDK/webpack/bootstrap","webpack://FeaturevisorSDK/webpack/runtime/define property getters","webpack://FeaturevisorSDK/webpack/runtime/hasOwnProperty shorthand","webpack://FeaturevisorSDK/webpack/runtime/make namespace object","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 ","/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n/**\n * Validate [semver](https://semver.org/) version strings.\n *\n * @param version Version number to validate\n * @returns `true` if the version number is a valid semver version number, `false` otherwise.\n *\n * @example\n * ```\n * validate('1.0.0-rc.1'); // return true\n * validate('1.0-rc.1'); // return false\n * validate('foo'); // return false\n * ```\n */\nexport const validate = (version) => typeof version === 'string' && /^[v\\d]/.test(version) && semver.test(version);\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\n/**\n * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.\n *\n * @param version Version number to match\n * @param range Range pattern for version\n * @returns `true` if the version number is within the range, `false` otherwise.\n *\n * @example\n * ```\n * satisfies('1.1.0', '^1.0.0'); // return true\n * satisfies('1.1.0', '~1.0.0'); // return false\n * ```\n */\nexport const satisfies = (version, range) => {\n // handle multiple comparators\n if (range.includes('||')) {\n return range.split('||').some((r) => satisfies(version, r));\n }\n else if (range.includes(' ')) {\n return range\n .trim()\n .replace(/\\s{2,}/g, ' ')\n .split(' ')\n .every((r) => satisfies(version, r));\n }\n // if no range operator then \"=\"\n const m = range.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~')\n return compare(version, range, op);\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3, , vp] = validateAndParse(version);\n const [r1, r2, r3, , rp] = validateAndParse(range);\n const v = [v1, v2, v3];\n const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];\n // validate pre-release\n if (rp) {\n if (!vp)\n return false;\n if (compareSegments(v, r) !== 0)\n return false;\n if (compareSegments(vp.split('.'), rp.split('.')) === -1)\n return false;\n }\n // first non-zero number\n const nonZero = r.findIndex((v) => v !== '0') + 1;\n // pointer to where segments can be >=\n const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;\n // before pointer must be equal\n if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)\n return false;\n // after pointer must be >=\n if (compareSegments(v.slice(i), r.slice(i)) === -1)\n return false;\n return true;\n};\nconst semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nconst validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nconst compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=index.js.map","(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\";\nimport { Emitter } from \"./emitter\";\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 emitter?: Emitter; // @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 fromInstance?: boolean;\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 emitter?: Emitter;\n private interceptAttributes?: (attributes: Attributes) => Attributes;\n private fromInstance: boolean;\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 if (options.emitter) {\n this.emitter = options.emitter;\n }\n\n this.setDatafile(options.datafile);\n\n this.fromInstance = options.fromInstance || false;\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 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 if (this.emitter) {\n this.emitter.emit(\n \"activation\",\n featureKey,\n variationValue,\n finalAttributes,\n captureAttributes,\n );\n }\n\n if (this.fromInstance && this.onActivation) {\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 { compareVersions } from \"compare-versions\";\n\nimport { Attributes, Condition, PlainCondition } from \"@featurevisor/types\";\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 compareVersions(valueInAttributes, value) === 0;\n } else if (operator === \"semverNotEquals\") {\n return compareVersions(valueInAttributes, value) !== 0;\n } else if (operator === \"semverGreaterThan\") {\n return compareVersions(valueInAttributes, value) === 1;\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return compareVersions(valueInAttributes, value) >= 0;\n } else if (operator === \"semverLessThan\") {\n return compareVersions(valueInAttributes, value) === -1;\n } else if (operator === \"semverLessThanOrEquals\") {\n return compareVersions(valueInAttributes, value) <= 0;\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\";\nimport { Emitter } from \"./emitter\";\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\nexport type Event = \"ready\" | \"refresh\" | \"update\" | \"activation\";\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\n refresh: () => void;\n startRefreshing: () => void;\n stopRefreshing: () => void;\n\n addListener: Emitter[\"addListener\"];\n on: Emitter[\"addListener\"];\n removeListener: Emitter[\"removeListener\"];\n off: Emitter[\"removeListener\"];\n removeAllListeners: Emitter[\"removeAllListeners\"];\n\n isReady: () => boolean;\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\ninterface Listeners {\n [key: string]: Function[];\n}\n\ninterface Statuses {\n ready: boolean;\n refreshInProgress: boolean;\n}\n\nfunction getInstanceFromSdk(\n sdk: FeaturevisorSDK,\n options: InstanceOptions,\n logger: Logger,\n emitter: Emitter,\n statuses: Statuses,\n): FeaturevisorInstance {\n let intervalId;\n\n const on = emitter.addListener.bind(emitter);\n const off = emitter.removeListener.bind(emitter);\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.bind(sdk),\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 // emitter\n on: on,\n addListener: on,\n off: off,\n removeListener: off,\n removeAllListeners: emitter.removeAllListeners.bind(emitter),\n\n // refresh\n refresh() {\n logger.debug(\"refreshing datafile\");\n\n if (statuses.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 statuses.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 emitter.emit(\"refresh\");\n\n if (isNotSameRevision) {\n emitter.emit(\"update\");\n }\n\n statuses.refreshInProgress = false;\n })\n .catch((e) => {\n logger.error(\"failed to refresh datafile\", { error: e });\n statuses.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 isReady() {\n return statuses.ready;\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 const emitter = new Emitter();\n const statuses: Statuses = {\n ready: false,\n refreshInProgress: false,\n };\n\n if (!options.datafileUrl && options.refreshInterval) {\n logger.warn(\"refreshing datafile requires `datafileUrl` option\");\n }\n\n if (options.onReady) {\n emitter.addListener(\"ready\", options.onReady);\n }\n\n if (options.onActivation) {\n emitter.addListener(\"activation\", options.onActivation);\n }\n\n if (options.onRefresh) {\n emitter.addListener(\"refresh\", options.onRefresh);\n }\n\n if (options.onUpdate) {\n emitter.addListener(\"update\", options.onUpdate);\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 emitter,\n interceptAttributes: options.interceptAttributes,\n fromInstance: true,\n });\n\n statuses.ready = true;\n setTimeout(function() {\n emitter.emit(\"ready\");\n }, 0);\n\n return getInstanceFromSdk(sdk, options, logger, emitter, statuses);\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 emitter,\n interceptAttributes: options.interceptAttributes,\n fromInstance: true,\n });\n\n if (options.datafileUrl) {\n fetchDatafileContent(options.datafileUrl, options)\n .then((datafile) => {\n sdk.setDatafile(datafile);\n\n statuses.ready = true;\n emitter.emit(\"ready\");\n })\n .catch((e) => {\n logger.error(\"failed to fetch datafile:\");\n console.error(e);\n });\n }\n\n return getInstanceFromSdk(sdk, options, logger, emitter, statuses);\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","export type EventName = \"ready\" | \"refresh\" | \"update\" | \"activation\";\n\nexport interface Listeners {\n [key: string]: Function[];\n}\n\nexport class Emitter {\n private _listeners: Listeners;\n\n constructor() {\n this._listeners = {};\n }\n\n public addListener(eventName: EventName, fn: Function): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n this._listeners[eventName] = [];\n }\n\n this._listeners[eventName].push(fn);\n }\n\n public removeListener(eventName: EventName, fn: Function): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n return;\n }\n\n const index = this._listeners[eventName].indexOf(fn);\n\n if (index !== -1) {\n this._listeners[eventName].splice(index, 1);\n }\n }\n\n public removeAllListeners(eventName?: EventName): void {\n if (eventName) {\n this._listeners[eventName] = [];\n } else {\n Object.keys(this._listeners).forEach((key) => {\n this._listeners[key] = [];\n });\n }\n }\n\n public emit(eventName: EventName, ...args: any[]): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n return;\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn(...args);\n });\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 if (matchedTraffic.variation) {\n const variation = feature.variations.find((v) => {\n return v.value === matchedTraffic.variation;\n });\n\n if (variation) {\n logger.debug(\"using variation from rule\", {\n featureKey: feature.key,\n variation: variation.value,\n ruleKey: matchedTraffic.key,\n });\n\n return variation;\n }\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","// 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","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\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","compareVersions","v1","v2","n1","validateAndParse","n2","p1","pop","p2","r","compareSegments","split","validate","version","test","semver","compare","operator","assertValidOperator","res","operatorResMap","includes","satisfies","range","some","trim","replace","every","m","match","op","v3","vp","r1","r2","r3","rp","v","nonZero","findIndex","i","slice","TypeError","Error","shift","isWildcard","s","tryParse","n","parseInt","isNaN","compareStrings","a","b","ap","bp","String","forceType","Math","max","length","allowedOperators","Object","keys","indexOf","join","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","murmur","str","k","l","h","MAX_HASH_VALUE","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","getValueByType","value","fieldType","undefined","parseFloat","Array","isArray","options","onActivation","configureBucketValue","logger","createLogger","interceptAttributes","emitter","setDatafile","datafile","fromInstance","datafileReader","DatafileReader","JSON","parse","e","error","getRevision","getFeature","featureKey","getBucketKey","feature","attributes","prefix","bucketBy","getBucketValue","getBucketedNumber","getVariation","warn","finalAttributes","forcedVariation","getForcedVariation","debug","variation","bucketValue","getBucketedVariation","defaultVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","variationValue","getAllAttributes","filter","capture","forEach","emit","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variableKey","variableSchema","variablesSchema","find","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","getVariableJSON","FeaturevisorSDK","conditionIsMatched","condition","attribute","valueInAttributes","startsWith","endsWith","allConditionsAreMatched","conditions","and","c","or","not","fetchDatafileContent","datafileUrl","handleDatafileFetch","fetch","then","json","getInstanceFromSdk","sdk","statuses","intervalId","on","addListener","bind","off","removeListener","instance","setLogLevels","setLevels","removeAllListeners","refresh","refreshInProgress","isNotSameRevision","revision","info","catch","startRefreshing","refreshInterval","setInterval","stopRefreshing","clearInterval","isReady","ready","emptyDatafile","schemaVersion","segments","features","Emitter","onReady","onRefresh","onUpdate","setTimeout","console","parseJsonConditionsIfStringified","record","datafileJson","getSchemaVersion","getAttribute","attributeKey","getSegment","segmentKey","segment","_listeners","eventName","fn","push","index","splice","args","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","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","d","definition","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag"],"sourceRoot":""}
package/jest.config.js ADDED
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ preset: "ts-jest",
3
+ bail: true,
4
+ };
package/lib/client.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Attributes, VariationValue, VariableValue, Feature, DatafileContent, BucketValue, FeatureKey, VariationType, VariableType } from "@featurevisor/types";
2
2
  import { Logger } from "./logger";
3
+ import { Emitter } from "./emitter";
3
4
  export type ActivationCallback = (featureName: string, variation: VariationValue, attributes: Attributes, captureAttributes: Attributes) => void;
4
5
  export type ConfigureBucketValue = (feature: any, attributes: any, bucketValue: BucketValue) => BucketValue;
5
6
  export interface SdkOptions {
@@ -7,7 +8,9 @@ export interface SdkOptions {
7
8
  onActivation?: ActivationCallback;
8
9
  configureBucketValue?: ConfigureBucketValue;
9
10
  logger?: Logger;
11
+ emitter?: Emitter;
10
12
  interceptAttributes?: (attributes: Attributes) => Attributes;
13
+ fromInstance?: boolean;
11
14
  }
12
15
  type FieldType = VariationType | VariableType;
13
16
  type ValueType = VariableValue;
@@ -17,7 +20,9 @@ export declare class FeaturevisorSDK {
17
20
  private datafileReader;
18
21
  private configureBucketValue?;
19
22
  private logger;
23
+ private emitter?;
20
24
  private interceptAttributes?;
25
+ private fromInstance;
21
26
  constructor(options: SdkOptions);
22
27
  setDatafile(datafile: DatafileContent | string): void;
23
28
  getRevision(): string;
package/lib/client.js CHANGED
@@ -38,7 +38,11 @@ var FeaturevisorSDK = /** @class */ (function () {
38
38
  if (options.interceptAttributes) {
39
39
  this.interceptAttributes = options.interceptAttributes;
40
40
  }
41
+ if (options.emitter) {
42
+ this.emitter = options.emitter;
43
+ }
41
44
  this.setDatafile(options.datafile);
45
+ this.fromInstance = options.fromInstance || false;
42
46
  }
43
47
  FeaturevisorSDK.prototype.setDatafile = function (datafile) {
44
48
  try {
@@ -141,19 +145,22 @@ var FeaturevisorSDK = /** @class */ (function () {
141
145
  if (typeof variationValue === "undefined") {
142
146
  return undefined;
143
147
  }
144
- if (this.onActivation) {
145
- var finalAttributes_1 = this.interceptAttributes
146
- ? this.interceptAttributes(attributes)
147
- : attributes;
148
- var captureAttributes_1 = {};
149
- var attributesForCapturing = this.datafileReader
150
- .getAllAttributes()
151
- .filter(function (a) { return a.capture === true; });
152
- attributesForCapturing.forEach(function (a) {
153
- if (typeof finalAttributes_1[a.key] !== "undefined") {
154
- captureAttributes_1[a.key] = attributes[a.key];
155
- }
156
- });
148
+ var finalAttributes_1 = this.interceptAttributes
149
+ ? this.interceptAttributes(attributes)
150
+ : attributes;
151
+ var captureAttributes_1 = {};
152
+ var attributesForCapturing = this.datafileReader
153
+ .getAllAttributes()
154
+ .filter(function (a) { return a.capture === true; });
155
+ attributesForCapturing.forEach(function (a) {
156
+ if (typeof finalAttributes_1[a.key] !== "undefined") {
157
+ captureAttributes_1[a.key] = attributes[a.key];
158
+ }
159
+ });
160
+ if (this.emitter) {
161
+ this.emitter.emit("activation", featureKey, variationValue, finalAttributes_1, captureAttributes_1);
162
+ }
163
+ if (this.fromInstance && this.onActivation) {
157
164
  this.onActivation(featureKey, variationValue, finalAttributes_1, captureAttributes_1);
158
165
  }
159
166
  return variationValue;
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { DatafileContent, Attributes } from "@featurevisor/types";
2
2
  import { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from "./client";
3
3
  import { Logger } from "./logger";
4
+ import { Emitter } from "./emitter";
4
5
  export type ReadyCallback = () => void;
5
6
  export interface InstanceOptions {
6
7
  datafile?: DatafileContent | string;
@@ -15,6 +16,7 @@ export interface InstanceOptions {
15
16
  onRefresh?: () => void;
16
17
  onUpdate?: () => void;
17
18
  }
19
+ export type Event = "ready" | "refresh" | "update" | "activation";
18
20
  export interface FeaturevisorInstance {
19
21
  /**
20
22
  * From FeaturevisorSDK
@@ -43,5 +45,11 @@ export interface FeaturevisorInstance {
43
45
  refresh: () => void;
44
46
  startRefreshing: () => void;
45
47
  stopRefreshing: () => void;
48
+ addListener: Emitter["addListener"];
49
+ on: Emitter["addListener"];
50
+ removeListener: Emitter["removeListener"];
51
+ off: Emitter["removeListener"];
52
+ removeAllListeners: Emitter["removeAllListeners"];
53
+ isReady: () => boolean;
46
54
  }
47
55
  export declare function createInstance(options: InstanceOptions): FeaturevisorInstance;