@plyaz/core 1.2.0 → 1.2.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 (238) hide show
  1. package/dist/adapters/index.d.ts +16 -0
  2. package/dist/adapters/index.d.ts.map +1 -0
  3. package/dist/adapters/nestjs.d.ts +79 -0
  4. package/dist/adapters/nestjs.d.ts.map +1 -0
  5. package/dist/adapters/nextjs.d.ts +28 -0
  6. package/dist/adapters/nextjs.d.ts.map +1 -0
  7. package/dist/backend/example/example.controller.d.ts +121 -0
  8. package/dist/backend/example/example.controller.d.ts.map +1 -0
  9. package/dist/backend/example/example.module.d.ts +29 -0
  10. package/dist/backend/example/example.module.d.ts.map +1 -0
  11. package/dist/backend/example/index.d.ts +8 -0
  12. package/dist/backend/example/index.d.ts.map +1 -0
  13. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts +150 -0
  14. package/dist/backend/featureFlags/FeatureFlagDomainService.d.ts.map +1 -0
  15. package/dist/backend/featureFlags/config/feature-flag.config.d.ts +28 -50
  16. package/dist/backend/featureFlags/config/feature-flag.config.d.ts.map +1 -1
  17. package/dist/backend/featureFlags/config/validation.d.ts +6 -6
  18. package/dist/backend/featureFlags/config/validation.d.ts.map +1 -1
  19. package/dist/backend/featureFlags/feature-flag.controller.d.ts +14 -55
  20. package/dist/backend/featureFlags/feature-flag.controller.d.ts.map +1 -1
  21. package/dist/backend/featureFlags/feature-flag.module.d.ts +36 -43
  22. package/dist/backend/featureFlags/feature-flag.module.d.ts.map +1 -1
  23. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts +16 -2
  24. package/dist/backend/featureFlags/guards/feature-flag.guard.d.ts.map +1 -1
  25. package/dist/backend/featureFlags/index.d.ts +6 -7
  26. package/dist/backend/featureFlags/index.d.ts.map +1 -1
  27. package/dist/backend/featureFlags/interceptors/error-handling-interceptor.d.ts.map +1 -1
  28. package/dist/backend/featureFlags/interceptors/feature-flag-logging-interceptor.d.ts.map +1 -1
  29. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts +6 -11
  30. package/dist/backend/featureFlags/middleware/feature-flag-middleware.d.ts.map +1 -1
  31. package/dist/backend/index.d.ts +5 -0
  32. package/dist/backend/index.d.ts.map +1 -1
  33. package/dist/base/cache/CacheKeyBuilder.d.ts +115 -0
  34. package/dist/base/cache/CacheKeyBuilder.d.ts.map +1 -0
  35. package/dist/base/cache/index.d.ts +1 -0
  36. package/dist/base/cache/index.d.ts.map +1 -1
  37. package/dist/base/cache/strategies/redis.d.ts.map +1 -1
  38. package/dist/base/observability/BaseAdapter.d.ts +79 -0
  39. package/dist/base/observability/BaseAdapter.d.ts.map +1 -0
  40. package/dist/base/observability/CompositeAdapter.d.ts +72 -0
  41. package/dist/base/observability/CompositeAdapter.d.ts.map +1 -0
  42. package/dist/base/observability/DatadogAdapter.d.ts +117 -0
  43. package/dist/base/observability/DatadogAdapter.d.ts.map +1 -0
  44. package/dist/base/observability/LoggerAdapter.d.ts +54 -0
  45. package/dist/base/observability/LoggerAdapter.d.ts.map +1 -0
  46. package/dist/base/observability/ObservabilityService.d.ts +160 -0
  47. package/dist/base/observability/ObservabilityService.d.ts.map +1 -0
  48. package/dist/base/observability/index.d.ts +17 -0
  49. package/dist/base/observability/index.d.ts.map +1 -0
  50. package/dist/domain/base/BaseBackendDomainService.d.ts +528 -0
  51. package/dist/domain/base/BaseBackendDomainService.d.ts.map +1 -0
  52. package/dist/domain/base/BaseDomainService.d.ts +284 -0
  53. package/dist/domain/base/BaseDomainService.d.ts.map +1 -0
  54. package/dist/domain/base/BaseFrontendDomainService.d.ts +493 -0
  55. package/dist/domain/base/BaseFrontendDomainService.d.ts.map +1 -0
  56. package/dist/domain/base/BaseMapper.d.ts +100 -0
  57. package/dist/domain/base/BaseMapper.d.ts.map +1 -0
  58. package/dist/domain/base/BaseValidator.d.ts +105 -0
  59. package/dist/domain/base/BaseValidator.d.ts.map +1 -0
  60. package/dist/domain/base/index.d.ts +10 -0
  61. package/dist/domain/base/index.d.ts.map +1 -0
  62. package/dist/domain/example/BackendExampleDomainService.d.ts +257 -0
  63. package/dist/domain/example/BackendExampleDomainService.d.ts.map +1 -0
  64. package/dist/domain/example/FrontendExampleDomainService.d.ts +164 -0
  65. package/dist/domain/example/FrontendExampleDomainService.d.ts.map +1 -0
  66. package/dist/domain/example/index.d.ts +10 -0
  67. package/dist/domain/example/index.d.ts.map +1 -0
  68. package/dist/domain/example/mappers/ExampleMapper.d.ts +67 -0
  69. package/dist/domain/example/mappers/ExampleMapper.d.ts.map +1 -0
  70. package/dist/domain/example/validators/ExampleValidator.d.ts +33 -0
  71. package/dist/domain/example/validators/ExampleValidator.d.ts.map +1 -0
  72. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts +86 -0
  73. package/dist/domain/featureFlags/FrontendFeatureFlagDomainService.d.ts.map +1 -0
  74. package/dist/domain/featureFlags/index.d.ts +10 -5
  75. package/dist/domain/featureFlags/index.d.ts.map +1 -1
  76. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts +72 -0
  77. package/dist/domain/featureFlags/mappers/FeatureFlagMapper.d.ts.map +1 -0
  78. package/dist/domain/featureFlags/mappers/index.d.ts +8 -0
  79. package/dist/domain/featureFlags/mappers/index.d.ts.map +1 -0
  80. package/dist/domain/featureFlags/module.d.ts +20 -0
  81. package/dist/domain/featureFlags/module.d.ts.map +1 -0
  82. package/dist/domain/featureFlags/provider.d.ts +40 -1
  83. package/dist/domain/featureFlags/provider.d.ts.map +1 -1
  84. package/dist/domain/featureFlags/providers/api.d.ts +59 -34
  85. package/dist/domain/featureFlags/providers/api.d.ts.map +1 -1
  86. package/dist/domain/featureFlags/providers/database.d.ts +48 -46
  87. package/dist/domain/featureFlags/providers/database.d.ts.map +1 -1
  88. package/dist/domain/featureFlags/providers/factory.d.ts +50 -33
  89. package/dist/domain/featureFlags/providers/factory.d.ts.map +1 -1
  90. package/dist/domain/featureFlags/providers/file.d.ts +48 -1
  91. package/dist/domain/featureFlags/providers/file.d.ts.map +1 -1
  92. package/dist/domain/featureFlags/providers/memory.d.ts +32 -6
  93. package/dist/domain/featureFlags/providers/memory.d.ts.map +1 -1
  94. package/dist/domain/featureFlags/providers/redis.d.ts +6 -1
  95. package/dist/domain/featureFlags/providers/redis.d.ts.map +1 -1
  96. package/dist/domain/featureFlags/service.d.ts +112 -0
  97. package/dist/domain/featureFlags/service.d.ts.map +1 -0
  98. package/dist/domain/index.d.ts +2 -0
  99. package/dist/domain/index.d.ts.map +1 -1
  100. package/dist/engine/featureFlags/engine.d.ts +8 -0
  101. package/dist/engine/featureFlags/engine.d.ts.map +1 -1
  102. package/dist/entry-backend.d.ts +24 -0
  103. package/dist/entry-backend.d.ts.map +1 -0
  104. package/dist/entry-backend.js +15635 -0
  105. package/dist/entry-backend.js.map +1 -0
  106. package/dist/entry-backend.mjs +15506 -0
  107. package/dist/entry-backend.mjs.map +1 -0
  108. package/dist/entry-frontend.d.ts +23 -0
  109. package/dist/entry-frontend.d.ts.map +1 -0
  110. package/dist/entry-frontend.js +11152 -0
  111. package/dist/entry-frontend.js.map +1 -0
  112. package/dist/entry-frontend.mjs +11089 -0
  113. package/dist/entry-frontend.mjs.map +1 -0
  114. package/dist/events/CoreEventManager.d.ts +116 -0
  115. package/dist/events/CoreEventManager.d.ts.map +1 -0
  116. package/dist/events/index.d.ts +27 -0
  117. package/dist/events/index.d.ts.map +1 -0
  118. package/dist/frontend/base/index.d.ts +8 -0
  119. package/dist/frontend/base/index.d.ts.map +1 -0
  120. package/dist/frontend/components/InitializationError.d.ts +25 -0
  121. package/dist/frontend/components/InitializationError.d.ts.map +1 -0
  122. package/dist/frontend/components/InitializationLoading.d.ts +22 -0
  123. package/dist/frontend/components/InitializationLoading.d.ts.map +1 -0
  124. package/dist/frontend/components/index.d.ts +9 -0
  125. package/dist/frontend/components/index.d.ts.map +1 -0
  126. package/dist/frontend/example/index.d.ts +9 -0
  127. package/dist/frontend/example/index.d.ts.map +1 -0
  128. package/dist/frontend/featureFlags/index.d.ts +28 -7
  129. package/dist/frontend/featureFlags/index.d.ts.map +1 -1
  130. package/dist/frontend/index.d.ts +4 -0
  131. package/dist/frontend/index.d.ts.map +1 -1
  132. package/dist/frontend/providers/ApiProvider.d.ts +2 -2
  133. package/dist/frontend/providers/ApiProvider.d.ts.map +1 -1
  134. package/dist/frontend/providers/PlyazProvider.d.ts +305 -0
  135. package/dist/frontend/providers/PlyazProvider.d.ts.map +1 -0
  136. package/dist/frontend/providers/index.d.ts +1 -0
  137. package/dist/frontend/providers/index.d.ts.map +1 -1
  138. package/dist/frontend/store/feature-flags.d.ts +63 -0
  139. package/dist/frontend/store/feature-flags.d.ts.map +1 -0
  140. package/dist/frontend/store/index.d.ts +14 -0
  141. package/dist/frontend/store/index.d.ts.map +1 -0
  142. package/dist/frontend/store/integrations.d.ts +36 -0
  143. package/dist/frontend/store/integrations.d.ts.map +1 -0
  144. package/dist/frontend/store/service-accessors.d.ts +78 -0
  145. package/dist/frontend/store/service-accessors.d.ts.map +1 -0
  146. package/dist/index.d.ts +5 -2
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +15450 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/index.mjs +13678 -4697
  151. package/dist/index.mjs.map +1 -1
  152. package/dist/init/CoreInitializer.d.ts +582 -0
  153. package/dist/init/CoreInitializer.d.ts.map +1 -0
  154. package/dist/init/ServiceRegistry.d.ts +256 -0
  155. package/dist/init/ServiceRegistry.d.ts.map +1 -0
  156. package/dist/init/index.d.ts +14 -0
  157. package/dist/init/index.d.ts.map +1 -0
  158. package/dist/init/nestjs/CoreModule.d.ts +63 -0
  159. package/dist/init/nestjs/CoreModule.d.ts.map +1 -0
  160. package/dist/init/nestjs/index.d.ts +5 -0
  161. package/dist/init/nestjs/index.d.ts.map +1 -0
  162. package/dist/init/nestjs/index.js +9059 -0
  163. package/dist/init/nestjs/index.js.map +1 -0
  164. package/dist/init/nestjs/index.mjs +9055 -0
  165. package/dist/init/nestjs/index.mjs.map +1 -0
  166. package/dist/init/react.d.ts +33 -0
  167. package/dist/init/react.d.ts.map +1 -0
  168. package/dist/models/example/ExampleRepository.d.ts +124 -0
  169. package/dist/models/example/ExampleRepository.d.ts.map +1 -0
  170. package/dist/models/example/index.d.ts +7 -0
  171. package/dist/models/example/index.d.ts.map +1 -0
  172. package/dist/{backend/featureFlags/database/repository.d.ts → models/featureFlags/FeatureFlagRepository.d.ts} +47 -5
  173. package/dist/models/featureFlags/FeatureFlagRepository.d.ts.map +1 -0
  174. package/dist/models/featureFlags/index.d.ts +7 -0
  175. package/dist/models/featureFlags/index.d.ts.map +1 -0
  176. package/dist/models/index.d.ts +9 -0
  177. package/dist/models/index.d.ts.map +1 -0
  178. package/dist/services/ApiClientService.d.ts +92 -4
  179. package/dist/services/ApiClientService.d.ts.map +1 -1
  180. package/dist/services/CacheService.d.ts +176 -0
  181. package/dist/services/CacheService.d.ts.map +1 -0
  182. package/dist/services/DbService.d.ts +391 -0
  183. package/dist/services/DbService.d.ts.map +1 -0
  184. package/dist/services/NotificationService.d.ts +151 -0
  185. package/dist/services/NotificationService.d.ts.map +1 -0
  186. package/dist/services/StorageService.d.ts +144 -0
  187. package/dist/services/StorageService.d.ts.map +1 -0
  188. package/dist/services/index.d.ts +4 -0
  189. package/dist/services/index.d.ts.map +1 -1
  190. package/dist/utils/common/id.d.ts +83 -0
  191. package/dist/utils/common/id.d.ts.map +1 -0
  192. package/dist/utils/common/index.d.ts +2 -0
  193. package/dist/utils/common/index.d.ts.map +1 -1
  194. package/dist/utils/common/object.d.ts +70 -0
  195. package/dist/utils/common/object.d.ts.map +1 -0
  196. package/dist/utils/featureFlags/conditions.d.ts.map +1 -1
  197. package/dist/utils/featureFlags/context.d.ts +0 -1
  198. package/dist/utils/featureFlags/context.d.ts.map +1 -1
  199. package/dist/utils/index.d.ts +1 -0
  200. package/dist/utils/index.d.ts.map +1 -1
  201. package/dist/utils/mapperUtils.d.ts +38 -0
  202. package/dist/utils/mapperUtils.d.ts.map +1 -0
  203. package/dist/utils/runtime.d.ts +15 -0
  204. package/dist/utils/runtime.d.ts.map +1 -0
  205. package/dist/version.d.ts +24 -0
  206. package/dist/version.d.ts.map +1 -0
  207. package/dist/web_app/auth/add_user.d.ts +2 -2
  208. package/dist/web_app/auth/add_user.d.ts.map +1 -1
  209. package/dist/web_app/auth/update_user.d.ts +1 -1
  210. package/dist/web_app/auth/update_user.d.ts.map +1 -1
  211. package/package.json +89 -15
  212. package/dist/backend/featureFlags/database/connection.d.ts +0 -321
  213. package/dist/backend/featureFlags/database/connection.d.ts.map +0 -1
  214. package/dist/backend/featureFlags/database/repository.d.ts.map +0 -1
  215. package/dist/backend/featureFlags/feature-flag.repository.d.ts +0 -85
  216. package/dist/backend/featureFlags/feature-flag.repository.d.ts.map +0 -1
  217. package/dist/backend/featureFlags/feature-flag.service.d.ts +0 -264
  218. package/dist/backend/featureFlags/feature-flag.service.d.ts.map +0 -1
  219. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts +0 -103
  220. package/dist/frontend/featureFlags/hooks/useFeatureFlag.d.ts.map +0 -1
  221. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts +0 -35
  222. package/dist/frontend/featureFlags/hooks/useFeatureFlagActions.d.ts.map +0 -1
  223. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts +0 -55
  224. package/dist/frontend/featureFlags/hooks/useFeatureFlagHelpers.d.ts.map +0 -1
  225. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts +0 -57
  226. package/dist/frontend/featureFlags/hooks/useFeatureFlagProvider.d.ts.map +0 -1
  227. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts +0 -99
  228. package/dist/frontend/featureFlags/providers/FeatureFlagProvider.d.ts.map +0 -1
  229. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts +0 -31
  230. package/dist/frontend/featureFlags/providers/FeatureFlagProviderHelpers.d.ts.map +0 -1
  231. package/dist/frontend/featureFlags/providers/types.d.ts +0 -21
  232. package/dist/frontend/featureFlags/providers/types.d.ts.map +0 -1
  233. package/dist/index.cjs +0 -6435
  234. package/dist/index.cjs.map +0 -1
  235. package/dist/utils/db/databaseService.d.ts +0 -6
  236. package/dist/utils/db/databaseService.d.ts.map +0 -1
  237. package/dist/utils/db/index.d.ts +0 -2
  238. package/dist/utils/db/index.d.ts.map +0 -1
@@ -0,0 +1,493 @@
1
+ /**
2
+ * Base Frontend Domain Service
3
+ *
4
+ * Extends BaseDomainService with common frontend patterns:
5
+ * - **Primary/Read Store Pattern**: Services have ONE primary store (mutate) + multiple read stores (read-only)
6
+ * - **Automatic Store Injection**: Stores injected by ServiceRegistry from root store
7
+ * - **Automatic Loading State**: Managed via setStoresLoading() on primary store
8
+ * - **Generic CRUD Operations**: With fetchers from @plyaz/api
9
+ * - **Event Emission**: Typed event payloads via CoreEventManager
10
+ * - **Automatic DTO Mapping**: Via mapper classes
11
+ *
12
+ * ## Store Architecture (NEW)
13
+ *
14
+ * ### Primary Store (Mutate)
15
+ * - Service has ONE primary store defined by `store: 'campaigns'` config
16
+ * - Can call: setData(), updateData(), setLoading()
17
+ * - syncToStores() syncs ONLY to primary store
18
+ * - Access via: this.primaryStore
19
+ *
20
+ * ### Read Stores (Read-Only)
21
+ * - Service can read from multiple stores: `readStores: ['users', 'error', 'featureFlags']`
22
+ * - Can read state but should NOT call mutation methods
23
+ * - Used for cross-domain data access (e.g., campaign service reading user data)
24
+ * - Access via: this.getReadStore('users')
25
+ *
26
+ * ### All Stores from Root Store
27
+ * - All stores (domain + global) are slices of ONE root Zustand store
28
+ * - Automatically reactive - changes propagate to subscribers (React components)
29
+ * - Error/featureFlags are built-in, domain stores added dynamically
30
+ *
31
+ * Frontend domain services should extend this class instead of BaseDomainService
32
+ * to get automatic store integration and CRUD capabilities.
33
+ *
34
+ * All generic type parameters for full type safety:
35
+ * - TConfig: Service configuration type
36
+ * - TStore: Store interface type
37
+ * - TData: Data type for store sync
38
+ * - TEntity: Domain entity type
39
+ * - TResponseDTO: API response DTO type (snake_case)
40
+ * - TCreateDTO: Create request DTO type
41
+ * - TPatchDTO: Patch request DTO type (partial update)
42
+ * - TQueryDTO: Query/filter DTO type for fetchAll
43
+ * - TStoreState: Serializable store state type
44
+ * - TMapper: Mapper instance type
45
+ * - TValidator: Optional validator type
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * class MyFrontendService extends BaseFrontendDomainService<
50
+ * MyConfig,
51
+ * MyStore,
52
+ * MyStoreData,
53
+ * MyEntity,
54
+ * MyResponseDTO,
55
+ * CreateMyDTO,
56
+ * PatchMyDTO,
57
+ * QueryMyDTO,
58
+ * MyStoreState,
59
+ * MyMapper
60
+ * > {
61
+ * protected eventPrefix = 'myDomain';
62
+ * protected mapper: MyMapper;
63
+ *
64
+ * constructor(config: MyConfig) {
65
+ * super({ ... mapperClass: MyMapperClass });
66
+ * this.mapper = new MyMapperClass();
67
+ * }
68
+ *
69
+ * // All CRUD methods inherited!
70
+ * // - fetchAll(query?)
71
+ * // - fetchById(id)
72
+ * // - create(data)
73
+ * // - update(id, data)
74
+ * // - delete(id)
75
+ * }
76
+ * ```
77
+ */
78
+ import { BaseDomainService } from '../../domain/base';
79
+ import { CorePackageError } from '@plyaz/errors';
80
+ import type { RootStoreSlice } from '@plyaz/types/store';
81
+ import type { CoreEntityCreatingPayload, CoreEntityCreatedPayload, CoreEntityPatchingPayload, CoreEntityPatchedPayload, CoreEntityDeletingPayload, CoreEntityDeletedPayload, CoreEntityErrorPayload, CoreEntityCompletePayload } from '@plyaz/types/core';
82
+ export type { CoreBaseFrontendStore, CoreBaseFrontendServiceConfig, CoreBaseFrontendServiceConstructorConfig, CoreStoreHandlers, } from '@plyaz/types/core';
83
+ import type { CoreBaseFrontendStore, CoreBaseFrontendServiceConfig, CoreBaseFrontendServiceConstructorConfig, CoreBaseMapperInstance, CoreBaseValidatorInstance, CoreStoreHandlers, CoreOptimisticUpdateConfig } from '@plyaz/types/core';
84
+ /**
85
+ * Base type for frontend event payloads
86
+ * All frontend event payloads should extend this
87
+ */
88
+ type BaseFrontendEventPayload = CoreEntityCreatingPayload<unknown> | CoreEntityCreatedPayload<unknown, unknown> | CoreEntityPatchingPayload<unknown> | CoreEntityPatchedPayload<unknown, unknown> | CoreEntityDeletingPayload | CoreEntityDeletedPayload | CoreEntityErrorPayload | CoreEntityCompletePayload | Record<string, unknown>;
89
+ /**
90
+ * Abstract base class for frontend domain services with store integration and CRUD operations.
91
+ *
92
+ * Extends BaseDomainService with:
93
+ * - Multi-store connection management
94
+ * - Automatic sync to connected stores
95
+ * - Loading/error state propagation
96
+ * - Generic CRUD operations (fetchAll, fetchById, create, update, delete)
97
+ * - Event emission with typed payloads
98
+ * - Automatic DTO mapping via mapper
99
+ *
100
+ * @typeParam TConfig - Service configuration type
101
+ * @typeParam TStore - Store interface type
102
+ * @typeParam TData - Data type for store sync
103
+ * @typeParam TEntity - Domain entity type
104
+ * @typeParam TResponseDTO - API response DTO type
105
+ * @typeParam TCreateDTO - Create request DTO type
106
+ * @typeParam TPatchDTO - Patch request DTO type
107
+ * @typeParam TQueryDTO - Query/filter DTO type for fetchAll (default: unknown)
108
+ * @typeParam TStoreState - Serializable store state type
109
+ * @typeParam TMapper - Mapper instance type
110
+ * @typeParam TValidator - Optional validator type
111
+ * @typeParam TDeleteResult - Delete operation result type (default: void for backwards compatibility)
112
+ */
113
+ export declare abstract class BaseFrontendDomainService<TConfig extends CoreBaseFrontendServiceConfig<TData, TStore>, TStore extends CoreBaseFrontendStore<TData>, TData = Record<string, unknown>, TEntity = unknown, TResponseDTO = unknown, TCreateDTO = unknown, TPatchDTO extends Partial<unknown> = Partial<TCreateDTO>, TQueryDTO = unknown, TStoreState = TEntity, TMapper extends CoreBaseMapperInstance<TEntity, TResponseDTO, TCreateDTO, TCreateDTO, TPatchDTO, unknown, TStoreState> = CoreBaseMapperInstance<TEntity, TResponseDTO, TCreateDTO, TCreateDTO, TPatchDTO, unknown, TStoreState>, TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance, TDeleteResult = void> extends BaseDomainService<TConfig, TMapper, TValidator> {
114
+ /**
115
+ * Event prefix for all events emitted by this service
116
+ * E.g., 'example' → emits 'example:creating', 'example:created', etc.
117
+ *
118
+ * Required by subclasses
119
+ */
120
+ protected abstract eventPrefix: string;
121
+ /** Primary store - the main store this service can mutate */
122
+ private _primaryStore;
123
+ /**
124
+ * Primary store key - override in subclass to set default
125
+ * @example protected primaryStoreKey = STORE_KEYS.EXAMPLE;
126
+ */
127
+ protected primaryStoreKey?: string;
128
+ /** Read-only stores - can read but not mutate */
129
+ private readonly _readStores;
130
+ /**
131
+ * Read-only store keys - always includes error and featureFlags by default
132
+ * Override in subclass to add additional read stores
133
+ * @example protected readStoreKeys = [...super.readStoreKeys, STORE_KEYS.CAMPAIGNS];
134
+ */
135
+ protected readStoreKeys: string[];
136
+ /** Store handlers for custom store synchronization */
137
+ protected readonly storeHandlers?: CoreStoreHandlers<TData, TStore>;
138
+ /** Optimistic update configuration */
139
+ protected readonly optimisticConfig?: CoreOptimisticUpdateConfig;
140
+ /** Stack of previous states for rollback (LIFO) */
141
+ private readonly _rollbackStack;
142
+ /** Maximum rollback stack size */
143
+ private readonly _maxRollbackStackSize;
144
+ constructor(config: CoreBaseFrontendServiceConstructorConfig<TConfig, TStore, TData, TMapper, TValidator>);
145
+ /**
146
+ * Get the number of connected stores (primary + read stores).
147
+ */
148
+ get connectedStoreCount(): number;
149
+ /**
150
+ * Check if any stores are connected (primary or read).
151
+ */
152
+ get hasConnectedStores(): boolean;
153
+ /**
154
+ * Get primary store (protected).
155
+ * This is the store the service can mutate.
156
+ */
157
+ protected get primaryStore(): TStore | null;
158
+ /**
159
+ * Get a read-only store by key (protected).
160
+ * Can read state but should not call mutation methods.
161
+ *
162
+ * @param key - Store key (type-safe)
163
+ * @returns Store slice or undefined (auto-typed based on key)
164
+ */
165
+ protected getReadStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;
166
+ /**
167
+ * Get a specific store slice by key (protected).
168
+ *
169
+ * **Namespaced Root Store Architecture:**
170
+ * - All stores are slices merged into ONE Zustand root store
171
+ * - Each slice is namespaced (e.g., store.example, store.errors)
172
+ * - This returns the SPECIFIC slice for the given key
173
+ * - Type-safe: only valid store keys allowed
174
+ *
175
+ * **Usage Guidelines:**
176
+ * - Can mutate stores that are NOT in readStoreKeys
177
+ * - Should NOT mutate stores in readStoreKeys (errors, featureFlags by default)
178
+ * - Useful for cross-domain updates (e.g., campaign service updating user stats)
179
+ *
180
+ * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')
181
+ * @returns Specific store slice (fully typed based on key)
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * // In CampaignService
186
+ * protected async afterCreate(id: string, campaign: Campaign) {
187
+ * // Update primary store (campaigns)
188
+ * this.primaryStore.addItem(campaign);
189
+ *
190
+ * // Check feature flag (read-only) - auto-typed as FeatureFlagStoreSlice
191
+ * const flagsSlice = this.getStore('featureFlags'); // ✅ Type-safe!
192
+ * if (flagsSlice?.flags?.['update-user-stats']) {
193
+ * // Update user store (cross-domain mutation - OK since not read-only)
194
+ * const userSlice = this.getStore('users'); // ✅ Auto-typed!
195
+ * userSlice?.incrementCampaignCount(campaign.userId);
196
+ * }
197
+ * }
198
+ * ```
199
+ */
200
+ protected getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;
201
+ /**
202
+ * Sync data to primary store only (read stores are NOT updated).
203
+ * Uses setData (replace) or updateData (merge) based on `replace` parameter.
204
+ * If custom store handlers are configured, uses those instead of default behavior.
205
+ *
206
+ * @param data - Data to sync to primary store
207
+ * @param replace - If true, calls setData; if false, calls updateData
208
+ */
209
+ protected syncToStores(data: TData, replace?: boolean): void;
210
+ /**
211
+ * Set loading state on primary store only.
212
+ * Read stores are NOT affected.
213
+ *
214
+ * Automatically called by CRUD methods before and after API calls.
215
+ *
216
+ * @param isLoading - Loading state
217
+ */
218
+ protected setStoresLoading(isLoading: boolean): void;
219
+ /**
220
+ * Add entity to store (for create operations).
221
+ * Priority: storeHandlers.addData > store.addData
222
+ *
223
+ * @param entity - Entity to add
224
+ * @returns The converted store state (for reuse in event payloads)
225
+ */
226
+ protected addEntityToStore(entity: TEntity): TStoreState;
227
+ /**
228
+ * Update entity in store (for update operations).
229
+ * Priority: storeHandlers.updateDataById > store.updateDataById
230
+ *
231
+ * @param id - Entity ID
232
+ * @param entity - Updated entity
233
+ * @returns The converted store state (for reuse in event payloads)
234
+ */
235
+ protected updateEntityInStore(id: string, entity: TEntity): TStoreState;
236
+ /**
237
+ * Sync multiple entities to store using mapper.toStoreStateList.
238
+ * Converts entities to store format and syncs via setData (full replacement).
239
+ *
240
+ * @param entities - Entities to sync
241
+ * @returns Array of converted store states
242
+ */
243
+ protected syncEntitiesToStore(entities: TEntity[]): TStoreState[];
244
+ /**
245
+ * Remove entity from store by ID.
246
+ * Priority: storeHandlers.removeData > store.removeData
247
+ *
248
+ * @param id - Entity ID to remove
249
+ */
250
+ protected removeEntityFromStore(id: string): void;
251
+ /**
252
+ * Check if optimistic updates are enabled for an operation.
253
+ */
254
+ protected isOptimisticEnabled(operation: 'create' | 'update' | 'delete'): boolean;
255
+ /**
256
+ * Save current store state for potential rollback.
257
+ * Call this BEFORE making optimistic changes.
258
+ */
259
+ protected saveStateForRollback(operation: string): void;
260
+ /**
261
+ * Rollback to previous state on error.
262
+ * Call this when an optimistic update fails.
263
+ */
264
+ protected rollbackState(operation: string, error: Error): void;
265
+ /**
266
+ * Clear rollback state after successful operation.
267
+ * Call this when API succeeds.
268
+ */
269
+ protected clearRollbackState(operation: string): void;
270
+ /**
271
+ * Resolve conflict between optimistic and server state.
272
+ */
273
+ protected resolveConflict<T>(optimistic: T, server: T): T;
274
+ /**
275
+ * Fetch all entities from API
276
+ *
277
+ * Flow:
278
+ * 1. Assert service is ready
279
+ * 2. Check fetcher is available
280
+ * 3. Set stores loading
281
+ * 4. Emit 'fetching' event
282
+ * 5. Lifecycle hook: beforeFetchAll
283
+ * 6. Call fetcher (from @plyaz/api)
284
+ * 7. Map response DTOs to domain entities
285
+ * 8. Lifecycle hook: afterFetchAll
286
+ * 9. Emit 'fetched' event
287
+ * 10. Return entities
288
+ *
289
+ * Error Handling:
290
+ * - On API error: wrap and emit error event
291
+ * - Set error on all stores
292
+ * - Re-throw wrapped error
293
+ *
294
+ * @param query - Optional query/filter parameters (e.g., { status: 'active' })
295
+ * @param options - Optional service options for fetcher
296
+ * @returns Promise resolving to array of entities
297
+ * @throws CorePackageError if fetcher not configured or API call fails
298
+ *
299
+ * @example
300
+ * ```typescript
301
+ * // Fetch all entities
302
+ * const allItems = await service.fetchAll();
303
+ *
304
+ * // Fetch with filters
305
+ * const activeItems = await service.fetchAll({ status: 'active' });
306
+ *
307
+ * // Fetch with pagination
308
+ * const pagedItems = await service.fetchAll({ page: 2, limit: 10 });
309
+ * ```
310
+ */
311
+ fetchAll(query?: Partial<TQueryDTO>, options?: unknown): Promise<TEntity[]>;
312
+ /**
313
+ * Fetch single entity by ID from API
314
+ *
315
+ * @param id - Entity ID
316
+ * @param options - Optional service options for fetcher
317
+ * @returns Entity or null if not found
318
+ * @throws CorePackageError if fetcher not configured or API call fails
319
+ */
320
+ fetchById<TInput = string, TOptions = unknown>(id: TInput, options?: TOptions): Promise<TEntity | null>;
321
+ /**
322
+ * Create new entity
323
+ *
324
+ * Flow:
325
+ * 1. Assert service is ready
326
+ * 2. Check fetcher is available
327
+ * 3. Set stores loading
328
+ * 4. Emit 'creating' event
329
+ * 5. Lifecycle hook: beforeCreate
330
+ * 6. Map input data to create DTO (if mapper available)
331
+ * 7. [Optimistic] Save state and add to store BEFORE API call
332
+ * 8. Call create fetcher (from @plyaz/api)
333
+ * 9. Map response DTO to domain entity
334
+ * 10. [Optimistic] Resolve conflicts if needed
335
+ * 11. Lifecycle hook: afterCreate
336
+ * 12. Emit 'created' event
337
+ * 13. Return entity
338
+ *
339
+ * @param data - Create data (can be partial domain entity or DTO)
340
+ * @param options - Optional service options for fetcher
341
+ * @returns Created entity
342
+ * @throws CorePackageError if fetcher not configured or creation fails
343
+ */
344
+ create<TInput = unknown, TOptions = unknown>(data: TInput, options?: TOptions): Promise<TEntity>;
345
+ /**
346
+ * Update entity (partial update - PATCH)
347
+ *
348
+ * @param id - Entity ID
349
+ * @param data - Partial update data
350
+ * @param options - Optional service options for fetcher
351
+ * @returns Updated entity
352
+ * @throws CorePackageError if fetcher not configured or update fails
353
+ */
354
+ update<TInput = unknown, TOptions = unknown>(id: string, data: TInput, options?: TOptions): Promise<TEntity>;
355
+ /**
356
+ * Delete entity
357
+ *
358
+ * @param id - Entity ID
359
+ * @param options - Optional service options for fetcher
360
+ * @returns Delete operation result (type specified by TDeleteResult generic)
361
+ * @throws CorePackageError if fetcher not configured or deletion fails
362
+ */
363
+ delete<TInput = string, TOptions = unknown>(id: TInput, options?: TOptions): Promise<TDeleteResult>;
364
+ /**
365
+ * Emit event with automatic prefix
366
+ * Uses CoreEventManager under the hood
367
+ *
368
+ * @param event - Event name (without prefix)
369
+ * @param payload - Event payload
370
+ *
371
+ * @example
372
+ * ```typescript
373
+ * // If eventPrefix is 'example', this emits 'example:created'
374
+ * this.emitEvent('created', { entity, storeState });
375
+ * ```
376
+ */
377
+ protected emitEvent<TPayload extends BaseFrontendEventPayload>(event: string, payload: TPayload): void;
378
+ /**
379
+ * Called before fetchAll API call
380
+ * Override to add custom logic (e.g., cache check, validate query)
381
+ *
382
+ * @param query - Optional query/filter parameters
383
+ */
384
+ protected beforeFetchAll?(query?: Partial<TQueryDTO>): Promise<void>;
385
+ /**
386
+ * Called after fetchAll success
387
+ * Override to add custom logic (e.g., cache set, transform entities)
388
+ *
389
+ * @param entities - Fetched entities
390
+ * @param query - Optional query/filter parameters that were used
391
+ */
392
+ protected afterFetchAll?(entities: TEntity[], query?: Partial<TQueryDTO>): Promise<void>;
393
+ /**
394
+ * Called before fetchById API call
395
+ */
396
+ protected beforeFetchById?<TInput>(id: TInput): Promise<void>;
397
+ /**
398
+ * Called after fetchById success
399
+ */
400
+ protected afterFetchById?(entity: TEntity): Promise<void>;
401
+ /**
402
+ * Called before create API call
403
+ * Use this to modify data or validate before sending to API
404
+ */
405
+ protected beforeCreate?<TInput>(data: TInput): Promise<void>;
406
+ /**
407
+ * Called after create success
408
+ * Use this to update stores, show notifications, etc.
409
+ */
410
+ protected afterCreate?(entity: TEntity): Promise<void>;
411
+ /**
412
+ * Called before update API call
413
+ */
414
+ protected beforeUpdate?<TInput>(id: string, data: TInput): Promise<void>;
415
+ /**
416
+ * Called after update success
417
+ */
418
+ protected afterUpdate?(id: string, entity: TEntity): Promise<void>;
419
+ /**
420
+ * Called before delete API call
421
+ */
422
+ protected beforeDelete?<TInput>(id: TInput): Promise<void>;
423
+ /**
424
+ * Called after delete success
425
+ */
426
+ protected afterDelete?<TInput>(id: TInput): Promise<void>;
427
+ /**
428
+ * Called before OPTIONS request
429
+ *
430
+ * Use for custom logic before checking allowed methods/CORS headers.
431
+ *
432
+ * @param resource - Optional resource identifier or URL
433
+ */
434
+ protected beforeOptions?<TInput>(resource?: TInput): Promise<void>;
435
+ /**
436
+ * Called after OPTIONS request success
437
+ *
438
+ * Use for processing allowed methods/headers or logging.
439
+ *
440
+ * @param resource - Optional resource identifier or URL
441
+ * @param result - The OPTIONS response (allowed methods, CORS headers, etc.)
442
+ */
443
+ protected afterOptions?<TInput>(resource: TInput | undefined, result: unknown): Promise<void>;
444
+ /**
445
+ * Called before HEAD request
446
+ *
447
+ * Use for custom logic before checking resource existence/headers.
448
+ *
449
+ * @param resource - Optional resource identifier or URL
450
+ */
451
+ protected beforeHead?<TInput>(resource?: TInput): Promise<void>;
452
+ /**
453
+ * Called after HEAD request success
454
+ *
455
+ * Use for processing response headers or logging.
456
+ * Note: HEAD requests return no body, only headers.
457
+ *
458
+ * @param resource - Optional resource identifier or URL
459
+ * @param headers - Response headers (if available)
460
+ */
461
+ protected afterHead?<TInput>(resource: TInput | undefined, headers?: unknown): Promise<void>;
462
+ /**
463
+ * Wrap error in CorePackageError with context
464
+ *
465
+ * @param error - Original error
466
+ * @param operation - Operation that failed
467
+ * @param context - Additional context
468
+ * @returns Wrapped error
469
+ */
470
+ protected wrapError(error: unknown, operation: string, context?: Record<string, unknown>): CorePackageError;
471
+ /**
472
+ * Track a frontend operation with observability (span + metrics).
473
+ * Wraps an operation with automatic span creation, duration recording, and error tracking.
474
+ *
475
+ * @param operation - Operation name (fetchAll, fetchById, create, delete)
476
+ * @param entityId - Optional entity ID for context
477
+ * @param fn - The operation function to execute
478
+ * @returns Result of the operation
479
+ *
480
+ * @example
481
+ * ```typescript
482
+ * const entity = await this.trackOperation('create', undefined, async () => {
483
+ * return await this.config.fetchers.create(data);
484
+ * });
485
+ * ```
486
+ */
487
+ protected trackOperation<T>(operation: 'fetchAll' | 'fetchById' | 'create' | 'patch' | 'delete', entityId: string | undefined, fn: () => Promise<T>): Promise<T>;
488
+ /**
489
+ * Record operation metrics (duration and count).
490
+ */
491
+ private recordOperationMetrics;
492
+ }
493
+ //# sourceMappingURL=BaseFrontendDomainService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseFrontendDomainService.d.ts","sourceRoot":"","sources":["../../../src/domain/base/BaseFrontendDomainService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Base Mapper
3
+ *
4
+ * Abstract base class for domain mappers handling data transformation.
5
+ * Supports all HTTP operations with corresponding mapping methods.
6
+ *
7
+ * Mapping concerns:
8
+ * - Request mapping (domain → API DTO for POST, PUT, PATCH, DELETE)
9
+ * - Response mapping (API DTO → domain)
10
+ * - Store mapping (domain ↔ Zustand state)
11
+ * - Query mapping (filters → query params)
12
+ *
13
+ * Note: Validation is handled by BaseValidator, not here.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * class ExampleMapper extends BaseMapper<
18
+ * ExampleEntity, // Domain model
19
+ * ExampleResponseDTO, // API response
20
+ * CreateExampleDTO, // POST body
21
+ * UpdateExampleDTO, // PUT body
22
+ * PatchExampleDTO, // PATCH body
23
+ * QueryExampleDTO, // GET params
24
+ * ExampleStoreItem // Store state
25
+ * > {
26
+ * toDomain(dto) { ... }
27
+ * toCreateDTO(data) { ... }
28
+ * // ... implement needed methods
29
+ * }
30
+ * ```
31
+ */
32
+ import type { CoreBaseMapperInstance } from '@plyaz/types/core';
33
+ /**
34
+ * Abstract base mapper with default implementations
35
+ *
36
+ * Required to implement:
37
+ * - toDomain(dto): Convert API response to domain model
38
+ *
39
+ * Optional to implement (based on your needs):
40
+ * - toCreateDTO(data): For POST requests
41
+ * - toUpdateDTO(data): For PUT requests
42
+ * - toPatchDTO(data): For PATCH requests
43
+ * - toQueryDTO(filters): For GET query params
44
+ * - toStoreState(domain): Custom store state shape
45
+ * - fromStoreState(state): Restore domain from store
46
+ */
47
+ export declare abstract class BaseMapper<TDomain, TResponseDTO, TCreateDTO = unknown, TUpdateDTO = TCreateDTO, TPatchDTO = Partial<TCreateDTO>, TQueryDTO = unknown, TStoreState = TDomain> implements CoreBaseMapperInstance<TDomain, TResponseDTO, TCreateDTO, TUpdateDTO, TPatchDTO, TQueryDTO, TStoreState> {
48
+ /**
49
+ * Convert API response DTO to domain model
50
+ * Handle snake_case → camelCase, add computed properties
51
+ */
52
+ abstract toDomain(dto: TResponseDTO): TDomain;
53
+ /**
54
+ * Convert domain data to create DTO (POST body)
55
+ * Handle camelCase → snake_case, pick required fields
56
+ */
57
+ toCreateDTO?(data: Partial<TDomain>): TCreateDTO;
58
+ /**
59
+ * Convert domain data to update DTO (PUT body - full replacement)
60
+ * Default: same as toCreateDTO
61
+ */
62
+ toUpdateDTO?(data: Partial<TDomain>): TUpdateDTO;
63
+ /**
64
+ * Convert domain data to patch DTO (PATCH body - partial)
65
+ * Default: picks only defined fields
66
+ */
67
+ toPatchDTO?(data: Partial<TDomain>): TPatchDTO;
68
+ /**
69
+ * Convert filter object to query params DTO (GET)
70
+ * Handle pagination, sorting, filtering
71
+ */
72
+ toQueryDTO?(filters: Partial<TQueryDTO>): TQueryDTO;
73
+ /**
74
+ * Convert database row/repository result to response DTO
75
+ * Override to map repository output to API response format
76
+ * Useful when repository returns different format than API expects
77
+ */
78
+ toResponseDTO?(row: unknown): TResponseDTO;
79
+ /**
80
+ * Map array of DTOs to domain models
81
+ */
82
+ toDomainList(dtos: TResponseDTO[]): TDomain[];
83
+ /**
84
+ * Convert domain model to store state (serializable)
85
+ * Default: strips functions, keeps data
86
+ */
87
+ toStoreState(domain: TDomain): TStoreState;
88
+ /**
89
+ * Convert array of domain models to aggregated store state
90
+ * Override to customize how multiple items map to store
91
+ * Default: returns array of individual store states (as Partial since shape may differ)
92
+ */
93
+ toStoreStateList?(domains: TDomain[]): Partial<TStoreState>;
94
+ /**
95
+ * Restore domain model from store state
96
+ * Override to restore computed properties/methods
97
+ */
98
+ fromStoreState(state: TStoreState): TDomain;
99
+ }
100
+ //# sourceMappingURL=BaseMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseMapper.d.ts","sourceRoot":"","sources":["../../../src/domain/base/BaseMapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,8BAAsB,UAAU,CAC9B,OAAO,EACP,YAAY,EACZ,UAAU,GAAG,OAAO,EACpB,UAAU,GAAG,UAAU,EACvB,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,EAC/B,SAAS,GAAG,OAAO,EACnB,WAAW,GAAG,OAAO,CACrB,YACE,sBAAsB,CACpB,OAAO,EACP,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,CACZ;IAMH;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO;IAM7C;;;OAGG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU;IAEhD;;;OAGG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU;IAEhD;;;OAGG;IACH,UAAU,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS;IAE9C;;;OAGG;IACH,UAAU,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS;IAMnD;;;;OAIG;IACH,aAAa,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY;IAE1C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE;IAQ7C;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW;IAe1C;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAM3D;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;CAG5C"}