@flag-engine/core 0.0.10 → 1.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"getEligibleStrategy.d.ts","sourceRoot":"","sources":["../src/getEligibleStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAY/E;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,IAAI,EAAE,EACb,mBAAmB,iBAAiB,EACpC,QAAO,MAAU,KAChB,OAgFF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,iBAAiB,EAC7B,mBAAmB,iBAAiB,KACnC,QAAQ,GAAG,SAIb,CAAC"}
1
+ {"version":3,"file":"getEligibleStrategy.d.ts","sourceRoot":"","sources":["../src/getEligibleStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAM/E;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,IAAI,EAAE,EACb,mBAAmB,iBAAiB,EACpC,QAAO,MAAU,KAChB,OA0DF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,iBAAiB,EAC7B,mBAAmB,iBAAiB,KACnC,QAAQ,GAAG,SAIb,CAAC"}
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("murmurhash-js");const r=e=>"string"==typeof e,t=e=>null==e,n=(e,a,s=0)=>!(s>10)&&(0===e.length||e.every((e=>{if("inSegment"in e)return n(e.inSegment.rules,a,s+1);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 r=a[e.field];return Array.isArray(e.value)&&-1!==e.value.indexOf(r)}case"not_in":{const r=a[e.field];return Array.isArray(e.value)&&-1===e.value.indexOf(r)}default:return!1}}))),a=2**32,s=(r,t)=>{if(0===r.strategies.length)return!0;const s=((e,r)=>e.strategies.find((e=>n(e.rules,r))))(r,t);if(!s)return!1;if(0===s.variants.length)return!0;const u=((r,t)=>{const n=[...r.variants].sort(((e,r)=>e.percent-r.percent)),s=`${r.name}-${t}`,u=e.murmur3(s)/a*100;let l=0;for(const e of n)if(l+=e.percent,u<l)return e;return!1})(s,t.__id);return!1!==u&&u.name};exports.createFlagEngine=e=>({createUserContext:r=>((e,r)=>{let t=r;return{evaluateAll:()=>{const r={};for(const n of e)r[n.key]="enabled"===n.status&&s(n,t);return r},evaluate:r=>{const n=e.find((e=>e.key===r));return!!n&&"disabled"!==n.status&&s(n,t)},setUserConfiguration:e=>{t=e}}})(e,r)});
1
+ "use strict";var e=require("murmurhash-js");const t=e=>"string"==typeof e,r=(e,n,s=0)=>!(s>10)&&(0===e.length||e.every((e=>{if("inSegment"in e)return r(e.inSegment.rules,n,s+1);switch(e.operator){case"equals":return-1!==e.value.indexOf(n[e.field]);case"not_equals":return-1===e.value.indexOf(n[e.field]);case"greater_than":{const t=n[e.field];return"number"==typeof t&&t>e.value}case"less_than":{const t=n[e.field];return"number"==typeof t&&t<e.value}case"contains":{const r=n[e.field];return!!t(r)&&e.value.some((e=>r.includes(e)))}case"not_contains":{const r=n[e.field];return!t(r)||e.value.every((e=>!r.includes(e)))}default:return!1}}))),n=2**32,s=(t,s)=>{if(0===t.strategies.length)return!0;const a=((e,t)=>e.strategies.find((e=>r(e.rules,t))))(t,s);if(!a)return!1;if(0===a.variants.length)return!0;const u=((t,r)=>{const s=[...t.variants].sort(((e,t)=>e.percent-t.percent)),a=`${t.name}-${r}`,u=e.murmur3(a)/n*100;let i=0;for(const e of s)if(i+=e.percent,u<i)return e;return!1})(a,s.__id);return!1!==u&&u.name};exports.createFlagEngine=e=>({createUserContext:t=>((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&&"enabled"===n.status&&s(n,r)},setUserConfiguration:e=>{r=e}}})(e,t)});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{murmur3 as e}from"murmurhash-js";const t=e=>"string"==typeof e,r=e=>null==e,n=(e,a,s=0)=>!(s>10)&&(0===e.length||e.every((e=>{if("inSegment"in e)return n(e.inSegment.rules,a,s+1);switch(e.operator){case"equals":return a[e.field]===e.value;case"not_equals":return a[e.field]!==e.value;case"greater_than":{const t=a[e.field];return!r(t)&&!r(e.value)&&t>e.value}case"less_than":{const t=a[e.field];return!r(t)&&!r(e.value)&&t<e.value}case"contains":{const r=a[e.field];return t(r)&&t(e.value)&&r.includes(e.value)}case"not_contains":{const r=a[e.field];return t(r)&&t(e.value)&&!r.includes(e.value)}case"in":{const t=a[e.field];return Array.isArray(e.value)&&-1!==e.value.indexOf(t)}case"not_in":{const t=a[e.field];return Array.isArray(e.value)&&-1===e.value.indexOf(t)}default:return!1}}))),a=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)=>{const n=[...t.variants].sort(((e,t)=>e.percent-t.percent)),s=`${t.name}-${r}`,u=e(s)/a*100;let l=0;for(const e of n)if(l+=e.percent,u<l)return e;return!1})(s,r.__id);return!1!==u&&u.name},u=e=>({createUserContext:t=>((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}}})(e,t)});export{u as createFlagEngine};
1
+ import{murmur3 as e}from"murmurhash-js";const t=e=>"string"==typeof e,n=(e,r,s=0)=>!(s>10)&&(0===e.length||e.every((e=>{if("inSegment"in e)return n(e.inSegment.rules,r,s+1);switch(e.operator){case"equals":return-1!==e.value.indexOf(r[e.field]);case"not_equals":return-1===e.value.indexOf(r[e.field]);case"greater_than":{const t=r[e.field];return"number"==typeof t&&t>e.value}case"less_than":{const t=r[e.field];return"number"==typeof t&&t<e.value}case"contains":{const n=r[e.field];return!!t(n)&&e.value.some((e=>n.includes(e)))}case"not_contains":{const n=r[e.field];return!t(n)||e.value.every((e=>!n.includes(e)))}default:return!1}}))),r=2**32,s=(t,s)=>{if(0===t.strategies.length)return!0;const a=((e,t)=>e.strategies.find((e=>n(e.rules,t))))(t,s);if(!a)return!1;if(0===a.variants.length)return!0;const u=((t,n)=>{const s=[...t.variants].sort(((e,t)=>e.percent-t.percent)),a=`${t.name}-${n}`,u=e(a)/r*100;let o=0;for(const e of s)if(o+=e.percent,u<o)return e;return!1})(a,s.__id);return!1!==u&&u.name},a=e=>({createUserContext:t=>((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&&"enabled"===r.status&&s(r,n)},setUserConfiguration:e=>{n=e}}})(e,t)});export{a as createFlagEngine};
package/dist/types.d.ts CHANGED
@@ -1,11 +1,18 @@
1
1
  export type FlagStatus = "enabled" | "disabled";
2
- export type ConditionOperator = "equals" | "not_equals" | "contains" | "not_contains" | "greater_than" | "less_than" | "in" | "not_in";
2
+ export type ConditionOperator = "equals" | "not_equals" | "contains" | "not_contains" | "greater_than" | "less_than";
3
3
  type RuleValuePrimitive = object | null | undefined | string | number | boolean | Date;
4
- export type RuleValue = RuleValuePrimitive | Array<RuleValuePrimitive>;
5
4
  export type Rule = {
6
5
  field: string;
7
- operator: ConditionOperator;
8
- value: RuleValue;
6
+ operator: "equals" | "not_equals";
7
+ value: Array<RuleValuePrimitive>;
8
+ } | {
9
+ field: string;
10
+ operator: "contains" | "not_contains";
11
+ value: Array<string>;
12
+ } | {
13
+ field: string;
14
+ operator: "greater_than" | "less_than";
15
+ value: number;
9
16
  } | {
10
17
  inSegment: Segment;
11
18
  };
@@ -1 +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,GACJ,QAAQ,CAAC;AAEb,KAAK,kBAAkB,GACnB,MAAM,GACN,IAAI,GACJ,SAAS,GACT,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,CAAC;AAET,MAAM,MAAM,SAAS,GAAG,kBAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAEvE,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,kBAAkB,CAAC;CACnC,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,yBAAyB;IACxC,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;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,CACjB,iBAAiB,EAAE,iBAAiB,KACjC,yBAAyB,CAAC;CAChC"}
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,CAAC;AAEhB,KAAK,kBAAkB,GACnB,MAAM,GACN,IAAI,GACJ,SAAS,GACT,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,CAAC;AAET,MAAM,MAAM,IAAI,GACZ;IACE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAC;IAClC,KAAK,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;CAClC,GACD;IACE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,cAAc,CAAC;IACtC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACtB,GACD;IACE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,GAAG,WAAW,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf,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,kBAAkB,CAAC;CACnC,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,yBAAyB;IACxC,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;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,CACjB,iBAAiB,EAAE,iBAAiB,KACjC,yBAAyB,CAAC;CAChC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flag-engine/core",
3
3
  "private": false,
4
- "version": "0.0.10",
4
+ "version": "1.0.0",
5
5
  "description": "Feature flags evaluation engine, runtime agnostic",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs.js",
@@ -20,7 +20,8 @@
20
20
  "test": "vitest",
21
21
  "coverage": "vitest run --coverage",
22
22
  "lint": "eslint .",
23
- "size": "bundlesize"
23
+ "bench": "tsx src/__benchmarks__/evaluateAll.bench.ts",
24
+ "bundlesize": "bundlesize"
24
25
  },
25
26
  "keywords": [],
26
27
  "author": "",
@@ -36,6 +37,7 @@
36
37
  "bundlesize": "^0.18.2",
37
38
  "eslint": "^9.29.0",
38
39
  "rollup": "^4.44.0",
40
+ "tinybench": "^6.0.0",
39
41
  "tslib": "^2.8.1",
40
42
  "tsx": "^4.20.3",
41
43
  "typescript": "^5.8.3",
package/rollup.config.mjs CHANGED
@@ -12,7 +12,7 @@ export default () => {
12
12
  {
13
13
  file: "dist/index.cjs.js",
14
14
  format: "cjs",
15
- name: "ff-engine",
15
+ name: "flag-engine",
16
16
  globals,
17
17
  },
18
18
  {