@plyaz/core 1.10.1 → 1.11.1

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.
Files changed (36) hide show
  1. package/dist/base/observability/DatadogAdapter.d.ts.map +1 -1
  2. package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -1
  3. package/dist/domain/featureFlags/module.d.ts.map +1 -1
  4. package/dist/domain/files/BackendFilesDomainService.d.ts +10 -13
  5. package/dist/domain/files/BackendFilesDomainService.d.ts.map +1 -1
  6. package/dist/entry-backend.js +382 -200
  7. package/dist/entry-backend.js.map +1 -1
  8. package/dist/entry-backend.mjs +280 -98
  9. package/dist/entry-backend.mjs.map +1 -1
  10. package/dist/entry-frontend-browser.js +122 -35
  11. package/dist/entry-frontend-browser.js.map +1 -1
  12. package/dist/entry-frontend-browser.mjs +123 -33
  13. package/dist/entry-frontend-browser.mjs.map +1 -1
  14. package/dist/entry-frontend.js +122 -35
  15. package/dist/entry-frontend.js.map +1 -1
  16. package/dist/entry-frontend.mjs +123 -33
  17. package/dist/entry-frontend.mjs.map +1 -1
  18. package/dist/frontend/providers/PlyazProvider.d.ts +1 -3
  19. package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -1
  20. package/dist/index.js +1339 -1134
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +1290 -1085
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/init/CoreInitializer.d.ts +31 -1
  25. package/dist/init/CoreInitializer.d.ts.map +1 -1
  26. package/dist/init/nestjs/index.js +126 -14
  27. package/dist/init/nestjs/index.js.map +1 -1
  28. package/dist/init/nestjs/index.mjs +127 -15
  29. package/dist/init/nestjs/index.mjs.map +1 -1
  30. package/dist/services/DbService.d.ts +12 -0
  31. package/dist/services/DbService.d.ts.map +1 -1
  32. package/dist/services/NotificationService.d.ts +8 -0
  33. package/dist/services/NotificationService.d.ts.map +1 -1
  34. package/dist/services/StorageService.d.ts +8 -0
  35. package/dist/services/StorageService.d.ts.map +1 -1
  36. package/package.json +3 -3
@@ -7,7 +7,7 @@ import { generateRequestId, CorePackageError, BaseError, initializeErrorSystem,
7
7
  import { ERROR_CODES as ERROR_CODES$1, ERROR_CATEGORY as ERROR_CATEGORY$1, DATABASE_ERROR_CODES } from '@plyaz/types/errors';
8
8
  import { OBSERVABILITY_METRICS } from '@plyaz/types/observability';
9
9
  import { clearEventEmitter, setEventEmitter, initializeGlobalErrorHandler } from '@plyaz/errors/middleware';
10
- import { STORE_KEYS, useRootStore, createStandaloneFeatureFlagStore } from '@plyaz/store';
10
+ import { STORE_KEYS, createStandaloneFeatureFlagStore } from '@plyaz/store';
11
11
  import { CORE_EVENTS as CORE_EVENTS$1 } from '@plyaz/types/core';
12
12
  import { createDatabaseService } from '@plyaz/db';
13
13
 
@@ -969,7 +969,7 @@ var LoggerAdapter = class extends BaseAdapter {
969
969
  let status = "unset";
970
970
  let statusMessage;
971
971
  const logSpans = this.logSpans;
972
- const logger2 = this.observabilityLogger;
972
+ const logger3 = this.observabilityLogger;
973
973
  return {
974
974
  context,
975
975
  setAttribute: /* @__PURE__ */ __name((key, value) => {
@@ -981,7 +981,7 @@ var LoggerAdapter = class extends BaseAdapter {
981
981
  addEvent: /* @__PURE__ */ __name((event) => {
982
982
  events.push(event);
983
983
  if (logSpans) {
984
- logger2.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {
984
+ logger3.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {
985
985
  traceId: context.traceId,
986
986
  spanId: context.spanId,
987
987
  eventAttributes: event.attributes
@@ -996,7 +996,7 @@ var LoggerAdapter = class extends BaseAdapter {
996
996
  const duration = (endTime ?? Date.now()) - startTime;
997
997
  if (logSpans) {
998
998
  const logMethod = status === "error" ? "warn" : "debug";
999
- logger2[logMethod](`[SPAN END] ${options.name}`, {
999
+ logger3[logMethod](`[SPAN END] ${options.name}`, {
1000
1000
  traceId: context.traceId,
1001
1001
  spanId: context.spanId,
1002
1002
  durationMs: duration,
@@ -1009,7 +1009,7 @@ var LoggerAdapter = class extends BaseAdapter {
1009
1009
  }, "end"),
1010
1010
  recordException: /* @__PURE__ */ __name((error) => {
1011
1011
  if (logSpans) {
1012
- logger2.error(`[SPAN ERROR] ${options.name}`, {
1012
+ logger3.error(`[SPAN ERROR] ${options.name}`, {
1013
1013
  traceId: context.traceId,
1014
1014
  spanId: context.spanId,
1015
1015
  error: error.message,
@@ -2500,6 +2500,24 @@ var Core = class _Core {
2500
2500
  */
2501
2501
  this._rootStore = null;
2502
2502
  }
2503
+ static {
2504
+ /**
2505
+ * Injected store hook for frontend (set via setRootStoreHook before initialize).
2506
+ * This is used instead of directly importing from @plyaz/store to prevent
2507
+ * duplicate store instances when bundlers create multiple module copies.
2508
+ */
2509
+ this._injectedStoreHook = null;
2510
+ }
2511
+ /**
2512
+ * Set the root store hook for frontend use.
2513
+ * Must be called before Core.initialize() when running in browser.
2514
+ * PlyazProvider calls this automatically with the store prop.
2515
+ *
2516
+ * @param store - The useRootStore hook from @plyaz/store
2517
+ */
2518
+ static setRootStoreHook(store) {
2519
+ _Core._injectedStoreHook = store;
2520
+ }
2503
2521
  /**
2504
2522
  * Setup environment and context
2505
2523
  */
@@ -3410,8 +3428,14 @@ var Core = class _Core {
3410
3428
  static async initializeRootStore(config, verbose) {
3411
3429
  const isFrontend = typeof window !== "undefined";
3412
3430
  if (isFrontend) {
3413
- _Core.log("Using frontend root store (Zustand)", verbose);
3414
- _Core._rootStore = useRootStore;
3431
+ if (!_Core._injectedStoreHook) {
3432
+ throw new CorePackageError(
3433
+ "Root store hook not set. Call Core.setRootStoreHook(useRootStore) before Core.initialize(), or use PlyazProvider with the store prop: <PlyazProvider store={useRootStore} ...>",
3434
+ ERROR_CODES.CLIENT_INITIALIZATION_FAILED
3435
+ );
3436
+ }
3437
+ _Core.log("Using frontend root store (Zustand) - injected via setRootStoreHook", verbose);
3438
+ _Core._rootStore = _Core._injectedStoreHook;
3415
3439
  } else {
3416
3440
  _Core.log("Creating backend composite store (in-memory)", verbose);
3417
3441
  const ServerErrorMiddleware = getCoreDependency("ServerErrorMiddleware");
@@ -3520,26 +3544,76 @@ var Core = class _Core {
3520
3544
  errorStore,
3521
3545
  _Core.buildErrorHandlerConfig(_Core._errorConfig)
3522
3546
  );
3547
+ _Core.setupErrorEventSubscription(verbose);
3548
+ _Core.setupErrorStoreSubscription(verbose);
3549
+ _Core.log("Global error handler initialized with CoreEventManager integration", verbose);
3550
+ if (_Core._errorConfig.httpHandler !== false) {
3551
+ await _Core.createHttpErrorHandler(_Core._errorConfig, verbose);
3552
+ }
3553
+ }
3554
+ /**
3555
+ * Log serialized errors with full details.
3556
+ */
3557
+ static logErrors(errors, prefix = "ErrorStore") {
3558
+ for (const err of errors) {
3559
+ _Core.logger.error(`[${prefix}] ${err.code}: ${err.message}`, {
3560
+ id: err.id,
3561
+ code: err.code,
3562
+ message: err.message,
3563
+ category: err.category,
3564
+ source: err.source,
3565
+ status: err.status,
3566
+ isRetryable: err.isRetryable,
3567
+ context: err.context,
3568
+ timestamp: err.timestamp
3569
+ });
3570
+ }
3571
+ }
3572
+ /**
3573
+ * Setup SYSTEM.ERROR event subscription for error store updates.
3574
+ * Backend: Also logs errors with full details.
3575
+ * Frontend: Only updates store (logging handled by store subscription).
3576
+ */
3577
+ static setupErrorEventSubscription(verbose) {
3578
+ const isBackend = BACKEND_RUNTIMES.includes(_Core._coreServices.runtime);
3523
3579
  const errorEventCleanup = CoreEventManager.on(
3524
3580
  CORE_EVENTS$1.SYSTEM.ERROR,
3525
3581
  (event) => {
3526
3582
  if (!_Core._rootStore) return;
3527
3583
  try {
3528
3584
  const { errors } = event.data;
3529
- if (errors && errors.length > 0) {
3530
- _Core._rootStore.getState().errors.addErrors(errors);
3531
- _Core.log(`Added ${errors.length} error(s) to store`, verbose);
3532
- }
3585
+ if (!errors || errors.length === 0) return;
3586
+ _Core._rootStore.getState().errors.addErrors(errors);
3587
+ if (isBackend) _Core.logErrors(errors);
3588
+ _Core.log(`Added ${errors.length} error(s) to store`, verbose);
3533
3589
  } catch (e) {
3534
3590
  _Core.logger.error("Failed to handle error event", { error: e });
3535
3591
  }
3536
3592
  }
3537
3593
  );
3538
3594
  _Core._eventCleanupFns.push(errorEventCleanup);
3539
- _Core.log("Global error handler initialized with CoreEventManager integration", verbose);
3540
- if (_Core._errorConfig.httpHandler !== false) {
3541
- await _Core.createHttpErrorHandler(_Core._errorConfig, verbose);
3542
- }
3595
+ }
3596
+ /**
3597
+ * Setup error store subscription for frontend logging.
3598
+ * Logs new errors when they're added to the store.
3599
+ * Only active for non-backend runtimes (browser, nextjs, nuxt, edge).
3600
+ */
3601
+ static setupErrorStoreSubscription(verbose) {
3602
+ const isFrontend = !BACKEND_RUNTIMES.includes(_Core._coreServices.runtime);
3603
+ if (!isFrontend || !_Core._rootStore) return;
3604
+ let prevErrorCount = 0;
3605
+ const storeUnsubscribe = _Core._rootStore.subscribe((state) => {
3606
+ const currentCount = state.errors.errorCount;
3607
+ if (currentCount <= prevErrorCount) {
3608
+ prevErrorCount = currentCount;
3609
+ return;
3610
+ }
3611
+ const newErrors = state.errors.errors.slice(0, currentCount - prevErrorCount);
3612
+ _Core.logErrors(newErrors, "ErrorStore:FE");
3613
+ prevErrorCount = currentCount;
3614
+ });
3615
+ _Core._eventCleanupFns.push(storeUnsubscribe);
3616
+ _Core.log("Error store subscription initialized for frontend", verbose);
3543
3617
  }
3544
3618
  /**
3545
3619
  * Create HTTP error handler based on detected runtime.
@@ -3727,6 +3801,7 @@ var Core = class _Core {
3727
3801
  _Core.log("Feature flags initialized", verbose);
3728
3802
  }
3729
3803
  };
3804
+ var logger2 = new PackageLogger({ packageName: "core", service: "DbService" });
3730
3805
  var DEFAULT_ENCRYPTION_FIELDS = {
3731
3806
  // User PII
3732
3807
  users: ["password_hash", "phone_number", "date_of_birth"],
@@ -3820,6 +3895,41 @@ var DbService = class _DbService {
3820
3895
  };
3821
3896
  CoreEventManager.emit(CORE_EVENTS$1.DATABASE.ERROR, payload);
3822
3897
  }
3898
+ /**
3899
+ * Creates merged event handlers that wrap user-provided handlers.
3900
+ * Adds Core-level logging and forwards to user handlers.
3901
+ *
3902
+ * Note: Unlike StorageService/NotificationService, DB events don't emit
3903
+ * to CoreEventManager by default (too verbose). User handlers can emit
3904
+ * if needed.
3905
+ *
3906
+ * @param userHandlers - User-provided event handlers from config
3907
+ * @returns Merged handlers with Core logging + user handlers
3908
+ */
3909
+ static createMergedEventHandlers(userHandlers) {
3910
+ return {
3911
+ ...userHandlers,
3912
+ onAfterWrite: /* @__PURE__ */ __name(async (event) => {
3913
+ logger2.debug("Database write completed", {
3914
+ operation: event.operation,
3915
+ table: event.table,
3916
+ duration: event.duration
3917
+ });
3918
+ if (userHandlers?.onAfterWrite) {
3919
+ await userHandlers.onAfterWrite(event);
3920
+ }
3921
+ }, "onAfterWrite"),
3922
+ onAfterRead: /* @__PURE__ */ __name(async (event) => {
3923
+ logger2.debug("Database read completed", {
3924
+ table: event.table,
3925
+ duration: event.duration
3926
+ });
3927
+ if (userHandlers?.onAfterRead) {
3928
+ await userHandlers.onAfterRead(event);
3929
+ }
3930
+ }, "onAfterRead")
3931
+ };
3932
+ }
3823
3933
  /**
3824
3934
  * Gets the singleton instance of DbService
3825
3935
  *
@@ -4024,6 +4134,8 @@ var DbService = class _DbService {
4024
4134
  if (cache) dbConfig.cache = cache;
4025
4135
  if (audit) dbConfig.audit = audit;
4026
4136
  if (encryption) dbConfig.encryption = encryption;
4137
+ const events = _DbService.createMergedEventHandlers(config.events);
4138
+ if (events) dbConfig.events = events;
4027
4139
  return dbConfig;
4028
4140
  }
4029
4141
  /**