@flag-engine/core 0.0.1 → 0.0.3

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { FlagConfiguration, UserConfiguration } from "./types";
2
+ export declare const evaluateFlag: (flagConfig: FlagConfiguration, userConfiguration: UserConfiguration) => string | boolean;
3
+ //# sourceMappingURL=evaluateFlag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluateFlag.d.ts","sourceRoot":"","sources":["../src/evaluateFlag.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,YAAY,eACX,iBAAiB,qBACV,iBAAiB,qBAgBrC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { FlagConfiguration, UserConfiguration } from "./types";
2
+ export declare const getEligibleStrategy: (flagConfig: FlagConfiguration, userConfiguration: UserConfiguration) => import("./types").Strategy | undefined;
3
+ //# sourceMappingURL=getEligibleStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEligibleStrategy.d.ts","sourceRoot":"","sources":["../src/getEligibleStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAQ,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA2ErE,eAAO,MAAM,mBAAmB,eAClB,iBAAiB,qBACV,iBAAiB,2CAKrC,CAAC"}
@@ -0,0 +1 @@
1
+ "use strict";var e=require("murmurhash-js");const t=e=>"number"==typeof e,r=e=>"string"==typeof e,n=(e,a)=>0===e.length||e.every((e=>{if("inSegment"in e)return n(e.inSegment.rules,a);switch(e.operator){case"equals":return a[e.field]===e.value;case"not_equals":return a[e.field]!==e.value;case"greater_than":{const r=a[e.field];return t(r)&&t(e.value)&&r>e.value}case"less_than":{const r=a[e.field];return t(r)&&t(e.value)&&r<e.value}case"contains":{const t=a[e.field];return r(t)&&r(e.value)&&t.includes(e.value)}case"not_contains":{const t=a[e.field];return r(t)&&r(e.value)&&!t.includes(e.value)}case"in":{const t=a[e.field];return Array.isArray(e.value)&&e.value.includes(t)}default:return!1}})),a=Math.pow(2,32),s=(t,r)=>{if(0===t.strategies.length)return!0;const s=((e,t)=>e.strategies.find((e=>n(e.rules,t))))(t,r);if(!s)return!1;if(0===s.variants.length)return!0;const u=((t,r)=>{t.variants.sort(((e,t)=>e.percent-t.percent));let n=0;const s=t.variants.find((t=>{const s=`${t.name}-${r}`,u=e.murmur3(s)/a*100;if(n+=t.percent,u<=n)return t}));return s||!1})(s,r.__id);return!!u&&u.name};exports.createFlagEngine=(e,t)=>{let r=t;return{evaluateAll:()=>{const t={};for(const n of e)t[n.key]="enabled"===n.status&&s(n,r);return t},evaluate:t=>{const n=e.find((e=>e.key===t));return!!n&&("disabled"!==n.status&&s(n,r))},setUserConfiguration:e=>{r=e}}};
@@ -0,0 +1,3 @@
1
+ import { EvaluationMachine, FlagsConfiguration, UserConfiguration } from "./types";
2
+ export declare const createFlagEngine: (flagsConfig: FlagsConfiguration, userConfiguration: UserConfiguration) => EvaluationMachine;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAEjB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,gBAAgB,gBACd,kBAAkB,qBACZ,iBAAiB,KACnC,iBA6BF,CAAC"}
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{murmur3 as e}from"murmurhash-js";const t=e=>"number"==typeof e,n=e=>"string"==typeof e,r=(e,a)=>0===e.length||e.every((e=>{if("inSegment"in e)return r(e.inSegment.rules,a);switch(e.operator){case"equals":return a[e.field]===e.value;case"not_equals":return a[e.field]!==e.value;case"greater_than":{const n=a[e.field];return t(n)&&t(e.value)&&n>e.value}case"less_than":{const n=a[e.field];return t(n)&&t(e.value)&&n<e.value}case"contains":{const t=a[e.field];return n(t)&&n(e.value)&&t.includes(e.value)}case"not_contains":{const t=a[e.field];return n(t)&&n(e.value)&&!t.includes(e.value)}case"in":{const t=a[e.field];return Array.isArray(e.value)&&e.value.includes(t)}default:return!1}})),a=Math.pow(2,32),s=(t,n)=>{if(0===t.strategies.length)return!0;const s=((e,t)=>e.strategies.find((e=>r(e.rules,t))))(t,n);if(!s)return!1;if(0===s.variants.length)return!0;const u=((t,n)=>{t.variants.sort(((e,t)=>e.percent-t.percent));let r=0;const s=t.variants.find((t=>{const s=`${t.name}-${n}`,u=e(s)/a*100;if(r+=t.percent,u<=r)return t}));return s||!1})(s,n.__id);return!!u&&u.name},u=(e,t)=>{let n=t;return{evaluateAll:()=>{const t={};for(const r of e)t[r.key]="enabled"===r.status&&s(r,n);return t},evaluate:t=>{const r=e.find((e=>e.key===t));return!!r&&("disabled"!==r.status&&s(r,n))},setUserConfiguration:e=>{n=e}}};export{u as createFlagEngine};
@@ -0,0 +1,3 @@
1
+ import { Strategy } from "./types";
2
+ export declare const resolveStrategyVariant: (strategy: Strategy, userKey: string) => false | import("./types").Variant;
3
+ //# sourceMappingURL=resolveStrategyVariant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveStrategyVariant.d.ts","sourceRoot":"","sources":["../src/resolveStrategyVariant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC,eAAO,MAAM,sBAAsB,aAAc,QAAQ,WAAW,MAAM,sCAqBzE,CAAC"}
@@ -0,0 +1,40 @@
1
+ export type FlagStatus = "enabled" | "disabled";
2
+ export type ConditionOperator = "equals" | "not_equals" | "contains" | "not_contains" | "greater_than" | "less_than" | "in";
3
+ export type RuleValue = string | number | boolean | Array<string | number | boolean>;
4
+ export type Rule = {
5
+ field: string;
6
+ operator: ConditionOperator;
7
+ value: RuleValue;
8
+ } | {
9
+ inSegment: Segment;
10
+ };
11
+ export type Segment = {
12
+ name: string;
13
+ rules: Array<Rule>;
14
+ };
15
+ export type Strategy = {
16
+ name: string;
17
+ rules: Array<Rule>;
18
+ variants: Array<Variant>;
19
+ };
20
+ export type Variant = {
21
+ name: string;
22
+ percent: number;
23
+ };
24
+ export type FlagConfiguration = {
25
+ key: string;
26
+ status: FlagStatus;
27
+ strategies: Array<Strategy>;
28
+ };
29
+ export type UserConfiguration = {
30
+ __id: string;
31
+ [key: string]: string | number | boolean;
32
+ };
33
+ export type FlagsConfiguration = Array<FlagConfiguration>;
34
+ export type FlagDict = Record<string, string | boolean>;
35
+ export interface EvaluationMachine {
36
+ evaluateAll: () => FlagDict;
37
+ evaluate: (flagKey: string) => string | boolean;
38
+ setUserConfiguration: (newUserConfiguration: UserConfiguration) => void;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAChD,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,cAAc,GACd,cAAc,GACd,WAAW,GACX,IAAI,CAAC;AAET,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAErC,MAAM,MAAM,IAAI,GACZ;IACE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,SAAS,CAAC;CAClB,GACD;IACE,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEN,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAE1D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,QAAQ,CAAC;IAC5B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC;IAChD,oBAAoB,EAAE,CAAC,oBAAoB,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACzE"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flag-engine/core",
3
3
  "private": false,
4
- "version": "0.0.1",
4
+ "version": "0.0.3",
5
5
  "description": "Feature flags evaluation engine, runtime agnostic",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs.js",