@cratis/chronicle 3.0.0 → 3.1.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 (338) hide show
  1. package/ChronicleClient.ts +4 -3
  2. package/EventStore.ts +20 -3
  3. package/IEventStore.ts +16 -0
  4. package/README.md +40 -28
  5. package/auditing/CausationType.ts +10 -0
  6. package/compliance/ComplianceContracts.ts +84 -0
  7. package/compliance/IPIIManager.ts +17 -0
  8. package/compliance/PIIManager.ts +31 -0
  9. package/compliance/index.ts +2 -0
  10. package/connection/ChronicleConnection.ts +7 -1
  11. package/connection/ChronicleServices.ts +2 -0
  12. package/connection/Guid.ts +18 -0
  13. package/connection/callResults.spec.ts +90 -0
  14. package/connection/callResults.ts +112 -0
  15. package/dist/ChronicleClient.d.ts.map +1 -1
  16. package/dist/ChronicleClient.js +4 -3
  17. package/dist/ChronicleClient.js.map +1 -1
  18. package/dist/EventStore.d.ts +8 -0
  19. package/dist/EventStore.d.ts.map +1 -1
  20. package/dist/EventStore.js +16 -3
  21. package/dist/EventStore.js.map +1 -1
  22. package/dist/IEventStore.d.ts +12 -0
  23. package/dist/IEventStore.d.ts.map +1 -1
  24. package/dist/auditing/CausationType.d.ts +8 -0
  25. package/dist/auditing/CausationType.d.ts.map +1 -1
  26. package/dist/auditing/CausationType.js +8 -0
  27. package/dist/auditing/CausationType.js.map +1 -1
  28. package/dist/compliance/ComplianceContracts.d.ts +40 -0
  29. package/dist/compliance/ComplianceContracts.d.ts.map +1 -1
  30. package/dist/compliance/ComplianceContracts.js +71 -0
  31. package/dist/compliance/ComplianceContracts.js.map +1 -1
  32. package/dist/compliance/IPIIManager.d.ts +15 -0
  33. package/dist/compliance/IPIIManager.d.ts.map +1 -0
  34. package/dist/compliance/IPIIManager.js +4 -0
  35. package/dist/compliance/IPIIManager.js.map +1 -0
  36. package/dist/compliance/PIIManager.d.ts +20 -0
  37. package/dist/compliance/PIIManager.d.ts.map +1 -0
  38. package/dist/compliance/PIIManager.js +30 -0
  39. package/dist/compliance/PIIManager.js.map +1 -0
  40. package/dist/compliance/index.d.ts +2 -0
  41. package/dist/compliance/index.d.ts.map +1 -1
  42. package/dist/compliance/index.js +1 -0
  43. package/dist/compliance/index.js.map +1 -1
  44. package/dist/connection/ChronicleConnection.d.ts +1 -0
  45. package/dist/connection/ChronicleConnection.d.ts.map +1 -1
  46. package/dist/connection/ChronicleConnection.js +6 -1
  47. package/dist/connection/ChronicleConnection.js.map +1 -1
  48. package/dist/connection/ChronicleServices.d.ts +2 -0
  49. package/dist/connection/ChronicleServices.d.ts.map +1 -1
  50. package/dist/connection/Guid.d.ts +5 -0
  51. package/dist/connection/Guid.d.ts.map +1 -1
  52. package/dist/connection/Guid.js +15 -0
  53. package/dist/connection/Guid.js.map +1 -1
  54. package/dist/connection/callResults.d.ts +69 -0
  55. package/dist/connection/callResults.d.ts.map +1 -0
  56. package/dist/connection/callResults.js +74 -0
  57. package/dist/connection/callResults.js.map +1 -0
  58. package/dist/eventSequences/AppendOperationsBroadcaster.d.ts +16 -0
  59. package/dist/eventSequences/AppendOperationsBroadcaster.d.ts.map +1 -0
  60. package/dist/eventSequences/AppendOperationsBroadcaster.js +77 -0
  61. package/dist/eventSequences/AppendOperationsBroadcaster.js.map +1 -0
  62. package/dist/eventSequences/AppendOptions.d.ts +7 -0
  63. package/dist/eventSequences/AppendOptions.d.ts.map +1 -1
  64. package/dist/eventSequences/AppendResult.d.ts +14 -0
  65. package/dist/eventSequences/AppendResult.d.ts.map +1 -1
  66. package/dist/eventSequences/AppendedEventWithResult.d.ts +13 -0
  67. package/dist/eventSequences/AppendedEventWithResult.d.ts.map +1 -0
  68. package/dist/eventSequences/AppendedEventWithResult.js +4 -0
  69. package/dist/eventSequences/AppendedEventWithResult.js.map +1 -0
  70. package/dist/eventSequences/CompleteStreamError.d.ts +17 -0
  71. package/dist/eventSequences/CompleteStreamError.d.ts.map +1 -0
  72. package/dist/eventSequences/CompleteStreamError.js +20 -0
  73. package/dist/eventSequences/CompleteStreamError.js.map +1 -0
  74. package/dist/eventSequences/CompleteStreamResult.d.ts +14 -0
  75. package/dist/eventSequences/CompleteStreamResult.d.ts.map +1 -0
  76. package/dist/eventSequences/CompleteStreamResult.js +4 -0
  77. package/dist/eventSequences/CompleteStreamResult.js.map +1 -0
  78. package/dist/eventSequences/ConcurrencyViolation.d.ts +13 -0
  79. package/dist/eventSequences/ConcurrencyViolation.d.ts.map +1 -0
  80. package/dist/eventSequences/ConcurrencyViolation.js +4 -0
  81. package/dist/eventSequences/ConcurrencyViolation.js.map +1 -0
  82. package/dist/eventSequences/EventForEventSourceId.d.ts +8 -0
  83. package/dist/eventSequences/EventForEventSourceId.d.ts.map +1 -1
  84. package/dist/eventSequences/EventSequence.d.ts +35 -1
  85. package/dist/eventSequences/EventSequence.d.ts.map +1 -1
  86. package/dist/eventSequences/EventSequence.js +350 -19
  87. package/dist/eventSequences/EventSequence.js.map +1 -1
  88. package/dist/eventSequences/IEventSequence.d.ts +85 -1
  89. package/dist/eventSequences/IEventSequence.d.ts.map +1 -1
  90. package/dist/eventSequences/WaitForCompletionResult.d.ts +11 -0
  91. package/dist/eventSequences/WaitForCompletionResult.d.ts.map +1 -0
  92. package/dist/eventSequences/WaitForCompletionResult.js +4 -0
  93. package/dist/eventSequences/WaitForCompletionResult.js.map +1 -0
  94. package/dist/eventSequences/index.d.ts +5 -0
  95. package/dist/eventSequences/index.d.ts.map +1 -1
  96. package/dist/eventSequences/index.js +1 -0
  97. package/dist/eventSequences/index.js.map +1 -1
  98. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.d.ts +3 -0
  99. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.d.ts.map +1 -1
  100. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.js +9 -0
  101. package/dist/eventStoreSubscriptions/EventStoreSubscriptions.js.map +1 -1
  102. package/dist/eventStoreSubscriptions/IEventStoreSubscriptions.d.ts +6 -0
  103. package/dist/eventStoreSubscriptions/IEventStoreSubscriptions.d.ts.map +1 -1
  104. package/dist/eventStoreSubscriptions/contracts.d.ts +18 -0
  105. package/dist/eventStoreSubscriptions/contracts.d.ts.map +1 -1
  106. package/dist/eventStoreSubscriptions/contracts.js +106 -0
  107. package/dist/eventStoreSubscriptions/contracts.js.map +1 -1
  108. package/dist/events/constraints/Constraints.js +4 -4
  109. package/dist/events/constraints/Constraints.js.map +1 -1
  110. package/dist/externalServices/ExternalServiceBuilder.d.ts +42 -0
  111. package/dist/externalServices/ExternalServiceBuilder.d.ts.map +1 -0
  112. package/dist/externalServices/ExternalServiceBuilder.js +110 -0
  113. package/dist/externalServices/ExternalServiceBuilder.js.map +1 -0
  114. package/dist/externalServices/ExternalServices.d.ts +19 -0
  115. package/dist/externalServices/ExternalServices.d.ts.map +1 -0
  116. package/dist/externalServices/ExternalServices.js +30 -0
  117. package/dist/externalServices/ExternalServices.js.map +1 -0
  118. package/dist/externalServices/ExternalServicesContracts.d.ts +137 -0
  119. package/dist/externalServices/ExternalServicesContracts.d.ts.map +1 -0
  120. package/dist/externalServices/ExternalServicesContracts.js +654 -0
  121. package/dist/externalServices/ExternalServicesContracts.js.map +1 -0
  122. package/dist/externalServices/IExternalServiceBuilder.d.ts +67 -0
  123. package/dist/externalServices/IExternalServiceBuilder.d.ts.map +1 -0
  124. package/dist/externalServices/IExternalServiceBuilder.js +4 -0
  125. package/dist/externalServices/IExternalServiceBuilder.js.map +1 -0
  126. package/dist/externalServices/IExternalServices.d.ts +13 -0
  127. package/dist/externalServices/IExternalServices.d.ts.map +1 -0
  128. package/dist/externalServices/IExternalServices.js +4 -0
  129. package/dist/externalServices/IExternalServices.js.map +1 -0
  130. package/dist/externalServices/index.d.ts +5 -0
  131. package/dist/externalServices/index.d.ts.map +1 -0
  132. package/dist/externalServices/index.js +5 -0
  133. package/dist/externalServices/index.js.map +1 -0
  134. package/dist/identities/IIdentityManager.d.ts +17 -0
  135. package/dist/identities/IIdentityManager.d.ts.map +1 -0
  136. package/dist/identities/IIdentityManager.js +4 -0
  137. package/dist/identities/IIdentityManager.js.map +1 -0
  138. package/dist/identities/IdentityManager.d.ts +20 -0
  139. package/dist/identities/IdentityManager.d.ts.map +1 -0
  140. package/dist/identities/IdentityManager.js +31 -0
  141. package/dist/identities/IdentityManager.js.map +1 -0
  142. package/dist/identities/index.d.ts +3 -0
  143. package/dist/identities/index.d.ts.map +1 -0
  144. package/dist/identities/index.js +4 -0
  145. package/dist/identities/index.js.map +1 -0
  146. package/dist/index.d.ts +5 -1
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +5 -1
  149. package/dist/index.js.map +1 -1
  150. package/dist/jobs/IJobs.d.ts +4 -4
  151. package/dist/jobs/IJobs.d.ts.map +1 -1
  152. package/dist/jobs/Jobs.d.ts +4 -4
  153. package/dist/jobs/Jobs.d.ts.map +1 -1
  154. package/dist/jobs/Jobs.js +12 -10
  155. package/dist/jobs/Jobs.js.map +1 -1
  156. package/dist/observation/FailedPartition.d.ts +15 -0
  157. package/dist/observation/FailedPartition.d.ts.map +1 -0
  158. package/dist/observation/FailedPartition.js +4 -0
  159. package/dist/observation/FailedPartition.js.map +1 -0
  160. package/dist/observation/FailedPartitionAttempt.d.ts +15 -0
  161. package/dist/observation/FailedPartitionAttempt.d.ts.map +1 -0
  162. package/dist/observation/FailedPartitionAttempt.js +4 -0
  163. package/dist/observation/FailedPartitionAttempt.js.map +1 -0
  164. package/dist/observation/FailedPartitions.d.ts +24 -0
  165. package/dist/observation/FailedPartitions.d.ts.map +1 -0
  166. package/dist/observation/FailedPartitions.js +39 -0
  167. package/dist/observation/FailedPartitions.js.map +1 -0
  168. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.d.ts +19 -0
  169. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.d.ts.map +1 -0
  170. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.js +4 -0
  171. package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.js.map +1 -0
  172. package/dist/observation/ICanBeNotifiedWhenReplay.d.ts +17 -0
  173. package/dist/observation/ICanBeNotifiedWhenReplay.d.ts.map +1 -0
  174. package/dist/observation/ICanBeNotifiedWhenReplay.js +4 -0
  175. package/dist/observation/ICanBeNotifiedWhenReplay.js.map +1 -0
  176. package/dist/observation/IFailedPartitions.d.ts +18 -0
  177. package/dist/observation/IFailedPartitions.d.ts.map +1 -0
  178. package/dist/observation/IFailedPartitions.js +4 -0
  179. package/dist/observation/IFailedPartitions.js.map +1 -0
  180. package/dist/observation/index.d.ts +6 -0
  181. package/dist/observation/index.d.ts.map +1 -1
  182. package/dist/observation/index.js +1 -0
  183. package/dist/observation/index.js.map +1 -1
  184. package/dist/observation/notifyReplayLifecycle.d.ts +13 -0
  185. package/dist/observation/notifyReplayLifecycle.d.ts.map +1 -0
  186. package/dist/observation/notifyReplayLifecycle.js +54 -0
  187. package/dist/observation/notifyReplayLifecycle.js.map +1 -0
  188. package/dist/observation/toClientFailedPartition.d.ts +9 -0
  189. package/dist/observation/toClientFailedPartition.d.ts.map +1 -0
  190. package/dist/observation/toClientFailedPartition.js +23 -0
  191. package/dist/observation/toClientFailedPartition.js.map +1 -0
  192. package/dist/projections/Projections.d.ts +0 -4
  193. package/dist/projections/Projections.d.ts.map +1 -1
  194. package/dist/projections/Projections.js +25 -103
  195. package/dist/projections/Projections.js.map +1 -1
  196. package/dist/projections/declarative/AddBuilder.d.ts +17 -0
  197. package/dist/projections/declarative/AddBuilder.d.ts.map +1 -0
  198. package/dist/projections/declarative/AddBuilder.js +28 -0
  199. package/dist/projections/declarative/AddBuilder.js.map +1 -0
  200. package/dist/projections/declarative/AddChildBuilder.d.ts +56 -0
  201. package/dist/projections/declarative/AddChildBuilder.d.ts.map +1 -0
  202. package/dist/projections/declarative/AddChildBuilder.js +72 -0
  203. package/dist/projections/declarative/AddChildBuilder.js.map +1 -0
  204. package/dist/projections/declarative/ChildrenBuilder.d.ts +28 -0
  205. package/dist/projections/declarative/ChildrenBuilder.d.ts.map +1 -0
  206. package/dist/projections/declarative/ChildrenBuilder.js +72 -0
  207. package/dist/projections/declarative/ChildrenBuilder.js.map +1 -0
  208. package/dist/projections/declarative/CompositeKeyBuilder.d.ts +16 -0
  209. package/dist/projections/declarative/CompositeKeyBuilder.d.ts.map +1 -0
  210. package/dist/projections/declarative/CompositeKeyBuilder.js +29 -0
  211. package/dist/projections/declarative/CompositeKeyBuilder.js.map +1 -0
  212. package/dist/projections/declarative/FromBuilder.d.ts +8 -6
  213. package/dist/projections/declarative/FromBuilder.d.ts.map +1 -1
  214. package/dist/projections/declarative/FromBuilder.js +44 -14
  215. package/dist/projections/declarative/FromBuilder.js.map +1 -1
  216. package/dist/projections/declarative/ICompositeKeyBuilder.d.ts +5 -0
  217. package/dist/projections/declarative/ICompositeKeyBuilder.d.ts.map +1 -1
  218. package/dist/projections/declarative/JoinBuilder.d.ts +7 -5
  219. package/dist/projections/declarative/JoinBuilder.d.ts.map +1 -1
  220. package/dist/projections/declarative/JoinBuilder.js +50 -16
  221. package/dist/projections/declarative/JoinBuilder.js.map +1 -1
  222. package/dist/projections/declarative/NestedBuilder.d.ts +24 -0
  223. package/dist/projections/declarative/NestedBuilder.d.ts.map +1 -0
  224. package/dist/projections/declarative/NestedBuilder.js +60 -0
  225. package/dist/projections/declarative/NestedBuilder.js.map +1 -0
  226. package/dist/projections/declarative/ProjectionBuilderCore.d.ts +127 -0
  227. package/dist/projections/declarative/ProjectionBuilderCore.d.ts.map +1 -0
  228. package/dist/projections/declarative/ProjectionBuilderCore.js +180 -0
  229. package/dist/projections/declarative/ProjectionBuilderCore.js.map +1 -0
  230. package/dist/projections/declarative/ProjectionBuilderFor.d.ts +6 -32
  231. package/dist/projections/declarative/ProjectionBuilderFor.d.ts.map +1 -1
  232. package/dist/projections/declarative/ProjectionBuilderFor.js +24 -118
  233. package/dist/projections/declarative/ProjectionBuilderFor.js.map +1 -1
  234. package/dist/projections/declarative/SubtractBuilder.d.ts +17 -0
  235. package/dist/projections/declarative/SubtractBuilder.d.ts.map +1 -0
  236. package/dist/projections/declarative/SubtractBuilder.js +28 -0
  237. package/dist/projections/declarative/SubtractBuilder.js.map +1 -0
  238. package/dist/projections/declarative/index.d.ts +9 -0
  239. package/dist/projections/declarative/index.d.ts.map +1 -1
  240. package/dist/projections/declarative/index.js +8 -0
  241. package/dist/projections/declarative/index.js.map +1 -1
  242. package/dist/projections/modelBound/childrenAndNestedBuilder.d.ts +90 -0
  243. package/dist/projections/modelBound/childrenAndNestedBuilder.d.ts.map +1 -0
  244. package/dist/projections/modelBound/childrenAndNestedBuilder.js +290 -0
  245. package/dist/projections/modelBound/childrenAndNestedBuilder.js.map +1 -0
  246. package/dist/reactors/ReactorSideEffects.d.ts +29 -0
  247. package/dist/reactors/ReactorSideEffects.d.ts.map +1 -0
  248. package/dist/reactors/ReactorSideEffects.js +70 -0
  249. package/dist/reactors/ReactorSideEffects.js.map +1 -0
  250. package/dist/reactors/Reactors.d.ts +4 -1
  251. package/dist/reactors/Reactors.d.ts.map +1 -1
  252. package/dist/reactors/Reactors.js +23 -4
  253. package/dist/reactors/Reactors.js.map +1 -1
  254. package/dist/reducers/Reducers.d.ts.map +1 -1
  255. package/dist/reducers/Reducers.js +15 -3
  256. package/dist/reducers/Reducers.js.map +1 -1
  257. package/dist/reducers/reducer.d.ts +9 -1
  258. package/dist/reducers/reducer.d.ts.map +1 -1
  259. package/dist/reducers/reducer.js +4 -2
  260. package/dist/reducers/reducer.js.map +1 -1
  261. package/dist/transactions/IUnitOfWork.d.ts +18 -0
  262. package/dist/transactions/IUnitOfWork.d.ts.map +1 -1
  263. package/dist/transactions/UnitOfWork.d.ts +9 -0
  264. package/dist/transactions/UnitOfWork.d.ts.map +1 -1
  265. package/dist/transactions/UnitOfWork.js +14 -0
  266. package/dist/transactions/UnitOfWork.js.map +1 -1
  267. package/dist/tsconfig.tsbuildinfo +1 -1
  268. package/eventSequences/AppendOperationsBroadcaster.ts +83 -0
  269. package/eventSequences/AppendOptions.ts +8 -0
  270. package/eventSequences/AppendResult.ts +16 -0
  271. package/eventSequences/AppendedEventWithResult.ts +17 -0
  272. package/eventSequences/CompleteStreamError.ts +20 -0
  273. package/eventSequences/CompleteStreamResult.ts +13 -0
  274. package/eventSequences/ConcurrencyViolation.ts +18 -0
  275. package/eventSequences/EventForEventSourceId.ts +12 -0
  276. package/eventSequences/EventSequence.spec.ts +588 -0
  277. package/eventSequences/EventSequence.ts +406 -20
  278. package/eventSequences/IEventSequence.ts +109 -1
  279. package/eventSequences/WaitForCompletionResult.ts +15 -0
  280. package/eventSequences/index.ts +5 -0
  281. package/eventStoreSubscriptions/EventStoreSubscriptions.spec.ts +52 -0
  282. package/eventStoreSubscriptions/EventStoreSubscriptions.ts +19 -1
  283. package/eventStoreSubscriptions/IEventStoreSubscriptions.ts +7 -0
  284. package/eventStoreSubscriptions/contracts.ts +126 -0
  285. package/events/constraints/Constraints.ts +4 -4
  286. package/externalServices/ExternalServiceBuilder.ts +128 -0
  287. package/externalServices/ExternalServices.ts +34 -0
  288. package/externalServices/ExternalServicesContracts.ts +709 -0
  289. package/externalServices/IExternalServiceBuilder.ts +76 -0
  290. package/externalServices/IExternalServices.ts +16 -0
  291. package/externalServices/index.ts +7 -0
  292. package/identities/IIdentityManager.ts +19 -0
  293. package/identities/IdentityManager.ts +32 -0
  294. package/identities/index.ts +5 -0
  295. package/index.ts +6 -0
  296. package/jobs/IJobs.ts +4 -4
  297. package/jobs/Jobs.ts +16 -14
  298. package/observation/FailedPartition.ts +21 -0
  299. package/observation/FailedPartitionAttempt.ts +21 -0
  300. package/observation/FailedPartitions.spec.ts +75 -0
  301. package/observation/FailedPartitions.ts +44 -0
  302. package/observation/ICanBeNotifiedWhenPartitionReplayed.ts +22 -0
  303. package/observation/ICanBeNotifiedWhenReplay.ts +20 -0
  304. package/observation/IFailedPartitions.ts +22 -0
  305. package/observation/index.ts +6 -0
  306. package/observation/notifyReplayLifecycle.spec.ts +98 -0
  307. package/observation/notifyReplayLifecycle.ts +61 -0
  308. package/observation/toClientFailedPartition.ts +26 -0
  309. package/package.json +28 -3
  310. package/projections/Projections.childrenAndNested.spec.ts +188 -0
  311. package/projections/Projections.spec.ts +131 -0
  312. package/projections/Projections.ts +37 -119
  313. package/projections/declarative/AddBuilder.ts +28 -0
  314. package/projections/declarative/AddChildBuilder.ts +97 -0
  315. package/projections/declarative/ChildrenBuilder.spec.ts +157 -0
  316. package/projections/declarative/ChildrenBuilder.ts +90 -0
  317. package/projections/declarative/CompositeKeyBuilder.spec.ts +117 -0
  318. package/projections/declarative/CompositeKeyBuilder.ts +38 -0
  319. package/projections/declarative/FromBuilder.ts +60 -15
  320. package/projections/declarative/ICompositeKeyBuilder.ts +6 -0
  321. package/projections/declarative/JoinBuilder.ts +66 -17
  322. package/projections/declarative/NestedBuilder.ts +76 -0
  323. package/projections/declarative/ProjectionBuilderCore.ts +257 -0
  324. package/projections/declarative/ProjectionBuilderFor.spec.ts +115 -0
  325. package/projections/declarative/ProjectionBuilderFor.ts +29 -168
  326. package/projections/declarative/SubtractBuilder.ts +28 -0
  327. package/projections/declarative/index.ts +9 -0
  328. package/projections/modelBound/childrenAndNestedBuilder.ts +354 -0
  329. package/reactors/ReactorSideEffects.spec.ts +182 -0
  330. package/reactors/ReactorSideEffects.ts +97 -0
  331. package/reactors/Reactors.ts +29 -4
  332. package/reducers/Reducers.spec.ts +87 -0
  333. package/reducers/Reducers.ts +15 -3
  334. package/reducers/reducer.spec.ts +40 -0
  335. package/reducers/reducer.ts +11 -2
  336. package/transactions/IUnitOfWork.ts +21 -0
  337. package/transactions/UnitOfWork.spec.ts +82 -0
  338. package/transactions/UnitOfWork.ts +20 -0
@@ -0,0 +1,117 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import 'reflect-metadata';
5
+ import { describe, expect, it } from 'vitest';
6
+ import { eventType } from '../../events/eventTypeDecorator';
7
+ import { ProjectionBuilderFor } from './ProjectionBuilderFor';
8
+
9
+ // Decorators are applied as plain function calls (rather than `@decorator` syntax) so these
10
+ // fixtures don't depend on the test runner's decorator-syntax support.
11
+
12
+ class OrderLineAdded {
13
+ orderId!: string;
14
+ lineNumber!: number;
15
+ quantity!: number;
16
+ }
17
+ eventType()(OrderLineAdded);
18
+
19
+ class OrderLineJoined {
20
+ orderId!: string;
21
+ lineNumber!: number;
22
+ description!: string;
23
+ }
24
+ eventType()(OrderLineJoined);
25
+
26
+ class CompositeKey {
27
+ orderId!: string;
28
+ lineNumber!: number;
29
+ }
30
+
31
+ class OrderLine {
32
+ id!: string;
33
+ quantity!: number;
34
+ description!: string;
35
+ }
36
+
37
+ interface FromRecord {
38
+ Key: { Id: string };
39
+ Value: { Key: string };
40
+ }
41
+
42
+ interface JoinRecord {
43
+ Key: { Id: string };
44
+ Value: { Key: string };
45
+ }
46
+
47
+ interface JoinRecordWithParentKey {
48
+ Key: { Id: string };
49
+ Value: { Key: string; ParentKey?: string };
50
+ }
51
+
52
+ describe('CompositeKeyBuilder', () => {
53
+ describe('when using a composite key on a from builder', () => {
54
+ it('should produce a $composite expression', () => {
55
+ const builder = new ProjectionBuilderFor<OrderLine>();
56
+ builder.from(OrderLineAdded, from => from.usingCompositeKey<CompositeKey>(key => key
57
+ .set(target => target.orderId, event => event.orderId)
58
+ .set(target => target.lineNumber, event => event.lineNumber)));
59
+
60
+ const definition = builder.build('orderLine', 'OrderLine') as unknown as { From: FromRecord[] };
61
+ const entry = definition.From.find(candidate => candidate.Key.Id === 'OrderLineAdded')!;
62
+
63
+ expect(entry.Value.Key).toBe('$composite(orderId=orderId,lineNumber=lineNumber)');
64
+ });
65
+ });
66
+
67
+ describe('when using a parent composite key on a from builder', () => {
68
+ it('should produce a $composite expression for the parent key', () => {
69
+ const builder = new ProjectionBuilderFor<OrderLine>();
70
+ builder.from(OrderLineAdded, from => from.usingParentCompositeKey<CompositeKey>(key => key
71
+ .set(target => target.orderId, event => event.orderId)
72
+ .set(target => target.lineNumber, event => event.lineNumber)));
73
+
74
+ const definition = builder.build('orderLine', 'OrderLine') as unknown as { From: Array<{ Key: { Id: string }; Value: { ParentKey: string } }> };
75
+ const entry = definition.From.find(candidate => candidate.Key.Id === 'OrderLineAdded')!;
76
+
77
+ expect(entry.Value.ParentKey).toBe('$composite(orderId=orderId,lineNumber=lineNumber)');
78
+ });
79
+ });
80
+
81
+ describe('when using a composite key on a join builder', () => {
82
+ it('should produce a $composite expression', () => {
83
+ const builder = new ProjectionBuilderFor<OrderLine>();
84
+ builder.join(OrderLineJoined, join => join
85
+ .on(model => model.id)
86
+ .usingCompositeKey<CompositeKey>(key => key
87
+ .set(target => target.orderId, event => event.orderId)
88
+ .set(target => target.lineNumber, event => event.lineNumber)));
89
+
90
+ const definition = builder.build('orderLine', 'OrderLine') as unknown as { Join: JoinRecord[] };
91
+ const entry = definition.Join.find(candidate => candidate.Key.Id === 'OrderLineJoined')!;
92
+
93
+ expect(entry.Value.Key).toBe('$composite(orderId=orderId,lineNumber=lineNumber)');
94
+ });
95
+ });
96
+
97
+ describe('when using parent-key methods on a join builder', () => {
98
+ it('should accept the calls without throwing, matching the C# client having no wire effect for Join', () => {
99
+ const builder = new ProjectionBuilderFor<OrderLine>();
100
+
101
+ expect(() => builder.join(OrderLineJoined, join => join
102
+ .on(model => model.id)
103
+ .usingParentKey(event => event.orderId)
104
+ .usingParentKeyFromContext('someContextProperty')
105
+ .usingParentCompositeKey<CompositeKey>(key => key.set(target => target.orderId, event => event.orderId))
106
+ .usingConstantParentKey('constant')
107
+ )).not.toThrow();
108
+
109
+ const definition = builder.build('orderLine', 'OrderLine') as unknown as { Join: JoinRecordWithParentKey[] };
110
+ const entry = definition.Join.find(candidate => candidate.Key.Id === 'OrderLineJoined')!;
111
+
112
+ // JoinDefinition has no ParentKey slot on the wire, so none of the calls above
113
+ // should have produced a ParentKey property.
114
+ expect(entry.Value.ParentKey).toBeUndefined();
115
+ });
116
+ });
117
+ });
@@ -0,0 +1,38 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
5
+ import { ICompositeKeyBuilder } from './ICompositeKeyBuilder';
6
+
7
+ /**
8
+ * Concrete implementation of {@link ICompositeKeyBuilder} that builds a `$composite(...)` key
9
+ * expression from multiple event properties mapped onto named parts of a key type.
10
+ * @template TKeyType - The composite key type.
11
+ * @template TEvent - The event type.
12
+ */
13
+ export class CompositeKeyBuilder<TKeyType, TEvent> implements ICompositeKeyBuilder<TKeyType, TEvent> {
14
+ private readonly _parts: Array<{ property: string; expression: string }> = [];
15
+
16
+ /** @inheritdoc */
17
+ set(
18
+ targetPropertyAccessor: PropertyAccessor<TKeyType>,
19
+ sourcePropertyAccessor: PropertyAccessor<TEvent>
20
+ ): ICompositeKeyBuilder<TKeyType, TEvent> {
21
+ const targetHandler = new PropertyPathResolverProxyHandler();
22
+ const targetProxy = new Proxy({}, targetHandler);
23
+ targetPropertyAccessor(targetProxy as TKeyType);
24
+
25
+ const sourceHandler = new PropertyPathResolverProxyHandler();
26
+ const sourceProxy = new Proxy({}, sourceHandler);
27
+ sourcePropertyAccessor(sourceProxy as TEvent);
28
+
29
+ this._parts.push({ property: targetHandler.property, expression: sourceHandler.property });
30
+ return this;
31
+ }
32
+
33
+ /** @inheritdoc */
34
+ build(): string {
35
+ const parts = this._parts.map(part => `${part.property}=${part.expression}`).join(',');
36
+ return `$composite(${parts})`;
37
+ }
38
+ }
@@ -2,6 +2,9 @@
2
2
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
 
4
4
  import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
5
+ import { AddBuilder } from './AddBuilder';
6
+ import { AddChildBuilder, ChildAdditionEntry } from './AddChildBuilder';
7
+ import { CompositeKeyBuilder } from './CompositeKeyBuilder';
5
8
  import { IAddBuilder } from './IAddBuilder';
6
9
  import { IAddChildBuilder } from './IAddChildBuilder';
7
10
  import { ICompositeKeyBuilder } from './ICompositeKeyBuilder';
@@ -9,6 +12,7 @@ import { IFromBuilder } from './IFromBuilder';
9
12
  import { ISetBuilder } from './ISetBuilder';
10
13
  import { ISubtractBuilder } from './ISubtractBuilder';
11
14
  import { SetBuilder } from './SetBuilder';
15
+ import { SubtractBuilder } from './SubtractBuilder';
12
16
 
13
17
  /**
14
18
  * Accumulated property mapping for a from clause.
@@ -17,6 +21,7 @@ export interface FromEntry {
17
21
  properties: Record<string, string>;
18
22
  key: string;
19
23
  parentKey: string;
24
+ children: ChildAdditionEntry[];
20
25
  }
21
26
 
22
27
  /**
@@ -28,7 +33,8 @@ export class FromBuilder<TReadModel, TEvent> implements IFromBuilder<TReadModel,
28
33
  readonly entry: FromEntry = {
29
34
  properties: {},
30
35
  key: '$eventSourceId',
31
- parentKey: ''
36
+ parentKey: '',
37
+ children: []
32
38
  };
33
39
 
34
40
  /** @inheritdoc */
@@ -75,13 +81,19 @@ export class FromBuilder<TReadModel, TEvent> implements IFromBuilder<TReadModel,
75
81
  }
76
82
 
77
83
  /** @inheritdoc */
78
- usingCompositeKey<TKeyType>(_builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
79
- throw new Error('usingCompositeKey is not implemented yet.');
84
+ usingCompositeKey<TKeyType>(builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
85
+ const compositeKeyBuilder = new CompositeKeyBuilder<TKeyType, TEvent>();
86
+ builderCallback(compositeKeyBuilder);
87
+ this.entry.key = compositeKeyBuilder.build();
88
+ return this;
80
89
  }
81
90
 
82
91
  /** @inheritdoc */
83
- usingParentCompositeKey<TKeyType>(_builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
84
- throw new Error('usingParentCompositeKey is not implemented yet.');
92
+ usingParentCompositeKey<TKeyType>(builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
93
+ const compositeKeyBuilder = new CompositeKeyBuilder<TKeyType, TEvent>();
94
+ builderCallback(compositeKeyBuilder);
95
+ this.entry.parentKey = compositeKeyBuilder.build();
96
+ return this;
85
97
  }
86
98
 
87
99
  /** @inheritdoc */
@@ -115,30 +127,63 @@ export class FromBuilder<TReadModel, TEvent> implements IFromBuilder<TReadModel,
115
127
  }
116
128
 
117
129
  /** @inheritdoc */
118
- add(_readModelPropertyAccessor: PropertyAccessor<TReadModel>): IAddBuilder<TEvent, this> {
119
- throw new Error('add is not implemented yet.');
130
+ add(readModelPropertyAccessor: PropertyAccessor<TReadModel>): IAddBuilder<TEvent, this> {
131
+ const handler = new PropertyPathResolverProxyHandler();
132
+ const proxy = new Proxy({}, handler);
133
+ readModelPropertyAccessor(proxy as TReadModel);
134
+ return new AddBuilder<TEvent, this>(
135
+ handler.property,
136
+ (property, expression) => { this.entry.properties[property] = expression; },
137
+ this
138
+ );
120
139
  }
121
140
 
122
141
  /** @inheritdoc */
123
- subtract(_readModelPropertyAccessor: PropertyAccessor<TReadModel>): ISubtractBuilder<TEvent, this> {
124
- throw new Error('subtract is not implemented yet.');
142
+ subtract(readModelPropertyAccessor: PropertyAccessor<TReadModel>): ISubtractBuilder<TEvent, this> {
143
+ const handler = new PropertyPathResolverProxyHandler();
144
+ const proxy = new Proxy({}, handler);
145
+ readModelPropertyAccessor(proxy as TReadModel);
146
+ return new SubtractBuilder<TEvent, this>(
147
+ handler.property,
148
+ (property, expression) => { this.entry.properties[property] = expression; },
149
+ this
150
+ );
125
151
  }
126
152
 
127
153
  /** @inheritdoc */
128
- count(_readModelPropertyAccessor: PropertyAccessor<TReadModel>): this {
129
- throw new Error('count is not implemented yet.');
154
+ count(readModelPropertyAccessor: PropertyAccessor<TReadModel>): this {
155
+ const handler = new PropertyPathResolverProxyHandler();
156
+ const proxy = new Proxy({}, handler);
157
+ readModelPropertyAccessor(proxy as TReadModel);
158
+ this.entry.properties[handler.property] = '$count';
159
+ return this;
130
160
  }
131
161
 
132
162
  /** @inheritdoc */
133
163
  addChild<TChildModel>(
134
- _targetPropertyAccessor: PropertyAccessor<TReadModel>,
135
- _eventPropertyAccessorOrBuilderCallback: PropertyAccessor<TEvent> | ((builder: IAddChildBuilder<TChildModel, TEvent>) => void)
164
+ targetPropertyAccessor: PropertyAccessor<TReadModel>,
165
+ eventPropertyAccessorOrBuilderCallback: PropertyAccessor<TEvent> | ((builder: IAddChildBuilder<TChildModel, TEvent>) => void)
136
166
  ): this {
137
- throw new Error('addChild is not implemented yet.');
167
+ const targetHandler = new PropertyPathResolverProxyHandler();
168
+ const targetProxy = new Proxy({}, targetHandler);
169
+ targetPropertyAccessor(targetProxy as TReadModel);
170
+
171
+ const probe = new AddChildBuilder<TChildModel, TEvent>();
172
+ const probeProxy = new Proxy({}, probe);
173
+ (eventPropertyAccessorOrBuilderCallback as (value: unknown) => void)(probeProxy);
174
+
175
+ this.entry.children.push(probe.usedAsBuilder
176
+ ? { targetProperty: targetHandler.property, identifiedBy: probe.identifiedByProperty, usingKey: probe.usingKeyProperty }
177
+ : { targetProperty: targetHandler.property, fromEventProperty: probe.capturedEventProperty });
178
+ return this;
138
179
  }
139
180
 
140
181
  /** @inheritdoc */
141
182
  setThisValue(): ISetBuilder<TEvent, this> {
142
- throw new Error('setThisValue is not implemented yet.');
183
+ return new SetBuilder<TEvent, this>(
184
+ '$this',
185
+ (rp, expr) => { this.entry.properties[rp] = expr; },
186
+ this
187
+ );
143
188
  }
144
189
  }
@@ -19,4 +19,10 @@ export interface ICompositeKeyBuilder<TKeyType, TEvent> {
19
19
  targetPropertyAccessor: PropertyAccessor<TKeyType>,
20
20
  sourcePropertyAccessor: PropertyAccessor<TEvent>
21
21
  ): ICompositeKeyBuilder<TKeyType, TEvent>;
22
+
23
+ /**
24
+ * Builds the composite key expression from the configured parts.
25
+ * @returns The `$composite(...)` property expression.
26
+ */
27
+ build(): string;
22
28
  }
@@ -2,6 +2,9 @@
2
2
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
 
4
4
  import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
5
+ import { AddBuilder } from './AddBuilder';
6
+ import { AddChildBuilder, ChildAdditionEntry } from './AddChildBuilder';
7
+ import { CompositeKeyBuilder } from './CompositeKeyBuilder';
5
8
  import { IAddBuilder } from './IAddBuilder';
6
9
  import { IAddChildBuilder } from './IAddChildBuilder';
7
10
  import { ICompositeKeyBuilder } from './ICompositeKeyBuilder';
@@ -9,6 +12,7 @@ import { IJoinBuilder } from './IJoinBuilder';
9
12
  import { ISetBuilder } from './ISetBuilder';
10
13
  import { ISubtractBuilder } from './ISubtractBuilder';
11
14
  import { SetBuilder } from './SetBuilder';
15
+ import { SubtractBuilder } from './SubtractBuilder';
12
16
 
13
17
  /**
14
18
  * Accumulated property mapping for a join clause.
@@ -17,6 +21,7 @@ export interface JoinEntry {
17
21
  on: string;
18
22
  properties: Record<string, string>;
19
23
  key: string;
24
+ children: ChildAdditionEntry[];
20
25
  }
21
26
 
22
27
  /**
@@ -28,7 +33,8 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
28
33
  readonly entry: JoinEntry = {
29
34
  on: '',
30
35
  properties: {},
31
- key: '$eventSourceId'
36
+ key: '$eventSourceId',
37
+ children: []
32
38
  };
33
39
 
34
40
  /** @inheritdoc */
@@ -71,22 +77,31 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
71
77
 
72
78
  /** @inheritdoc */
73
79
  usingParentKey(_keyAccessor: PropertyAccessor<TEvent>): this {
74
- throw new Error('usingParentKey is not supported for join mappings.');
80
+ // A join's wire definition (JoinDefinition) has no ParentKey slot - the C# client
81
+ // accepts this call too (it is inherited from the shared key-builder base) but its
82
+ // JoinBuilder.Build() only ever reads On/Properties/Key, so the value is silently
83
+ // unused there as well. Matching that: accept the call, but it has no effect.
84
+ return this;
75
85
  }
76
86
 
77
87
  /** @inheritdoc */
78
88
  usingParentKeyFromContext(_contextPropertyName: string): this {
79
- throw new Error('usingParentKeyFromContext is not supported for join mappings.');
89
+ // See usingParentKey - accepted for interface parity with From, no wire effect for Join.
90
+ return this;
80
91
  }
81
92
 
82
93
  /** @inheritdoc */
83
- usingCompositeKey<TKeyType>(_builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
84
- throw new Error('usingCompositeKey is not implemented yet.');
94
+ usingCompositeKey<TKeyType>(builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
95
+ const compositeKeyBuilder = new CompositeKeyBuilder<TKeyType, TEvent>();
96
+ builderCallback(compositeKeyBuilder);
97
+ this.entry.key = compositeKeyBuilder.build();
98
+ return this;
85
99
  }
86
100
 
87
101
  /** @inheritdoc */
88
102
  usingParentCompositeKey<TKeyType>(_builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
89
- throw new Error('usingParentCompositeKey is not supported for join mappings.');
103
+ // See usingParentKey - accepted for interface parity with From, no wire effect for Join.
104
+ return this;
90
105
  }
91
106
 
92
107
  /** @inheritdoc */
@@ -97,7 +112,8 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
97
112
 
98
113
  /** @inheritdoc */
99
114
  usingConstantParentKey(_value: string): this {
100
- throw new Error('usingConstantParentKey is not supported for join mappings.');
115
+ // See usingParentKey - accepted for interface parity with From, no wire effect for Join.
116
+ return this;
101
117
  }
102
118
 
103
119
  /** @inheritdoc */
@@ -119,30 +135,63 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
119
135
  }
120
136
 
121
137
  /** @inheritdoc */
122
- add(_readModelPropertyAccessor: PropertyAccessor<TReadModel>): IAddBuilder<TEvent, this> {
123
- throw new Error('add is not implemented yet.');
138
+ add(readModelPropertyAccessor: PropertyAccessor<TReadModel>): IAddBuilder<TEvent, this> {
139
+ const handler = new PropertyPathResolverProxyHandler();
140
+ const proxy = new Proxy({}, handler);
141
+ readModelPropertyAccessor(proxy as TReadModel);
142
+ return new AddBuilder<TEvent, this>(
143
+ handler.property,
144
+ (property, expression) => { this.entry.properties[property] = expression; },
145
+ this
146
+ );
124
147
  }
125
148
 
126
149
  /** @inheritdoc */
127
- subtract(_readModelPropertyAccessor: PropertyAccessor<TReadModel>): ISubtractBuilder<TEvent, this> {
128
- throw new Error('subtract is not implemented yet.');
150
+ subtract(readModelPropertyAccessor: PropertyAccessor<TReadModel>): ISubtractBuilder<TEvent, this> {
151
+ const handler = new PropertyPathResolverProxyHandler();
152
+ const proxy = new Proxy({}, handler);
153
+ readModelPropertyAccessor(proxy as TReadModel);
154
+ return new SubtractBuilder<TEvent, this>(
155
+ handler.property,
156
+ (property, expression) => { this.entry.properties[property] = expression; },
157
+ this
158
+ );
129
159
  }
130
160
 
131
161
  /** @inheritdoc */
132
- count(_readModelPropertyAccessor: PropertyAccessor<TReadModel>): this {
133
- throw new Error('count is not implemented yet.');
162
+ count(readModelPropertyAccessor: PropertyAccessor<TReadModel>): this {
163
+ const handler = new PropertyPathResolverProxyHandler();
164
+ const proxy = new Proxy({}, handler);
165
+ readModelPropertyAccessor(proxy as TReadModel);
166
+ this.entry.properties[handler.property] = '$count';
167
+ return this;
134
168
  }
135
169
 
136
170
  /** @inheritdoc */
137
171
  addChild<TChildModel>(
138
- _targetPropertyAccessor: PropertyAccessor<TReadModel>,
139
- _eventPropertyAccessorOrBuilderCallback: PropertyAccessor<TEvent> | ((builder: IAddChildBuilder<TChildModel, TEvent>) => void)
172
+ targetPropertyAccessor: PropertyAccessor<TReadModel>,
173
+ eventPropertyAccessorOrBuilderCallback: PropertyAccessor<TEvent> | ((builder: IAddChildBuilder<TChildModel, TEvent>) => void)
140
174
  ): this {
141
- throw new Error('addChild is not implemented yet.');
175
+ const targetHandler = new PropertyPathResolverProxyHandler();
176
+ const targetProxy = new Proxy({}, targetHandler);
177
+ targetPropertyAccessor(targetProxy as TReadModel);
178
+
179
+ const probe = new AddChildBuilder<TChildModel, TEvent>();
180
+ const probeProxy = new Proxy({}, probe);
181
+ (eventPropertyAccessorOrBuilderCallback as (value: unknown) => void)(probeProxy);
182
+
183
+ this.entry.children.push(probe.usedAsBuilder
184
+ ? { targetProperty: targetHandler.property, identifiedBy: probe.identifiedByProperty, usingKey: probe.usingKeyProperty }
185
+ : { targetProperty: targetHandler.property, fromEventProperty: probe.capturedEventProperty });
186
+ return this;
142
187
  }
143
188
 
144
189
  /** @inheritdoc */
145
190
  setThisValue(): ISetBuilder<TEvent, this> {
146
- throw new Error('setThisValue is not implemented yet.');
191
+ return new SetBuilder<TEvent, this>(
192
+ '$this',
193
+ (rp, expr) => { this.entry.properties[rp] = expr; },
194
+ this
195
+ );
147
196
  }
148
197
  }
@@ -0,0 +1,76 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
5
+ import { ChildrenDefinitionLike, ProjectionBuilderCore } from './ProjectionBuilderCore';
6
+ import { IChildrenBuilder } from './IChildrenBuilder';
7
+ import { INestedBuilder } from './INestedBuilder';
8
+ import { ChildrenBuilder } from './ChildrenBuilder';
9
+
10
+ /**
11
+ * Concrete implementation of {@link INestedBuilder}, building the `ChildrenDefinition` for a
12
+ * nested single-object sub-projection reached through `.nested()`.
13
+ * @template TParentReadModel - The parent read model type.
14
+ * @template TNestedReadModel - The nested object read model type.
15
+ */
16
+ export class NestedBuilder<TParentReadModel, TNestedReadModel>
17
+ extends ProjectionBuilderCore<TNestedReadModel, INestedBuilder<TParentReadModel, TNestedReadModel>>
18
+ implements INestedBuilder<TParentReadModel, TNestedReadModel> {
19
+ /** @inheritdoc */
20
+ clearWith(eventType: Function): INestedBuilder<TParentReadModel, TNestedReadModel> {
21
+ const contractType = this.toContractEventType(eventType);
22
+ this._removedWith.push({
23
+ Key: contractType,
24
+ Value: { Key: '$eventSourceId', ParentKey: '' }
25
+ });
26
+ return this;
27
+ }
28
+
29
+ /** @inheritdoc */
30
+ children<TChildModel>(
31
+ targetPropertyAccessor: PropertyAccessor<TNestedReadModel>,
32
+ builderCallback: (builder: IChildrenBuilder<TNestedReadModel, TChildModel>) => void
33
+ ): INestedBuilder<TParentReadModel, TNestedReadModel> {
34
+ const handler = new PropertyPathResolverProxyHandler();
35
+ const proxy = new Proxy({}, handler);
36
+ targetPropertyAccessor(proxy as TNestedReadModel);
37
+
38
+ const builder = new ChildrenBuilder<TNestedReadModel, TChildModel>();
39
+ builderCallback(builder);
40
+ this._children[handler.property] = builder.buildDefinition();
41
+ return this;
42
+ }
43
+
44
+ /** @inheritdoc */
45
+ nested<TGrandNestedModel>(
46
+ targetPropertyAccessor: PropertyAccessor<TNestedReadModel>,
47
+ builderCallback: (builder: INestedBuilder<TNestedReadModel, TGrandNestedModel>) => void
48
+ ): INestedBuilder<TParentReadModel, TNestedReadModel> {
49
+ const handler = new PropertyPathResolverProxyHandler();
50
+ const proxy = new Proxy({}, handler);
51
+ targetPropertyAccessor(proxy as TNestedReadModel);
52
+
53
+ const builder = new NestedBuilder<TNestedReadModel, TGrandNestedModel>();
54
+ builderCallback(builder);
55
+ this._nested[handler.property] = builder.buildDefinition();
56
+ return this;
57
+ }
58
+
59
+ /**
60
+ * Builds the {@link ChildrenDefinitionLike} representing this nested object.
61
+ * @returns The accumulated nested definition.
62
+ */
63
+ buildDefinition(): ChildrenDefinitionLike {
64
+ return {
65
+ IdentifiedBy: '',
66
+ From: this._from,
67
+ Join: this._join,
68
+ Children: this._children,
69
+ All: this._all,
70
+ RemovedWith: this._removedWith,
71
+ RemovedWithJoin: this._removedWithJoin,
72
+ AutoMap: this._autoMap,
73
+ Nested: this._nested
74
+ };
75
+ }
76
+ }