@plyaz/core 1.0.3 → 1.1.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/README.md +33 -21
- package/dist/base/cache/index.d.ts.map +1 -1
- package/dist/base/cache/strategies/memory.d.ts.map +1 -1
- package/dist/base/cache/strategies/redis.d.ts.map +1 -1
- package/dist/domain/featureFlags/provider.d.ts.map +1 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +1 -1
- package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +1 -1
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +2 -16
- package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +1 -1
- package/dist/frontend/featureFlags/providers/types.d.ts +21 -0
- package/dist/frontend/featureFlags/providers/types.d.ts.map +1 -0
- package/dist/index.cjs +23 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +24 -31
- package/dist/index.mjs.map +1 -1
- package/dist/utils/common/hash.d.ts +14 -3
- package/dist/utils/common/hash.d.ts.map +1 -1
- package/dist/utils/common/values.d.ts.map +1 -1
- package/dist/utils/featureFlags/context.d.ts.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
The `@plyaz/core` package serves as the orchestration layer that combines functionality from specialized packages to provide core business logic, domain models, and SDK foundations.
|
|
6
6
|
|
|
7
|
+
📚 **Full Documentation**:
|
|
8
|
+
- [Core Package Overview](https://plyaz.atlassian.net/wiki/spaces/SD/pages/37257227/Core+Package)
|
|
9
|
+
- [Feature Flag System](https://plyaz.atlassian.net/wiki/spaces/SD/pages/44859395)
|
|
10
|
+
- [Cache System](https://plyaz.atlassian.net/wiki/spaces/SD/pages/44892180)
|
|
11
|
+
|
|
7
12
|
## 🎯 Key Objectives
|
|
8
13
|
|
|
9
14
|
- **Business Logic Orchestration**: Centralize core business logic that coordinates between specialized packages
|
|
@@ -52,27 +57,34 @@ import { createLogger } from '@plyaz/logger';
|
|
|
52
57
|
│ └── contracts/ # External service contracts
|
|
53
58
|
```
|
|
54
59
|
|
|
55
|
-
## 🚀 Currently
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
66
|
-
- **
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- **
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
- **
|
|
60
|
+
## 🚀 Currently Implemented Features
|
|
61
|
+
|
|
62
|
+
> **Note**: The @plyaz/core package currently has two main features implemented. Additional providers and backend integrations are in development.
|
|
63
|
+
|
|
64
|
+
### ✅ Feature Flag System (Most Complete)
|
|
65
|
+
- **Implemented Providers**:
|
|
66
|
+
- ✅ Memory Provider - Fully functional with FEATURES constant
|
|
67
|
+
- ✅ File Provider - JSON/YAML support with hot reload capability
|
|
68
|
+
- ⏳ Redis Provider - Stub only (pending implementation)
|
|
69
|
+
- ⏳ API Provider - Stub only (pending implementation)
|
|
70
|
+
- ⏳ Database Provider - Stub only (pending implementation)
|
|
71
|
+
- **Frontend Support**: React hooks and context providers (working)
|
|
72
|
+
- **Backend Support**: NestJS module structure (partial - not fully integrated)
|
|
73
|
+
- **Engine**: Complete rule-based evaluation with targeting and rollouts
|
|
74
|
+
- **Testing**: Full override capabilities for test scenarios
|
|
75
|
+
|
|
76
|
+
### ✅ Cache System (Partially Complete)
|
|
77
|
+
- **Implemented Strategies**:
|
|
78
|
+
- ✅ Memory Strategy - LRU eviction with TTL management
|
|
79
|
+
- ⏳ Redis Strategy - Stub only (pending implementation)
|
|
80
|
+
- **Features**: Statistics tracking, automatic cleanup, TTL management
|
|
81
|
+
- **Integration**: Currently used by feature flag system
|
|
82
|
+
|
|
83
|
+
### 🚧 Pending Implementation
|
|
84
|
+
- **Backend Integration**: Full NestJS module integration
|
|
85
|
+
- **Additional Engines**: Calculation, Incentive, Validation, Insights
|
|
86
|
+
- **SDK Layer**: B2B partner SDK foundation
|
|
87
|
+
- **External Providers**: Redis, API, and Database connections
|
|
76
88
|
|
|
77
89
|
### File Provider Configuration
|
|
78
90
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/base/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/base/cache/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAiB,WAAW,EAAc,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE9F;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IAQX,OAAO,CAAC,MAAM;IAP1B,OAAO,CAAC,QAAQ,CAAgB;IAEhC;;;;OAIG;gBACiB,MAAM,EAAE,WAAW;IAIvC;;;;;;;;OAQG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahE;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAe5C;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAexC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI5C;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IActB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/memory.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAG7F;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA2C;IAEpE;;;;OAIG;gBACS,MAAM,GAAE,iBAAsB;IAc1C;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9D;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAcxD;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAcrC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;;;OAIG;IACH,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/memory.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAG7F;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA2C;IAEpE;;;;OAIG;gBACS,MAAM,GAAE,iBAAsB;IAc1C;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9D;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAcxD;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAcrC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAUpB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;CAyB3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/base/cache/strategies/redis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG5F;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAgB1C,OAAO,CAAC,MAAM;IAf1B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;OAIG;gBACiB,MAAM,EAAE,gBAAgB;IAO5C;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9D;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAuBxD;;;;;OAKG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAqBrC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;;;OAKG;YACW,eAAe;IAc7B;;;;;OAKG;YACW,mBAAmB;IA4BjC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/domain/featureFlags/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,mBAAmB,IAAI,oBAAoB,EAC3C,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,4BAA4B,EAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/domain/featureFlags/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,6 @@ export declare function useFeatureFlagProviderStatus<FeatureFlagKey extends stri
|
|
|
52
52
|
isInitialized: boolean;
|
|
53
53
|
isLoading: boolean;
|
|
54
54
|
error: Error | null;
|
|
55
|
-
lastUpdated: Date | null;
|
|
55
|
+
lastUpdated: Date | null | undefined;
|
|
56
56
|
};
|
|
57
57
|
//# sourceMappingURL=useFeatureFlagProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeatureFlagProvider.d.ts","sourceRoot":"","sources":["../../../../src/frontend/featureFlags/hooks/useFeatureFlagProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAA2B,MAAM,cAAc,CAAC;AAEjF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,SAAS,MAAM,KAC1B,mBAAmB,CAAC,cAAc,CAAC,CAWvC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAAC,cAAc,SAAS,MAAM,KAAK;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"useFeatureFlagProvider.d.ts","sourceRoot":"","sources":["../../../../src/frontend/featureFlags/hooks/useFeatureFlagProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAA2B,MAAM,cAAc,CAAC;AAEjF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,SAAS,MAAM,KAC1B,mBAAmB,CAAC,cAAc,CAAC,CAWvC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAAC,cAAc,SAAS,MAAM,KAAK;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC,CAgBA"}
|
|
@@ -7,22 +7,8 @@
|
|
|
7
7
|
* @version 1.0.0
|
|
8
8
|
*/
|
|
9
9
|
import React from 'react';
|
|
10
|
-
import type {
|
|
11
|
-
|
|
12
|
-
* Provider state interface.
|
|
13
|
-
*/
|
|
14
|
-
export interface ProviderState<FeatureFlagKey extends string> {
|
|
15
|
-
provider: IFeatureFlagProvider<FeatureFlagKey> | null;
|
|
16
|
-
isInitialized: boolean;
|
|
17
|
-
isLoading: boolean;
|
|
18
|
-
error: Error | null;
|
|
19
|
-
lastUpdated: Date | null;
|
|
20
|
-
}
|
|
21
|
-
export interface UseFeatureFlagProviderState<FeatureFlagKey extends string> {
|
|
22
|
-
state: ProviderState<FeatureFlagKey>;
|
|
23
|
-
setState: React.Dispatch<React.SetStateAction<ProviderState<FeatureFlagKey>>>;
|
|
24
|
-
initializeProvider: () => Promise<void>;
|
|
25
|
-
}
|
|
10
|
+
import type { FeatureFlagConfig } from '@plyaz/types';
|
|
11
|
+
import type { ProviderState, UseFeatureFlagProviderState } from './types';
|
|
26
12
|
/**
|
|
27
13
|
* Hook for managing feature flag provider state and initialization.
|
|
28
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureFlagProviderHelpers.d.ts","sourceRoot":"","sources":["../../../../src/frontend/featureFlags/providers/FeatureFlagProviderHelpers.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"FeatureFlagProviderHelpers.d.ts","sourceRoot":"","sources":["../../../../src/frontend/featureFlags/providers/FeatureFlagProviderHelpers.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,OAAO,KAAK,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAE1E;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,cAAc,SAAS,MAAM,EACvE,MAAM,EAAE,iBAAiB,CAAC,cAAc,CAAC,EACzC,OAAO,CAAC,EAAE,MAAM,IAAI,EACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC/B,2BAA2B,CAAC,cAAc,CAAC,CA8C7C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,SAAS,MAAM,EACnE,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,EACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,GAC5E,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,OAAO,EACtB,SAAS,EAAE,OAAO,EAClB,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,GACrC,KAAK,CAAC,YAAY,GAAG,IAAI,CAW3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,cAAc,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,EACzE,KAAK,CAAC,EAAE,MAAM,IAAI,GACjB,KAAK,CAAC,YAAY,GAAG,IAAI,CAO3B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import type { FeatureFlagProvider as IFeatureFlagProvider } from '@plyaz/types';
|
|
3
|
+
/**
|
|
4
|
+
* Provider state interface.
|
|
5
|
+
*/
|
|
6
|
+
export interface ProviderState<FeatureFlagKey extends string> {
|
|
7
|
+
provider: IFeatureFlagProvider<FeatureFlagKey> | null;
|
|
8
|
+
isInitialized: boolean;
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
lastUpdated: Date | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Hook for managing feature flag provider state and initialization.
|
|
15
|
+
*/
|
|
16
|
+
export interface UseFeatureFlagProviderState<FeatureFlagKey extends string> {
|
|
17
|
+
state: ProviderState<FeatureFlagKey>;
|
|
18
|
+
setState: React.Dispatch<React.SetStateAction<ProviderState<FeatureFlagKey>>>;
|
|
19
|
+
initializeProvider: () => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/frontend/featureFlags/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,cAAc,SAAS,MAAM;IAC1D,QAAQ,EAAE,oBAAoB,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACtD,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B,CAAC,cAAc,SAAS,MAAM;IACxE,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC9E,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC"}
|
package/dist/index.cjs
CHANGED
|
@@ -51,24 +51,21 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
51
51
|
};
|
|
52
52
|
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
53
53
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
54
|
-
|
|
55
|
-
// src/utils/common/hash.ts
|
|
56
54
|
function hashString(str) {
|
|
57
|
-
|
|
58
|
-
let hash =
|
|
55
|
+
if (str.length === 0) return 0;
|
|
56
|
+
let hash = config.FNV_CONSTANTS.FNV_32_OFFSET;
|
|
59
57
|
for (let i = 0; i < str.length; i++) {
|
|
60
|
-
|
|
61
|
-
hash = (hash
|
|
62
|
-
hash = hash & hash;
|
|
58
|
+
hash ^= str.charCodeAt(i);
|
|
59
|
+
hash = Math.imul(hash, config.FNV_CONSTANTS.FNV_32_PRIME) >>> 0;
|
|
63
60
|
}
|
|
64
|
-
return
|
|
61
|
+
return hash >>> 0;
|
|
65
62
|
}
|
|
66
63
|
__name(hashString, "hashString");
|
|
67
64
|
function isInRollout(identifier, percentage) {
|
|
68
|
-
if (percentage >=
|
|
65
|
+
if (percentage >= config.MATH_CONSTANTS.PERCENTAGE_MAX) return true;
|
|
69
66
|
if (percentage <= 0) return false;
|
|
70
67
|
const hash = hashString(identifier);
|
|
71
|
-
return hash %
|
|
68
|
+
return hash % config.MATH_CONSTANTS.PERCENTAGE_MAX < percentage;
|
|
72
69
|
}
|
|
73
70
|
__name(isInRollout, "isInRollout");
|
|
74
71
|
function createRolloutIdentifier(featureKey, userId) {
|
|
@@ -97,23 +94,22 @@ var HashUtils = {
|
|
|
97
94
|
* @param totalBuckets - Total number of buckets (default: 100)
|
|
98
95
|
* @returns true if identifier is in the bucket range
|
|
99
96
|
*/
|
|
100
|
-
isInBucketRange: /* @__PURE__ */ __name((identifier, startBucket, endBucket, totalBuckets =
|
|
97
|
+
isInBucketRange: /* @__PURE__ */ __name((identifier, startBucket, endBucket, totalBuckets = config.MATH_CONSTANTS.PERCENTAGE_MAX) => {
|
|
101
98
|
const bucket = hashString(identifier) % totalBuckets;
|
|
102
99
|
return bucket >= startBucket && bucket <= endBucket;
|
|
103
100
|
}, "isInBucketRange"),
|
|
104
101
|
/**
|
|
105
102
|
* Creates a deterministic random seed from a string.
|
|
103
|
+
* Uses the improved hash function and ensures the seed is within
|
|
104
|
+
* the safe range for JavaScript's Math.random seeding.
|
|
106
105
|
*
|
|
107
106
|
* @param str - String to convert to seed
|
|
108
|
-
* @returns Deterministic seed value
|
|
107
|
+
* @returns Deterministic seed value (0 to 2^31-1)
|
|
109
108
|
*/
|
|
110
109
|
createSeed: /* @__PURE__ */ __name((str) => {
|
|
111
|
-
|
|
112
|
-
return hashString(str) % SAFE_INT;
|
|
110
|
+
return hashString(str) % config.HASH_SEED_CONSTANTS.MAX_SAFE_SEED;
|
|
113
111
|
}, "createSeed")
|
|
114
112
|
};
|
|
115
|
-
|
|
116
|
-
// src/utils/common/values.ts
|
|
117
113
|
function isStringFalsy(value) {
|
|
118
114
|
if (value === "") return true;
|
|
119
115
|
const lower = value.toLowerCase().trim();
|
|
@@ -179,7 +175,7 @@ var ValueUtils = {
|
|
|
179
175
|
*/
|
|
180
176
|
isValidPercentage: /* @__PURE__ */ __name((value) => {
|
|
181
177
|
if (typeof value !== "number") return false;
|
|
182
|
-
return !isNaN(value) && isFinite(value) && value >= 0 && value <=
|
|
178
|
+
return !isNaN(value) && isFinite(value) && value >= 0 && value <= config.MATH_CONSTANTS.PERCENTAGE_MAX;
|
|
183
179
|
}, "isValidPercentage"),
|
|
184
180
|
/**
|
|
185
181
|
* Clamps a number to a specific range.
|
|
@@ -225,8 +221,6 @@ var ValueUtils = {
|
|
|
225
221
|
return current;
|
|
226
222
|
}, "getNestedProperty")
|
|
227
223
|
};
|
|
228
|
-
|
|
229
|
-
// src/utils/featureFlags/context.ts
|
|
230
224
|
var FeatureFlagContextBuilder = class _FeatureFlagContextBuilder {
|
|
231
225
|
static {
|
|
232
226
|
__name(this, "FeatureFlagContextBuilder");
|
|
@@ -422,7 +416,7 @@ var ContextUtils = {
|
|
|
422
416
|
if (context.platform && !["web", "mobile", "desktop"].includes(context.platform)) {
|
|
423
417
|
errors.push("Platform must be web, mobile, or desktop");
|
|
424
418
|
}
|
|
425
|
-
if (context.country && context.country.length !==
|
|
419
|
+
if (context.country && context.country.length !== config.ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {
|
|
426
420
|
errors.push("Country must be a 2-letter ISO country code");
|
|
427
421
|
}
|
|
428
422
|
return {
|
|
@@ -1141,6 +1135,9 @@ var MemoryCacheStrategy = class {
|
|
|
1141
1135
|
this.cleanupTimer = setInterval(() => {
|
|
1142
1136
|
this.cleanupExpiredEntries();
|
|
1143
1137
|
}, this.cleanupInterval);
|
|
1138
|
+
if (this.cleanupTimer && typeof this.cleanupTimer.unref === "function") {
|
|
1139
|
+
this.cleanupTimer.unref();
|
|
1140
|
+
}
|
|
1144
1141
|
}
|
|
1145
1142
|
/**
|
|
1146
1143
|
* Removes expired entries from the cache.
|
|
@@ -1189,8 +1186,6 @@ var MemoryCacheStrategy = class {
|
|
|
1189
1186
|
}
|
|
1190
1187
|
}
|
|
1191
1188
|
};
|
|
1192
|
-
|
|
1193
|
-
// src/base/cache/strategies/redis.ts
|
|
1194
1189
|
var RedisCacheStrategy = class {
|
|
1195
1190
|
/**
|
|
1196
1191
|
* Creates a new Redis cache strategy.
|
|
@@ -1228,7 +1223,7 @@ var RedisCacheStrategy = class {
|
|
|
1228
1223
|
const redisKey = this.buildRedisKey(key);
|
|
1229
1224
|
const serializedEntry = JSON.stringify(entry);
|
|
1230
1225
|
const ttlMs = entry.expiresAt - Date.now();
|
|
1231
|
-
const ttlSeconds = Math.max(1, Math.ceil(ttlMs /
|
|
1226
|
+
const ttlSeconds = Math.max(1, Math.ceil(ttlMs / config.TIME_CONSTANTS.MILLISECONDS_PER_SECOND));
|
|
1232
1227
|
await this.client.set(redisKey, serializedEntry, "EX", ttlSeconds);
|
|
1233
1228
|
this.stats.setCount++;
|
|
1234
1229
|
}
|
|
@@ -1399,7 +1394,7 @@ var CacheManager = class {
|
|
|
1399
1394
|
const finalTtl = ttl ?? this.config.ttl;
|
|
1400
1395
|
const entry = {
|
|
1401
1396
|
data: value,
|
|
1402
|
-
expiresAt: Date.now() + finalTtl *
|
|
1397
|
+
expiresAt: Date.now() + finalTtl * config.TIME_CONSTANTS.MILLISECONDS_PER_SECOND,
|
|
1403
1398
|
createdAt: Date.now()
|
|
1404
1399
|
};
|
|
1405
1400
|
await this.strategy.set(key, entry);
|
|
@@ -1492,8 +1487,6 @@ var CacheManager = class {
|
|
|
1492
1487
|
await this.strategy.dispose?.();
|
|
1493
1488
|
}
|
|
1494
1489
|
};
|
|
1495
|
-
|
|
1496
|
-
// src/domain/featureFlags/provider.ts
|
|
1497
1490
|
var FeatureFlagProvider = class {
|
|
1498
1491
|
/**
|
|
1499
1492
|
* Creates a new feature flag provider.
|
|
@@ -1728,7 +1721,7 @@ var FeatureFlagProvider = class {
|
|
|
1728
1721
|
void this.refresh().catch((error) => {
|
|
1729
1722
|
this.log("Auto-refresh failed:", error);
|
|
1730
1723
|
});
|
|
1731
|
-
}, this.config.refreshInterval *
|
|
1724
|
+
}, this.config.refreshInterval * config.TIME_CONSTANTS.MILLISECONDS_PER_SECOND);
|
|
1732
1725
|
}
|
|
1733
1726
|
}
|
|
1734
1727
|
/**
|
|
@@ -2372,7 +2365,7 @@ var FileFeatureFlagProvider = class extends FeatureFlagProvider {
|
|
|
2372
2365
|
};
|
|
2373
2366
|
let content;
|
|
2374
2367
|
if (format === "json") {
|
|
2375
|
-
content = JSON.stringify(defaultData, null,
|
|
2368
|
+
content = JSON.stringify(defaultData, null, config.FORMAT_CONSTANTS.JSON_INDENT_SPACES);
|
|
2376
2369
|
} else {
|
|
2377
2370
|
content = yaml__namespace.stringify(defaultData);
|
|
2378
2371
|
}
|
|
@@ -2480,7 +2473,7 @@ var FileFeatureFlagProvider = class extends FeatureFlagProvider {
|
|
|
2480
2473
|
try {
|
|
2481
2474
|
let content;
|
|
2482
2475
|
if (format === "json") {
|
|
2483
|
-
content = JSON.stringify(fileData, null,
|
|
2476
|
+
content = JSON.stringify(fileData, null, config.FORMAT_CONSTANTS.JSON_INDENT_SPACES);
|
|
2484
2477
|
} else {
|
|
2485
2478
|
content = yaml__namespace.stringify(fileData);
|
|
2486
2479
|
}
|
|
@@ -4018,7 +4011,7 @@ function useFeatureFlagProviderStatus() {
|
|
|
4018
4011
|
isInitialized: context.isInitialized,
|
|
4019
4012
|
isLoading: context.isLoading,
|
|
4020
4013
|
error: context.error,
|
|
4021
|
-
lastUpdated: context.lastUpdated
|
|
4014
|
+
lastUpdated: context.lastUpdated ? new Date(context.lastUpdated) : void 0
|
|
4022
4015
|
};
|
|
4023
4016
|
}
|
|
4024
4017
|
__name(useFeatureFlagProviderStatus, "useFeatureFlagProviderStatus");
|