@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.
@@ -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 fs = require('fs');
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, CoreEventManager;
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
- exports.BaseFrontendDomainService = void 0;
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
- exports.BaseFrontendDomainService = class extends exports.BaseDomainService {
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; exports.ExampleMapper = void 0;
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
- exports.ExampleMapper = new ExampleMapperClass();
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: () => exports.FrontendExampleDomainService
7597
+ FrontendExampleDomainService: () => FrontendExampleDomainService
7601
7598
  });
7602
- var DEFAULT_POLLING_INTERVAL_MS; exports.FrontendExampleDomainService = void 0;
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
- exports.FrontendExampleDomainService = class _FrontendExampleDomainService extends exports.BaseFrontendDomainService {
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; exports.ExampleValidator = void 0;
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
- exports.ExampleValidator = new ExampleValidatorClass();
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 parse2(text, options, metadata) {
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(parse2, "parse");
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 parse2(text, _objectSpread2(_objectSpread2({}, options), {}, {
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/domain/index.ts
42211
- init_base();
42212
- var FeatureFlagService = class {
42213
- constructor(provider, config) {
42214
- this.provider = provider;
42215
- this.config = config;
42216
- this.logger = new logger$1.PackageLogger({
42217
- packageName: "core",
42218
- service: "FeatureFlagService"
42219
- });
42220
- this.isInitialized = false;
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/domain/featureFlags/provider.ts
43031
+ // src/base/index.ts
43191
43032
  init_cache();
43192
- var FeatureFlagProvider = class {
43193
- /**
43194
- * Creates a new feature flag provider.
43195
- *
43196
- * @param config - Provider configuration
43197
- * @param features - Record of feature flag keys to their default values
43198
- */
43199
- constructor(config, features) {
43200
- this.config = config;
43201
- this.subscribers = /* @__PURE__ */ new Set();
43202
- this.isInitialized = false;
43203
- this.features = features;
43204
- this.engine = new FeatureFlagEngine(features, config.isLoggingEnabled ?? false);
43205
- this.cacheManager = new exports.CacheManager({
43206
- isEnabled: config.isCacheEnabled,
43207
- ttl: config.cacheTtl,
43208
- strategy: "memory"
43209
- // Default to memory, can be overridden
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, "FeatureFlagProvider");
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
- * Initializes the provider by loading initial data.
43218
- *
43219
- * @returns Promise that resolves when initialization is complete
43210
+ * Check if service is available
43220
43211
  */
43221
- async initialize() {
43222
- if (this.isInitialized) {
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
- * Performs the actual initialization work.
43233
- *
43234
- * @private
43235
- * @returns Promise that resolves when initialization is complete
43216
+ * Dispose/cleanup the service
43236
43217
  */
43237
- async doInitialize() {
43238
- try {
43239
- await this.refresh();
43240
- this.isInitialized = true;
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
- * Gets a feature flag evaluation for the specified key and context.
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 - The feature flag key
43252
- * @param context - Optional context for evaluation
43253
- * @returns Promise resolving to the flag evaluation
43243
+ * @param key - Feature flag key
43244
+ * @param context - Evaluation context (user, environment, etc.)
43245
+ * @returns Full evaluation result
43254
43246
  */
43255
- async getFlag(key, context) {
43256
- if (!this.isInitialized) {
43257
- await this.initialize();
43258
- }
43259
- if (this.config.isCacheEnabled) {
43260
- const cacheKey = this.generateCacheKey(key, context);
43261
- const cached = await this.cacheManager.get(cacheKey);
43262
- if (cached) {
43263
- return cached;
43264
- }
43265
- const evaluation = this.engine.evaluate(key, context);
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
- * Checks if a feature flag is enabled.
43261
+ * Check if a feature flag is enabled
43273
43262
  *
43274
- * @param key - The feature flag key
43275
- * @param context - Optional context for evaluation
43276
- * @returns Promise resolving to boolean indicating if flag is enabled
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
- const evaluation = await this.getFlag(key, context);
43280
- return evaluation.isEnabled;
43268
+ this.assertReady();
43269
+ const evalContext = context ?? this.config.defaultContext;
43270
+ return this.provider.isEnabled(key, evalContext);
43281
43271
  }
43282
43272
  /**
43283
- * Gets the value of a feature flag.
43273
+ * Get the value of a feature flag
43284
43274
  *
43285
- * @template T - The expected type of the flag value
43286
- * @param key - The feature flag key
43287
- * @param context - Optional context for evaluation
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
- const evaluation = await this.getFlag(key, context);
43292
- return evaluation.value;
43280
+ this.assertReady();
43281
+ const evalContext = context ?? this.config.defaultContext;
43282
+ return this.provider.getValue(key, evalContext);
43293
43283
  }
43294
43284
  /**
43295
- * Gets all feature flag evaluations for the given context.
43285
+ * Evaluate all feature flags for a context
43296
43286
  *
43297
- * @param context - Optional context for evaluation
43298
- * @returns Promise resolving to record of flag evaluations
43287
+ * @param context - Evaluation context
43288
+ * @returns Record of all flag evaluations
43299
43289
  */
43300
- async getAllFlags(context) {
43301
- if (!this.isInitialized) {
43302
- await this.initialize();
43303
- }
43304
- const results = {};
43305
- for (const key of Object.keys(this.features)) {
43306
- results[key] = await this.getFlag(key, context);
43307
- }
43308
- const engineFlags = this.engine.getFlags();
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
- * Refreshes the provider by fetching latest data from the source.
43305
+ * Create a new feature flag
43318
43306
  *
43319
- * @returns Promise that resolves when refresh is complete
43307
+ * @param data - Flag creation data
43308
+ * @returns The created feature flag
43320
43309
  */
43321
- async refresh() {
43310
+ async create(data) {
43311
+ this.assertReady();
43312
+ exports.CoreEventManager.emit("featureFlag:backend:creating", { data });
43322
43313
  try {
43323
- const { flags, rules } = await this.fetchData();
43324
- this.engine.setFlags(flags);
43325
- this.engine.setRules(rules);
43326
- await this.cacheManager.clear();
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
- this.log("Failed to refresh provider:", error);
43319
+ exports.CoreEventManager.emit("featureFlag:backend:create:error", { error, data });
43331
43320
  throw error;
43332
43321
  }
43333
43322
  }
43334
43323
  /**
43335
- * Subscribes to provider updates.
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
- var FrontendFeatureFlagDomainService = class _FrontendFeatureFlagDomainService extends exports.BaseFrontendDomainService {
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
- var featureFlagMapper = new FeatureFlagMapper();
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;