@plyaz/core 1.5.19 → 1.5.21
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/domain/example/FrontendExampleDomainService.d.ts.map +1 -1
- package/dist/entry-backend.d.ts +15 -1
- package/dist/entry-backend.d.ts.map +1 -1
- package/dist/entry-backend.js +784 -1360
- package/dist/entry-backend.js.map +1 -1
- package/dist/entry-backend.mjs +2818 -3378
- package/dist/entry-backend.mjs.map +1 -1
- package/dist/entry-frontend-browser.js +2 -0
- package/dist/entry-frontend-browser.js.map +1 -1
- package/dist/entry-frontend-browser.mjs +2 -0
- package/dist/entry-frontend-browser.mjs.map +1 -1
- package/dist/entry-frontend.js +2 -0
- package/dist/entry-frontend.js.map +1 -1
- package/dist/entry-frontend.mjs +2 -0
- package/dist/entry-frontend.mjs.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/entry-backend.js
CHANGED
|
@@ -18,15 +18,12 @@ var storage = require('@plyaz/storage');
|
|
|
18
18
|
var notifications = require('@plyaz/notifications');
|
|
19
19
|
var ServerErrorMiddleware = require('@plyaz/errors/middleware/backend');
|
|
20
20
|
require('@plyaz/types/globals');
|
|
21
|
-
var
|
|
21
|
+
var module$1 = require('module');
|
|
22
|
+
var url = require('url');
|
|
22
23
|
var path = require('path');
|
|
24
|
+
var fs = require('fs');
|
|
23
25
|
var util = require('util');
|
|
24
|
-
var url = require('url');
|
|
25
26
|
var yaml = require('yaml');
|
|
26
|
-
var module$1 = require('module');
|
|
27
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
28
|
-
var react = require('react');
|
|
29
|
-
var api = require('@plyaz/config/api');
|
|
30
27
|
var dotenv = require('dotenv');
|
|
31
28
|
|
|
32
29
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
@@ -49,8 +46,8 @@ function _interopNamespace(e) {
|
|
|
49
46
|
}
|
|
50
47
|
|
|
51
48
|
var ServerErrorMiddleware__namespace = /*#__PURE__*/_interopNamespace(ServerErrorMiddleware);
|
|
52
|
-
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
|
53
49
|
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
50
|
+
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
|
54
51
|
var yaml__namespace = /*#__PURE__*/_interopNamespace(yaml);
|
|
55
52
|
|
|
56
53
|
// @plyaz package - Built with tsup
|
|
@@ -441,7 +438,7 @@ var init_common = __esm({
|
|
|
441
438
|
init_validation();
|
|
442
439
|
}
|
|
443
440
|
});
|
|
444
|
-
var MAX_EVENT_LISTENERS, CoreEventManagerClass
|
|
441
|
+
var MAX_EVENT_LISTENERS, CoreEventManagerClass; exports.CoreEventManager = void 0;
|
|
445
442
|
var init_CoreEventManager = __esm({
|
|
446
443
|
"src/events/CoreEventManager.ts"() {
|
|
447
444
|
init_common();
|
|
@@ -545,7 +542,7 @@ var init_CoreEventManager = __esm({
|
|
|
545
542
|
return generateCorrelationId();
|
|
546
543
|
}
|
|
547
544
|
};
|
|
548
|
-
CoreEventManager = new CoreEventManagerClass();
|
|
545
|
+
exports.CoreEventManager = new CoreEventManagerClass();
|
|
549
546
|
}
|
|
550
547
|
});
|
|
551
548
|
function getConfigForEnvironment(env) {
|
|
@@ -766,7 +763,7 @@ var init_ApiClientService = __esm({
|
|
|
766
763
|
requestId
|
|
767
764
|
}
|
|
768
765
|
};
|
|
769
|
-
CoreEventManager.emit(types.CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });
|
|
766
|
+
exports.CoreEventManager.emit(types.CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });
|
|
770
767
|
} else {
|
|
771
768
|
const serializedErrors = errorDetails.map(
|
|
772
769
|
(detail, index) => ({
|
|
@@ -790,7 +787,7 @@ var init_ApiClientService = __esm({
|
|
|
790
787
|
}
|
|
791
788
|
})
|
|
792
789
|
);
|
|
793
|
-
CoreEventManager.emit(types.CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });
|
|
790
|
+
exports.CoreEventManager.emit(types.CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });
|
|
794
791
|
}
|
|
795
792
|
} catch (e) {
|
|
796
793
|
console.error("[ApiClientService] Failed to emit error event:", e);
|
|
@@ -943,7 +940,7 @@ var init_ApiClientService = __esm({
|
|
|
943
940
|
error,
|
|
944
941
|
duration: options.duration
|
|
945
942
|
};
|
|
946
|
-
CoreEventManager.emit(types.CORE_EVENTS.API.REQUEST_ERROR, payload);
|
|
943
|
+
exports.CoreEventManager.emit(types.CORE_EVENTS.API.REQUEST_ERROR, payload);
|
|
947
944
|
if (options.rethrow && error instanceof Error) {
|
|
948
945
|
throw error;
|
|
949
946
|
}
|
|
@@ -3160,7 +3157,7 @@ var init_CoreInitializer = __esm({
|
|
|
3160
3157
|
* @example Core.events.on('example:created', handler)
|
|
3161
3158
|
*/
|
|
3162
3159
|
static get events() {
|
|
3163
|
-
return CoreEventManager;
|
|
3160
|
+
return exports.CoreEventManager;
|
|
3164
3161
|
}
|
|
3165
3162
|
/**
|
|
3166
3163
|
* Get database service instance
|
|
@@ -3611,7 +3608,7 @@ var init_CoreInitializer = __esm({
|
|
|
3611
3608
|
}
|
|
3612
3609
|
_Core._flagConfig = {};
|
|
3613
3610
|
exports.ServiceRegistry.disposeAll();
|
|
3614
|
-
CoreEventManager.dispose();
|
|
3611
|
+
exports.CoreEventManager.dispose();
|
|
3615
3612
|
_Core._coreServices = {
|
|
3616
3613
|
db: null,
|
|
3617
3614
|
api: null,
|
|
@@ -3821,13 +3818,13 @@ var init_CoreInitializer = __esm({
|
|
|
3821
3818
|
replaceBuiltIn: _Core._errorConfig.localization?.replaceBuiltIn
|
|
3822
3819
|
});
|
|
3823
3820
|
await _Core.initializeRootStore(_Core._errorConfig, verbose);
|
|
3824
|
-
middleware.setEventEmitter(CoreEventManager.emit.bind(CoreEventManager));
|
|
3821
|
+
middleware.setEventEmitter(exports.CoreEventManager.emit.bind(exports.CoreEventManager));
|
|
3825
3822
|
const errorStore = _Core.getErrorStoreActions();
|
|
3826
3823
|
_Core._errorHandler = middleware.initializeGlobalErrorHandler(
|
|
3827
3824
|
errorStore,
|
|
3828
3825
|
_Core.buildErrorHandlerConfig(_Core._errorConfig)
|
|
3829
3826
|
);
|
|
3830
|
-
const errorEventCleanup = CoreEventManager.on(
|
|
3827
|
+
const errorEventCleanup = exports.CoreEventManager.on(
|
|
3831
3828
|
core.CORE_EVENTS.SYSTEM.ERROR,
|
|
3832
3829
|
(event) => {
|
|
3833
3830
|
if (!_Core._rootStore) return;
|
|
@@ -3927,34 +3924,34 @@ var init_CoreInitializer = __esm({
|
|
|
3927
3924
|
return;
|
|
3928
3925
|
}
|
|
3929
3926
|
_Core.log("Subscribing to error events...", verbose);
|
|
3930
|
-
const cleanupSystemError = CoreEventManager.on(core.CORE_EVENTS.SYSTEM.ERROR, (event) => {
|
|
3927
|
+
const cleanupSystemError = exports.CoreEventManager.on(core.CORE_EVENTS.SYSTEM.ERROR, (event) => {
|
|
3931
3928
|
if (_Core._errorHandler && event.data?.errors?.length) {
|
|
3932
3929
|
for (const err of event.data.errors) {
|
|
3933
3930
|
_Core._errorHandler.captureError(err, "system");
|
|
3934
3931
|
}
|
|
3935
3932
|
}
|
|
3936
3933
|
});
|
|
3937
|
-
const cleanupEntityError = CoreEventManager.on(core.CORE_EVENTS.ENTITY.ERROR, (event) => {
|
|
3934
|
+
const cleanupEntityError = exports.CoreEventManager.on(core.CORE_EVENTS.ENTITY.ERROR, (event) => {
|
|
3938
3935
|
if (_Core._errorHandler && event.data) {
|
|
3939
3936
|
_Core._errorHandler.captureError(event.data.error, "entity");
|
|
3940
3937
|
}
|
|
3941
3938
|
});
|
|
3942
|
-
const cleanupApiError = CoreEventManager.on(core.CORE_EVENTS.API.REQUEST_ERROR, (event) => {
|
|
3939
|
+
const cleanupApiError = exports.CoreEventManager.on(core.CORE_EVENTS.API.REQUEST_ERROR, (event) => {
|
|
3943
3940
|
if (_Core._errorHandler && event.data) {
|
|
3944
3941
|
_Core._errorHandler.captureError(event.data.error, "api");
|
|
3945
3942
|
}
|
|
3946
3943
|
});
|
|
3947
|
-
const cleanupValidationError = CoreEventManager.on(core.CORE_EVENTS.VALIDATION.FAILED, (event) => {
|
|
3944
|
+
const cleanupValidationError = exports.CoreEventManager.on(core.CORE_EVENTS.VALIDATION.FAILED, (event) => {
|
|
3948
3945
|
if (_Core._errorHandler && event.data) {
|
|
3949
3946
|
_Core._errorHandler.captureError(event.data.error, "validation");
|
|
3950
3947
|
}
|
|
3951
3948
|
});
|
|
3952
|
-
const cleanupAuthUnauthorized = CoreEventManager.on(core.CORE_EVENTS.AUTH.UNAUTHORIZED, (event) => {
|
|
3949
|
+
const cleanupAuthUnauthorized = exports.CoreEventManager.on(core.CORE_EVENTS.AUTH.UNAUTHORIZED, (event) => {
|
|
3953
3950
|
if (_Core._errorHandler && event.data?.error) {
|
|
3954
3951
|
_Core._errorHandler.captureError(event.data.error, "auth");
|
|
3955
3952
|
}
|
|
3956
3953
|
});
|
|
3957
|
-
const cleanupAuthSessionExpired = CoreEventManager.on(
|
|
3954
|
+
const cleanupAuthSessionExpired = exports.CoreEventManager.on(
|
|
3958
3955
|
core.CORE_EVENTS.AUTH.SESSION_EXPIRED,
|
|
3959
3956
|
(event) => {
|
|
3960
3957
|
if (_Core._errorHandler && event.data?.error) {
|
|
@@ -3971,19 +3968,19 @@ var init_CoreInitializer = __esm({
|
|
|
3971
3968
|
cleanupAuthSessionExpired
|
|
3972
3969
|
);
|
|
3973
3970
|
if (_Core.isRuntimeCompatible("backend")) {
|
|
3974
|
-
const cleanupDatabaseError = CoreEventManager.on(core.CORE_EVENTS.DATABASE.ERROR, (event) => {
|
|
3971
|
+
const cleanupDatabaseError = exports.CoreEventManager.on(core.CORE_EVENTS.DATABASE.ERROR, (event) => {
|
|
3975
3972
|
if (_Core._errorHandler && event.data) {
|
|
3976
3973
|
_Core._errorHandler.captureError(event.data.error, "database");
|
|
3977
3974
|
}
|
|
3978
3975
|
});
|
|
3979
3976
|
_Core._eventCleanupFns.push(cleanupDatabaseError);
|
|
3980
|
-
const cleanupStorageError = CoreEventManager.on(core.CORE_EVENTS.STORAGE.ERROR, (event) => {
|
|
3977
|
+
const cleanupStorageError = exports.CoreEventManager.on(core.CORE_EVENTS.STORAGE.ERROR, (event) => {
|
|
3981
3978
|
if (_Core._errorHandler && event.data) {
|
|
3982
3979
|
_Core._errorHandler.captureError(event.data.error, "storage");
|
|
3983
3980
|
}
|
|
3984
3981
|
});
|
|
3985
3982
|
_Core._eventCleanupFns.push(cleanupStorageError);
|
|
3986
|
-
const cleanupNotificationError = CoreEventManager.on(
|
|
3983
|
+
const cleanupNotificationError = exports.CoreEventManager.on(
|
|
3987
3984
|
core.CORE_EVENTS.NOTIFICATION.ERROR,
|
|
3988
3985
|
(event) => {
|
|
3989
3986
|
if (_Core._errorHandler && event.data) {
|
|
@@ -4462,13 +4459,13 @@ var init_BaseDomainService = __esm({
|
|
|
4462
4459
|
};
|
|
4463
4460
|
}
|
|
4464
4461
|
});
|
|
4465
|
-
|
|
4462
|
+
var BaseFrontendDomainService;
|
|
4466
4463
|
var init_BaseFrontendDomainService = __esm({
|
|
4467
4464
|
"src/domain/base/BaseFrontendDomainService.ts"() {
|
|
4468
4465
|
init_BaseDomainService();
|
|
4469
4466
|
init_CoreEventManager();
|
|
4470
4467
|
init_CoreInitializer();
|
|
4471
|
-
|
|
4468
|
+
BaseFrontendDomainService = class extends exports.BaseDomainService {
|
|
4472
4469
|
// ─────────────────────────────────────────────────────────────────────────
|
|
4473
4470
|
// Constructor
|
|
4474
4471
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -5271,7 +5268,7 @@ var init_BaseFrontendDomainService = __esm({
|
|
|
5271
5268
|
*/
|
|
5272
5269
|
emitEvent(event, payload) {
|
|
5273
5270
|
const eventName = `${this.eventPrefix}:${event}`;
|
|
5274
|
-
CoreEventManager.emit(eventName, payload);
|
|
5271
|
+
exports.CoreEventManager.emit(eventName, payload);
|
|
5275
5272
|
this.logDebug(`Event emitted: ${eventName}`, payload);
|
|
5276
5273
|
}
|
|
5277
5274
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -6963,7 +6960,7 @@ var init_BaseBackendDomainService = __esm({
|
|
|
6963
6960
|
*/
|
|
6964
6961
|
emitEvent(event, payload) {
|
|
6965
6962
|
if (this.emitEvents) {
|
|
6966
|
-
CoreEventManager.emit(`${this.eventPrefix}:${event}`, payload);
|
|
6963
|
+
exports.CoreEventManager.emit(`${this.eventPrefix}:${event}`, payload);
|
|
6967
6964
|
}
|
|
6968
6965
|
}
|
|
6969
6966
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -7453,7 +7450,7 @@ var init_base = __esm({
|
|
|
7453
7450
|
});
|
|
7454
7451
|
|
|
7455
7452
|
// src/domain/example/mappers/ExampleMapper.ts
|
|
7456
|
-
var PAGINATION_DEFAULTS, ExampleMapperClass;
|
|
7453
|
+
var PAGINATION_DEFAULTS, ExampleMapperClass;
|
|
7457
7454
|
var init_ExampleMapper = __esm({
|
|
7458
7455
|
"src/domain/example/mappers/ExampleMapper.ts"() {
|
|
7459
7456
|
init_base();
|
|
@@ -7590,23 +7587,23 @@ var init_ExampleMapper = __esm({
|
|
|
7590
7587
|
};
|
|
7591
7588
|
}
|
|
7592
7589
|
};
|
|
7593
|
-
|
|
7590
|
+
new ExampleMapperClass();
|
|
7594
7591
|
}
|
|
7595
7592
|
});
|
|
7596
7593
|
|
|
7597
7594
|
// src/domain/example/FrontendExampleDomainService.ts
|
|
7598
7595
|
var FrontendExampleDomainService_exports = {};
|
|
7599
7596
|
__export(FrontendExampleDomainService_exports, {
|
|
7600
|
-
FrontendExampleDomainService: () =>
|
|
7597
|
+
FrontendExampleDomainService: () => FrontendExampleDomainService
|
|
7601
7598
|
});
|
|
7602
|
-
var DEFAULT_POLLING_INTERVAL_MS
|
|
7599
|
+
var DEFAULT_POLLING_INTERVAL_MS, FrontendExampleDomainService;
|
|
7603
7600
|
var init_FrontendExampleDomainService = __esm({
|
|
7604
7601
|
"src/domain/example/FrontendExampleDomainService.ts"() {
|
|
7605
7602
|
init_BaseFrontendDomainService();
|
|
7606
7603
|
init_CoreEventManager();
|
|
7607
7604
|
init_ExampleMapper();
|
|
7608
7605
|
DEFAULT_POLLING_INTERVAL_MS = 3e4;
|
|
7609
|
-
|
|
7606
|
+
FrontendExampleDomainService = class _FrontendExampleDomainService extends BaseFrontendDomainService {
|
|
7610
7607
|
// ─────────────────────────────────────────────────────────────────────────
|
|
7611
7608
|
// Constructor
|
|
7612
7609
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -7615,6 +7612,8 @@ var init_FrontendExampleDomainService = __esm({
|
|
|
7615
7612
|
super({
|
|
7616
7613
|
serviceName: "ExampleFrontendService",
|
|
7617
7614
|
supportedRuntimes: ["frontend"],
|
|
7615
|
+
// API client config - uses injected options or creates from apiBasePath
|
|
7616
|
+
apiClientConfig: options?.apiClient?.options ?? { baseURL: apiBasePath },
|
|
7618
7617
|
serviceConfig: {
|
|
7619
7618
|
enabled: true,
|
|
7620
7619
|
apiBasePath,
|
|
@@ -7734,7 +7733,7 @@ var init_FrontendExampleDomainService = __esm({
|
|
|
7734
7733
|
* Note: Base class automatically calls syncToStores() which uses storeHandlers
|
|
7735
7734
|
*/
|
|
7736
7735
|
async afterFetchAll(entities) {
|
|
7737
|
-
CoreEventManager.emit("example:store:synced", { items: entities });
|
|
7736
|
+
exports.CoreEventManager.emit("example:store:synced", { items: entities });
|
|
7738
7737
|
}
|
|
7739
7738
|
// ─────────────────────────────────────────────────────────────────────────
|
|
7740
7739
|
// Optional: Manual Store Updates (Alternative to storeHandlers)
|
|
@@ -7773,7 +7772,7 @@ var init_FrontendExampleDomainService = __esm({
|
|
|
7773
7772
|
* ```
|
|
7774
7773
|
*/
|
|
7775
7774
|
on(event, handler) {
|
|
7776
|
-
return CoreEventManager.on(event, handler);
|
|
7775
|
+
return exports.CoreEventManager.on(event, handler);
|
|
7777
7776
|
}
|
|
7778
7777
|
// ─────────────────────────────────────────────────────────────────────────
|
|
7779
7778
|
// Polling (Domain-Specific Feature)
|
|
@@ -7967,7 +7966,7 @@ var init_DbService = __esm({
|
|
|
7967
7966
|
query: options?.query,
|
|
7968
7967
|
recoverable: options?.recoverable ?? false
|
|
7969
7968
|
};
|
|
7970
|
-
CoreEventManager.emit(core.CORE_EVENTS.DATABASE.ERROR, payload);
|
|
7969
|
+
exports.CoreEventManager.emit(core.CORE_EVENTS.DATABASE.ERROR, payload);
|
|
7971
7970
|
}
|
|
7972
7971
|
/**
|
|
7973
7972
|
* Gets the singleton instance of DbService
|
|
@@ -8816,7 +8815,7 @@ var init_example = __esm({
|
|
|
8816
8815
|
init_ExampleRepository();
|
|
8817
8816
|
}
|
|
8818
8817
|
});
|
|
8819
|
-
var ExampleValidatorClass;
|
|
8818
|
+
var ExampleValidatorClass;
|
|
8820
8819
|
var init_ExampleValidator = __esm({
|
|
8821
8820
|
"src/domain/example/validators/ExampleValidator.ts"() {
|
|
8822
8821
|
init_base();
|
|
@@ -8848,7 +8847,7 @@ var init_ExampleValidator = __esm({
|
|
|
8848
8847
|
return amount <= budget;
|
|
8849
8848
|
}
|
|
8850
8849
|
};
|
|
8851
|
-
|
|
8850
|
+
new ExampleValidatorClass();
|
|
8852
8851
|
}
|
|
8853
8852
|
});
|
|
8854
8853
|
|
|
@@ -22684,7 +22683,7 @@ var init_extractFormattedPhoneNumberFromPossibleRfc3966NumberUri = __esm({
|
|
|
22684
22683
|
});
|
|
22685
22684
|
|
|
22686
22685
|
// node_modules/.pnpm/libphonenumber-js@1.12.33/node_modules/libphonenumber-js/es6/parse.js
|
|
22687
|
-
function
|
|
22686
|
+
function parse(text, options, metadata) {
|
|
22688
22687
|
options = options || {};
|
|
22689
22688
|
metadata = new Metadata(metadata);
|
|
22690
22689
|
if (options.defaultCountry && !metadata.hasCountry(options.defaultCountry)) {
|
|
@@ -22868,7 +22867,7 @@ var init_parse = __esm({
|
|
|
22868
22867
|
PHONE_NUMBER_START_PATTERN = new RegExp("[" + PLUS_CHARS + VALID_DIGITS + "]");
|
|
22869
22868
|
AFTER_PHONE_NUMBER_END_PATTERN = new RegExp("[^" + VALID_DIGITS + "#]+$");
|
|
22870
22869
|
USE_NON_GEOGRAPHIC_COUNTRY_CODE3 = false;
|
|
22871
|
-
__name(
|
|
22870
|
+
__name(parse, "parse");
|
|
22872
22871
|
__name(_extractFormattedPhoneNumber, "_extractFormattedPhoneNumber");
|
|
22873
22872
|
__name(parseInput, "parseInput");
|
|
22874
22873
|
__name(result, "result");
|
|
@@ -22924,7 +22923,7 @@ function _toPrimitive4(t, r) {
|
|
|
22924
22923
|
return ("string" === r ? String : Number)(t);
|
|
22925
22924
|
}
|
|
22926
22925
|
function parsePhoneNumberWithError(text, options, metadata) {
|
|
22927
|
-
return
|
|
22926
|
+
return parse(text, _objectSpread2(_objectSpread2({}, options), {}, {
|
|
22928
22927
|
v2: true
|
|
22929
22928
|
}), metadata);
|
|
22930
22929
|
}
|
|
@@ -41835,7 +41834,7 @@ var StorageService = class _StorageService {
|
|
|
41835
41834
|
filename: options?.filename,
|
|
41836
41835
|
recoverable: options?.recoverable ?? false
|
|
41837
41836
|
};
|
|
41838
|
-
CoreEventManager.emit(core.CORE_EVENTS.STORAGE.ERROR, payload);
|
|
41837
|
+
exports.CoreEventManager.emit(core.CORE_EVENTS.STORAGE.ERROR, payload);
|
|
41839
41838
|
}
|
|
41840
41839
|
// ─────────────────────────────────────────────────────────────────
|
|
41841
41840
|
// Singleton Management
|
|
@@ -42040,7 +42039,7 @@ var NotificationService = class _NotificationService {
|
|
|
42040
42039
|
channel: options?.channel,
|
|
42041
42040
|
recoverable: options?.recoverable ?? false
|
|
42042
42041
|
};
|
|
42043
|
-
CoreEventManager.emit(core.CORE_EVENTS.NOTIFICATION.ERROR, payload);
|
|
42042
|
+
exports.CoreEventManager.emit(core.CORE_EVENTS.NOTIFICATION.ERROR, payload);
|
|
42044
42043
|
}
|
|
42045
42044
|
// ─────────────────────────────────────────────────────────────────
|
|
42046
42045
|
// Singleton Management
|
|
@@ -42207,176 +42206,18 @@ var NotificationService = class _NotificationService {
|
|
|
42207
42206
|
}
|
|
42208
42207
|
};
|
|
42209
42208
|
|
|
42210
|
-
// src/
|
|
42211
|
-
|
|
42212
|
-
|
|
42213
|
-
|
|
42214
|
-
|
|
42215
|
-
|
|
42216
|
-
|
|
42217
|
-
|
|
42218
|
-
|
|
42219
|
-
|
|
42220
|
-
|
|
42221
|
-
|
|
42222
|
-
static {
|
|
42223
|
-
__name(this, "FeatureFlagService");
|
|
42224
|
-
}
|
|
42225
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42226
|
-
// Lifecycle
|
|
42227
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42228
|
-
/**
|
|
42229
|
-
* Initializes the service and underlying provider.
|
|
42230
|
-
*/
|
|
42231
|
-
async initialize() {
|
|
42232
|
-
if (this.isInitialized) {
|
|
42233
|
-
return;
|
|
42234
|
-
}
|
|
42235
|
-
try {
|
|
42236
|
-
await this.provider.initialize();
|
|
42237
|
-
this.isInitialized = true;
|
|
42238
|
-
this.logger.info(`Feature flag service initialized with ${this.config.provider} provider`);
|
|
42239
|
-
} catch (error) {
|
|
42240
|
-
this.logger.error("Failed to initialize feature flag service", { error });
|
|
42241
|
-
throw error;
|
|
42242
|
-
}
|
|
42243
|
-
}
|
|
42244
|
-
/**
|
|
42245
|
-
* Disposes the service and underlying provider.
|
|
42246
|
-
*/
|
|
42247
|
-
dispose() {
|
|
42248
|
-
this.provider.dispose();
|
|
42249
|
-
this.isInitialized = false;
|
|
42250
|
-
this.logger.info("Feature flag service disposed");
|
|
42251
|
-
}
|
|
42252
|
-
/**
|
|
42253
|
-
* Refreshes the provider cache.
|
|
42254
|
-
*/
|
|
42255
|
-
async refresh() {
|
|
42256
|
-
await this.provider.refresh();
|
|
42257
|
-
this.logger.debug("Feature flag cache refreshed");
|
|
42258
|
-
}
|
|
42259
|
-
/**
|
|
42260
|
-
* Gets whether the service is initialized.
|
|
42261
|
-
*/
|
|
42262
|
-
getIsInitialized() {
|
|
42263
|
-
return this.isInitialized;
|
|
42264
|
-
}
|
|
42265
|
-
/**
|
|
42266
|
-
* Gets the provider type.
|
|
42267
|
-
*/
|
|
42268
|
-
getProviderType() {
|
|
42269
|
-
return this.config.provider;
|
|
42270
|
-
}
|
|
42271
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42272
|
-
// Read Operations
|
|
42273
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42274
|
-
/**
|
|
42275
|
-
* Evaluates a feature flag.
|
|
42276
|
-
*/
|
|
42277
|
-
async getFlag(key, context) {
|
|
42278
|
-
return this.provider.getFlag(key, context);
|
|
42279
|
-
}
|
|
42280
|
-
/**
|
|
42281
|
-
* Gets all feature flag evaluations.
|
|
42282
|
-
*/
|
|
42283
|
-
async getAllFlags(context) {
|
|
42284
|
-
return this.provider.getAllFlags(context);
|
|
42285
|
-
}
|
|
42286
|
-
/**
|
|
42287
|
-
* Checks if a feature flag is enabled.
|
|
42288
|
-
*/
|
|
42289
|
-
async isEnabled(key, context) {
|
|
42290
|
-
return this.provider.isEnabled(key, context);
|
|
42291
|
-
}
|
|
42292
|
-
/**
|
|
42293
|
-
* Gets the value of a feature flag.
|
|
42294
|
-
*/
|
|
42295
|
-
async getValue(key, context) {
|
|
42296
|
-
return this.provider.getValue(key, context);
|
|
42297
|
-
}
|
|
42298
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42299
|
-
// Flag Management
|
|
42300
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42301
|
-
/**
|
|
42302
|
-
* Creates a new feature flag.
|
|
42303
|
-
*/
|
|
42304
|
-
async createFlag(data) {
|
|
42305
|
-
const flag = await this.provider.createFlag(data);
|
|
42306
|
-
this.logger.info("Feature flag created", { key: data.key });
|
|
42307
|
-
return flag;
|
|
42308
|
-
}
|
|
42309
|
-
/**
|
|
42310
|
-
* Updates an existing feature flag.
|
|
42311
|
-
*/
|
|
42312
|
-
async updateFlag(key, data) {
|
|
42313
|
-
const flag = await this.provider.updateFlag(key, data);
|
|
42314
|
-
this.logger.info("Feature flag updated", { key });
|
|
42315
|
-
return flag;
|
|
42316
|
-
}
|
|
42317
|
-
/**
|
|
42318
|
-
* Deletes a feature flag.
|
|
42319
|
-
*/
|
|
42320
|
-
async deleteFlag(key) {
|
|
42321
|
-
await this.provider.deleteFlag(key);
|
|
42322
|
-
this.logger.info("Feature flag deleted", { key });
|
|
42323
|
-
}
|
|
42324
|
-
/**
|
|
42325
|
-
* Gets all rules for a specific flag.
|
|
42326
|
-
*/
|
|
42327
|
-
async getRules(key) {
|
|
42328
|
-
return this.provider.getRules(key);
|
|
42329
|
-
}
|
|
42330
|
-
/**
|
|
42331
|
-
* Gets all enabled rules.
|
|
42332
|
-
*/
|
|
42333
|
-
async getAllRules() {
|
|
42334
|
-
return this.provider.getAllRules();
|
|
42335
|
-
}
|
|
42336
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42337
|
-
// Override Operations
|
|
42338
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42339
|
-
/**
|
|
42340
|
-
* Sets a runtime override for a flag.
|
|
42341
|
-
*/
|
|
42342
|
-
setOverride(key, value) {
|
|
42343
|
-
this.provider.setOverride(key, value);
|
|
42344
|
-
this.logger.debug("Override set", { key, value });
|
|
42345
|
-
}
|
|
42346
|
-
/**
|
|
42347
|
-
* Removes a runtime override for a flag.
|
|
42348
|
-
*/
|
|
42349
|
-
removeOverride(key) {
|
|
42350
|
-
this.provider.removeOverride(key);
|
|
42351
|
-
this.logger.debug("Override removed", { key });
|
|
42352
|
-
}
|
|
42353
|
-
/**
|
|
42354
|
-
* Clears all runtime overrides.
|
|
42355
|
-
*/
|
|
42356
|
-
clearOverrides() {
|
|
42357
|
-
this.provider.clearOverrides();
|
|
42358
|
-
this.logger.debug("All overrides cleared");
|
|
42359
|
-
}
|
|
42360
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42361
|
-
// Subscription
|
|
42362
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42363
|
-
/**
|
|
42364
|
-
* Subscribes to flag changes.
|
|
42365
|
-
*/
|
|
42366
|
-
subscribe(callback) {
|
|
42367
|
-
return this.provider.subscribe(callback);
|
|
42368
|
-
}
|
|
42369
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42370
|
-
// Provider Access (for advanced use cases)
|
|
42371
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
42372
|
-
/**
|
|
42373
|
-
* Gets the underlying provider instance.
|
|
42374
|
-
* Use with caution - prefer service methods.
|
|
42375
|
-
*/
|
|
42376
|
-
getProvider() {
|
|
42377
|
-
return this.provider;
|
|
42378
|
-
}
|
|
42379
|
-
};
|
|
42209
|
+
// src/init/index.ts
|
|
42210
|
+
init_CoreInitializer();
|
|
42211
|
+
init_ServiceRegistry();
|
|
42212
|
+
init_ApiClientService();
|
|
42213
|
+
|
|
42214
|
+
// src/entry-backend.ts
|
|
42215
|
+
init_BaseDomainService();
|
|
42216
|
+
init_BaseBackendDomainService();
|
|
42217
|
+
init_BaseMapper();
|
|
42218
|
+
init_BaseValidator();
|
|
42219
|
+
init_mapperUtils();
|
|
42220
|
+
init_BackendExampleDomainService();
|
|
42380
42221
|
|
|
42381
42222
|
// src/engine/featureFlags/engine.ts
|
|
42382
42223
|
init_common();
|
|
@@ -43187,152 +43028,753 @@ var FeatureFlagEngine = class {
|
|
|
43187
43028
|
}
|
|
43188
43029
|
};
|
|
43189
43030
|
|
|
43190
|
-
// src/
|
|
43031
|
+
// src/base/index.ts
|
|
43191
43032
|
init_cache();
|
|
43192
|
-
|
|
43193
|
-
|
|
43194
|
-
|
|
43195
|
-
|
|
43196
|
-
|
|
43197
|
-
|
|
43198
|
-
|
|
43199
|
-
|
|
43200
|
-
|
|
43201
|
-
|
|
43202
|
-
|
|
43203
|
-
|
|
43204
|
-
|
|
43205
|
-
|
|
43206
|
-
|
|
43207
|
-
|
|
43208
|
-
|
|
43209
|
-
|
|
43033
|
+
|
|
43034
|
+
// src/utils/index.ts
|
|
43035
|
+
init_common();
|
|
43036
|
+
init_runtime();
|
|
43037
|
+
|
|
43038
|
+
// src/services/index.ts
|
|
43039
|
+
init_ApiClientService();
|
|
43040
|
+
init_DbService();
|
|
43041
|
+
var cachedVersion = "";
|
|
43042
|
+
function getPackageVersion() {
|
|
43043
|
+
if (cachedVersion) return cachedVersion;
|
|
43044
|
+
try {
|
|
43045
|
+
const require2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('entry-backend.js', document.baseURI).href)));
|
|
43046
|
+
const pkg = require2("../package.json");
|
|
43047
|
+
cachedVersion = pkg.version ?? "0.0.0";
|
|
43048
|
+
} catch {
|
|
43049
|
+
try {
|
|
43050
|
+
const currentFile = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('entry-backend.js', document.baseURI).href)));
|
|
43051
|
+
const currentDir = path.dirname(currentFile);
|
|
43052
|
+
const pkgPath = path.join(currentDir, "..", "package.json");
|
|
43053
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
43054
|
+
cachedVersion = pkg.version ?? "0.0.0";
|
|
43055
|
+
} catch {
|
|
43056
|
+
cachedVersion = "0.0.0";
|
|
43057
|
+
}
|
|
43058
|
+
}
|
|
43059
|
+
return cachedVersion;
|
|
43060
|
+
}
|
|
43061
|
+
__name(getPackageVersion, "getPackageVersion");
|
|
43062
|
+
var VERSION = getPackageVersion();
|
|
43063
|
+
var PACKAGE_NAME = "@plyaz/core";
|
|
43064
|
+
|
|
43065
|
+
// src/config/index.ts
|
|
43066
|
+
init_dependencies();
|
|
43067
|
+
|
|
43068
|
+
// src/entry-backend.ts
|
|
43069
|
+
init_events();
|
|
43070
|
+
init_DbService();
|
|
43071
|
+
|
|
43072
|
+
// src/backend/example/example.module.ts
|
|
43073
|
+
var import_common9 = __toESM(require_common(), 1);
|
|
43074
|
+
|
|
43075
|
+
// src/backend/example/example.controller.ts
|
|
43076
|
+
var import_common8 = __toESM(require_common(), 1);
|
|
43077
|
+
var BACKEND_EXAMPLE_DOMAIN_SERVICE = "BACKEND_EXAMPLE_DOMAIN_SERVICE";
|
|
43078
|
+
exports.ExampleController = class ExampleController {
|
|
43079
|
+
constructor(exampleService) {
|
|
43080
|
+
this.exampleService = exampleService;
|
|
43081
|
+
}
|
|
43082
|
+
health() {
|
|
43083
|
+
return errors.SuccessResponseStandard("Service is healthy", {
|
|
43084
|
+
service: this.exampleService.isAvailable(),
|
|
43085
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
43210
43086
|
});
|
|
43211
|
-
this.setupRefreshTimer();
|
|
43212
43087
|
}
|
|
43088
|
+
async getEntity(id) {
|
|
43089
|
+
const entity = await this.exampleService.getById(id);
|
|
43090
|
+
return errors.SuccessResponseStandard("Entity retrieved successfully", entity);
|
|
43091
|
+
}
|
|
43092
|
+
async createEntity(dto) {
|
|
43093
|
+
const entity = await this.exampleService.create(dto);
|
|
43094
|
+
return errors.SuccessResponseStandard("Entity created successfully", entity, types.HTTP_STATUS.CREATED);
|
|
43095
|
+
}
|
|
43096
|
+
async updateEntity(id, dto) {
|
|
43097
|
+
const entity = await this.exampleService.patch(id, dto);
|
|
43098
|
+
return errors.SuccessResponseStandard("Entity updated successfully", entity);
|
|
43099
|
+
}
|
|
43100
|
+
async deleteEntity(id) {
|
|
43101
|
+
await this.exampleService.delete(id);
|
|
43102
|
+
return errors.SuccessResponseStandard("Entity deleted successfully", null);
|
|
43103
|
+
}
|
|
43104
|
+
async createEntityWithValidation(dto) {
|
|
43105
|
+
const entity = await this.exampleService.create(dto);
|
|
43106
|
+
return errors.SuccessResponseStandard("Entity created successfully", entity, types.HTTP_STATUS.CREATED);
|
|
43107
|
+
}
|
|
43108
|
+
async demoSingleError() {
|
|
43109
|
+
return await this.exampleService.demoSingleValidationError();
|
|
43110
|
+
}
|
|
43111
|
+
async demoArrayErrors() {
|
|
43112
|
+
return await this.exampleService.demoMultipleValidationErrors();
|
|
43113
|
+
}
|
|
43114
|
+
};
|
|
43115
|
+
__name(exports.ExampleController, "ExampleController");
|
|
43116
|
+
__decorateClass([
|
|
43117
|
+
(0, import_common8.Get)("health")
|
|
43118
|
+
], exports.ExampleController.prototype, "health", 1);
|
|
43119
|
+
__decorateClass([
|
|
43120
|
+
(0, import_common8.Get)("entities/:id"),
|
|
43121
|
+
__decorateParam(0, (0, import_common8.Param)("id"))
|
|
43122
|
+
], exports.ExampleController.prototype, "getEntity", 1);
|
|
43123
|
+
__decorateClass([
|
|
43124
|
+
(0, import_common8.Post)("entities"),
|
|
43125
|
+
(0, import_common8.HttpCode)(import_common8.HttpStatus.CREATED),
|
|
43126
|
+
__decorateParam(0, (0, import_common8.Body)())
|
|
43127
|
+
], exports.ExampleController.prototype, "createEntity", 1);
|
|
43128
|
+
__decorateClass([
|
|
43129
|
+
(0, import_common8.Patch)("entities/:id"),
|
|
43130
|
+
__decorateParam(0, (0, import_common8.Param)("id")),
|
|
43131
|
+
__decorateParam(1, (0, import_common8.Body)())
|
|
43132
|
+
], exports.ExampleController.prototype, "updateEntity", 1);
|
|
43133
|
+
__decorateClass([
|
|
43134
|
+
(0, import_common8.Delete)("entities/:id"),
|
|
43135
|
+
(0, import_common8.HttpCode)(import_common8.HttpStatus.OK),
|
|
43136
|
+
__decorateParam(0, (0, import_common8.Param)("id"))
|
|
43137
|
+
], exports.ExampleController.prototype, "deleteEntity", 1);
|
|
43138
|
+
__decorateClass([
|
|
43139
|
+
(0, import_common8.Post)("entities/validated"),
|
|
43140
|
+
(0, import_common8.HttpCode)(import_common8.HttpStatus.CREATED),
|
|
43141
|
+
__decorateParam(0, (0, import_common8.Body)())
|
|
43142
|
+
], exports.ExampleController.prototype, "createEntityWithValidation", 1);
|
|
43143
|
+
__decorateClass([
|
|
43144
|
+
(0, import_common8.Get)("errors/single")
|
|
43145
|
+
], exports.ExampleController.prototype, "demoSingleError", 1);
|
|
43146
|
+
__decorateClass([
|
|
43147
|
+
(0, import_common8.Get)("errors/array")
|
|
43148
|
+
], exports.ExampleController.prototype, "demoArrayErrors", 1);
|
|
43149
|
+
exports.ExampleController = __decorateClass([
|
|
43150
|
+
(0, import_common8.Controller)("example"),
|
|
43151
|
+
__decorateParam(0, (0, import_common8.Inject)(BACKEND_EXAMPLE_DOMAIN_SERVICE))
|
|
43152
|
+
], exports.ExampleController);
|
|
43153
|
+
|
|
43154
|
+
// src/domain/example/index.ts
|
|
43155
|
+
init_BackendExampleDomainService();
|
|
43156
|
+
init_FrontendExampleDomainService();
|
|
43157
|
+
init_ExampleMapper();
|
|
43158
|
+
init_ExampleValidator();
|
|
43159
|
+
|
|
43160
|
+
// src/backend/example/example.module.ts
|
|
43161
|
+
exports.ExampleModule = class ExampleModule {
|
|
43162
|
+
};
|
|
43163
|
+
__name(exports.ExampleModule, "ExampleModule");
|
|
43164
|
+
exports.ExampleModule = __decorateClass([
|
|
43165
|
+
(0, import_common9.Module)({
|
|
43166
|
+
controllers: [exports.ExampleController],
|
|
43167
|
+
providers: [
|
|
43168
|
+
// Provide BackendExampleDomainService via factory using the singleton instance
|
|
43169
|
+
// This ensures the service is shared across the application
|
|
43170
|
+
{
|
|
43171
|
+
provide: BACKEND_EXAMPLE_DOMAIN_SERVICE,
|
|
43172
|
+
useFactory: /* @__PURE__ */ __name(() => exports.exampleService, "useFactory")
|
|
43173
|
+
}
|
|
43174
|
+
],
|
|
43175
|
+
exports: [BACKEND_EXAMPLE_DOMAIN_SERVICE]
|
|
43176
|
+
})
|
|
43177
|
+
], exports.ExampleModule);
|
|
43178
|
+
|
|
43179
|
+
// src/backend/featureFlags/FeatureFlagDomainService.ts
|
|
43180
|
+
init_base();
|
|
43181
|
+
init_CoreEventManager();
|
|
43182
|
+
var FeatureFlagDomainService = class extends exports.BaseDomainService {
|
|
43213
43183
|
static {
|
|
43214
|
-
__name(this, "
|
|
43184
|
+
__name(this, "FeatureFlagDomainService");
|
|
43185
|
+
}
|
|
43186
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43187
|
+
// Constructor
|
|
43188
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43189
|
+
constructor(config) {
|
|
43190
|
+
const serviceConfig = {
|
|
43191
|
+
enabled: true,
|
|
43192
|
+
defaults: {},
|
|
43193
|
+
...config
|
|
43194
|
+
};
|
|
43195
|
+
super({
|
|
43196
|
+
serviceName: "FeatureFlagDomainService",
|
|
43197
|
+
supportedRuntimes: ["backend"],
|
|
43198
|
+
serviceConfig
|
|
43199
|
+
// No API client for backend - uses provider directly
|
|
43200
|
+
});
|
|
43201
|
+
this.provider = config.provider;
|
|
43202
|
+
this._initialized = true;
|
|
43203
|
+
this.logInfo("Service initialized with provider");
|
|
43204
|
+
exports.CoreEventManager.emit("featureFlag:backend:provider:initialized", { providerType: "unknown" });
|
|
43215
43205
|
}
|
|
43206
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43207
|
+
// Abstract Implementations
|
|
43208
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43216
43209
|
/**
|
|
43217
|
-
*
|
|
43218
|
-
*
|
|
43219
|
-
* @returns Promise that resolves when initialization is complete
|
|
43210
|
+
* Check if service is available
|
|
43220
43211
|
*/
|
|
43221
|
-
|
|
43222
|
-
|
|
43223
|
-
return;
|
|
43224
|
-
}
|
|
43225
|
-
if (this.initializePromise) {
|
|
43226
|
-
return this.initializePromise;
|
|
43227
|
-
}
|
|
43228
|
-
this.initializePromise = this.doInitialize();
|
|
43229
|
-
return this.initializePromise;
|
|
43212
|
+
isAvailable() {
|
|
43213
|
+
return this.isServiceEnabled && this.provider !== null;
|
|
43230
43214
|
}
|
|
43231
43215
|
/**
|
|
43232
|
-
*
|
|
43233
|
-
*
|
|
43234
|
-
* @private
|
|
43235
|
-
* @returns Promise that resolves when initialization is complete
|
|
43216
|
+
* Dispose/cleanup the service
|
|
43236
43217
|
*/
|
|
43237
|
-
|
|
43238
|
-
|
|
43239
|
-
|
|
43240
|
-
|
|
43241
|
-
this.log("Provider initialized successfully");
|
|
43242
|
-
} catch (error) {
|
|
43243
|
-
this.log("Failed to initialize provider:", error);
|
|
43244
|
-
this.initializePromise = void 0;
|
|
43245
|
-
throw error;
|
|
43218
|
+
dispose() {
|
|
43219
|
+
if (this.provider) {
|
|
43220
|
+
this.provider.dispose();
|
|
43221
|
+
exports.CoreEventManager.emit("featureFlag:backend:provider:disposed", {});
|
|
43246
43222
|
}
|
|
43223
|
+
this.logInfo("Service disposed");
|
|
43247
43224
|
}
|
|
43225
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43226
|
+
// Provider Operations
|
|
43227
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43248
43228
|
/**
|
|
43249
|
-
*
|
|
43229
|
+
* Refresh the provider cache
|
|
43230
|
+
*/
|
|
43231
|
+
async refresh() {
|
|
43232
|
+
this.assertReady();
|
|
43233
|
+
await this.provider.refresh();
|
|
43234
|
+
exports.CoreEventManager.emit("featureFlag:backend:provider:refreshed", {});
|
|
43235
|
+
this.logDebug("Provider cache refreshed");
|
|
43236
|
+
}
|
|
43237
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43238
|
+
// Evaluation Operations
|
|
43239
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43240
|
+
/**
|
|
43241
|
+
* Evaluate a single feature flag
|
|
43250
43242
|
*
|
|
43251
|
-
* @param key -
|
|
43252
|
-
* @param context -
|
|
43253
|
-
* @returns
|
|
43243
|
+
* @param key - Feature flag key
|
|
43244
|
+
* @param context - Evaluation context (user, environment, etc.)
|
|
43245
|
+
* @returns Full evaluation result
|
|
43254
43246
|
*/
|
|
43255
|
-
async
|
|
43256
|
-
|
|
43257
|
-
|
|
43258
|
-
}
|
|
43259
|
-
|
|
43260
|
-
const
|
|
43261
|
-
|
|
43262
|
-
|
|
43263
|
-
|
|
43264
|
-
}
|
|
43265
|
-
|
|
43266
|
-
await this.cacheManager.set(cacheKey, evaluation);
|
|
43267
|
-
return evaluation;
|
|
43247
|
+
async evaluate(key, context) {
|
|
43248
|
+
this.assertReady();
|
|
43249
|
+
const evalContext = context ?? this.config.defaultContext;
|
|
43250
|
+
exports.CoreEventManager.emit("featureFlag:backend:evaluating", { key, context: evalContext });
|
|
43251
|
+
try {
|
|
43252
|
+
const result2 = await this.provider.getFlag(key, evalContext);
|
|
43253
|
+
exports.CoreEventManager.emit("featureFlag:backend:evaluated", { key, result: result2 });
|
|
43254
|
+
return result2;
|
|
43255
|
+
} catch (error) {
|
|
43256
|
+
exports.CoreEventManager.emit("featureFlag:backend:evaluate:error", { key, error });
|
|
43257
|
+
throw error;
|
|
43268
43258
|
}
|
|
43269
|
-
return this.engine.evaluate(key, context);
|
|
43270
43259
|
}
|
|
43271
43260
|
/**
|
|
43272
|
-
*
|
|
43261
|
+
* Check if a feature flag is enabled
|
|
43273
43262
|
*
|
|
43274
|
-
* @param key -
|
|
43275
|
-
* @param context -
|
|
43276
|
-
* @returns
|
|
43263
|
+
* @param key - Feature flag key
|
|
43264
|
+
* @param context - Evaluation context
|
|
43265
|
+
* @returns Boolean indicating if flag is enabled
|
|
43277
43266
|
*/
|
|
43278
43267
|
async isEnabled(key, context) {
|
|
43279
|
-
|
|
43280
|
-
|
|
43268
|
+
this.assertReady();
|
|
43269
|
+
const evalContext = context ?? this.config.defaultContext;
|
|
43270
|
+
return this.provider.isEnabled(key, evalContext);
|
|
43281
43271
|
}
|
|
43282
43272
|
/**
|
|
43283
|
-
*
|
|
43273
|
+
* Get the value of a feature flag
|
|
43284
43274
|
*
|
|
43285
|
-
* @
|
|
43286
|
-
* @param
|
|
43287
|
-
* @
|
|
43288
|
-
* @returns Promise resolving to the flag value
|
|
43275
|
+
* @param key - Feature flag key
|
|
43276
|
+
* @param context - Evaluation context
|
|
43277
|
+
* @returns The flag value
|
|
43289
43278
|
*/
|
|
43290
43279
|
async getValue(key, context) {
|
|
43291
|
-
|
|
43292
|
-
|
|
43280
|
+
this.assertReady();
|
|
43281
|
+
const evalContext = context ?? this.config.defaultContext;
|
|
43282
|
+
return this.provider.getValue(key, evalContext);
|
|
43293
43283
|
}
|
|
43294
43284
|
/**
|
|
43295
|
-
*
|
|
43285
|
+
* Evaluate all feature flags for a context
|
|
43296
43286
|
*
|
|
43297
|
-
* @param context -
|
|
43298
|
-
* @returns
|
|
43287
|
+
* @param context - Evaluation context
|
|
43288
|
+
* @returns Record of all flag evaluations
|
|
43299
43289
|
*/
|
|
43300
|
-
async
|
|
43301
|
-
|
|
43302
|
-
|
|
43303
|
-
|
|
43304
|
-
|
|
43305
|
-
|
|
43306
|
-
|
|
43307
|
-
|
|
43308
|
-
|
|
43309
|
-
for (const flag of engineFlags) {
|
|
43310
|
-
if (!(flag.key in results)) {
|
|
43311
|
-
results[flag.key] = await this.getFlag(flag.key, context);
|
|
43312
|
-
}
|
|
43290
|
+
async evaluateAll(context) {
|
|
43291
|
+
this.assertReady();
|
|
43292
|
+
const evalContext = context ?? this.config.defaultContext;
|
|
43293
|
+
try {
|
|
43294
|
+
const result2 = await this.provider.getAllFlags(evalContext);
|
|
43295
|
+
return result2;
|
|
43296
|
+
} catch (error) {
|
|
43297
|
+
this.logError("Failed to evaluate all flags", { error });
|
|
43298
|
+
throw error;
|
|
43313
43299
|
}
|
|
43314
|
-
return results;
|
|
43315
43300
|
}
|
|
43301
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43302
|
+
// CRUD Operations
|
|
43303
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43316
43304
|
/**
|
|
43317
|
-
*
|
|
43305
|
+
* Create a new feature flag
|
|
43318
43306
|
*
|
|
43319
|
-
* @
|
|
43307
|
+
* @param data - Flag creation data
|
|
43308
|
+
* @returns The created feature flag
|
|
43320
43309
|
*/
|
|
43321
|
-
async
|
|
43310
|
+
async create(data) {
|
|
43311
|
+
this.assertReady();
|
|
43312
|
+
exports.CoreEventManager.emit("featureFlag:backend:creating", { data });
|
|
43322
43313
|
try {
|
|
43323
|
-
const
|
|
43324
|
-
|
|
43325
|
-
this.
|
|
43326
|
-
|
|
43327
|
-
this.notifySubscribers();
|
|
43328
|
-
this.log(`Refreshed with ${flags.length} flags and ${rules.length} rules`);
|
|
43314
|
+
const flag = await this.provider.createFlag(data);
|
|
43315
|
+
exports.CoreEventManager.emit("featureFlag:backend:created", { flag });
|
|
43316
|
+
this.logInfo("Feature flag created", { key: data.key });
|
|
43317
|
+
return flag;
|
|
43329
43318
|
} catch (error) {
|
|
43330
|
-
|
|
43319
|
+
exports.CoreEventManager.emit("featureFlag:backend:create:error", { error, data });
|
|
43331
43320
|
throw error;
|
|
43332
43321
|
}
|
|
43333
43322
|
}
|
|
43334
43323
|
/**
|
|
43335
|
-
*
|
|
43324
|
+
* Update an existing feature flag
|
|
43325
|
+
*
|
|
43326
|
+
* @param key - Flag key to update
|
|
43327
|
+
* @param data - Partial update data
|
|
43328
|
+
* @returns The updated feature flag
|
|
43329
|
+
*/
|
|
43330
|
+
async update(key, data) {
|
|
43331
|
+
this.assertReady();
|
|
43332
|
+
exports.CoreEventManager.emit("featureFlag:backend:updating", { key, data });
|
|
43333
|
+
try {
|
|
43334
|
+
const flag = await this.provider.updateFlag(key, data);
|
|
43335
|
+
exports.CoreEventManager.emit("featureFlag:backend:updated", { flag });
|
|
43336
|
+
this.logInfo("Feature flag updated", { key });
|
|
43337
|
+
return flag;
|
|
43338
|
+
} catch (error) {
|
|
43339
|
+
exports.CoreEventManager.emit("featureFlag:backend:update:error", { error, key });
|
|
43340
|
+
throw error;
|
|
43341
|
+
}
|
|
43342
|
+
}
|
|
43343
|
+
/**
|
|
43344
|
+
* Delete a feature flag
|
|
43345
|
+
*
|
|
43346
|
+
* @param key - Flag key to delete
|
|
43347
|
+
*/
|
|
43348
|
+
async delete(key) {
|
|
43349
|
+
this.assertReady();
|
|
43350
|
+
exports.CoreEventManager.emit("featureFlag:backend:deleting", { key });
|
|
43351
|
+
try {
|
|
43352
|
+
await this.provider.deleteFlag(key);
|
|
43353
|
+
exports.CoreEventManager.emit("featureFlag:backend:deleted", { key });
|
|
43354
|
+
this.logInfo("Feature flag deleted", { key });
|
|
43355
|
+
} catch (error) {
|
|
43356
|
+
exports.CoreEventManager.emit("featureFlag:backend:delete:error", { error, key });
|
|
43357
|
+
throw error;
|
|
43358
|
+
}
|
|
43359
|
+
}
|
|
43360
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43361
|
+
// Rules Operations
|
|
43362
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43363
|
+
/**
|
|
43364
|
+
* Get rules for a specific flag
|
|
43365
|
+
*
|
|
43366
|
+
* @param key - Flag key
|
|
43367
|
+
* @returns Array of rules
|
|
43368
|
+
*/
|
|
43369
|
+
async getRules(key) {
|
|
43370
|
+
this.assertReady();
|
|
43371
|
+
try {
|
|
43372
|
+
const rules = await this.provider.getRules(key);
|
|
43373
|
+
return rules;
|
|
43374
|
+
} catch (error) {
|
|
43375
|
+
this.logError("Failed to get rules", { key, error });
|
|
43376
|
+
throw error;
|
|
43377
|
+
}
|
|
43378
|
+
}
|
|
43379
|
+
/**
|
|
43380
|
+
* Get all rules
|
|
43381
|
+
*
|
|
43382
|
+
* @returns Array of all rules
|
|
43383
|
+
*/
|
|
43384
|
+
async getAllRules() {
|
|
43385
|
+
this.assertReady();
|
|
43386
|
+
try {
|
|
43387
|
+
const rules = await this.provider.getAllRules();
|
|
43388
|
+
return rules;
|
|
43389
|
+
} catch (error) {
|
|
43390
|
+
this.logError("Failed to get all rules", { error });
|
|
43391
|
+
throw error;
|
|
43392
|
+
}
|
|
43393
|
+
}
|
|
43394
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43395
|
+
// Override Operations (Runtime Overrides)
|
|
43396
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43397
|
+
/**
|
|
43398
|
+
* Set a runtime override for a flag (in-memory, not persisted)
|
|
43399
|
+
*
|
|
43400
|
+
* @param key - Flag key
|
|
43401
|
+
* @param value - Override value
|
|
43402
|
+
*/
|
|
43403
|
+
setOverride(key, value) {
|
|
43404
|
+
this.assertReady();
|
|
43405
|
+
exports.CoreEventManager.emit("featureFlag:backend:override:setting", { key, value });
|
|
43406
|
+
this.provider.setOverride(key, value);
|
|
43407
|
+
exports.CoreEventManager.emit("featureFlag:backend:override:set", { key, value });
|
|
43408
|
+
this.logDebug("Override set", { key, value });
|
|
43409
|
+
}
|
|
43410
|
+
/**
|
|
43411
|
+
* Remove a runtime override for a flag
|
|
43412
|
+
*
|
|
43413
|
+
* @param key - Flag key
|
|
43414
|
+
*/
|
|
43415
|
+
removeOverride(key) {
|
|
43416
|
+
this.assertReady();
|
|
43417
|
+
exports.CoreEventManager.emit("featureFlag:backend:override:removing", { key });
|
|
43418
|
+
this.provider.removeOverride(key);
|
|
43419
|
+
exports.CoreEventManager.emit("featureFlag:backend:override:removed", { key });
|
|
43420
|
+
this.logDebug("Override removed", { key });
|
|
43421
|
+
}
|
|
43422
|
+
/**
|
|
43423
|
+
* Clear all runtime overrides
|
|
43424
|
+
*/
|
|
43425
|
+
clearOverrides() {
|
|
43426
|
+
this.assertReady();
|
|
43427
|
+
this.provider.clearOverrides();
|
|
43428
|
+
this.logDebug("All overrides cleared");
|
|
43429
|
+
}
|
|
43430
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43431
|
+
// Subscription
|
|
43432
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43433
|
+
/**
|
|
43434
|
+
* Subscribe to provider changes
|
|
43435
|
+
*
|
|
43436
|
+
* @param callback - Callback when flags change
|
|
43437
|
+
* @returns Unsubscribe function
|
|
43438
|
+
*/
|
|
43439
|
+
subscribe(callback) {
|
|
43440
|
+
this.assertReady();
|
|
43441
|
+
return this.provider.subscribe(callback);
|
|
43442
|
+
}
|
|
43443
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43444
|
+
// Event Subscription
|
|
43445
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43446
|
+
/**
|
|
43447
|
+
* Subscribe to feature flag events
|
|
43448
|
+
*
|
|
43449
|
+
* @param event - Event type to subscribe to
|
|
43450
|
+
* @param handler - Event handler
|
|
43451
|
+
* @returns Unsubscribe function
|
|
43452
|
+
*/
|
|
43453
|
+
on(event, handler) {
|
|
43454
|
+
return exports.CoreEventManager.on(event, handler);
|
|
43455
|
+
}
|
|
43456
|
+
};
|
|
43457
|
+
|
|
43458
|
+
// src/backend/featureFlags/feature-flag.module.ts
|
|
43459
|
+
var import_common12 = __toESM(require_common(), 1);
|
|
43460
|
+
|
|
43461
|
+
// src/backend/featureFlags/feature-flag.controller.ts
|
|
43462
|
+
var import_common11 = __toESM(require_common(), 1);
|
|
43463
|
+
var FeatureFlagService = class {
|
|
43464
|
+
constructor(provider, config) {
|
|
43465
|
+
this.provider = provider;
|
|
43466
|
+
this.config = config;
|
|
43467
|
+
this.logger = new logger$1.PackageLogger({
|
|
43468
|
+
packageName: "core",
|
|
43469
|
+
service: "FeatureFlagService"
|
|
43470
|
+
});
|
|
43471
|
+
this.isInitialized = false;
|
|
43472
|
+
}
|
|
43473
|
+
static {
|
|
43474
|
+
__name(this, "FeatureFlagService");
|
|
43475
|
+
}
|
|
43476
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43477
|
+
// Lifecycle
|
|
43478
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43479
|
+
/**
|
|
43480
|
+
* Initializes the service and underlying provider.
|
|
43481
|
+
*/
|
|
43482
|
+
async initialize() {
|
|
43483
|
+
if (this.isInitialized) {
|
|
43484
|
+
return;
|
|
43485
|
+
}
|
|
43486
|
+
try {
|
|
43487
|
+
await this.provider.initialize();
|
|
43488
|
+
this.isInitialized = true;
|
|
43489
|
+
this.logger.info(`Feature flag service initialized with ${this.config.provider} provider`);
|
|
43490
|
+
} catch (error) {
|
|
43491
|
+
this.logger.error("Failed to initialize feature flag service", { error });
|
|
43492
|
+
throw error;
|
|
43493
|
+
}
|
|
43494
|
+
}
|
|
43495
|
+
/**
|
|
43496
|
+
* Disposes the service and underlying provider.
|
|
43497
|
+
*/
|
|
43498
|
+
dispose() {
|
|
43499
|
+
this.provider.dispose();
|
|
43500
|
+
this.isInitialized = false;
|
|
43501
|
+
this.logger.info("Feature flag service disposed");
|
|
43502
|
+
}
|
|
43503
|
+
/**
|
|
43504
|
+
* Refreshes the provider cache.
|
|
43505
|
+
*/
|
|
43506
|
+
async refresh() {
|
|
43507
|
+
await this.provider.refresh();
|
|
43508
|
+
this.logger.debug("Feature flag cache refreshed");
|
|
43509
|
+
}
|
|
43510
|
+
/**
|
|
43511
|
+
* Gets whether the service is initialized.
|
|
43512
|
+
*/
|
|
43513
|
+
getIsInitialized() {
|
|
43514
|
+
return this.isInitialized;
|
|
43515
|
+
}
|
|
43516
|
+
/**
|
|
43517
|
+
* Gets the provider type.
|
|
43518
|
+
*/
|
|
43519
|
+
getProviderType() {
|
|
43520
|
+
return this.config.provider;
|
|
43521
|
+
}
|
|
43522
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43523
|
+
// Read Operations
|
|
43524
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43525
|
+
/**
|
|
43526
|
+
* Evaluates a feature flag.
|
|
43527
|
+
*/
|
|
43528
|
+
async getFlag(key, context) {
|
|
43529
|
+
return this.provider.getFlag(key, context);
|
|
43530
|
+
}
|
|
43531
|
+
/**
|
|
43532
|
+
* Gets all feature flag evaluations.
|
|
43533
|
+
*/
|
|
43534
|
+
async getAllFlags(context) {
|
|
43535
|
+
return this.provider.getAllFlags(context);
|
|
43536
|
+
}
|
|
43537
|
+
/**
|
|
43538
|
+
* Checks if a feature flag is enabled.
|
|
43539
|
+
*/
|
|
43540
|
+
async isEnabled(key, context) {
|
|
43541
|
+
return this.provider.isEnabled(key, context);
|
|
43542
|
+
}
|
|
43543
|
+
/**
|
|
43544
|
+
* Gets the value of a feature flag.
|
|
43545
|
+
*/
|
|
43546
|
+
async getValue(key, context) {
|
|
43547
|
+
return this.provider.getValue(key, context);
|
|
43548
|
+
}
|
|
43549
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43550
|
+
// Flag Management
|
|
43551
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43552
|
+
/**
|
|
43553
|
+
* Creates a new feature flag.
|
|
43554
|
+
*/
|
|
43555
|
+
async createFlag(data) {
|
|
43556
|
+
const flag = await this.provider.createFlag(data);
|
|
43557
|
+
this.logger.info("Feature flag created", { key: data.key });
|
|
43558
|
+
return flag;
|
|
43559
|
+
}
|
|
43560
|
+
/**
|
|
43561
|
+
* Updates an existing feature flag.
|
|
43562
|
+
*/
|
|
43563
|
+
async updateFlag(key, data) {
|
|
43564
|
+
const flag = await this.provider.updateFlag(key, data);
|
|
43565
|
+
this.logger.info("Feature flag updated", { key });
|
|
43566
|
+
return flag;
|
|
43567
|
+
}
|
|
43568
|
+
/**
|
|
43569
|
+
* Deletes a feature flag.
|
|
43570
|
+
*/
|
|
43571
|
+
async deleteFlag(key) {
|
|
43572
|
+
await this.provider.deleteFlag(key);
|
|
43573
|
+
this.logger.info("Feature flag deleted", { key });
|
|
43574
|
+
}
|
|
43575
|
+
/**
|
|
43576
|
+
* Gets all rules for a specific flag.
|
|
43577
|
+
*/
|
|
43578
|
+
async getRules(key) {
|
|
43579
|
+
return this.provider.getRules(key);
|
|
43580
|
+
}
|
|
43581
|
+
/**
|
|
43582
|
+
* Gets all enabled rules.
|
|
43583
|
+
*/
|
|
43584
|
+
async getAllRules() {
|
|
43585
|
+
return this.provider.getAllRules();
|
|
43586
|
+
}
|
|
43587
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43588
|
+
// Override Operations
|
|
43589
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43590
|
+
/**
|
|
43591
|
+
* Sets a runtime override for a flag.
|
|
43592
|
+
*/
|
|
43593
|
+
setOverride(key, value) {
|
|
43594
|
+
this.provider.setOverride(key, value);
|
|
43595
|
+
this.logger.debug("Override set", { key, value });
|
|
43596
|
+
}
|
|
43597
|
+
/**
|
|
43598
|
+
* Removes a runtime override for a flag.
|
|
43599
|
+
*/
|
|
43600
|
+
removeOverride(key) {
|
|
43601
|
+
this.provider.removeOverride(key);
|
|
43602
|
+
this.logger.debug("Override removed", { key });
|
|
43603
|
+
}
|
|
43604
|
+
/**
|
|
43605
|
+
* Clears all runtime overrides.
|
|
43606
|
+
*/
|
|
43607
|
+
clearOverrides() {
|
|
43608
|
+
this.provider.clearOverrides();
|
|
43609
|
+
this.logger.debug("All overrides cleared");
|
|
43610
|
+
}
|
|
43611
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43612
|
+
// Subscription
|
|
43613
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43614
|
+
/**
|
|
43615
|
+
* Subscribes to flag changes.
|
|
43616
|
+
*/
|
|
43617
|
+
subscribe(callback) {
|
|
43618
|
+
return this.provider.subscribe(callback);
|
|
43619
|
+
}
|
|
43620
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43621
|
+
// Provider Access (for advanced use cases)
|
|
43622
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43623
|
+
/**
|
|
43624
|
+
* Gets the underlying provider instance.
|
|
43625
|
+
* Use with caution - prefer service methods.
|
|
43626
|
+
*/
|
|
43627
|
+
getProvider() {
|
|
43628
|
+
return this.provider;
|
|
43629
|
+
}
|
|
43630
|
+
};
|
|
43631
|
+
|
|
43632
|
+
// src/domain/featureFlags/provider.ts
|
|
43633
|
+
init_cache();
|
|
43634
|
+
var FeatureFlagProvider = class {
|
|
43635
|
+
/**
|
|
43636
|
+
* Creates a new feature flag provider.
|
|
43637
|
+
*
|
|
43638
|
+
* @param config - Provider configuration
|
|
43639
|
+
* @param features - Record of feature flag keys to their default values
|
|
43640
|
+
*/
|
|
43641
|
+
constructor(config, features) {
|
|
43642
|
+
this.config = config;
|
|
43643
|
+
this.subscribers = /* @__PURE__ */ new Set();
|
|
43644
|
+
this.isInitialized = false;
|
|
43645
|
+
this.features = features;
|
|
43646
|
+
this.engine = new FeatureFlagEngine(features, config.isLoggingEnabled ?? false);
|
|
43647
|
+
this.cacheManager = new exports.CacheManager({
|
|
43648
|
+
isEnabled: config.isCacheEnabled,
|
|
43649
|
+
ttl: config.cacheTtl,
|
|
43650
|
+
strategy: "memory"
|
|
43651
|
+
// Default to memory, can be overridden
|
|
43652
|
+
});
|
|
43653
|
+
this.setupRefreshTimer();
|
|
43654
|
+
}
|
|
43655
|
+
static {
|
|
43656
|
+
__name(this, "FeatureFlagProvider");
|
|
43657
|
+
}
|
|
43658
|
+
/**
|
|
43659
|
+
* Initializes the provider by loading initial data.
|
|
43660
|
+
*
|
|
43661
|
+
* @returns Promise that resolves when initialization is complete
|
|
43662
|
+
*/
|
|
43663
|
+
async initialize() {
|
|
43664
|
+
if (this.isInitialized) {
|
|
43665
|
+
return;
|
|
43666
|
+
}
|
|
43667
|
+
if (this.initializePromise) {
|
|
43668
|
+
return this.initializePromise;
|
|
43669
|
+
}
|
|
43670
|
+
this.initializePromise = this.doInitialize();
|
|
43671
|
+
return this.initializePromise;
|
|
43672
|
+
}
|
|
43673
|
+
/**
|
|
43674
|
+
* Performs the actual initialization work.
|
|
43675
|
+
*
|
|
43676
|
+
* @private
|
|
43677
|
+
* @returns Promise that resolves when initialization is complete
|
|
43678
|
+
*/
|
|
43679
|
+
async doInitialize() {
|
|
43680
|
+
try {
|
|
43681
|
+
await this.refresh();
|
|
43682
|
+
this.isInitialized = true;
|
|
43683
|
+
this.log("Provider initialized successfully");
|
|
43684
|
+
} catch (error) {
|
|
43685
|
+
this.log("Failed to initialize provider:", error);
|
|
43686
|
+
this.initializePromise = void 0;
|
|
43687
|
+
throw error;
|
|
43688
|
+
}
|
|
43689
|
+
}
|
|
43690
|
+
/**
|
|
43691
|
+
* Gets a feature flag evaluation for the specified key and context.
|
|
43692
|
+
*
|
|
43693
|
+
* @param key - The feature flag key
|
|
43694
|
+
* @param context - Optional context for evaluation
|
|
43695
|
+
* @returns Promise resolving to the flag evaluation
|
|
43696
|
+
*/
|
|
43697
|
+
async getFlag(key, context) {
|
|
43698
|
+
if (!this.isInitialized) {
|
|
43699
|
+
await this.initialize();
|
|
43700
|
+
}
|
|
43701
|
+
if (this.config.isCacheEnabled) {
|
|
43702
|
+
const cacheKey = this.generateCacheKey(key, context);
|
|
43703
|
+
const cached = await this.cacheManager.get(cacheKey);
|
|
43704
|
+
if (cached) {
|
|
43705
|
+
return cached;
|
|
43706
|
+
}
|
|
43707
|
+
const evaluation = this.engine.evaluate(key, context);
|
|
43708
|
+
await this.cacheManager.set(cacheKey, evaluation);
|
|
43709
|
+
return evaluation;
|
|
43710
|
+
}
|
|
43711
|
+
return this.engine.evaluate(key, context);
|
|
43712
|
+
}
|
|
43713
|
+
/**
|
|
43714
|
+
* Checks if a feature flag is enabled.
|
|
43715
|
+
*
|
|
43716
|
+
* @param key - The feature flag key
|
|
43717
|
+
* @param context - Optional context for evaluation
|
|
43718
|
+
* @returns Promise resolving to boolean indicating if flag is enabled
|
|
43719
|
+
*/
|
|
43720
|
+
async isEnabled(key, context) {
|
|
43721
|
+
const evaluation = await this.getFlag(key, context);
|
|
43722
|
+
return evaluation.isEnabled;
|
|
43723
|
+
}
|
|
43724
|
+
/**
|
|
43725
|
+
* Gets the value of a feature flag.
|
|
43726
|
+
*
|
|
43727
|
+
* @template T - The expected type of the flag value
|
|
43728
|
+
* @param key - The feature flag key
|
|
43729
|
+
* @param context - Optional context for evaluation
|
|
43730
|
+
* @returns Promise resolving to the flag value
|
|
43731
|
+
*/
|
|
43732
|
+
async getValue(key, context) {
|
|
43733
|
+
const evaluation = await this.getFlag(key, context);
|
|
43734
|
+
return evaluation.value;
|
|
43735
|
+
}
|
|
43736
|
+
/**
|
|
43737
|
+
* Gets all feature flag evaluations for the given context.
|
|
43738
|
+
*
|
|
43739
|
+
* @param context - Optional context for evaluation
|
|
43740
|
+
* @returns Promise resolving to record of flag evaluations
|
|
43741
|
+
*/
|
|
43742
|
+
async getAllFlags(context) {
|
|
43743
|
+
if (!this.isInitialized) {
|
|
43744
|
+
await this.initialize();
|
|
43745
|
+
}
|
|
43746
|
+
const results = {};
|
|
43747
|
+
for (const key of Object.keys(this.features)) {
|
|
43748
|
+
results[key] = await this.getFlag(key, context);
|
|
43749
|
+
}
|
|
43750
|
+
const engineFlags = this.engine.getFlags();
|
|
43751
|
+
for (const flag of engineFlags) {
|
|
43752
|
+
if (!(flag.key in results)) {
|
|
43753
|
+
results[flag.key] = await this.getFlag(flag.key, context);
|
|
43754
|
+
}
|
|
43755
|
+
}
|
|
43756
|
+
return results;
|
|
43757
|
+
}
|
|
43758
|
+
/**
|
|
43759
|
+
* Refreshes the provider by fetching latest data from the source.
|
|
43760
|
+
*
|
|
43761
|
+
* @returns Promise that resolves when refresh is complete
|
|
43762
|
+
*/
|
|
43763
|
+
async refresh() {
|
|
43764
|
+
try {
|
|
43765
|
+
const { flags, rules } = await this.fetchData();
|
|
43766
|
+
this.engine.setFlags(flags);
|
|
43767
|
+
this.engine.setRules(rules);
|
|
43768
|
+
await this.cacheManager.clear();
|
|
43769
|
+
this.notifySubscribers();
|
|
43770
|
+
this.log(`Refreshed with ${flags.length} flags and ${rules.length} rules`);
|
|
43771
|
+
} catch (error) {
|
|
43772
|
+
this.log("Failed to refresh provider:", error);
|
|
43773
|
+
throw error;
|
|
43774
|
+
}
|
|
43775
|
+
}
|
|
43776
|
+
/**
|
|
43777
|
+
* Subscribes to provider updates.
|
|
43336
43778
|
*
|
|
43337
43779
|
* @param callback - Function to call when provider updates
|
|
43338
43780
|
* @returns Unsubscribe function
|
|
@@ -45706,7 +46148,7 @@ init_CoreEventManager();
|
|
|
45706
46148
|
init_BaseFrontendDomainService();
|
|
45707
46149
|
var DEFAULT_CACHE_TTL_SECONDS2 = 300;
|
|
45708
46150
|
var DEFAULT_REFRESH_INTERVAL_MS = 6e4;
|
|
45709
|
-
|
|
46151
|
+
(class _FrontendFeatureFlagDomainService extends BaseFrontendDomainService {
|
|
45710
46152
|
constructor(config) {
|
|
45711
46153
|
super({
|
|
45712
46154
|
serviceName: "FeatureFlagDomainService",
|
|
@@ -45724,7 +46166,7 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45724
46166
|
this.provider = config.provider;
|
|
45725
46167
|
this._initialized = true;
|
|
45726
46168
|
this.logInfo("Service initialized", { storeCount: this.connectedStoreCount });
|
|
45727
|
-
CoreEventManager.emit("featureFlag:provider:initialized", { providerType: "api" });
|
|
46169
|
+
exports.CoreEventManager.emit("featureFlag:provider:initialized", { providerType: "api" });
|
|
45728
46170
|
}
|
|
45729
46171
|
static {
|
|
45730
46172
|
__name(this, "FrontendFeatureFlagDomainService");
|
|
@@ -45779,7 +46221,7 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45779
46221
|
}
|
|
45780
46222
|
dispose() {
|
|
45781
46223
|
this.provider?.dispose();
|
|
45782
|
-
CoreEventManager.emit("featureFlag:provider:disposed", {});
|
|
46224
|
+
exports.CoreEventManager.emit("featureFlag:provider:disposed", {});
|
|
45783
46225
|
this.logInfo("Service disposed");
|
|
45784
46226
|
}
|
|
45785
46227
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -45790,7 +46232,7 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45790
46232
|
this.setStoresLoading(true);
|
|
45791
46233
|
try {
|
|
45792
46234
|
await this.provider.refresh();
|
|
45793
|
-
CoreEventManager.emit("featureFlag:provider:refreshed", {});
|
|
46235
|
+
exports.CoreEventManager.emit("featureFlag:provider:refreshed", {});
|
|
45794
46236
|
if (this.hasConnectedStores) {
|
|
45795
46237
|
const evaluations = await this.provider.getAllFlags(this.config.defaultContext);
|
|
45796
46238
|
this.syncToStores(this.toValues(evaluations));
|
|
@@ -45806,16 +46248,16 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45806
46248
|
async evaluate(key, context) {
|
|
45807
46249
|
this.assertReady();
|
|
45808
46250
|
const ctx = context ?? this.config.defaultContext;
|
|
45809
|
-
CoreEventManager.emit("featureFlag:evaluating", { key, context: ctx });
|
|
46251
|
+
exports.CoreEventManager.emit("featureFlag:evaluating", { key, context: ctx });
|
|
45810
46252
|
try {
|
|
45811
46253
|
const result2 = await this.provider.getFlag(key, ctx);
|
|
45812
|
-
CoreEventManager.emit("featureFlag:evaluated", { key, result: result2 });
|
|
46254
|
+
exports.CoreEventManager.emit("featureFlag:evaluated", { key, result: result2 });
|
|
45813
46255
|
if (this.hasConnectedStores) {
|
|
45814
46256
|
this.syncToStores({ [key]: result2.value });
|
|
45815
46257
|
}
|
|
45816
46258
|
return result2;
|
|
45817
46259
|
} catch (error) {
|
|
45818
|
-
CoreEventManager.emit("featureFlag:evaluate:error", { key, error });
|
|
46260
|
+
exports.CoreEventManager.emit("featureFlag:evaluate:error", { key, error });
|
|
45819
46261
|
throw error;
|
|
45820
46262
|
}
|
|
45821
46263
|
}
|
|
@@ -45852,49 +46294,49 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45852
46294
|
// ─────────────────────────────────────────────────────────────────────────
|
|
45853
46295
|
async createFlag(data) {
|
|
45854
46296
|
this.assertReady();
|
|
45855
|
-
CoreEventManager.emit("featureFlag:creating", { data });
|
|
46297
|
+
exports.CoreEventManager.emit("featureFlag:creating", { data });
|
|
45856
46298
|
try {
|
|
45857
46299
|
const flag = await this.provider.createFlag(data);
|
|
45858
|
-
CoreEventManager.emit("featureFlag:created", { flag });
|
|
46300
|
+
exports.CoreEventManager.emit("featureFlag:created", { flag });
|
|
45859
46301
|
this.logInfo("Flag created", { key: data.key });
|
|
45860
46302
|
if (this.hasConnectedStores) {
|
|
45861
46303
|
this.syncToStores({ [data.key]: flag.value });
|
|
45862
46304
|
}
|
|
45863
46305
|
return flag;
|
|
45864
46306
|
} catch (error) {
|
|
45865
|
-
CoreEventManager.emit("featureFlag:create:error", { error, data });
|
|
46307
|
+
exports.CoreEventManager.emit("featureFlag:create:error", { error, data });
|
|
45866
46308
|
throw error;
|
|
45867
46309
|
}
|
|
45868
46310
|
}
|
|
45869
46311
|
async updateFlag(key, data) {
|
|
45870
46312
|
this.assertReady();
|
|
45871
|
-
CoreEventManager.emit("featureFlag:updating", { key, data });
|
|
46313
|
+
exports.CoreEventManager.emit("featureFlag:updating", { key, data });
|
|
45872
46314
|
try {
|
|
45873
46315
|
const flag = await this.provider.updateFlag(key, data);
|
|
45874
|
-
CoreEventManager.emit("featureFlag:updated", { flag });
|
|
46316
|
+
exports.CoreEventManager.emit("featureFlag:updated", { flag });
|
|
45875
46317
|
this.logInfo("Flag updated", { key });
|
|
45876
46318
|
if (this.hasConnectedStores) {
|
|
45877
46319
|
this.syncToStores({ [key]: flag.value });
|
|
45878
46320
|
}
|
|
45879
46321
|
return flag;
|
|
45880
46322
|
} catch (error) {
|
|
45881
|
-
CoreEventManager.emit("featureFlag:update:error", { error, key });
|
|
46323
|
+
exports.CoreEventManager.emit("featureFlag:update:error", { error, key });
|
|
45882
46324
|
throw error;
|
|
45883
46325
|
}
|
|
45884
46326
|
}
|
|
45885
46327
|
async deleteFlag(key) {
|
|
45886
46328
|
this.assertReady();
|
|
45887
|
-
CoreEventManager.emit("featureFlag:deleting", { key });
|
|
46329
|
+
exports.CoreEventManager.emit("featureFlag:deleting", { key });
|
|
45888
46330
|
try {
|
|
45889
46331
|
await this.provider.deleteFlag(key);
|
|
45890
|
-
CoreEventManager.emit("featureFlag:deleted", { key });
|
|
46332
|
+
exports.CoreEventManager.emit("featureFlag:deleted", { key });
|
|
45891
46333
|
this.logInfo("Flag deleted", { key });
|
|
45892
46334
|
if (this.hasConnectedStores) {
|
|
45893
46335
|
const evaluations = await this.provider.getAllFlags(this.config.defaultContext);
|
|
45894
46336
|
this.syncToStores(this.toValues(evaluations), true);
|
|
45895
46337
|
}
|
|
45896
46338
|
} catch (error) {
|
|
45897
|
-
CoreEventManager.emit("featureFlag:delete:error", { error, key });
|
|
46339
|
+
exports.CoreEventManager.emit("featureFlag:delete:error", { error, key });
|
|
45898
46340
|
throw error;
|
|
45899
46341
|
}
|
|
45900
46342
|
}
|
|
@@ -45914,15 +46356,15 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45914
46356
|
// ─────────────────────────────────────────────────────────────────────────
|
|
45915
46357
|
setOverride(key, value) {
|
|
45916
46358
|
this.assertReady();
|
|
45917
|
-
CoreEventManager.emit("featureFlag:override:setting", { key, value });
|
|
46359
|
+
exports.CoreEventManager.emit("featureFlag:override:setting", { key, value });
|
|
45918
46360
|
this.provider.setOverride(key, value);
|
|
45919
|
-
CoreEventManager.emit("featureFlag:override:set", { key, value });
|
|
46361
|
+
exports.CoreEventManager.emit("featureFlag:override:set", { key, value });
|
|
45920
46362
|
}
|
|
45921
46363
|
removeOverride(key) {
|
|
45922
46364
|
this.assertReady();
|
|
45923
|
-
CoreEventManager.emit("featureFlag:override:removing", { key });
|
|
46365
|
+
exports.CoreEventManager.emit("featureFlag:override:removing", { key });
|
|
45924
46366
|
this.provider.removeOverride(key);
|
|
45925
|
-
CoreEventManager.emit("featureFlag:override:removed", { key });
|
|
46367
|
+
exports.CoreEventManager.emit("featureFlag:override:removed", { key });
|
|
45926
46368
|
}
|
|
45927
46369
|
clearOverrides() {
|
|
45928
46370
|
this.assertReady();
|
|
@@ -45936,7 +46378,7 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45936
46378
|
return this.provider.subscribe(callback);
|
|
45937
46379
|
}
|
|
45938
46380
|
on(event, handler) {
|
|
45939
|
-
return CoreEventManager.on(event, handler);
|
|
46381
|
+
return exports.CoreEventManager.on(event, handler);
|
|
45940
46382
|
}
|
|
45941
46383
|
// ─────────────────────────────────────────────────────────────────────────
|
|
45942
46384
|
// Protected: Store Sync Override
|
|
@@ -45967,7 +46409,7 @@ var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService e
|
|
|
45967
46409
|
}
|
|
45968
46410
|
return values;
|
|
45969
46411
|
}
|
|
45970
|
-
};
|
|
46412
|
+
});
|
|
45971
46413
|
|
|
45972
46414
|
// src/domain/featureFlags/mappers/FeatureFlagMapper.ts
|
|
45973
46415
|
init_BaseMapper();
|
|
@@ -46141,517 +46583,9 @@ var FeatureFlagMapper = class extends exports.BaseMapper {
|
|
|
46141
46583
|
return "json";
|
|
46142
46584
|
}
|
|
46143
46585
|
};
|
|
46144
|
-
|
|
46145
|
-
|
|
46146
|
-
// src/domain/featureFlags/index.ts
|
|
46147
|
-
var DEFAULT_FEATURE_FLAG_CONFIG = {
|
|
46148
|
-
provider: "memory",
|
|
46149
|
-
isCacheEnabled: true,
|
|
46150
|
-
cacheTtl: 300,
|
|
46151
|
-
// 5 minutes
|
|
46152
|
-
refreshInterval: 0,
|
|
46153
|
-
// No auto-refresh
|
|
46154
|
-
shouldFallbackToDefaults: true,
|
|
46155
|
-
isLoggingEnabled: false
|
|
46156
|
-
};
|
|
46157
|
-
var FeatureFlagSystem = {
|
|
46158
|
-
/**
|
|
46159
|
-
* Initialize for frontend/client applications.
|
|
46160
|
-
*/
|
|
46161
|
-
initializeForFrontend: /* @__PURE__ */ __name(async (config$1 = {}) => {
|
|
46162
|
-
const finalConfig = {
|
|
46163
|
-
...DEFAULT_FEATURE_FLAG_CONFIG,
|
|
46164
|
-
...config$1
|
|
46165
|
-
};
|
|
46166
|
-
return FeatureFlagServiceFactory.createAndInitialize(finalConfig, config.FEATURES);
|
|
46167
|
-
}, "initializeForFrontend"),
|
|
46168
|
-
/**
|
|
46169
|
-
* Initialize for backend/server applications.
|
|
46170
|
-
*/
|
|
46171
|
-
initializeForBackend: /* @__PURE__ */ __name(async (config$1 = {}) => {
|
|
46172
|
-
const finalConfig = {
|
|
46173
|
-
...DEFAULT_FEATURE_FLAG_CONFIG,
|
|
46174
|
-
...config$1
|
|
46175
|
-
};
|
|
46176
|
-
return FeatureFlagServiceFactory.createAndInitialize(finalConfig, config.FEATURES);
|
|
46177
|
-
}, "initializeForBackend"),
|
|
46178
|
-
/**
|
|
46179
|
-
* Initialize for testing environments.
|
|
46180
|
-
*/
|
|
46181
|
-
initializeForTesting: /* @__PURE__ */ __name(async (overrides = {}) => {
|
|
46182
|
-
const service = await FeatureFlagServiceFactory.createAndInitialize(
|
|
46183
|
-
{
|
|
46184
|
-
...DEFAULT_FEATURE_FLAG_CONFIG,
|
|
46185
|
-
provider: "memory",
|
|
46186
|
-
isCacheEnabled: false,
|
|
46187
|
-
isLoggingEnabled: false
|
|
46188
|
-
},
|
|
46189
|
-
config.FEATURES
|
|
46190
|
-
);
|
|
46191
|
-
Object.entries(overrides).forEach(([key, value]) => {
|
|
46192
|
-
service.setOverride(key, value);
|
|
46193
|
-
});
|
|
46194
|
-
return service;
|
|
46195
|
-
}, "initializeForTesting")
|
|
46196
|
-
};
|
|
46197
|
-
|
|
46198
|
-
// src/domain/example/index.ts
|
|
46199
|
-
init_BackendExampleDomainService();
|
|
46200
|
-
init_FrontendExampleDomainService();
|
|
46201
|
-
init_ExampleMapper();
|
|
46202
|
-
init_ExampleValidator();
|
|
46203
|
-
|
|
46204
|
-
// src/base/index.ts
|
|
46205
|
-
init_cache();
|
|
46206
|
-
|
|
46207
|
-
// src/utils/index.ts
|
|
46208
|
-
init_common();
|
|
46209
|
-
init_runtime();
|
|
46210
|
-
|
|
46211
|
-
// src/services/index.ts
|
|
46212
|
-
init_ApiClientService();
|
|
46213
|
-
init_DbService();
|
|
46214
|
-
|
|
46215
|
-
// src/init/index.ts
|
|
46216
|
-
init_CoreInitializer();
|
|
46217
|
-
init_ServiceRegistry();
|
|
46218
|
-
init_ApiClientService();
|
|
46219
|
-
var cachedVersion = "";
|
|
46220
|
-
function getPackageVersion() {
|
|
46221
|
-
if (cachedVersion) return cachedVersion;
|
|
46222
|
-
try {
|
|
46223
|
-
const require2 = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('entry-backend.js', document.baseURI).href)));
|
|
46224
|
-
const pkg = require2("../package.json");
|
|
46225
|
-
cachedVersion = pkg.version ?? "0.0.0";
|
|
46226
|
-
} catch {
|
|
46227
|
-
try {
|
|
46228
|
-
const currentFile = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('entry-backend.js', document.baseURI).href)));
|
|
46229
|
-
const currentDir = path.dirname(currentFile);
|
|
46230
|
-
const pkgPath = path.join(currentDir, "..", "package.json");
|
|
46231
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
46232
|
-
cachedVersion = pkg.version ?? "0.0.0";
|
|
46233
|
-
} catch {
|
|
46234
|
-
cachedVersion = "0.0.0";
|
|
46235
|
-
}
|
|
46236
|
-
}
|
|
46237
|
-
return cachedVersion;
|
|
46238
|
-
}
|
|
46239
|
-
__name(getPackageVersion, "getPackageVersion");
|
|
46240
|
-
var VERSION = getPackageVersion();
|
|
46241
|
-
var PACKAGE_NAME = "@plyaz/core";
|
|
46242
|
-
|
|
46243
|
-
// src/config/index.ts
|
|
46244
|
-
init_dependencies();
|
|
46245
|
-
|
|
46246
|
-
// src/backend/index.ts
|
|
46247
|
-
var backend_exports = {};
|
|
46248
|
-
__export(backend_exports, {
|
|
46249
|
-
BACKEND_EXAMPLE_DOMAIN_SERVICE: () => BACKEND_EXAMPLE_DOMAIN_SERVICE,
|
|
46250
|
-
BackendExampleDomainService: () => exports.BackendExampleDomainService,
|
|
46251
|
-
Caching: () => exports.Caching,
|
|
46252
|
-
ErrorHandlingInterceptor: () => exports.ErrorHandlingInterceptor,
|
|
46253
|
-
ExampleController: () => exports.ExampleController,
|
|
46254
|
-
ExampleModule: () => exports.ExampleModule,
|
|
46255
|
-
FeatureDisabled: () => FeatureDisabled,
|
|
46256
|
-
FeatureEnabled: () => FeatureEnabled,
|
|
46257
|
-
FeatureFlagConfigFactory: () => FeatureFlagConfigFactory,
|
|
46258
|
-
FeatureFlagConfigValidator: () => FeatureFlagConfigValidator,
|
|
46259
|
-
FeatureFlagController: () => exports.FeatureFlagController,
|
|
46260
|
-
FeatureFlagDatabaseRepository: () => FeatureFlagDatabaseRepository,
|
|
46261
|
-
FeatureFlagDomainService: () => FeatureFlagDomainService,
|
|
46262
|
-
FeatureFlagGuard: () => exports.FeatureFlagGuard,
|
|
46263
|
-
FeatureFlagLoggingInterceptor: () => exports.FeatureFlagLoggingInterceptor,
|
|
46264
|
-
FeatureFlagMiddleware: () => exports.FeatureFlagMiddleware,
|
|
46265
|
-
FeatureFlagModule: () => exports.FeatureFlagModule,
|
|
46266
|
-
FeatureFlagService: () => FeatureFlagService,
|
|
46267
|
-
FeatureFlagServiceFactory: () => FeatureFlagServiceFactory
|
|
46268
|
-
});
|
|
46269
|
-
|
|
46270
|
-
// src/backend/example/example.module.ts
|
|
46271
|
-
var import_common10 = __toESM(require_common(), 1);
|
|
46272
|
-
|
|
46273
|
-
// src/backend/example/example.controller.ts
|
|
46274
|
-
var import_common9 = __toESM(require_common(), 1);
|
|
46275
|
-
var BACKEND_EXAMPLE_DOMAIN_SERVICE = "BACKEND_EXAMPLE_DOMAIN_SERVICE";
|
|
46276
|
-
exports.ExampleController = class ExampleController {
|
|
46277
|
-
constructor(exampleService) {
|
|
46278
|
-
this.exampleService = exampleService;
|
|
46279
|
-
}
|
|
46280
|
-
health() {
|
|
46281
|
-
return errors.SuccessResponseStandard("Service is healthy", {
|
|
46282
|
-
service: this.exampleService.isAvailable(),
|
|
46283
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
46284
|
-
});
|
|
46285
|
-
}
|
|
46286
|
-
async getEntity(id) {
|
|
46287
|
-
const entity = await this.exampleService.getById(id);
|
|
46288
|
-
return errors.SuccessResponseStandard("Entity retrieved successfully", entity);
|
|
46289
|
-
}
|
|
46290
|
-
async createEntity(dto) {
|
|
46291
|
-
const entity = await this.exampleService.create(dto);
|
|
46292
|
-
return errors.SuccessResponseStandard("Entity created successfully", entity, types.HTTP_STATUS.CREATED);
|
|
46293
|
-
}
|
|
46294
|
-
async updateEntity(id, dto) {
|
|
46295
|
-
const entity = await this.exampleService.patch(id, dto);
|
|
46296
|
-
return errors.SuccessResponseStandard("Entity updated successfully", entity);
|
|
46297
|
-
}
|
|
46298
|
-
async deleteEntity(id) {
|
|
46299
|
-
await this.exampleService.delete(id);
|
|
46300
|
-
return errors.SuccessResponseStandard("Entity deleted successfully", null);
|
|
46301
|
-
}
|
|
46302
|
-
async createEntityWithValidation(dto) {
|
|
46303
|
-
const entity = await this.exampleService.create(dto);
|
|
46304
|
-
return errors.SuccessResponseStandard("Entity created successfully", entity, types.HTTP_STATUS.CREATED);
|
|
46305
|
-
}
|
|
46306
|
-
async demoSingleError() {
|
|
46307
|
-
return await this.exampleService.demoSingleValidationError();
|
|
46308
|
-
}
|
|
46309
|
-
async demoArrayErrors() {
|
|
46310
|
-
return await this.exampleService.demoMultipleValidationErrors();
|
|
46311
|
-
}
|
|
46312
|
-
};
|
|
46313
|
-
__name(exports.ExampleController, "ExampleController");
|
|
46314
|
-
__decorateClass([
|
|
46315
|
-
(0, import_common9.Get)("health")
|
|
46316
|
-
], exports.ExampleController.prototype, "health", 1);
|
|
46317
|
-
__decorateClass([
|
|
46318
|
-
(0, import_common9.Get)("entities/:id"),
|
|
46319
|
-
__decorateParam(0, (0, import_common9.Param)("id"))
|
|
46320
|
-
], exports.ExampleController.prototype, "getEntity", 1);
|
|
46321
|
-
__decorateClass([
|
|
46322
|
-
(0, import_common9.Post)("entities"),
|
|
46323
|
-
(0, import_common9.HttpCode)(import_common9.HttpStatus.CREATED),
|
|
46324
|
-
__decorateParam(0, (0, import_common9.Body)())
|
|
46325
|
-
], exports.ExampleController.prototype, "createEntity", 1);
|
|
46326
|
-
__decorateClass([
|
|
46327
|
-
(0, import_common9.Patch)("entities/:id"),
|
|
46328
|
-
__decorateParam(0, (0, import_common9.Param)("id")),
|
|
46329
|
-
__decorateParam(1, (0, import_common9.Body)())
|
|
46330
|
-
], exports.ExampleController.prototype, "updateEntity", 1);
|
|
46331
|
-
__decorateClass([
|
|
46332
|
-
(0, import_common9.Delete)("entities/:id"),
|
|
46333
|
-
(0, import_common9.HttpCode)(import_common9.HttpStatus.OK),
|
|
46334
|
-
__decorateParam(0, (0, import_common9.Param)("id"))
|
|
46335
|
-
], exports.ExampleController.prototype, "deleteEntity", 1);
|
|
46336
|
-
__decorateClass([
|
|
46337
|
-
(0, import_common9.Post)("entities/validated"),
|
|
46338
|
-
(0, import_common9.HttpCode)(import_common9.HttpStatus.CREATED),
|
|
46339
|
-
__decorateParam(0, (0, import_common9.Body)())
|
|
46340
|
-
], exports.ExampleController.prototype, "createEntityWithValidation", 1);
|
|
46341
|
-
__decorateClass([
|
|
46342
|
-
(0, import_common9.Get)("errors/single")
|
|
46343
|
-
], exports.ExampleController.prototype, "demoSingleError", 1);
|
|
46344
|
-
__decorateClass([
|
|
46345
|
-
(0, import_common9.Get)("errors/array")
|
|
46346
|
-
], exports.ExampleController.prototype, "demoArrayErrors", 1);
|
|
46347
|
-
exports.ExampleController = __decorateClass([
|
|
46348
|
-
(0, import_common9.Controller)("example"),
|
|
46349
|
-
__decorateParam(0, (0, import_common9.Inject)(BACKEND_EXAMPLE_DOMAIN_SERVICE))
|
|
46350
|
-
], exports.ExampleController);
|
|
46351
|
-
|
|
46352
|
-
// src/backend/example/example.module.ts
|
|
46353
|
-
exports.ExampleModule = class ExampleModule {
|
|
46354
|
-
};
|
|
46355
|
-
__name(exports.ExampleModule, "ExampleModule");
|
|
46356
|
-
exports.ExampleModule = __decorateClass([
|
|
46357
|
-
(0, import_common10.Module)({
|
|
46358
|
-
controllers: [exports.ExampleController],
|
|
46359
|
-
providers: [
|
|
46360
|
-
// Provide BackendExampleDomainService via factory using the singleton instance
|
|
46361
|
-
// This ensures the service is shared across the application
|
|
46362
|
-
{
|
|
46363
|
-
provide: BACKEND_EXAMPLE_DOMAIN_SERVICE,
|
|
46364
|
-
useFactory: /* @__PURE__ */ __name(() => exports.exampleService, "useFactory")
|
|
46365
|
-
}
|
|
46366
|
-
],
|
|
46367
|
-
exports: [BACKEND_EXAMPLE_DOMAIN_SERVICE]
|
|
46368
|
-
})
|
|
46369
|
-
], exports.ExampleModule);
|
|
46370
|
-
|
|
46371
|
-
// src/backend/featureFlags/FeatureFlagDomainService.ts
|
|
46372
|
-
init_base();
|
|
46373
|
-
init_CoreEventManager();
|
|
46374
|
-
var FeatureFlagDomainService = class extends exports.BaseDomainService {
|
|
46375
|
-
static {
|
|
46376
|
-
__name(this, "FeatureFlagDomainService");
|
|
46377
|
-
}
|
|
46378
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46379
|
-
// Constructor
|
|
46380
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46381
|
-
constructor(config) {
|
|
46382
|
-
const serviceConfig = {
|
|
46383
|
-
enabled: true,
|
|
46384
|
-
defaults: {},
|
|
46385
|
-
...config
|
|
46386
|
-
};
|
|
46387
|
-
super({
|
|
46388
|
-
serviceName: "FeatureFlagDomainService",
|
|
46389
|
-
supportedRuntimes: ["backend"],
|
|
46390
|
-
serviceConfig
|
|
46391
|
-
// No API client for backend - uses provider directly
|
|
46392
|
-
});
|
|
46393
|
-
this.provider = config.provider;
|
|
46394
|
-
this._initialized = true;
|
|
46395
|
-
this.logInfo("Service initialized with provider");
|
|
46396
|
-
CoreEventManager.emit("featureFlag:backend:provider:initialized", { providerType: "unknown" });
|
|
46397
|
-
}
|
|
46398
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46399
|
-
// Abstract Implementations
|
|
46400
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46401
|
-
/**
|
|
46402
|
-
* Check if service is available
|
|
46403
|
-
*/
|
|
46404
|
-
isAvailable() {
|
|
46405
|
-
return this.isServiceEnabled && this.provider !== null;
|
|
46406
|
-
}
|
|
46407
|
-
/**
|
|
46408
|
-
* Dispose/cleanup the service
|
|
46409
|
-
*/
|
|
46410
|
-
dispose() {
|
|
46411
|
-
if (this.provider) {
|
|
46412
|
-
this.provider.dispose();
|
|
46413
|
-
CoreEventManager.emit("featureFlag:backend:provider:disposed", {});
|
|
46414
|
-
}
|
|
46415
|
-
this.logInfo("Service disposed");
|
|
46416
|
-
}
|
|
46417
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46418
|
-
// Provider Operations
|
|
46419
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46420
|
-
/**
|
|
46421
|
-
* Refresh the provider cache
|
|
46422
|
-
*/
|
|
46423
|
-
async refresh() {
|
|
46424
|
-
this.assertReady();
|
|
46425
|
-
await this.provider.refresh();
|
|
46426
|
-
CoreEventManager.emit("featureFlag:backend:provider:refreshed", {});
|
|
46427
|
-
this.logDebug("Provider cache refreshed");
|
|
46428
|
-
}
|
|
46429
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46430
|
-
// Evaluation Operations
|
|
46431
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46432
|
-
/**
|
|
46433
|
-
* Evaluate a single feature flag
|
|
46434
|
-
*
|
|
46435
|
-
* @param key - Feature flag key
|
|
46436
|
-
* @param context - Evaluation context (user, environment, etc.)
|
|
46437
|
-
* @returns Full evaluation result
|
|
46438
|
-
*/
|
|
46439
|
-
async evaluate(key, context) {
|
|
46440
|
-
this.assertReady();
|
|
46441
|
-
const evalContext = context ?? this.config.defaultContext;
|
|
46442
|
-
CoreEventManager.emit("featureFlag:backend:evaluating", { key, context: evalContext });
|
|
46443
|
-
try {
|
|
46444
|
-
const result2 = await this.provider.getFlag(key, evalContext);
|
|
46445
|
-
CoreEventManager.emit("featureFlag:backend:evaluated", { key, result: result2 });
|
|
46446
|
-
return result2;
|
|
46447
|
-
} catch (error) {
|
|
46448
|
-
CoreEventManager.emit("featureFlag:backend:evaluate:error", { key, error });
|
|
46449
|
-
throw error;
|
|
46450
|
-
}
|
|
46451
|
-
}
|
|
46452
|
-
/**
|
|
46453
|
-
* Check if a feature flag is enabled
|
|
46454
|
-
*
|
|
46455
|
-
* @param key - Feature flag key
|
|
46456
|
-
* @param context - Evaluation context
|
|
46457
|
-
* @returns Boolean indicating if flag is enabled
|
|
46458
|
-
*/
|
|
46459
|
-
async isEnabled(key, context) {
|
|
46460
|
-
this.assertReady();
|
|
46461
|
-
const evalContext = context ?? this.config.defaultContext;
|
|
46462
|
-
return this.provider.isEnabled(key, evalContext);
|
|
46463
|
-
}
|
|
46464
|
-
/**
|
|
46465
|
-
* Get the value of a feature flag
|
|
46466
|
-
*
|
|
46467
|
-
* @param key - Feature flag key
|
|
46468
|
-
* @param context - Evaluation context
|
|
46469
|
-
* @returns The flag value
|
|
46470
|
-
*/
|
|
46471
|
-
async getValue(key, context) {
|
|
46472
|
-
this.assertReady();
|
|
46473
|
-
const evalContext = context ?? this.config.defaultContext;
|
|
46474
|
-
return this.provider.getValue(key, evalContext);
|
|
46475
|
-
}
|
|
46476
|
-
/**
|
|
46477
|
-
* Evaluate all feature flags for a context
|
|
46478
|
-
*
|
|
46479
|
-
* @param context - Evaluation context
|
|
46480
|
-
* @returns Record of all flag evaluations
|
|
46481
|
-
*/
|
|
46482
|
-
async evaluateAll(context) {
|
|
46483
|
-
this.assertReady();
|
|
46484
|
-
const evalContext = context ?? this.config.defaultContext;
|
|
46485
|
-
try {
|
|
46486
|
-
const result2 = await this.provider.getAllFlags(evalContext);
|
|
46487
|
-
return result2;
|
|
46488
|
-
} catch (error) {
|
|
46489
|
-
this.logError("Failed to evaluate all flags", { error });
|
|
46490
|
-
throw error;
|
|
46491
|
-
}
|
|
46492
|
-
}
|
|
46493
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46494
|
-
// CRUD Operations
|
|
46495
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46496
|
-
/**
|
|
46497
|
-
* Create a new feature flag
|
|
46498
|
-
*
|
|
46499
|
-
* @param data - Flag creation data
|
|
46500
|
-
* @returns The created feature flag
|
|
46501
|
-
*/
|
|
46502
|
-
async create(data) {
|
|
46503
|
-
this.assertReady();
|
|
46504
|
-
CoreEventManager.emit("featureFlag:backend:creating", { data });
|
|
46505
|
-
try {
|
|
46506
|
-
const flag = await this.provider.createFlag(data);
|
|
46507
|
-
CoreEventManager.emit("featureFlag:backend:created", { flag });
|
|
46508
|
-
this.logInfo("Feature flag created", { key: data.key });
|
|
46509
|
-
return flag;
|
|
46510
|
-
} catch (error) {
|
|
46511
|
-
CoreEventManager.emit("featureFlag:backend:create:error", { error, data });
|
|
46512
|
-
throw error;
|
|
46513
|
-
}
|
|
46514
|
-
}
|
|
46515
|
-
/**
|
|
46516
|
-
* Update an existing feature flag
|
|
46517
|
-
*
|
|
46518
|
-
* @param key - Flag key to update
|
|
46519
|
-
* @param data - Partial update data
|
|
46520
|
-
* @returns The updated feature flag
|
|
46521
|
-
*/
|
|
46522
|
-
async update(key, data) {
|
|
46523
|
-
this.assertReady();
|
|
46524
|
-
CoreEventManager.emit("featureFlag:backend:updating", { key, data });
|
|
46525
|
-
try {
|
|
46526
|
-
const flag = await this.provider.updateFlag(key, data);
|
|
46527
|
-
CoreEventManager.emit("featureFlag:backend:updated", { flag });
|
|
46528
|
-
this.logInfo("Feature flag updated", { key });
|
|
46529
|
-
return flag;
|
|
46530
|
-
} catch (error) {
|
|
46531
|
-
CoreEventManager.emit("featureFlag:backend:update:error", { error, key });
|
|
46532
|
-
throw error;
|
|
46533
|
-
}
|
|
46534
|
-
}
|
|
46535
|
-
/**
|
|
46536
|
-
* Delete a feature flag
|
|
46537
|
-
*
|
|
46538
|
-
* @param key - Flag key to delete
|
|
46539
|
-
*/
|
|
46540
|
-
async delete(key) {
|
|
46541
|
-
this.assertReady();
|
|
46542
|
-
CoreEventManager.emit("featureFlag:backend:deleting", { key });
|
|
46543
|
-
try {
|
|
46544
|
-
await this.provider.deleteFlag(key);
|
|
46545
|
-
CoreEventManager.emit("featureFlag:backend:deleted", { key });
|
|
46546
|
-
this.logInfo("Feature flag deleted", { key });
|
|
46547
|
-
} catch (error) {
|
|
46548
|
-
CoreEventManager.emit("featureFlag:backend:delete:error", { error, key });
|
|
46549
|
-
throw error;
|
|
46550
|
-
}
|
|
46551
|
-
}
|
|
46552
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46553
|
-
// Rules Operations
|
|
46554
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46555
|
-
/**
|
|
46556
|
-
* Get rules for a specific flag
|
|
46557
|
-
*
|
|
46558
|
-
* @param key - Flag key
|
|
46559
|
-
* @returns Array of rules
|
|
46560
|
-
*/
|
|
46561
|
-
async getRules(key) {
|
|
46562
|
-
this.assertReady();
|
|
46563
|
-
try {
|
|
46564
|
-
const rules = await this.provider.getRules(key);
|
|
46565
|
-
return rules;
|
|
46566
|
-
} catch (error) {
|
|
46567
|
-
this.logError("Failed to get rules", { key, error });
|
|
46568
|
-
throw error;
|
|
46569
|
-
}
|
|
46570
|
-
}
|
|
46571
|
-
/**
|
|
46572
|
-
* Get all rules
|
|
46573
|
-
*
|
|
46574
|
-
* @returns Array of all rules
|
|
46575
|
-
*/
|
|
46576
|
-
async getAllRules() {
|
|
46577
|
-
this.assertReady();
|
|
46578
|
-
try {
|
|
46579
|
-
const rules = await this.provider.getAllRules();
|
|
46580
|
-
return rules;
|
|
46581
|
-
} catch (error) {
|
|
46582
|
-
this.logError("Failed to get all rules", { error });
|
|
46583
|
-
throw error;
|
|
46584
|
-
}
|
|
46585
|
-
}
|
|
46586
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46587
|
-
// Override Operations (Runtime Overrides)
|
|
46588
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46589
|
-
/**
|
|
46590
|
-
* Set a runtime override for a flag (in-memory, not persisted)
|
|
46591
|
-
*
|
|
46592
|
-
* @param key - Flag key
|
|
46593
|
-
* @param value - Override value
|
|
46594
|
-
*/
|
|
46595
|
-
setOverride(key, value) {
|
|
46596
|
-
this.assertReady();
|
|
46597
|
-
CoreEventManager.emit("featureFlag:backend:override:setting", { key, value });
|
|
46598
|
-
this.provider.setOverride(key, value);
|
|
46599
|
-
CoreEventManager.emit("featureFlag:backend:override:set", { key, value });
|
|
46600
|
-
this.logDebug("Override set", { key, value });
|
|
46601
|
-
}
|
|
46602
|
-
/**
|
|
46603
|
-
* Remove a runtime override for a flag
|
|
46604
|
-
*
|
|
46605
|
-
* @param key - Flag key
|
|
46606
|
-
*/
|
|
46607
|
-
removeOverride(key) {
|
|
46608
|
-
this.assertReady();
|
|
46609
|
-
CoreEventManager.emit("featureFlag:backend:override:removing", { key });
|
|
46610
|
-
this.provider.removeOverride(key);
|
|
46611
|
-
CoreEventManager.emit("featureFlag:backend:override:removed", { key });
|
|
46612
|
-
this.logDebug("Override removed", { key });
|
|
46613
|
-
}
|
|
46614
|
-
/**
|
|
46615
|
-
* Clear all runtime overrides
|
|
46616
|
-
*/
|
|
46617
|
-
clearOverrides() {
|
|
46618
|
-
this.assertReady();
|
|
46619
|
-
this.provider.clearOverrides();
|
|
46620
|
-
this.logDebug("All overrides cleared");
|
|
46621
|
-
}
|
|
46622
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46623
|
-
// Subscription
|
|
46624
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46625
|
-
/**
|
|
46626
|
-
* Subscribe to provider changes
|
|
46627
|
-
*
|
|
46628
|
-
* @param callback - Callback when flags change
|
|
46629
|
-
* @returns Unsubscribe function
|
|
46630
|
-
*/
|
|
46631
|
-
subscribe(callback) {
|
|
46632
|
-
this.assertReady();
|
|
46633
|
-
return this.provider.subscribe(callback);
|
|
46634
|
-
}
|
|
46635
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46636
|
-
// Event Subscription
|
|
46637
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
46638
|
-
/**
|
|
46639
|
-
* Subscribe to feature flag events
|
|
46640
|
-
*
|
|
46641
|
-
* @param event - Event type to subscribe to
|
|
46642
|
-
* @param handler - Event handler
|
|
46643
|
-
* @returns Unsubscribe function
|
|
46644
|
-
*/
|
|
46645
|
-
on(event, handler) {
|
|
46646
|
-
return CoreEventManager.on(event, handler);
|
|
46647
|
-
}
|
|
46648
|
-
};
|
|
46649
|
-
|
|
46650
|
-
// src/backend/featureFlags/feature-flag.module.ts
|
|
46651
|
-
var import_common12 = __toESM(require_common(), 1);
|
|
46586
|
+
new FeatureFlagMapper();
|
|
46652
46587
|
|
|
46653
46588
|
// src/backend/featureFlags/feature-flag.controller.ts
|
|
46654
|
-
var import_common11 = __toESM(require_common(), 1);
|
|
46655
46589
|
exports.FeatureFlagController = class FeatureFlagController {
|
|
46656
46590
|
constructor(featureFlagService) {
|
|
46657
46591
|
this.featureFlagService = featureFlagService;
|
|
@@ -47522,500 +47456,6 @@ exports.Caching = __decorateClass([
|
|
|
47522
47456
|
(0, import_common18.Injectable)()
|
|
47523
47457
|
], exports.Caching);
|
|
47524
47458
|
|
|
47525
|
-
// src/frontend/index.ts
|
|
47526
|
-
var frontend_exports = {};
|
|
47527
|
-
__export(frontend_exports, {
|
|
47528
|
-
ApiProvider: () => ApiProvider,
|
|
47529
|
-
BaseFrontendDomainService: () => exports.BaseFrontendDomainService,
|
|
47530
|
-
FrontendExampleDomainService: () => exports.FrontendExampleDomainService,
|
|
47531
|
-
FrontendFeatureFlagDomainService: () => FrontendFeatureFlagDomainService,
|
|
47532
|
-
InitializationError: () => InitializationError,
|
|
47533
|
-
InitializationLoading: () => InitializationLoading,
|
|
47534
|
-
PlyazContext: () => PlyazContext,
|
|
47535
|
-
PlyazProvider: () => PlyazProvider,
|
|
47536
|
-
createFeatureFlagFetcher: () => createFeatureFlagFetcher,
|
|
47537
|
-
createFeatureFlagStoreConfig: () => createFeatureFlagStoreConfig,
|
|
47538
|
-
createServiceAccessor: () => createServiceAccessor,
|
|
47539
|
-
createServiceAccessors: () => createServiceAccessors,
|
|
47540
|
-
useApi: () => useApi,
|
|
47541
|
-
useApiSafe: () => useApiSafe,
|
|
47542
|
-
useAppContext: () => useAppContext,
|
|
47543
|
-
useEnvironment: () => useEnvironment,
|
|
47544
|
-
useEvents: () => useEvents,
|
|
47545
|
-
useFeatureFlags: () => useFeatureFlags,
|
|
47546
|
-
useFlag: () => useFlag,
|
|
47547
|
-
useHasService: () => useHasService,
|
|
47548
|
-
usePlyaz: () => usePlyaz,
|
|
47549
|
-
usePlyazReady: () => usePlyazReady,
|
|
47550
|
-
useService: () => useService,
|
|
47551
|
-
useServiceAsync: () => useServiceAsync,
|
|
47552
|
-
useServiceKeys: () => useServiceKeys,
|
|
47553
|
-
withServices: () => withServices
|
|
47554
|
-
});
|
|
47555
|
-
|
|
47556
|
-
// src/frontend/base/index.ts
|
|
47557
|
-
init_BaseFrontendDomainService();
|
|
47558
|
-
var errorContainerStyle = {
|
|
47559
|
-
padding: "20px",
|
|
47560
|
-
color: "red",
|
|
47561
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
47562
|
-
};
|
|
47563
|
-
var errorHeadingStyle = {
|
|
47564
|
-
margin: "0 0 10px 0",
|
|
47565
|
-
fontSize: "1.25rem",
|
|
47566
|
-
fontWeight: 600
|
|
47567
|
-
};
|
|
47568
|
-
var errorMessageStyle = {
|
|
47569
|
-
margin: 0,
|
|
47570
|
-
fontSize: "0.875rem"
|
|
47571
|
-
};
|
|
47572
|
-
function InitializationError({
|
|
47573
|
-
error,
|
|
47574
|
-
errorComponent
|
|
47575
|
-
}) {
|
|
47576
|
-
if (errorComponent) {
|
|
47577
|
-
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: errorComponent(error) });
|
|
47578
|
-
}
|
|
47579
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: errorContainerStyle, children: [
|
|
47580
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { style: errorHeadingStyle, children: "Plyaz Initialization Failed" }),
|
|
47581
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { style: errorMessageStyle, children: error.message })
|
|
47582
|
-
] });
|
|
47583
|
-
}
|
|
47584
|
-
__name(InitializationError, "InitializationError");
|
|
47585
|
-
var loadingContainerStyle = {
|
|
47586
|
-
padding: "20px",
|
|
47587
|
-
fontFamily: "system-ui, -apple-system, sans-serif"
|
|
47588
|
-
};
|
|
47589
|
-
var loadingMessageStyle = {
|
|
47590
|
-
margin: 0,
|
|
47591
|
-
fontSize: "0.875rem",
|
|
47592
|
-
color: "#666"
|
|
47593
|
-
};
|
|
47594
|
-
function InitializationLoading({ loading }) {
|
|
47595
|
-
if (loading) {
|
|
47596
|
-
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: loading });
|
|
47597
|
-
}
|
|
47598
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: loadingContainerStyle, children: /* @__PURE__ */ jsxRuntime.jsx("p", { style: loadingMessageStyle, children: "Initializing..." }) });
|
|
47599
|
-
}
|
|
47600
|
-
__name(InitializationLoading, "InitializationLoading");
|
|
47601
|
-
|
|
47602
|
-
// src/frontend/example/index.ts
|
|
47603
|
-
init_FrontendExampleDomainService();
|
|
47604
|
-
|
|
47605
|
-
// src/frontend/providers/ApiProvider.tsx
|
|
47606
|
-
init_ApiClientService();
|
|
47607
|
-
function ApiProvider({
|
|
47608
|
-
children,
|
|
47609
|
-
envConfig,
|
|
47610
|
-
apiConfig,
|
|
47611
|
-
loadingComponent,
|
|
47612
|
-
errorComponent,
|
|
47613
|
-
onInitialized,
|
|
47614
|
-
onError
|
|
47615
|
-
}) {
|
|
47616
|
-
const [isReady, setIsReady] = react.useState(false);
|
|
47617
|
-
const [error, setError] = react.useState(null);
|
|
47618
|
-
react.useEffect(() => {
|
|
47619
|
-
exports.ApiClientService.init(envConfig, apiConfig).then(() => {
|
|
47620
|
-
setIsReady(true);
|
|
47621
|
-
onInitialized?.();
|
|
47622
|
-
}).catch((err) => {
|
|
47623
|
-
const error2 = err instanceof Error ? err : new Error(String(err));
|
|
47624
|
-
setError(error2);
|
|
47625
|
-
onError?.(error2);
|
|
47626
|
-
globalThis.console.error("[ApiProvider] Failed to initialize API client:", error2);
|
|
47627
|
-
});
|
|
47628
|
-
return () => {
|
|
47629
|
-
};
|
|
47630
|
-
}, []);
|
|
47631
|
-
if (error) {
|
|
47632
|
-
if (errorComponent) {
|
|
47633
|
-
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: errorComponent(error) });
|
|
47634
|
-
}
|
|
47635
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: "20px", color: "red" }, children: [
|
|
47636
|
-
/* @__PURE__ */ jsxRuntime.jsx("h2", { children: "API Client Initialization Failed" }),
|
|
47637
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { children: error.message })
|
|
47638
|
-
] });
|
|
47639
|
-
}
|
|
47640
|
-
if (!isReady) {
|
|
47641
|
-
if (loadingComponent) {
|
|
47642
|
-
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: loadingComponent });
|
|
47643
|
-
}
|
|
47644
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "20px" }, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: "Initializing API client..." }) });
|
|
47645
|
-
}
|
|
47646
|
-
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
|
|
47647
|
-
}
|
|
47648
|
-
__name(ApiProvider, "ApiProvider");
|
|
47649
|
-
|
|
47650
|
-
// src/frontend/providers/PlyazProvider.tsx
|
|
47651
|
-
init_CoreInitializer();
|
|
47652
|
-
init_ServiceRegistry();
|
|
47653
|
-
init_ApiClientService();
|
|
47654
|
-
init_CoreEventManager();
|
|
47655
|
-
var PlyazContext = react.createContext(null);
|
|
47656
|
-
var FeatureFlagStore = class {
|
|
47657
|
-
constructor(config = {}) {
|
|
47658
|
-
this.flags = {};
|
|
47659
|
-
this.apiClient = null;
|
|
47660
|
-
this.refreshTimer = null;
|
|
47661
|
-
this.config = config;
|
|
47662
|
-
this.flags = config.defaults ?? {};
|
|
47663
|
-
}
|
|
47664
|
-
static {
|
|
47665
|
-
__name(this, "FeatureFlagStore");
|
|
47666
|
-
}
|
|
47667
|
-
setApiClient(client) {
|
|
47668
|
-
this.apiClient = client;
|
|
47669
|
-
}
|
|
47670
|
-
get(key, defaultValue = false) {
|
|
47671
|
-
return this.flags[key] ?? defaultValue;
|
|
47672
|
-
}
|
|
47673
|
-
getAll() {
|
|
47674
|
-
return { ...this.flags };
|
|
47675
|
-
}
|
|
47676
|
-
set(key, value) {
|
|
47677
|
-
this.flags[key] = value;
|
|
47678
|
-
}
|
|
47679
|
-
setAll(flags) {
|
|
47680
|
-
this.flags = { ...this.flags, ...flags };
|
|
47681
|
-
}
|
|
47682
|
-
async refresh() {
|
|
47683
|
-
if (this.config.provider === "api" && this.apiClient?.isInitialized()) {
|
|
47684
|
-
try {
|
|
47685
|
-
const endpoint = this.config.apiEndpoint ?? "/feature-flags";
|
|
47686
|
-
const client = this.apiClient.getClient();
|
|
47687
|
-
const response = await client.get(endpoint);
|
|
47688
|
-
if (response.data?.flags) {
|
|
47689
|
-
this.flags = { ...this.flags, ...response.data.flags };
|
|
47690
|
-
}
|
|
47691
|
-
} catch (error) {
|
|
47692
|
-
globalThis.console.warn("[PlyazProvider] Failed to refresh feature flags:", error);
|
|
47693
|
-
}
|
|
47694
|
-
}
|
|
47695
|
-
}
|
|
47696
|
-
startAutoRefresh() {
|
|
47697
|
-
if (this.config.provider === "api" && this.config.refreshInterval && this.config.refreshInterval > 0) {
|
|
47698
|
-
this.refreshTimer = globalThis.setInterval(() => {
|
|
47699
|
-
this.refresh().catch(() => {
|
|
47700
|
-
});
|
|
47701
|
-
}, this.config.refreshInterval);
|
|
47702
|
-
}
|
|
47703
|
-
}
|
|
47704
|
-
stopAutoRefresh() {
|
|
47705
|
-
if (this.refreshTimer) {
|
|
47706
|
-
globalThis.clearInterval(this.refreshTimer);
|
|
47707
|
-
this.refreshTimer = null;
|
|
47708
|
-
}
|
|
47709
|
-
}
|
|
47710
|
-
dispose() {
|
|
47711
|
-
this.stopAutoRefresh();
|
|
47712
|
-
this.flags = {};
|
|
47713
|
-
}
|
|
47714
|
-
};
|
|
47715
|
-
function buildApiConfig(config) {
|
|
47716
|
-
return {
|
|
47717
|
-
baseURL: config.api.baseURL,
|
|
47718
|
-
timeout: config.api.timeout,
|
|
47719
|
-
headers: config.api.headers ? { static: config.api.headers } : void 0,
|
|
47720
|
-
retry: config.api.retry,
|
|
47721
|
-
encryption: config.api.encryption?.enabled && config.api.encryption?.key ? api.createEncryptionConfig(config.api.encryption.key) : void 0
|
|
47722
|
-
};
|
|
47723
|
-
}
|
|
47724
|
-
__name(buildApiConfig, "buildApiConfig");
|
|
47725
|
-
async function initializeCore(config) {
|
|
47726
|
-
const apiConfig = buildApiConfig(config);
|
|
47727
|
-
await exports.Core.initialize({
|
|
47728
|
-
skipDb: true,
|
|
47729
|
-
appContext: config.appContext ?? "webapp",
|
|
47730
|
-
verbose: config.verbose,
|
|
47731
|
-
api: {
|
|
47732
|
-
env: config.api.env ?? "development",
|
|
47733
|
-
apiKey: config.api.apiKey,
|
|
47734
|
-
setAsDefault: true,
|
|
47735
|
-
...apiConfig
|
|
47736
|
-
}
|
|
47737
|
-
});
|
|
47738
|
-
}
|
|
47739
|
-
__name(initializeCore, "initializeCore");
|
|
47740
|
-
async function initializeServices(config) {
|
|
47741
|
-
if (!config.services || config.services.length === 0) return;
|
|
47742
|
-
if (config.verbose) {
|
|
47743
|
-
globalThis.console.log("[PlyazProvider] Initializing domain services...");
|
|
47744
|
-
}
|
|
47745
|
-
await exports.ServiceRegistry.initialize({
|
|
47746
|
-
apiClient: { baseURL: config.api.baseURL },
|
|
47747
|
-
services: config.services
|
|
47748
|
-
});
|
|
47749
|
-
if (config.verbose) {
|
|
47750
|
-
globalThis.console.log(
|
|
47751
|
-
"[PlyazProvider] Services initialized:",
|
|
47752
|
-
exports.ServiceRegistry.getInitializedKeys()
|
|
47753
|
-
);
|
|
47754
|
-
}
|
|
47755
|
-
}
|
|
47756
|
-
__name(initializeServices, "initializeServices");
|
|
47757
|
-
async function initializeFeatureFlags(featureFlagStore) {
|
|
47758
|
-
featureFlagStore.setApiClient(exports.ApiClientService);
|
|
47759
|
-
await featureFlagStore.refresh();
|
|
47760
|
-
featureFlagStore.startAutoRefresh();
|
|
47761
|
-
}
|
|
47762
|
-
__name(initializeFeatureFlags, "initializeFeatureFlags");
|
|
47763
|
-
function createServicesObject(config, featureFlagStore) {
|
|
47764
|
-
return {
|
|
47765
|
-
api: exports.ApiClientService,
|
|
47766
|
-
events: CoreEventManager,
|
|
47767
|
-
core: exports.Core,
|
|
47768
|
-
featureFlags: {
|
|
47769
|
-
get: /* @__PURE__ */ __name((key, def) => featureFlagStore.get(key, def), "get"),
|
|
47770
|
-
getAll: /* @__PURE__ */ __name(() => featureFlagStore.getAll(), "getAll"),
|
|
47771
|
-
refresh: /* @__PURE__ */ __name(() => featureFlagStore.refresh(), "refresh")
|
|
47772
|
-
},
|
|
47773
|
-
appContext: config.appContext ?? "webapp",
|
|
47774
|
-
environment: config.api.env ?? "development",
|
|
47775
|
-
getService: /* @__PURE__ */ __name((key) => exports.ServiceRegistry.get(key), "getService"),
|
|
47776
|
-
getServiceAsync: /* @__PURE__ */ __name((key) => exports.ServiceRegistry.getAsync(key), "getServiceAsync"),
|
|
47777
|
-
hasService: /* @__PURE__ */ __name((key) => exports.ServiceRegistry.has(key), "hasService"),
|
|
47778
|
-
getServiceKeys: /* @__PURE__ */ __name(() => exports.ServiceRegistry.getInitializedKeys(), "getServiceKeys")
|
|
47779
|
-
};
|
|
47780
|
-
}
|
|
47781
|
-
__name(createServicesObject, "createServicesObject");
|
|
47782
|
-
function PlyazProvider({
|
|
47783
|
-
children,
|
|
47784
|
-
config,
|
|
47785
|
-
loading,
|
|
47786
|
-
error: errorComponent,
|
|
47787
|
-
onReady,
|
|
47788
|
-
onError,
|
|
47789
|
-
skipLoadingState = false
|
|
47790
|
-
}) {
|
|
47791
|
-
const [isReady, setIsReady] = react.useState(false);
|
|
47792
|
-
const [error, setError] = react.useState(null);
|
|
47793
|
-
const [featureFlagStore] = react.useState(() => new FeatureFlagStore(config.featureFlags));
|
|
47794
|
-
const initialize = react.useCallback(async () => {
|
|
47795
|
-
try {
|
|
47796
|
-
setError(null);
|
|
47797
|
-
await initializeCore(config);
|
|
47798
|
-
await initializeServices(config);
|
|
47799
|
-
await initializeFeatureFlags(featureFlagStore);
|
|
47800
|
-
setIsReady(true);
|
|
47801
|
-
onReady?.(createServicesObject(config, featureFlagStore));
|
|
47802
|
-
} catch (err) {
|
|
47803
|
-
const initError = err instanceof Error ? err : new Error(String(err));
|
|
47804
|
-
setError(initError);
|
|
47805
|
-
onError?.(initError);
|
|
47806
|
-
globalThis.console.error("[PlyazProvider] Initialization failed:", initError);
|
|
47807
|
-
}
|
|
47808
|
-
}, [config, featureFlagStore, onReady, onError]);
|
|
47809
|
-
const reinitialize = react.useCallback(async () => {
|
|
47810
|
-
setIsReady(false);
|
|
47811
|
-
exports.ServiceRegistry.disposeAll();
|
|
47812
|
-
await exports.Core.reset();
|
|
47813
|
-
await initialize();
|
|
47814
|
-
}, [initialize]);
|
|
47815
|
-
react.useEffect(() => {
|
|
47816
|
-
void initialize();
|
|
47817
|
-
return () => {
|
|
47818
|
-
featureFlagStore.dispose();
|
|
47819
|
-
exports.ServiceRegistry.disposeAll();
|
|
47820
|
-
};
|
|
47821
|
-
}, []);
|
|
47822
|
-
const contextValue = react.useMemo(
|
|
47823
|
-
() => ({
|
|
47824
|
-
api: isReady ? exports.ApiClientService : null,
|
|
47825
|
-
events: CoreEventManager,
|
|
47826
|
-
core: exports.Core,
|
|
47827
|
-
featureFlags: {
|
|
47828
|
-
get: /* @__PURE__ */ __name((key, def) => featureFlagStore.get(key, def), "get"),
|
|
47829
|
-
getAll: /* @__PURE__ */ __name(() => featureFlagStore.getAll(), "getAll"),
|
|
47830
|
-
refresh: /* @__PURE__ */ __name(() => featureFlagStore.refresh(), "refresh")
|
|
47831
|
-
},
|
|
47832
|
-
appContext: config.appContext ?? "webapp",
|
|
47833
|
-
environment: config.api.env ?? "development",
|
|
47834
|
-
isReady,
|
|
47835
|
-
error,
|
|
47836
|
-
reinitialize,
|
|
47837
|
-
// ServiceRegistry access
|
|
47838
|
-
getService: /* @__PURE__ */ __name((key) => exports.ServiceRegistry.get(key), "getService"),
|
|
47839
|
-
getServiceAsync: /* @__PURE__ */ __name((key) => exports.ServiceRegistry.getAsync(key), "getServiceAsync"),
|
|
47840
|
-
hasService: /* @__PURE__ */ __name((key) => exports.ServiceRegistry.has(key), "hasService"),
|
|
47841
|
-
getServiceKeys: /* @__PURE__ */ __name(() => exports.ServiceRegistry.getInitializedKeys(), "getServiceKeys")
|
|
47842
|
-
}),
|
|
47843
|
-
[isReady, error, config.appContext, config.api.env, featureFlagStore, reinitialize]
|
|
47844
|
-
);
|
|
47845
|
-
if (error && !skipLoadingState) {
|
|
47846
|
-
return /* @__PURE__ */ jsxRuntime.jsx(frontend.ApiProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(InitializationError, { error, errorComponent }) });
|
|
47847
|
-
}
|
|
47848
|
-
if (!isReady && !skipLoadingState) {
|
|
47849
|
-
return /* @__PURE__ */ jsxRuntime.jsx(frontend.ApiProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(InitializationLoading, { loading }) });
|
|
47850
|
-
}
|
|
47851
|
-
return /* @__PURE__ */ jsxRuntime.jsx(frontend.ApiProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(PlyazContext.Provider, { value: contextValue, children }) });
|
|
47852
|
-
}
|
|
47853
|
-
__name(PlyazProvider, "PlyazProvider");
|
|
47854
|
-
function usePlyaz() {
|
|
47855
|
-
const context = react.useContext(PlyazContext);
|
|
47856
|
-
if (!context) {
|
|
47857
|
-
throw new Error(
|
|
47858
|
-
"usePlyaz must be used within a PlyazProvider. Wrap your app with <PlyazProvider config={...}>...</PlyazProvider>"
|
|
47859
|
-
);
|
|
47860
|
-
}
|
|
47861
|
-
return context;
|
|
47862
|
-
}
|
|
47863
|
-
__name(usePlyaz, "usePlyaz");
|
|
47864
|
-
function useApi() {
|
|
47865
|
-
const { api, isReady } = usePlyaz();
|
|
47866
|
-
if (!isReady || !api) {
|
|
47867
|
-
throw new Error("API client is not ready. Make sure PlyazProvider has finished initializing.");
|
|
47868
|
-
}
|
|
47869
|
-
return api;
|
|
47870
|
-
}
|
|
47871
|
-
__name(useApi, "useApi");
|
|
47872
|
-
function useApiSafe() {
|
|
47873
|
-
const { api } = usePlyaz();
|
|
47874
|
-
return api;
|
|
47875
|
-
}
|
|
47876
|
-
__name(useApiSafe, "useApiSafe");
|
|
47877
|
-
function useEvents() {
|
|
47878
|
-
const { events } = usePlyaz();
|
|
47879
|
-
return events;
|
|
47880
|
-
}
|
|
47881
|
-
__name(useEvents, "useEvents");
|
|
47882
|
-
function useFlag(key, defaultValue = false) {
|
|
47883
|
-
const { featureFlags } = usePlyaz();
|
|
47884
|
-
return featureFlags.get(key, defaultValue);
|
|
47885
|
-
}
|
|
47886
|
-
__name(useFlag, "useFlag");
|
|
47887
|
-
function useFeatureFlags() {
|
|
47888
|
-
const { featureFlags } = usePlyaz();
|
|
47889
|
-
return featureFlags;
|
|
47890
|
-
}
|
|
47891
|
-
__name(useFeatureFlags, "useFeatureFlags");
|
|
47892
|
-
function usePlyazReady() {
|
|
47893
|
-
const { isReady } = usePlyaz();
|
|
47894
|
-
return isReady;
|
|
47895
|
-
}
|
|
47896
|
-
__name(usePlyazReady, "usePlyazReady");
|
|
47897
|
-
function useAppContext() {
|
|
47898
|
-
const { appContext } = usePlyaz();
|
|
47899
|
-
return appContext;
|
|
47900
|
-
}
|
|
47901
|
-
__name(useAppContext, "useAppContext");
|
|
47902
|
-
function useEnvironment() {
|
|
47903
|
-
const { environment } = usePlyaz();
|
|
47904
|
-
return environment;
|
|
47905
|
-
}
|
|
47906
|
-
__name(useEnvironment, "useEnvironment");
|
|
47907
|
-
function useService(key) {
|
|
47908
|
-
const { getService, isReady } = usePlyaz();
|
|
47909
|
-
if (!isReady) {
|
|
47910
|
-
throw new Error(`PlyazProvider not ready. Cannot get service '${key}'.`);
|
|
47911
|
-
}
|
|
47912
|
-
return react.useMemo(() => getService(key), [getService, key]);
|
|
47913
|
-
}
|
|
47914
|
-
__name(useService, "useService");
|
|
47915
|
-
function useServiceAsync(key) {
|
|
47916
|
-
const { getServiceAsync, isReady } = usePlyaz();
|
|
47917
|
-
const [service, setService] = react.useState(null);
|
|
47918
|
-
const [isLoading, setIsLoading] = react.useState(true);
|
|
47919
|
-
const [error, setError] = react.useState(null);
|
|
47920
|
-
react.useEffect(() => {
|
|
47921
|
-
if (!isReady) return;
|
|
47922
|
-
let mounted = true;
|
|
47923
|
-
const loadService = /* @__PURE__ */ __name(async () => {
|
|
47924
|
-
try {
|
|
47925
|
-
setIsLoading(true);
|
|
47926
|
-
const svc = await getServiceAsync(key);
|
|
47927
|
-
if (mounted) {
|
|
47928
|
-
setService(svc);
|
|
47929
|
-
setIsLoading(false);
|
|
47930
|
-
}
|
|
47931
|
-
} catch (err) {
|
|
47932
|
-
if (mounted) {
|
|
47933
|
-
setError(err instanceof Error ? err : new Error(String(err)));
|
|
47934
|
-
setIsLoading(false);
|
|
47935
|
-
}
|
|
47936
|
-
}
|
|
47937
|
-
}, "loadService");
|
|
47938
|
-
void loadService();
|
|
47939
|
-
return () => {
|
|
47940
|
-
mounted = false;
|
|
47941
|
-
};
|
|
47942
|
-
}, [key, getServiceAsync, isReady]);
|
|
47943
|
-
return { service, isLoading, error };
|
|
47944
|
-
}
|
|
47945
|
-
__name(useServiceAsync, "useServiceAsync");
|
|
47946
|
-
function useHasService(key) {
|
|
47947
|
-
const { hasService } = usePlyaz();
|
|
47948
|
-
return hasService(key);
|
|
47949
|
-
}
|
|
47950
|
-
__name(useHasService, "useHasService");
|
|
47951
|
-
function useServiceKeys() {
|
|
47952
|
-
const { getServiceKeys } = usePlyaz();
|
|
47953
|
-
return getServiceKeys();
|
|
47954
|
-
}
|
|
47955
|
-
__name(useServiceKeys, "useServiceKeys");
|
|
47956
|
-
|
|
47957
|
-
// src/frontend/store/service-accessors.ts
|
|
47958
|
-
init_ServiceRegistry();
|
|
47959
|
-
function createServiceAccessor(serviceKey) {
|
|
47960
|
-
return () => exports.ServiceRegistry.getAsync(serviceKey);
|
|
47961
|
-
}
|
|
47962
|
-
__name(createServiceAccessor, "createServiceAccessor");
|
|
47963
|
-
function createServiceAccessors(keys) {
|
|
47964
|
-
const accessors = {};
|
|
47965
|
-
for (const [name, key] of Object.entries(keys)) {
|
|
47966
|
-
accessors[name] = createServiceAccessor(key);
|
|
47967
|
-
}
|
|
47968
|
-
return accessors;
|
|
47969
|
-
}
|
|
47970
|
-
__name(createServiceAccessors, "createServiceAccessors");
|
|
47971
|
-
function withServices(serviceKeys, createStore) {
|
|
47972
|
-
return (set, get) => {
|
|
47973
|
-
const services = {};
|
|
47974
|
-
for (const key of serviceKeys) {
|
|
47975
|
-
Object.defineProperty(services, key, {
|
|
47976
|
-
get: /* @__PURE__ */ __name(() => exports.ServiceRegistry.get(key), "get"),
|
|
47977
|
-
enumerable: true
|
|
47978
|
-
});
|
|
47979
|
-
}
|
|
47980
|
-
return createStore(set, get, services);
|
|
47981
|
-
};
|
|
47982
|
-
}
|
|
47983
|
-
__name(withServices, "withServices");
|
|
47984
|
-
|
|
47985
|
-
// src/frontend/store/feature-flags.ts
|
|
47986
|
-
init_ServiceRegistry();
|
|
47987
|
-
function createFeatureFlagFetcher(options = {}) {
|
|
47988
|
-
const { serviceKey = "featureFlags", context, transform } = options;
|
|
47989
|
-
return async () => {
|
|
47990
|
-
const service = await exports.ServiceRegistry.getAsync(serviceKey);
|
|
47991
|
-
const flags = await service.evaluateAll(context);
|
|
47992
|
-
const values = {};
|
|
47993
|
-
for (const [key, evaluation] of Object.entries(flags)) {
|
|
47994
|
-
if (evaluation && typeof evaluation === "object" && "value" in evaluation) {
|
|
47995
|
-
values[key] = evaluation.value;
|
|
47996
|
-
} else {
|
|
47997
|
-
values[key] = evaluation;
|
|
47998
|
-
}
|
|
47999
|
-
}
|
|
48000
|
-
return transform ? transform(values) : values;
|
|
48001
|
-
};
|
|
48002
|
-
}
|
|
48003
|
-
__name(createFeatureFlagFetcher, "createFeatureFlagFetcher");
|
|
48004
|
-
function createFeatureFlagStoreConfig(options) {
|
|
48005
|
-
const { serviceKey, context, defaults, polling, onFlagChange, onError } = options;
|
|
48006
|
-
return {
|
|
48007
|
-
fetchFn: createFeatureFlagFetcher({ serviceKey, context }),
|
|
48008
|
-
defaults,
|
|
48009
|
-
polling,
|
|
48010
|
-
onFlagChange,
|
|
48011
|
-
onError
|
|
48012
|
-
};
|
|
48013
|
-
}
|
|
48014
|
-
__name(createFeatureFlagStoreConfig, "createFeatureFlagStoreConfig");
|
|
48015
|
-
|
|
48016
|
-
// src/entry-backend.ts
|
|
48017
|
-
init_DbService();
|
|
48018
|
-
|
|
48019
47459
|
// src/adapters/nextjs.ts
|
|
48020
47460
|
init_CoreInitializer();
|
|
48021
47461
|
function parseQuery(url) {
|
|
@@ -48222,7 +47662,6 @@ reflect-metadata/Reflect.js:
|
|
|
48222
47662
|
***************************************************************************** *)
|
|
48223
47663
|
*/
|
|
48224
47664
|
|
|
48225
|
-
exports.ApiFeatureFlagProvider = ApiFeatureFlagProvider;
|
|
48226
47665
|
exports.BACKEND_EXAMPLE_DOMAIN_SERVICE = BACKEND_EXAMPLE_DOMAIN_SERVICE;
|
|
48227
47666
|
exports.CORE_DB_SERVICE = CORE_DB_SERVICE;
|
|
48228
47667
|
exports.CORE_ENV = CORE_ENV;
|
|
@@ -48230,12 +47669,7 @@ exports.CORE_OPTIONS = CORE_OPTIONS;
|
|
|
48230
47669
|
exports.CacheService = CacheService;
|
|
48231
47670
|
exports.ConditionUtils = ConditionUtils;
|
|
48232
47671
|
exports.ContextUtils = ContextUtils;
|
|
48233
|
-
exports.CoreBackend = backend_exports;
|
|
48234
|
-
exports.CoreFrontend = frontend_exports;
|
|
48235
47672
|
exports.CoreModule = CoreModule;
|
|
48236
|
-
exports.DEFAULT_FEATURE_FLAG_CONFIG = DEFAULT_FEATURE_FLAG_CONFIG;
|
|
48237
|
-
exports.DatabaseFeatureFlagProvider = DatabaseFeatureFlagProvider;
|
|
48238
|
-
exports.FEATURE_FLAG_SERVICE = FEATURE_FLAG_SERVICE;
|
|
48239
47673
|
exports.FeatureDisabled = FeatureDisabled;
|
|
48240
47674
|
exports.FeatureEnabled = FeatureEnabled;
|
|
48241
47675
|
exports.FeatureFlagConfigFactory = FeatureFlagConfigFactory;
|
|
@@ -48244,18 +47678,10 @@ exports.FeatureFlagContextBuilder = FeatureFlagContextBuilder;
|
|
|
48244
47678
|
exports.FeatureFlagDatabaseRepository = FeatureFlagDatabaseRepository;
|
|
48245
47679
|
exports.FeatureFlagDomainService = FeatureFlagDomainService;
|
|
48246
47680
|
exports.FeatureFlagEngine = FeatureFlagEngine;
|
|
48247
|
-
exports.FeatureFlagMapper = FeatureFlagMapper;
|
|
48248
|
-
exports.FeatureFlagProvider = FeatureFlagProvider;
|
|
48249
|
-
exports.FeatureFlagProviderFactory = FeatureFlagProviderFactory;
|
|
48250
47681
|
exports.FeatureFlagService = FeatureFlagService;
|
|
48251
47682
|
exports.FeatureFlagServiceFactory = FeatureFlagServiceFactory;
|
|
48252
|
-
exports.FeatureFlagSystem = FeatureFlagSystem;
|
|
48253
|
-
exports.FileFeatureFlagProvider = FileFeatureFlagProvider;
|
|
48254
|
-
exports.FrontendFeatureFlagDomainService = FrontendFeatureFlagDomainService;
|
|
48255
|
-
exports.MemoryFeatureFlagProvider = MemoryFeatureFlagProvider;
|
|
48256
47683
|
exports.NotificationService = NotificationService;
|
|
48257
47684
|
exports.PACKAGE_NAME = PACKAGE_NAME;
|
|
48258
|
-
exports.RedisFeatureFlagProvider = RedisFeatureFlagProvider;
|
|
48259
47685
|
exports.StorageService = StorageService;
|
|
48260
47686
|
exports.VERSION = VERSION;
|
|
48261
47687
|
exports.backendExampleDomainService = exports.exampleService;
|
|
@@ -48263,7 +47689,6 @@ exports.backendExampleService = exports.exampleService;
|
|
|
48263
47689
|
exports.camelToSnake = camelToSnake;
|
|
48264
47690
|
exports.clearCoreDependencies = clearCoreDependencies;
|
|
48265
47691
|
exports.createBackendContext = createBackendContext;
|
|
48266
|
-
exports.createFeatureFlagService = createFeatureFlagService;
|
|
48267
47692
|
exports.createFrontendContext = createFrontendContext;
|
|
48268
47693
|
exports.createHandler = createHandler;
|
|
48269
47694
|
exports.createRolloutIdentifier = createRolloutIdentifier;
|
|
@@ -48273,7 +47698,6 @@ exports.evaluateConditionOperator = evaluateConditionOperator;
|
|
|
48273
47698
|
exports.evaluateEqualityOperator = evaluateEqualityOperator;
|
|
48274
47699
|
exports.evaluateNumericOperator = evaluateNumericOperator;
|
|
48275
47700
|
exports.evaluateStringOperator = evaluateStringOperator;
|
|
48276
|
-
exports.featureFlagMapper = featureFlagMapper;
|
|
48277
47701
|
exports.formatDate = formatDate;
|
|
48278
47702
|
exports.generateCorrelationId = generateCorrelationId;
|
|
48279
47703
|
exports.generateId = generateId;
|