@lssm/lib.feature-flags 0.0.0-canary-20251210171026 → 0.0.0-canary-20251212004227
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/README.md +1 -1
- package/dist/docs/feature-flags.docblock.js +57 -0
- package/dist/docs/index.js +1 -0
- package/dist/index.js +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -138,7 +138,7 @@ This module integrates with:
|
|
|
138
138
|
|
|
139
139
|
- `@lssm/lib.identity-rbac` - User/org context for targeting
|
|
140
140
|
- `@lssm/lib.analytics` - Evaluation tracking
|
|
141
|
-
- `@lssm/
|
|
141
|
+
- `@lssm/module.audit-trail` - Configuration changes
|
|
142
142
|
|
|
143
143
|
## Schema Contribution
|
|
144
144
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import{registerDocBlocks as e}from"@lssm/lib.contracts/docs";e([{id:`docs.feature-flags.overview`,title:`Feature Flags & Experiments`,summary:`Reusable, spec-first feature flag and experiment module with targeting, gradual rollout, multivariate variants, and evaluation logging.`,kind:`reference`,visibility:`public`,route:`/docs/feature-flags/overview`,tags:[`feature-flags`,`experiments`,`progressive-delivery`],body:`## What this module provides
|
|
2
|
+
|
|
3
|
+
- **Entities**: FeatureFlag, FlagTargetingRule, Experiment, ExperimentAssignment, FlagEvaluation.
|
|
4
|
+
- **Contracts**: create/update/delete/toggle/list/get flags; create/delete rules; evaluate flags; create/start/stop/get experiments.
|
|
5
|
+
- **Events**: flag.created/updated/deleted/toggled, rule.created/deleted, experiment.created/started/stopped, flag.evaluated, experiment.variant_assigned.
|
|
6
|
+
- **Evaluation Engine**: Deterministic evaluator with gradual rollout, rule priority, audience filters, and experiment bucketing.
|
|
7
|
+
|
|
8
|
+
## How to use
|
|
9
|
+
|
|
10
|
+
1) Compose schema
|
|
11
|
+
- Add \`featureFlagsSchemaContribution\` to your module composition.
|
|
12
|
+
|
|
13
|
+
2) Register contracts/events
|
|
14
|
+
- Import exports from \`@lssm/lib.feature-flags\` into your spec registry.
|
|
15
|
+
|
|
16
|
+
3) Evaluate at runtime
|
|
17
|
+
- Instantiate \`FlagEvaluator\` with a repository implementation and optional logger.
|
|
18
|
+
- Evaluate with context attributes (userId, orgId, plan, segment, sessionId, attributes).
|
|
19
|
+
|
|
20
|
+
4) Wire observability
|
|
21
|
+
- Emit audit trail on config changes; emit \`flag.evaluated\` for analytics.
|
|
22
|
+
|
|
23
|
+
## Usage example
|
|
24
|
+
|
|
25
|
+
\`\`\`ts
|
|
26
|
+
import {
|
|
27
|
+
FlagEvaluator,
|
|
28
|
+
InMemoryFlagRepository,
|
|
29
|
+
} from '@lssm/lib.feature-flags';
|
|
30
|
+
|
|
31
|
+
const repo = new InMemoryFlagRepository();
|
|
32
|
+
repo.addFlag({
|
|
33
|
+
id: 'flag-1',
|
|
34
|
+
key: 'new_dashboard',
|
|
35
|
+
status: 'GRADUAL',
|
|
36
|
+
defaultValue: false,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const evaluator = new FlagEvaluator({ repository: repo });
|
|
40
|
+
const result = await evaluator.evaluate('new_dashboard', {
|
|
41
|
+
userId: 'user-123',
|
|
42
|
+
orgId: 'org-456',
|
|
43
|
+
plan: 'pro',
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (result.enabled) {
|
|
47
|
+
// serve the new dashboard
|
|
48
|
+
}
|
|
49
|
+
\`\`\`,
|
|
50
|
+
|
|
51
|
+
## Guardrails
|
|
52
|
+
|
|
53
|
+
- Keep flag keys stable and human-readable; avoid PII in context.
|
|
54
|
+
- Ensure experiments’ variant percentages sum to 100; default flag status to OFF.
|
|
55
|
+
- Use org-scoped flags for multi-tenant isolation.
|
|
56
|
+
- Log evaluations only when needed to control volume; prefer sampling for noisy paths.
|
|
57
|
+
`}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./feature-flags.docblock.js";
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ExperimentCreatedEvent as e,ExperimentStartedEvent as t,ExperimentStoppedEvent as n,FeatureFlagEvents as r,FlagCreatedEvent as i,FlagDeletedEvent as a,FlagEvaluatedEvent as o,FlagToggledEvent as s,FlagUpdatedEvent as c,RuleCreatedEvent as l,RuleDeletedEvent as u,VariantAssignedEvent as d}from"./events.js";import{ExperimentAssignmentEntity as f,ExperimentEntity as p,ExperimentStatusEnum as m,FeatureFlagEntity as h,FlagEvaluationEntity as g,FlagStatusEnum as _,FlagTargetingRuleEntity as v,RuleOperatorEnum as y,featureFlagEntities as b,featureFlagsSchemaContribution as x}from"./entities/index.js";import{CreateExperimentContract as S,CreateFlagContract as C,CreateRuleContract as w,DeleteFlagContract as T,DeleteRuleContract as E,EvaluateFlagContract as D,EvaluationResultModel as O,ExperimentModel as k,FeatureFlagModel as A,GetExperimentContract as j,GetFlagContract as M,ListFlagsContract as N,StartExperimentContract as P,StopExperimentContract as F,TargetingRuleModel as I,ToggleFlagContract as L,UpdateFlagContract as R}from"./contracts/index.js";import{FlagEvaluator as z,InMemoryFlagRepository as B,evaluateRuleCondition as V,getSubjectId as H,hashToBucket as U}from"./evaluation/index.js";export{S as CreateExperimentContract,C as CreateFlagContract,w as CreateRuleContract,T as DeleteFlagContract,E as DeleteRuleContract,D as EvaluateFlagContract,O as EvaluationResultModel,f as ExperimentAssignmentEntity,e as ExperimentCreatedEvent,p as ExperimentEntity,k as ExperimentModel,t as ExperimentStartedEvent,m as ExperimentStatusEnum,n as ExperimentStoppedEvent,h as FeatureFlagEntity,r as FeatureFlagEvents,A as FeatureFlagModel,i as FlagCreatedEvent,a as FlagDeletedEvent,o as FlagEvaluatedEvent,g as FlagEvaluationEntity,z as FlagEvaluator,_ as FlagStatusEnum,v as FlagTargetingRuleEntity,s as FlagToggledEvent,c as FlagUpdatedEvent,j as GetExperimentContract,M as GetFlagContract,B as InMemoryFlagRepository,N as ListFlagsContract,l as RuleCreatedEvent,u as RuleDeletedEvent,y as RuleOperatorEnum,P as StartExperimentContract,F as StopExperimentContract,I as TargetingRuleModel,L as ToggleFlagContract,R as UpdateFlagContract,d as VariantAssignedEvent,V as evaluateRuleCondition,b as featureFlagEntities,x as featureFlagsSchemaContribution,H as getSubjectId,U as hashToBucket};
|
|
1
|
+
import{ExperimentCreatedEvent as e,ExperimentStartedEvent as t,ExperimentStoppedEvent as n,FeatureFlagEvents as r,FlagCreatedEvent as i,FlagDeletedEvent as a,FlagEvaluatedEvent as o,FlagToggledEvent as s,FlagUpdatedEvent as c,RuleCreatedEvent as l,RuleDeletedEvent as u,VariantAssignedEvent as d}from"./events.js";import{ExperimentAssignmentEntity as f,ExperimentEntity as p,ExperimentStatusEnum as m,FeatureFlagEntity as h,FlagEvaluationEntity as g,FlagStatusEnum as _,FlagTargetingRuleEntity as v,RuleOperatorEnum as y,featureFlagEntities as b,featureFlagsSchemaContribution as x}from"./entities/index.js";import{CreateExperimentContract as S,CreateFlagContract as C,CreateRuleContract as w,DeleteFlagContract as T,DeleteRuleContract as E,EvaluateFlagContract as D,EvaluationResultModel as O,ExperimentModel as k,FeatureFlagModel as A,GetExperimentContract as j,GetFlagContract as M,ListFlagsContract as N,StartExperimentContract as P,StopExperimentContract as F,TargetingRuleModel as I,ToggleFlagContract as L,UpdateFlagContract as R}from"./contracts/index.js";import{FlagEvaluator as z,InMemoryFlagRepository as B,evaluateRuleCondition as V,getSubjectId as H,hashToBucket as U}from"./evaluation/index.js";import"./docs/index.js";export{S as CreateExperimentContract,C as CreateFlagContract,w as CreateRuleContract,T as DeleteFlagContract,E as DeleteRuleContract,D as EvaluateFlagContract,O as EvaluationResultModel,f as ExperimentAssignmentEntity,e as ExperimentCreatedEvent,p as ExperimentEntity,k as ExperimentModel,t as ExperimentStartedEvent,m as ExperimentStatusEnum,n as ExperimentStoppedEvent,h as FeatureFlagEntity,r as FeatureFlagEvents,A as FeatureFlagModel,i as FlagCreatedEvent,a as FlagDeletedEvent,o as FlagEvaluatedEvent,g as FlagEvaluationEntity,z as FlagEvaluator,_ as FlagStatusEnum,v as FlagTargetingRuleEntity,s as FlagToggledEvent,c as FlagUpdatedEvent,j as GetExperimentContract,M as GetFlagContract,B as InMemoryFlagRepository,N as ListFlagsContract,l as RuleCreatedEvent,u as RuleDeletedEvent,y as RuleOperatorEnum,P as StartExperimentContract,F as StopExperimentContract,I as TargetingRuleModel,L as ToggleFlagContract,R as UpdateFlagContract,d as VariantAssignedEvent,V as evaluateRuleCondition,b as featureFlagEntities,x as featureFlagsSchemaContribution,H as getSubjectId,U as hashToBucket};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lssm/lib.feature-flags",
|
|
3
|
-
"version": "0.0.0-canary-
|
|
3
|
+
"version": "0.0.0-canary-20251212004227",
|
|
4
4
|
"description": "Feature flags and experiments module for ContractSpec applications",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -29,6 +29,8 @@
|
|
|
29
29
|
"exports": {
|
|
30
30
|
".": "./src/index.ts",
|
|
31
31
|
"./contracts": "./src/contracts/index.ts",
|
|
32
|
+
"./docs": "./src/docs/index.ts",
|
|
33
|
+
"./docs/feature-flags.docblock": "./src/docs/feature-flags.docblock.ts",
|
|
32
34
|
"./entities": "./src/entities/index.ts",
|
|
33
35
|
"./evaluation": "./src/evaluation/index.ts",
|
|
34
36
|
"./events": "./src/events.ts",
|
|
@@ -44,6 +46,8 @@
|
|
|
44
46
|
"exports": {
|
|
45
47
|
".": "./dist/index.js",
|
|
46
48
|
"./contracts": "./dist/contracts/index.js",
|
|
49
|
+
"./docs": "./dist/docs/index.js",
|
|
50
|
+
"./docs/feature-flags.docblock": "./dist/docs/feature-flags.docblock.js",
|
|
47
51
|
"./entities": "./dist/entities/index.js",
|
|
48
52
|
"./evaluation": "./dist/evaluation/index.js",
|
|
49
53
|
"./events": "./dist/events.js",
|