@decaf-ts/core 0.5.0 → 0.5.2

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 (330) hide show
  1. package/LICENSE.md +21 -157
  2. package/README.md +652 -15
  3. package/dist/core.cjs +2638 -1085
  4. package/dist/core.esm.cjs +2636 -1070
  5. package/lib/esm/identity/decorators.d.ts +52 -14
  6. package/lib/esm/identity/decorators.js +54 -16
  7. package/lib/esm/identity/utils.d.ts +20 -1
  8. package/lib/esm/identity/utils.js +22 -2
  9. package/lib/esm/index.d.ts +11 -15
  10. package/lib/esm/index.js +17 -19
  11. package/lib/esm/interfaces/ErrorParser.d.ts +12 -0
  12. package/lib/esm/interfaces/ErrorParser.js +1 -1
  13. package/lib/esm/interfaces/Executor.d.ts +10 -13
  14. package/lib/esm/interfaces/Executor.js +1 -1
  15. package/lib/esm/interfaces/Observable.d.ts +20 -18
  16. package/lib/esm/interfaces/Observable.js +1 -1
  17. package/lib/esm/interfaces/Observer.d.ts +7 -8
  18. package/lib/esm/interfaces/Observer.js +1 -1
  19. package/lib/esm/interfaces/Paginatable.d.ts +18 -2
  20. package/lib/esm/interfaces/Paginatable.js +1 -1
  21. package/lib/esm/interfaces/Queriable.d.ts +44 -3
  22. package/lib/esm/interfaces/Queriable.js +1 -1
  23. package/lib/esm/interfaces/RawExecutor.d.ts +10 -13
  24. package/lib/esm/interfaces/RawExecutor.js +1 -1
  25. package/lib/esm/interfaces/SequenceOptions.d.ts +50 -5
  26. package/lib/esm/interfaces/SequenceOptions.js +19 -1
  27. package/lib/esm/interfaces/index.d.ts +0 -1
  28. package/lib/esm/interfaces/index.js +1 -2
  29. package/lib/esm/model/BaseModel.d.ts +31 -0
  30. package/lib/esm/model/BaseModel.js +24 -1
  31. package/lib/esm/model/construction.d.ts +442 -9
  32. package/lib/esm/model/construction.js +441 -2
  33. package/lib/esm/model/decorators.d.ts +166 -42
  34. package/lib/esm/model/decorators.js +161 -37
  35. package/lib/esm/model/index.js +1 -2
  36. package/lib/esm/model/types.d.ts +9 -0
  37. package/lib/esm/model/types.js +1 -1
  38. package/lib/esm/persistence/Adapter.d.ts +384 -40
  39. package/lib/esm/persistence/Adapter.js +415 -59
  40. package/lib/esm/persistence/Dispatch.d.ts +131 -0
  41. package/lib/esm/persistence/Dispatch.js +187 -0
  42. package/lib/esm/persistence/ObserverHandler.d.ts +109 -0
  43. package/lib/esm/persistence/ObserverHandler.js +137 -0
  44. package/lib/esm/persistence/Sequence.d.ts +89 -8
  45. package/lib/esm/persistence/Sequence.js +91 -1
  46. package/lib/esm/persistence/constants.d.ts +22 -5
  47. package/lib/esm/persistence/constants.js +23 -7
  48. package/lib/esm/persistence/decorators.d.ts +10 -0
  49. package/lib/esm/persistence/decorators.js +11 -1
  50. package/lib/esm/persistence/errors.d.ts +23 -3
  51. package/lib/esm/persistence/errors.js +25 -7
  52. package/lib/esm/persistence/index.d.ts +3 -0
  53. package/lib/esm/persistence/index.js +4 -1
  54. package/lib/esm/persistence/types.d.ts +21 -0
  55. package/lib/esm/persistence/types.js +2 -0
  56. package/lib/esm/query/Condition.d.ts +88 -44
  57. package/lib/esm/query/Condition.js +144 -62
  58. package/lib/esm/query/Paginator.d.ts +67 -10
  59. package/lib/esm/query/Paginator.js +64 -10
  60. package/lib/esm/query/Statement.d.ts +82 -47
  61. package/lib/esm/query/Statement.js +175 -122
  62. package/lib/esm/query/constants.d.ts +25 -64
  63. package/lib/esm/query/constants.js +26 -68
  64. package/lib/esm/query/errors.d.ts +14 -0
  65. package/lib/esm/query/errors.js +15 -1
  66. package/lib/esm/query/index.d.ts +0 -5
  67. package/lib/esm/query/index.js +1 -6
  68. package/lib/esm/query/options.d.ts +69 -178
  69. package/lib/esm/query/options.js +1 -1
  70. package/lib/esm/query/selectors.d.ts +20 -24
  71. package/lib/esm/query/selectors.js +1 -1
  72. package/lib/esm/ram/RamAdapter.d.ts +322 -20
  73. package/lib/esm/ram/RamAdapter.js +360 -140
  74. package/lib/esm/ram/RamContext.d.ts +16 -1
  75. package/lib/esm/ram/RamContext.js +18 -3
  76. package/lib/esm/ram/RamPaginator.d.ts +51 -6
  77. package/lib/esm/ram/RamPaginator.js +58 -6
  78. package/lib/esm/ram/RamSequence.d.ts +49 -24
  79. package/lib/esm/ram/RamSequence.js +52 -40
  80. package/lib/esm/ram/RamStatement.d.ts +84 -6
  81. package/lib/esm/ram/RamStatement.js +175 -6
  82. package/lib/esm/ram/constants.d.ts +9 -0
  83. package/lib/esm/ram/constants.js +10 -0
  84. package/lib/esm/ram/handlers.d.ts +25 -0
  85. package/lib/esm/ram/handlers.js +27 -0
  86. package/lib/esm/ram/index.d.ts +4 -4
  87. package/lib/esm/ram/index.js +9 -5
  88. package/lib/esm/ram/model/RamSequence.d.ts +21 -9
  89. package/lib/esm/ram/model/RamSequence.js +19 -1
  90. package/lib/esm/ram/types.d.ts +47 -5
  91. package/lib/esm/ram/types.js +1 -1
  92. package/lib/esm/repository/Repository.d.ts +381 -22
  93. package/lib/esm/repository/Repository.js +446 -43
  94. package/lib/esm/repository/constants.d.ts +23 -13
  95. package/lib/esm/repository/constants.js +24 -14
  96. package/lib/esm/repository/decorators.d.ts +27 -0
  97. package/lib/esm/repository/decorators.js +28 -1
  98. package/lib/esm/repository/errors.d.ts +12 -11
  99. package/lib/esm/repository/errors.js +13 -16
  100. package/lib/esm/repository/injectables.d.ts +18 -0
  101. package/lib/esm/repository/injectables.js +19 -1
  102. package/lib/esm/repository/types.d.ts +13 -1
  103. package/lib/esm/repository/types.js +1 -1
  104. package/lib/esm/repository/utils.d.ts +11 -0
  105. package/lib/esm/repository/utils.js +12 -1
  106. package/lib/esm/utils/decorators.d.ts +9 -0
  107. package/lib/esm/utils/decorators.js +19 -0
  108. package/lib/esm/utils/errors.d.ts +56 -0
  109. package/lib/esm/utils/errors.js +63 -0
  110. package/lib/esm/utils/index.d.ts +2 -0
  111. package/lib/esm/utils/index.js +3 -0
  112. package/lib/identity/decorators.cjs +54 -16
  113. package/lib/identity/decorators.d.ts +52 -14
  114. package/lib/identity/utils.cjs +22 -2
  115. package/lib/identity/utils.d.ts +20 -1
  116. package/lib/index.cjs +17 -19
  117. package/lib/index.d.ts +11 -15
  118. package/lib/interfaces/ErrorParser.cjs +1 -1
  119. package/lib/interfaces/ErrorParser.d.ts +12 -0
  120. package/lib/interfaces/Executor.cjs +1 -1
  121. package/lib/interfaces/Executor.d.ts +10 -13
  122. package/lib/interfaces/Observable.cjs +1 -1
  123. package/lib/interfaces/Observable.d.ts +20 -18
  124. package/lib/interfaces/Observer.cjs +1 -1
  125. package/lib/interfaces/Observer.d.ts +7 -8
  126. package/lib/interfaces/Paginatable.cjs +1 -1
  127. package/lib/interfaces/Paginatable.d.ts +18 -2
  128. package/lib/interfaces/Queriable.cjs +1 -1
  129. package/lib/interfaces/Queriable.d.ts +44 -3
  130. package/lib/interfaces/RawExecutor.cjs +1 -1
  131. package/lib/interfaces/RawExecutor.d.ts +10 -13
  132. package/lib/interfaces/SequenceOptions.cjs +19 -1
  133. package/lib/interfaces/SequenceOptions.d.ts +50 -5
  134. package/lib/interfaces/index.cjs +1 -2
  135. package/lib/interfaces/index.d.ts +0 -1
  136. package/lib/model/BaseModel.cjs +24 -1
  137. package/lib/model/BaseModel.d.ts +31 -0
  138. package/lib/model/construction.cjs +441 -2
  139. package/lib/model/construction.d.ts +442 -9
  140. package/lib/model/decorators.cjs +161 -37
  141. package/lib/model/decorators.d.ts +166 -42
  142. package/lib/model/index.cjs +1 -2
  143. package/lib/model/types.cjs +1 -1
  144. package/lib/model/types.d.ts +9 -0
  145. package/lib/persistence/Adapter.cjs +414 -58
  146. package/lib/persistence/Adapter.d.ts +384 -40
  147. package/lib/persistence/Dispatch.cjs +191 -0
  148. package/lib/persistence/Dispatch.d.ts +131 -0
  149. package/lib/persistence/ObserverHandler.cjs +141 -0
  150. package/lib/persistence/ObserverHandler.d.ts +109 -0
  151. package/lib/persistence/Sequence.cjs +91 -1
  152. package/lib/persistence/Sequence.d.ts +89 -8
  153. package/lib/persistence/constants.cjs +24 -8
  154. package/lib/persistence/constants.d.ts +22 -5
  155. package/lib/persistence/decorators.cjs +11 -1
  156. package/lib/persistence/decorators.d.ts +10 -0
  157. package/lib/persistence/errors.cjs +26 -9
  158. package/lib/persistence/errors.d.ts +23 -3
  159. package/lib/persistence/index.cjs +4 -1
  160. package/lib/persistence/index.d.ts +3 -0
  161. package/lib/persistence/types.cjs +3 -0
  162. package/lib/persistence/types.d.ts +21 -0
  163. package/lib/query/Condition.cjs +143 -61
  164. package/lib/query/Condition.d.ts +88 -44
  165. package/lib/query/Paginator.cjs +64 -10
  166. package/lib/query/Paginator.d.ts +67 -10
  167. package/lib/query/Statement.cjs +174 -121
  168. package/lib/query/Statement.d.ts +82 -47
  169. package/lib/query/constants.cjs +27 -69
  170. package/lib/query/constants.d.ts +25 -64
  171. package/lib/query/errors.cjs +15 -1
  172. package/lib/query/errors.d.ts +14 -0
  173. package/lib/query/index.cjs +1 -6
  174. package/lib/query/index.d.ts +0 -5
  175. package/lib/query/options.cjs +1 -1
  176. package/lib/query/options.d.ts +69 -178
  177. package/lib/query/selectors.cjs +1 -1
  178. package/lib/query/selectors.d.ts +20 -24
  179. package/lib/ram/RamAdapter.cjs +358 -172
  180. package/lib/ram/RamAdapter.d.ts +322 -20
  181. package/lib/ram/RamContext.cjs +18 -3
  182. package/lib/ram/RamContext.d.ts +16 -1
  183. package/lib/ram/RamPaginator.cjs +58 -6
  184. package/lib/ram/RamPaginator.d.ts +51 -6
  185. package/lib/ram/RamSequence.cjs +52 -41
  186. package/lib/ram/RamSequence.d.ts +49 -24
  187. package/lib/ram/RamStatement.cjs +175 -6
  188. package/lib/ram/RamStatement.d.ts +84 -6
  189. package/lib/ram/constants.cjs +13 -0
  190. package/lib/ram/constants.d.ts +9 -0
  191. package/lib/ram/handlers.cjs +30 -0
  192. package/lib/ram/handlers.d.ts +25 -0
  193. package/lib/ram/index.cjs +9 -5
  194. package/lib/ram/index.d.ts +4 -4
  195. package/lib/ram/model/RamSequence.cjs +19 -1
  196. package/lib/ram/model/RamSequence.d.ts +21 -9
  197. package/lib/ram/types.cjs +1 -1
  198. package/lib/ram/types.d.ts +47 -5
  199. package/lib/repository/Repository.cjs +445 -42
  200. package/lib/repository/Repository.d.ts +381 -22
  201. package/lib/repository/constants.cjs +24 -14
  202. package/lib/repository/constants.d.ts +23 -13
  203. package/lib/repository/decorators.cjs +28 -1
  204. package/lib/repository/decorators.d.ts +27 -0
  205. package/lib/repository/errors.cjs +14 -19
  206. package/lib/repository/errors.d.ts +12 -11
  207. package/lib/repository/injectables.cjs +19 -1
  208. package/lib/repository/injectables.d.ts +18 -0
  209. package/lib/repository/types.cjs +1 -1
  210. package/lib/repository/types.d.ts +13 -1
  211. package/lib/repository/utils.cjs +12 -1
  212. package/lib/repository/utils.d.ts +11 -0
  213. package/lib/utils/decorators.cjs +22 -0
  214. package/lib/utils/decorators.d.ts +9 -0
  215. package/lib/utils/errors.cjs +69 -0
  216. package/lib/utils/errors.d.ts +56 -0
  217. package/lib/{validators → utils}/index.cjs +2 -2
  218. package/lib/utils/index.d.ts +2 -0
  219. package/package.json +5 -5
  220. package/lib/esm/interfaces/Builder.d.ts +0 -16
  221. package/lib/esm/interfaces/Builder.js +0 -2
  222. package/lib/esm/model/IdentifiedBaseModel.d.ts +0 -7
  223. package/lib/esm/model/IdentifiedBaseModel.js +0 -25
  224. package/lib/esm/query/Clause.d.ts +0 -50
  225. package/lib/esm/query/Clause.js +0 -82
  226. package/lib/esm/query/ClauseFactory.d.ts +0 -71
  227. package/lib/esm/query/ClauseFactory.js +0 -6
  228. package/lib/esm/query/Query.d.ts +0 -43
  229. package/lib/esm/query/Query.js +0 -54
  230. package/lib/esm/query/clauses/FromClause.d.ts +0 -45
  231. package/lib/esm/query/clauses/FromClause.js +0 -59
  232. package/lib/esm/query/clauses/GroupByClause.d.ts +0 -21
  233. package/lib/esm/query/clauses/GroupByClause.js +0 -19
  234. package/lib/esm/query/clauses/InsertClause.d.ts +0 -37
  235. package/lib/esm/query/clauses/InsertClause.js +0 -55
  236. package/lib/esm/query/clauses/LimitClause.d.ts +0 -29
  237. package/lib/esm/query/clauses/LimitClause.js +0 -27
  238. package/lib/esm/query/clauses/OffsetClause.d.ts +0 -21
  239. package/lib/esm/query/clauses/OffsetClause.js +0 -19
  240. package/lib/esm/query/clauses/OrderByClause.d.ts +0 -37
  241. package/lib/esm/query/clauses/OrderByClause.js +0 -39
  242. package/lib/esm/query/clauses/SelectClause.d.ts +0 -47
  243. package/lib/esm/query/clauses/SelectClause.js +0 -62
  244. package/lib/esm/query/clauses/SelectorBasedClause.d.ts +0 -25
  245. package/lib/esm/query/clauses/SelectorBasedClause.js +0 -44
  246. package/lib/esm/query/clauses/ValuesClause.d.ts +0 -21
  247. package/lib/esm/query/clauses/ValuesClause.js +0 -36
  248. package/lib/esm/query/clauses/WhereClause.d.ts +0 -46
  249. package/lib/esm/query/clauses/WhereClause.js +0 -71
  250. package/lib/esm/query/clauses/index.d.ts +0 -10
  251. package/lib/esm/query/clauses/index.js +0 -11
  252. package/lib/esm/query/types.d.ts +0 -2
  253. package/lib/esm/query/types.js +0 -2
  254. package/lib/esm/ram/RamClauseFactory.d.ts +0 -17
  255. package/lib/esm/ram/RamClauseFactory.js +0 -92
  256. package/lib/esm/ram/clauses/FromClause.d.ts +0 -7
  257. package/lib/esm/ram/clauses/FromClause.js +0 -11
  258. package/lib/esm/ram/clauses/InsertClause.d.ts +0 -7
  259. package/lib/esm/ram/clauses/InsertClause.js +0 -13
  260. package/lib/esm/ram/clauses/OrderByClause.d.ts +0 -7
  261. package/lib/esm/ram/clauses/OrderByClause.js +0 -39
  262. package/lib/esm/ram/clauses/SelectClause.d.ts +0 -7
  263. package/lib/esm/ram/clauses/SelectClause.js +0 -16
  264. package/lib/esm/ram/clauses/ValuesClause.d.ts +0 -7
  265. package/lib/esm/ram/clauses/ValuesClause.js +0 -12
  266. package/lib/esm/ram/clauses/WhereClause.d.ts +0 -7
  267. package/lib/esm/ram/clauses/WhereClause.js +0 -11
  268. package/lib/esm/ram/clauses/index.d.ts +0 -6
  269. package/lib/esm/ram/clauses/index.js +0 -7
  270. package/lib/esm/validators/ClauseSequenceValidator.d.ts +0 -28
  271. package/lib/esm/validators/ClauseSequenceValidator.js +0 -95
  272. package/lib/esm/validators/decorators.d.ts +0 -10
  273. package/lib/esm/validators/decorators.js +0 -24
  274. package/lib/esm/validators/index.d.ts +0 -2
  275. package/lib/esm/validators/index.js +0 -3
  276. package/lib/interfaces/Builder.cjs +0 -3
  277. package/lib/interfaces/Builder.d.ts +0 -16
  278. package/lib/model/IdentifiedBaseModel.cjs +0 -29
  279. package/lib/model/IdentifiedBaseModel.d.ts +0 -7
  280. package/lib/query/Clause.cjs +0 -86
  281. package/lib/query/Clause.d.ts +0 -50
  282. package/lib/query/ClauseFactory.cjs +0 -10
  283. package/lib/query/ClauseFactory.d.ts +0 -71
  284. package/lib/query/Query.cjs +0 -58
  285. package/lib/query/Query.d.ts +0 -43
  286. package/lib/query/clauses/FromClause.cjs +0 -63
  287. package/lib/query/clauses/FromClause.d.ts +0 -45
  288. package/lib/query/clauses/GroupByClause.cjs +0 -23
  289. package/lib/query/clauses/GroupByClause.d.ts +0 -21
  290. package/lib/query/clauses/InsertClause.cjs +0 -59
  291. package/lib/query/clauses/InsertClause.d.ts +0 -37
  292. package/lib/query/clauses/LimitClause.cjs +0 -31
  293. package/lib/query/clauses/LimitClause.d.ts +0 -29
  294. package/lib/query/clauses/OffsetClause.cjs +0 -23
  295. package/lib/query/clauses/OffsetClause.d.ts +0 -21
  296. package/lib/query/clauses/OrderByClause.cjs +0 -43
  297. package/lib/query/clauses/OrderByClause.d.ts +0 -37
  298. package/lib/query/clauses/SelectClause.cjs +0 -66
  299. package/lib/query/clauses/SelectClause.d.ts +0 -47
  300. package/lib/query/clauses/SelectorBasedClause.cjs +0 -48
  301. package/lib/query/clauses/SelectorBasedClause.d.ts +0 -25
  302. package/lib/query/clauses/ValuesClause.cjs +0 -40
  303. package/lib/query/clauses/ValuesClause.d.ts +0 -21
  304. package/lib/query/clauses/WhereClause.cjs +0 -75
  305. package/lib/query/clauses/WhereClause.d.ts +0 -46
  306. package/lib/query/clauses/index.cjs +0 -27
  307. package/lib/query/clauses/index.d.ts +0 -10
  308. package/lib/query/types.cjs +0 -3
  309. package/lib/query/types.d.ts +0 -2
  310. package/lib/ram/RamClauseFactory.cjs +0 -96
  311. package/lib/ram/RamClauseFactory.d.ts +0 -17
  312. package/lib/ram/clauses/FromClause.cjs +0 -15
  313. package/lib/ram/clauses/FromClause.d.ts +0 -7
  314. package/lib/ram/clauses/InsertClause.cjs +0 -17
  315. package/lib/ram/clauses/InsertClause.d.ts +0 -7
  316. package/lib/ram/clauses/OrderByClause.cjs +0 -43
  317. package/lib/ram/clauses/OrderByClause.d.ts +0 -7
  318. package/lib/ram/clauses/SelectClause.cjs +0 -20
  319. package/lib/ram/clauses/SelectClause.d.ts +0 -7
  320. package/lib/ram/clauses/ValuesClause.cjs +0 -16
  321. package/lib/ram/clauses/ValuesClause.d.ts +0 -7
  322. package/lib/ram/clauses/WhereClause.cjs +0 -15
  323. package/lib/ram/clauses/WhereClause.d.ts +0 -7
  324. package/lib/ram/clauses/index.cjs +0 -23
  325. package/lib/ram/clauses/index.d.ts +0 -6
  326. package/lib/validators/ClauseSequenceValidator.cjs +0 -98
  327. package/lib/validators/ClauseSequenceValidator.d.ts +0 -28
  328. package/lib/validators/decorators.cjs +0 -27
  329. package/lib/validators/decorators.d.ts +0 -10
  330. package/lib/validators/index.d.ts +0 -2
@@ -1,18 +1,187 @@
1
- import { Statement } from "../query";
1
+ import { GroupOperator, Operator, QueryError, } from "../query";
2
2
  import { RamPaginator } from "./RamPaginator";
3
3
  import { InternalError } from "@decaf-ts/db-decorators";
4
+ import { Statement } from "../query/Statement";
5
+ import { Reflection } from "@decaf-ts/reflection";
6
+ /**
7
+ * @description RAM-specific query statement builder
8
+ * @summary Extends the base Statement class to provide query building functionality for the RAM adapter.
9
+ * This class translates high-level query operations into predicates that can filter and sort
10
+ * in-memory data structures.
11
+ * @template M - The model type being queried
12
+ * @template R - The result type returned by the query
13
+ * @param {RamAdapter} adapter - The RAM adapter instance to use for executing queries
14
+ * @class RamStatement
15
+ * @category Ram
16
+ * @example
17
+ * ```typescript
18
+ * // Create a statement for querying User models
19
+ * const statement = new RamStatement<User, User>(ramAdapter);
20
+ *
21
+ * // Build a query to find active users with age > 18
22
+ * const results = await statement
23
+ * .from(User)
24
+ * .where(Condition.and(
25
+ * Condition.eq('active', true),
26
+ * Condition.gt('age', 18)
27
+ * ))
28
+ * .orderBy('lastName', 'asc')
29
+ * .limit(10)
30
+ * .execute();
31
+ * ```
32
+ */
4
33
  export class RamStatement extends Statement {
5
- constructor(db) {
6
- super(db);
34
+ constructor(adapter) {
35
+ super(adapter);
7
36
  }
8
- paginate(size) {
37
+ /**
38
+ * @description Creates a sort comparator function
39
+ * @summary Generates a function that compares two model instances based on the orderBy criteria.
40
+ * This method handles different data types (string, number, date) and sort directions (asc, desc).
41
+ * @return {function(Model, Model): number} A comparator function for sorting model instances
42
+ */
43
+ getSort() {
44
+ return (el1, el2) => {
45
+ if (!this.orderBySelector)
46
+ throw new InternalError("orderBySelector not set. Should be impossible");
47
+ const selector = this.orderBySelector;
48
+ const [key, direction] = selector;
49
+ const type = Reflection.getTypeFromDecorator(el1, key);
50
+ if (!type)
51
+ throw new QueryError(`type not compatible with sorting: ${type}`);
52
+ switch (type) {
53
+ case "string":
54
+ case "String":
55
+ return ((direction === "asc" ? 1 : -1) *
56
+ el1[key].localeCompare(el2[key]));
57
+ case "number":
58
+ case "Number":
59
+ return ((direction === "asc" ? 1 : -1) *
60
+ (el1[key] -
61
+ el2[key]));
62
+ case "object":
63
+ case "Object":
64
+ if (el1[key] instanceof Date &&
65
+ el2[key] instanceof Date)
66
+ return ((direction === "asc" ? 1 : -1) *
67
+ (el1[key].valueOf() -
68
+ el2[key].valueOf()));
69
+ throw new QueryError(`Sorting not supported for not date classes`);
70
+ default:
71
+ throw new QueryError(`sorting not supported for type ${type}`);
72
+ }
73
+ };
74
+ }
75
+ /**
76
+ * @description Builds a RAM query from the statement
77
+ * @summary Converts the statement's selectors and conditions into a RawRamQuery object
78
+ * that can be executed by the RAM adapter. This method assembles all query components
79
+ * (select, from, where, limit, offset, sort) into the final query structure.
80
+ * @return {RawRamQuery<M>} The constructed RAM query object
81
+ */
82
+ build() {
83
+ const result = {
84
+ select: this.selectSelector,
85
+ from: this.fromSelector,
86
+ where: this.whereCondition
87
+ ? this.parseCondition(this.whereCondition).where
88
+ : // eslint-disable-next-line @typescript-eslint/no-unused-vars
89
+ (el) => {
90
+ return true;
91
+ },
92
+ limit: this.limitSelector,
93
+ skip: this.offsetSelector,
94
+ };
95
+ if (this.orderBySelector)
96
+ result.sort = this.getSort();
97
+ return result;
98
+ }
99
+ /**
100
+ * @description Creates a paginator for the query
101
+ * @summary Builds the query and wraps it in a RamPaginator to enable pagination of results.
102
+ * This allows retrieving large result sets in smaller chunks.
103
+ * @param {number} size - The page size (number of results per page)
104
+ * @return {Promise<Paginator<M, R, RawRamQuery<M>>>} A promise that resolves to a paginator for the query
105
+ */
106
+ async paginate(size) {
9
107
  try {
10
108
  const query = this.build();
11
- return new RamPaginator(this, size, query);
109
+ return new RamPaginator(this.adapter, query, size, this.fromSelector);
12
110
  }
13
111
  catch (e) {
14
112
  throw new InternalError(e);
15
113
  }
16
114
  }
115
+ /**
116
+ * @description Parses a condition into a RAM query predicate
117
+ * @summary Converts a Condition object into a predicate function that can be used
118
+ * to filter model instances in memory. This method handles both simple conditions
119
+ * (equals, greater than, etc.) and complex conditions with logical operators (AND, OR).
120
+ * @template M - The model type for the condition
121
+ * @param {Condition<M>} condition - The condition to parse
122
+ * @return {RawRamQuery<M>} A RAM query object with a where predicate function
123
+ * @mermaid
124
+ * sequenceDiagram
125
+ * participant Caller
126
+ * participant RamStatement
127
+ * participant SimpleCondition
128
+ * participant ComplexCondition
129
+ *
130
+ * Caller->>RamStatement: parseCondition(condition)
131
+ * alt Simple condition (eq, gt, lt, etc.)
132
+ * RamStatement->>SimpleCondition: Extract attr1, operator, comparison
133
+ * SimpleCondition-->>RamStatement: Return predicate function
134
+ * else Logical operator (AND, OR)
135
+ * RamStatement->>ComplexCondition: Extract nested conditions
136
+ * RamStatement->>RamStatement: parseCondition(leftCondition)
137
+ * RamStatement->>RamStatement: parseCondition(rightCondition)
138
+ * ComplexCondition-->>RamStatement: Combine predicates with logical operator
139
+ * end
140
+ * RamStatement-->>Caller: Return query with where predicate
141
+ */
142
+ parseCondition(condition) {
143
+ return {
144
+ where: (m) => {
145
+ const { attr1, operator, comparison } = condition;
146
+ if ([GroupOperator.AND, GroupOperator.OR, Operator.NOT].indexOf(operator) === -1) {
147
+ switch (operator) {
148
+ case Operator.BIGGER:
149
+ return m[attr1] > comparison;
150
+ case Operator.BIGGER_EQ:
151
+ return m[attr1] >= comparison;
152
+ case Operator.DIFFERENT:
153
+ return m[attr1] !== comparison;
154
+ case Operator.EQUAL:
155
+ return m[attr1] === comparison;
156
+ case Operator.REGEXP:
157
+ if (typeof m[attr1] !== "string")
158
+ throw new QueryError(`Invalid regexp comparison on a non string attribute: ${m[attr1]}`);
159
+ return !!m[attr1].match(new RegExp(comparison, "g"));
160
+ case Operator.SMALLER:
161
+ return m[attr1] < comparison;
162
+ case Operator.SMALLER_EQ:
163
+ return m[attr1] <= comparison;
164
+ default:
165
+ throw new InternalError(`Invalid operator for standard comparisons: ${operator}`);
166
+ }
167
+ }
168
+ else if (operator === Operator.NOT) {
169
+ throw new InternalError("Not implemented");
170
+ }
171
+ else {
172
+ const op1 = this.parseCondition(attr1);
173
+ const op2 = this.parseCondition(comparison);
174
+ switch (operator) {
175
+ case GroupOperator.AND:
176
+ return op1.where(m) && op2.where(m);
177
+ case GroupOperator.OR:
178
+ return op1.where(m) || op2.where(m);
179
+ default:
180
+ throw new InternalError(`Invalid operator for And/Or comparisons: ${operator}`);
181
+ }
182
+ }
183
+ },
184
+ };
185
+ }
17
186
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtU3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JhbS9SYW1TdGF0ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUloRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXhELE1BQU0sT0FBTyxZQUE4QixTQUFRLFNBQXNCO0lBQ3ZFLFlBQVksRUFBdUM7UUFDakQsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVELFFBQVEsQ0FBSSxJQUFZO1FBQ3RCLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFRLENBQUM7UUFDcEQsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFnaW5hdG9yLCBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB7IFJhbVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgUmFtUGFnaW5hdG9yIH0gZnJvbSBcIi4vUmFtUGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBjbGFzcyBSYW1TdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFN0YXRlbWVudDxSYW1RdWVyeTxNPj4ge1xuICBjb25zdHJ1Y3RvcihkYjogQWRhcHRlcjxhbnksIFJhbVF1ZXJ5PE0+LCBhbnksIGFueT4pIHtcbiAgICBzdXBlcihkYik7XG4gIH1cblxuICBwYWdpbmF0ZTxWPihzaXplOiBudW1iZXIpOiBQcm9taXNlPFBhZ2luYXRvcjxWLCBSYW1RdWVyeTxNPj4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmJ1aWxkKCk7XG4gICAgICByZXR1cm4gbmV3IFJhbVBhZ2luYXRvcih0aGlzLCBzaXplLCBxdWVyeSkgYXMgYW55O1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtU3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JhbS9SYW1TdGF0ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGFBQWEsRUFDYixRQUFRLEVBRVIsVUFBVSxHQUNYLE1BQU0sVUFBVSxDQUFDO0FBR2xCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUdsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLE9BQU8sWUFBaUMsU0FBUSxTQUlyRDtJQUNDLFlBQVksT0FBbUI7UUFDN0IsS0FBSyxDQUFDLE9BQWMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLE9BQU87UUFDYixPQUFPLENBQUMsR0FBVSxFQUFFLEdBQVUsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtnQkFDdkIsTUFBTSxJQUFJLGFBQWEsQ0FDckIsK0NBQStDLENBQ2hELENBQUM7WUFDSixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsR0FBYSxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLElBQUk7Z0JBQ1AsTUFBTSxJQUFJLFVBQVUsQ0FBQyxxQ0FBcUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVwRSxRQUFRLElBQUksRUFBRSxDQUFDO2dCQUNiLEtBQUssUUFBUSxD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QUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3JDLE1BQU0sSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sR0FBRyxHQUFxQixJQUFJLENBQUMsY0FBYyxDQUMvQyxLQUFxQixDQUN0QixDQUFDO29CQUNGLE1BQU0sR0FBRyxHQUFxQixJQUFJLENBQUMsY0FBYyxDQUMvQyxVQUEwQixDQUMzQixDQUFDO29CQUNGLFFBQVEsUUFBUSxFQUFFLENBQUM7d0JBQ2pCLEtBQUssYUFBYSxDQUFDLEdBQUc7NEJBQ3BCLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxLQUFLLGFBQWEsQ0FBQyxFQUFFOzRCQUNuQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdEM7NEJBQ0UsTUFBTSxJQUFJLGFBQWEsQ0FDckIsNENBQTRDLFFBQVEsRUFBRSxDQUN2RCxDQUFDO29CQUNOLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7U0FDa0IsQ0FBQztJQUN4QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBQYWdpbmF0b3IsXG4gIFF1ZXJ5RXJyb3IsXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgUmF3UmFtUXVlcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSYW1QYWdpbmF0b3IgfSBmcm9tIFwiLi9SYW1QYWdpbmF0b3JcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuLi9xdWVyeS9TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJhbUFkYXB0ZXIgfSBmcm9tIFwiLi9SYW1BZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJBTS1zcGVjaWZpYyBxdWVyeSBzdGF0ZW1lbnQgYnVpbGRlclxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBTdGF0ZW1lbnQgY2xhc3MgdG8gcHJvdmlkZSBxdWVyeSBidWlsZGluZyBmdW5jdGlvbmFsaXR5IGZvciB0aGUgUkFNIGFkYXB0ZXIuXG4gKiBUaGlzIGNsYXNzIHRyYW5zbGF0ZXMgaGlnaC1sZXZlbCBxdWVyeSBvcGVyYXRpb25zIGludG8gcHJlZGljYXRlcyB0aGF0IGNhbiBmaWx0ZXIgYW5kIHNvcnRcbiAqIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZXMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHF1ZXJpZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IHRoZSBxdWVyeVxuICogQHBhcmFtIHtSYW1BZGFwdGVyfSBhZGFwdGVyIC0gVGhlIFJBTSBhZGFwdGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgZXhlY3V0aW5nIHF1ZXJpZXNcbiAqIEBjbGFzcyBSYW1TdGF0ZW1lbnRcbiAqIEBjYXRlZ29yeSBSYW1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBzdGF0ZW1lbnQgZm9yIHF1ZXJ5aW5nIFVzZXIgbW9kZWxzXG4gKiBjb25zdCBzdGF0ZW1lbnQgPSBuZXcgUmFtU3RhdGVtZW50PFVzZXIsIFVzZXI+KHJhbUFkYXB0ZXIpO1xuICpcbiAqIC8vIEJ1aWxkIGEgcXVlcnkgdG8gZmluZCBhY3RpdmUgdXNlcnMgd2l0aCBhZ2UgPiAxOFxuICogY29uc3QgcmVzdWx0cyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmFuZChcbiAqICAgICBDb25kaXRpb24uZXEoJ2FjdGl2ZScsIHRydWUpLFxuICogICAgIENvbmRpdGlvbi5ndCgnYWdlJywgMTgpXG4gKiAgICkpXG4gKiAgIC5vcmRlckJ5KCdsYXN0TmFtZScsICdhc2MnKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBSYXdSYW1RdWVyeTxNPixcbiAgTSxcbiAgUlxuPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFJhbUFkYXB0ZXIpIHtcbiAgICBzdXBlcihhZGFwdGVyIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBzb3J0IGNvbXBhcmF0b3IgZnVuY3Rpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gbW9kZWwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBvcmRlckJ5IGNyaXRlcmlhLlxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGRpZmZlcmVudCBkYXRhIHR5cGVzIChzdHJpbmcsIG51bWJlciwgZGF0ZSkgYW5kIHNvcnQgZGlyZWN0aW9ucyAoYXNjLCBkZXNjKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb24oTW9kZWwsIE1vZGVsKTogbnVtYmVyfSBBIGNvbXBhcmF0b3IgZnVuY3Rpb24gZm9yIHNvcnRpbmcgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBwcml2YXRlIGdldFNvcnQoKSB7XG4gICAgcmV0dXJuIChlbDE6IE1vZGVsLCBlbDI6IE1vZGVsKSA9PiB7XG4gICAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBcIm9yZGVyQnlTZWxlY3RvciBub3Qgc2V0LiBTaG91bGQgYmUgaW1wb3NzaWJsZVwiXG4gICAgICAgICk7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMub3JkZXJCeVNlbGVjdG9yO1xuICAgICAgY29uc3QgW2tleSwgZGlyZWN0aW9uXSA9IHNlbGVjdG9yO1xuICAgICAgY29uc3QgdHlwZSA9IFJlZmxlY3Rpb24uZ2V0VHlwZUZyb21EZWNvcmF0b3IoZWwxLCBrZXkgYXMgc3RyaW5nKTtcbiAgICAgIGlmICghdHlwZSlcbiAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCBzb3J0aW5nOiAke3R5cGV9YCk7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIGNhc2UgXCJTdHJpbmdcIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gXCJhc2NcIiA/IDEgOiAtMSkgKlxuICAgICAgICAgICAgKGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgc3RyaW5nKS5sb2NhbGVDb21wYXJlKFxuICAgICAgICAgICAgICBlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIHN0cmluZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAoKGVsMVtrZXkgYXMga2V5b2YgTW9kZWxdIGFzIHVua25vd24gYXMgbnVtYmVyKSAtXG4gICAgICAgICAgICAgIChlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIG51bWJlcikpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gaW5zdGFuY2VvZiBEYXRlICYmXG4gICAgICAgICAgICBlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBpbnN0YW5jZW9mIERhdGVcbiAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBcImFzY1wiID8gMSA6IC0xKSAqXG4gICAgICAgICAgICAgICgoZWwxW2tleSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBEYXRlKS52YWx1ZU9mKCkgLVxuICAgICAgICAgICAgICAgIChlbDJba2V5IGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIERhdGUpLnZhbHVlT2YoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoYFNvcnRpbmcgbm90IHN1cHBvcnRlZCBmb3Igbm90IGRhdGUgY2xhc3Nlc2ApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBRdWVyeUVycm9yKGBzb3J0aW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFJBTSBxdWVyeSBmcm9tIHRoZSBzdGF0ZW1lbnRcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIHNlbGVjdG9ycyBhbmQgY29uZGl0aW9ucyBpbnRvIGEgUmF3UmFtUXVlcnkgb2JqZWN0XG4gICAqIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGJ5IHRoZSBSQU0gYWRhcHRlci4gVGhpcyBtZXRob2QgYXNzZW1ibGVzIGFsbCBxdWVyeSBjb21wb25lbnRzXG4gICAqIChzZWxlY3QsIGZyb20sIHdoZXJlLCBsaW1pdCwgb2Zmc2V0LCBzb3J0KSBpbnRvIHRoZSBmaW5hbCBxdWVyeSBzdHJ1Y3R1cmUuXG4gICAqIEByZXR1cm4ge1Jhd1JhbVF1ZXJ5PE0+fSBUaGUgY29uc3RydWN0ZWQgUkFNIHF1ZXJ5IG9iamVjdFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkKCk6IFJhd1JhbVF1ZXJ5PE0+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJhd1JhbVF1ZXJ5PE0+ID0ge1xuICAgICAgc2VsZWN0OiB0aGlzLnNlbGVjdFNlbGVjdG9yLFxuICAgICAgZnJvbTogdGhpcy5mcm9tU2VsZWN0b3IsXG4gICAgICB3aGVyZTogdGhpcy53aGVyZUNvbmRpdGlvblxuICAgICAgICA/IHRoaXMucGFyc2VDb25kaXRpb24odGhpcy53aGVyZUNvbmRpdGlvbikud2hlcmVcbiAgICAgICAgOiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgKGVsOiBNKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgbGltaXQ6IHRoaXMubGltaXRTZWxlY3RvcixcbiAgICAgIHNraXA6IHRoaXMub2Zmc2V0U2VsZWN0b3IsXG4gICAgfTtcbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpIHJlc3VsdC5zb3J0ID0gdGhpcy5nZXRTb3J0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHBhZ2luYXRvciBmb3IgdGhlIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgcXVlcnkgYW5kIHdyYXBzIGl0IGluIGEgUmFtUGFnaW5hdG9yIHRvIGVuYWJsZSBwYWdpbmF0aW9uIG9mIHJlc3VsdHMuXG4gICAqIFRoaXMgYWxsb3dzIHJldHJpZXZpbmcgbGFyZ2UgcmVzdWx0IHNldHMgaW4gc21hbGxlciBjaHVua3MuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIHBhZ2Ugc2l6ZSAobnVtYmVyIG9mIHJlc3VsdHMgcGVyIHBhZ2UpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UGFnaW5hdG9yPE0sIFIsIFJhd1JhbVF1ZXJ5PE0+Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yIGZvciB0aGUgcXVlcnlcbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlKHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFJhd1JhbVF1ZXJ5PE0+Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIHJldHVybiBuZXcgUmFtUGFnaW5hdG9yPE0sIFI+KFxuICAgICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBzaXplLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gYSBSQU0gcXVlcnkgcHJlZGljYXRlXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIGEgcHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWRcbiAgICogdG8gZmlsdGVyIG1vZGVsIGluc3RhbmNlcyBpbiBtZW1vcnkuIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBzaW1wbGUgY29uZGl0aW9uc1xuICAgKiAoZXF1YWxzLCBncmVhdGVyIHRoYW4sIGV0Yy4pIGFuZCBjb21wbGV4IGNvbmRpdGlvbnMgd2l0aCBsb2dpY2FsIG9wZXJhdG9ycyAoQU5ELCBPUikuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBjb25kaXRpb25cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gcGFyc2VcbiAgICogQHJldHVybiB7UmF3UmFtUXVlcnk8TT59IEEgUkFNIHF1ZXJ5IG9iamVjdCB3aXRoIGEgd2hlcmUgcHJlZGljYXRlIGZ1bmN0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbVN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFNpbXBsZUNvbmRpdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IENvbXBsZXhDb25kaXRpb25cbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICogICBhbHQgU2ltcGxlIGNvbmRpdGlvbiAoZXEsIGd0LCBsdCwgZXRjLilcbiAgICogICAgIFJhbVN0YXRlbWVudC0+PlNpbXBsZUNvbmRpdGlvbjogRXh0cmFjdCBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb25cbiAgICogICAgIFNpbXBsZUNvbmRpdGlvbi0tPj5SYW1TdGF0ZW1lbnQ6IFJldHVybiBwcmVkaWNhdGUgZnVuY3Rpb25cbiAgICogICBlbHNlIExvZ2ljYWwgb3BlcmF0b3IgKEFORCwgT1IpXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5Db21wbGV4Q29uZGl0aW9uOiBFeHRyYWN0IG5lc3RlZCBjb25kaXRpb25zXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGxlZnRDb25kaXRpb24pXG4gICAqICAgICBSYW1TdGF0ZW1lbnQtPj5SYW1TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKHJpZ2h0Q29uZGl0aW9uKVxuICAgKiAgICAgQ29tcGxleENvbmRpdGlvbi0tPj5SYW1TdGF0ZW1lbnQ6IENvbWJpbmUgcHJlZGljYXRlcyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3JcbiAgICogICBlbmRcbiAgICogICBSYW1TdGF0ZW1lbnQtLT4+Q2FsbGVyOiBSZXR1cm4gcXVlcnkgd2l0aCB3aGVyZSBwcmVkaWNhdGVcbiAgICovXG4gIHBhcnNlQ29uZGl0aW9uPE0gZXh0ZW5kcyBNb2RlbD4oY29uZGl0aW9uOiBDb25kaXRpb248TT4pOiBSYXdSYW1RdWVyeTxNPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiAobTogTW9kZWwpID0+IHtcbiAgICAgICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvciB8IEdyb3VwT3BlcmF0b3I7XG4gICAgICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICAgICApID09PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkJJR0dFUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID4gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuQklHR0VSX0VROlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPj0gY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuRElGRkVSRU5UOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gIT09IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkVRVUFMOlxuICAgICAgICAgICAgICByZXR1cm4gbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gPT09IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlJFR0VYUDpcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBJbnZhbGlkIHJlZ2V4cCBjb21wYXJpc29uIG9uIGEgbm9uIHN0cmluZyBhdHRyaWJ1dGU6ICR7bVthdHRyMSBhcyBrZXlvZiBNb2RlbF19YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiAhIShtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSBhcyB1bmtub3duIGFzIHN0cmluZykubWF0Y2goXG4gICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChjb21wYXJpc29uLCBcImdcIilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuU01BTExFUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIDwgY29tcGFyaXNvbjtcbiAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuU01BTExFUl9FUTpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdIDw9IGNvbXBhcmlzb247XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICBgSW52YWxpZCBvcGVyYXRvciBmb3Igc3RhbmRhcmQgY29tcGFyaXNvbnM6ICR7b3BlcmF0b3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRvciA9PT0gT3BlcmF0b3IuTk9UKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgb3AxOiBSYXdSYW1RdWVyeTxhbnk+ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgICAgIGF0dHIxIGFzIENvbmRpdGlvbjxNPlxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgb3AyOiBSYXdSYW1RdWVyeTxhbnk+ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgICAgIGNvbXBhcmlzb24gYXMgQ29uZGl0aW9uPE0+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pICYmIG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5PUjpcbiAgICAgICAgICAgICAgcmV0dXJuIG9wMS53aGVyZShtKSB8fCBvcDIud2hlcmUobSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICBgSW52YWxpZCBvcGVyYXRvciBmb3IgQW5kL09yIGNvbXBhcmlzb25zOiAke29wZXJhdG9yfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSBhcyBSYXdSYW1RdWVyeTxhbnk+O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @description Identifier for the RAM adapter
3
+ * @summary A constant string that uniquely identifies the RAM adapter in the system.
4
+ * Used for adapter type identification and configuration.
5
+ * @const RamFlavour
6
+ * @memberOf module:core
7
+ * @category Ram
8
+ */
9
+ export declare const RamFlavour = "ram";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @description Identifier for the RAM adapter
3
+ * @summary A constant string that uniquely identifies the RAM adapter in the system.
4
+ * Used for adapter type identification and configuration.
5
+ * @const RamFlavour
6
+ * @memberOf module:core
7
+ * @category Ram
8
+ */
9
+ export const RamFlavour = "ram";
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JhbS9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBJZGVudGlmaWVyIGZvciB0aGUgUkFNIGFkYXB0ZXJcbiAqIEBzdW1tYXJ5IEEgY29uc3RhbnQgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgUkFNIGFkYXB0ZXIgaW4gdGhlIHN5c3RlbS5cbiAqIFVzZWQgZm9yIGFkYXB0ZXIgdHlwZSBpZGVudGlmaWNhdGlvbiBhbmQgY29uZmlndXJhdGlvbi5cbiAqIEBjb25zdCBSYW1GbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBjYXRlZ29yeSBSYW1cbiAqL1xuZXhwb3J0IGNvbnN0IFJhbUZsYXZvdXIgPSBcInJhbVwiO1xuIl19
@@ -0,0 +1,25 @@
1
+ import { Model } from "@decaf-ts/decorator-validation";
2
+ import { Repo } from "../repository";
3
+ import { RelationsMetadata } from "../model";
4
+ import { RamFlags } from "./types";
5
+ import { Context } from "@decaf-ts/db-decorators";
6
+ /**
7
+ * @description Sets the created by field on a model during RAM create/update operations
8
+ * @summary Automatically populates a model field with the UUID from the context during create or update operations.
9
+ * This function is designed to be used as a handler for RAM operations to track entity creation.
10
+ * @template M - Type of the model being created/updated
11
+ * @template R - Type of the repository handling the model
12
+ * @template V - Type of the relations metadata
13
+ * @template F - Type of the RAM flags
14
+ * @template C - Type of the context
15
+ * @param {R} this - The repository instance
16
+ * @param {Context<F>} context - The operation context containing user identification
17
+ * @param {V} data - The relations metadata
18
+ * @param key - The property key to set with the UUID
19
+ * @param {M} model - The model instance being created/updated
20
+ * @return {Promise<void>} A promise that resolves when the field has been set
21
+ * @function createdByOnRamCreateUpdate
22
+ * @memberOf module:core
23
+ * @category Ram
24
+ */
25
+ export declare function createdByOnRamCreateUpdate<M extends Model, R extends Repo<M, F, C>, V extends RelationsMetadata, F extends RamFlags, C extends Context<F>>(this: R, context: Context<F>, data: V, key: keyof M, model: M): Promise<void>;
@@ -0,0 +1,27 @@
1
+ import { UnsupportedError } from "../persistence";
2
+ /**
3
+ * @description Sets the created by field on a model during RAM create/update operations
4
+ * @summary Automatically populates a model field with the UUID from the context during create or update operations.
5
+ * This function is designed to be used as a handler for RAM operations to track entity creation.
6
+ * @template M - Type of the model being created/updated
7
+ * @template R - Type of the repository handling the model
8
+ * @template V - Type of the relations metadata
9
+ * @template F - Type of the RAM flags
10
+ * @template C - Type of the context
11
+ * @param {R} this - The repository instance
12
+ * @param {Context<F>} context - The operation context containing user identification
13
+ * @param {V} data - The relations metadata
14
+ * @param key - The property key to set with the UUID
15
+ * @param {M} model - The model instance being created/updated
16
+ * @return {Promise<void>} A promise that resolves when the field has been set
17
+ * @function createdByOnRamCreateUpdate
18
+ * @memberOf module:core
19
+ * @category Ram
20
+ */
21
+ export async function createdByOnRamCreateUpdate(context, data, key, model) {
22
+ const uuid = context.get("UUID");
23
+ if (!uuid)
24
+ throw new UnsupportedError("This adapter does not support user identification");
25
+ model[key] = uuid;
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmFtL2hhbmRsZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDBCQUEwQixDQVE5QyxPQUFtQixFQUNuQixJQUFPLEVBQ1AsR0FBWSxFQUNaLEtBQVE7SUFFUixNQUFNLElBQUksR0FBVyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxJQUFJO1FBQ1AsTUFBTSxJQUFJLGdCQUFnQixDQUN4QixtREFBbUQsQ0FDcEQsQ0FBQztJQUNKLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFrQixDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlcG8gfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmVsYXRpb25zTWV0YWRhdGEgfSBmcm9tIFwiLi4vbW9kZWxcIjtcbmltcG9ydCB7IFJhbUZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRlZCBieSBmaWVsZCBvbiBhIG1vZGVsIGR1cmluZyBSQU0gY3JlYXRlL3VwZGF0ZSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBBdXRvbWF0aWNhbGx5IHBvcHVsYXRlcyBhIG1vZGVsIGZpZWxkIHdpdGggdGhlIFVVSUQgZnJvbSB0aGUgY29udGV4dCBkdXJpbmcgY3JlYXRlIG9yIHVwZGF0ZSBvcGVyYXRpb25zLlxuICogVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIGEgaGFuZGxlciBmb3IgUkFNIG9wZXJhdGlvbnMgdG8gdHJhY2sgZW50aXR5IGNyZWF0aW9uLlxuICogQHRlbXBsYXRlIE0gLSBUeXBlIG9mIHRoZSBtb2RlbCBiZWluZyBjcmVhdGVkL3VwZGF0ZWRcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBvZiB0aGUgcmVwb3NpdG9yeSBoYW5kbGluZyB0aGUgbW9kZWxcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFR5cGUgb2YgdGhlIFJBTSBmbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUeXBlIG9mIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIG9wZXJhdGlvbiBjb250ZXh0IGNvbnRhaW5pbmcgdXNlciBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IHdpdGggdGhlIFVVSURcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgYmVpbmcgY3JlYXRlZC91cGRhdGVkXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWVsZCBoYXMgYmVlbiBzZXRcbiAqIEBmdW5jdGlvbiBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgUmVwbzxNLCBGLCBDPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuICBGIGV4dGVuZHMgUmFtRmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHV1aWQ6IHN0cmluZyA9IGNvbnRleHQuZ2V0KFwiVVVJRFwiKTtcbiAgaWYgKCF1dWlkKVxuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJUaGlzIGFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIGlkZW50aWZpY2F0aW9uXCJcbiAgICApO1xuICBtb2RlbFtrZXldID0gdXVpZCBhcyBNW2tleW9mIE1dO1xufVxuIl19
@@ -1,9 +1,9 @@
1
- export * from "./clauses";
2
1
  export * from "./model";
3
- export * from "./RamAdapter";
4
- export * from "./RamClauseFactory";
2
+ export * from "./constants";
3
+ export * from "./handlers";
5
4
  export * from "./RamContext";
6
5
  export * from "./RamPaginator";
7
- export * from "./RamSequence";
8
6
  export * from "./RamStatement";
7
+ export * from "./RamSequence";
9
8
  export * from "./types";
9
+ export * from "./RamAdapter";
@@ -1,10 +1,14 @@
1
- export * from "./clauses";
1
+ import { RamAdapter } from "./RamAdapter";
2
+ // Invoked there to ensure decoration override
3
+ RamAdapter.decoration();
2
4
  export * from "./model";
3
- export * from "./RamAdapter";
4
- export * from "./RamClauseFactory";
5
+ export * from "./constants";
6
+ export * from "./handlers";
5
7
  export * from "./RamContext";
6
8
  export * from "./RamPaginator";
7
- export * from "./RamSequence";
8
9
  export * from "./RamStatement";
10
+ export * from "./RamSequence";
9
11
  export * from "./types";
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmFtL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vY2xhdXNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JhbUNsYXVzZUZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JhbUNvbnRleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JhbVBhZ2luYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUmFtU2VxdWVuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JhbVN0YXRlbWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbiJdfQ==
12
+ // left to last on purpose
13
+ export * from "./RamAdapter";
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmFtL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFMUMsOENBQThDO0FBQzlDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUV4QixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxTQUFTLENBQUM7QUFDeEIsMEJBQTBCO0FBQzFCLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcblxuLy8gSW52b2tlZCB0aGVyZSB0byBlbnN1cmUgZGVjb3JhdGlvbiBvdmVycmlkZVxuUmFtQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hhbmRsZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9SYW1Db250ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9SYW1QYWdpbmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JhbVN0YXRlbWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vUmFtU2VxdWVuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG4vLyBsZWZ0IHRvIGxhc3Qgb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vUmFtQWRhcHRlclwiO1xuIl19
@@ -1,19 +1,31 @@
1
1
  import type { ModelArg } from "@decaf-ts/decorator-validation";
2
2
  import { BaseModel } from "../../model";
3
+ /**
4
+ * @description RAM sequence model for auto-incrementing values
5
+ * @summary A model class that represents a sequence in the RAM adapter. It stores the current value
6
+ * of a sequence that can be used for generating sequential identifiers for entities.
7
+ * The sequence is identified by its ID and maintains the current value.
8
+ * @param {ModelArg<Sequence>} seq - Initial sequence data
9
+ * @class Sequence
10
+ * @category Ram
11
+ * @example
12
+ * ```typescript
13
+ * // Create a new sequence
14
+ * const orderSequence = new Sequence({ id: 'order_seq', current: 1 });
15
+ *
16
+ * // Use the sequence to get the next value
17
+ * const nextOrderId = parseInt(orderSequence.current.toString()) + 1;
18
+ * orderSequence.current = nextOrderId;
19
+ * ```
20
+ */
3
21
  export declare class Sequence extends BaseModel {
4
22
  /**
5
- * @summary the Primary key for the DBSequence
6
- * @prop name
7
- *
8
- * @see pk
23
+ * @description Primary key identifier for the sequence
9
24
  */
10
25
  id: string;
11
26
  /**
12
- * @summary the current value for the DBSequence
13
- * @prop current
14
- *
15
- * @see required
16
- * @see index
27
+ * @description Current value of the sequence
28
+ * Used to generate the next sequential value
17
29
  */
18
30
  current: string | number;
19
31
  constructor(seq?: ModelArg<Sequence>);
@@ -10,6 +10,24 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import { model, required } from "@decaf-ts/decorator-validation";
11
11
  import { BaseModel, index, table } from "../../model";
12
12
  import { pk } from "../../identity";
13
+ /**
14
+ * @description RAM sequence model for auto-incrementing values
15
+ * @summary A model class that represents a sequence in the RAM adapter. It stores the current value
16
+ * of a sequence that can be used for generating sequential identifiers for entities.
17
+ * The sequence is identified by its ID and maintains the current value.
18
+ * @param {ModelArg<Sequence>} seq - Initial sequence data
19
+ * @class Sequence
20
+ * @category Ram
21
+ * @example
22
+ * ```typescript
23
+ * // Create a new sequence
24
+ * const orderSequence = new Sequence({ id: 'order_seq', current: 1 });
25
+ *
26
+ * // Use the sequence to get the next value
27
+ * const nextOrderId = parseInt(orderSequence.current.toString()) + 1;
28
+ * orderSequence.current = nextOrderId;
29
+ * ```
30
+ */
13
31
  let Sequence = class Sequence extends BaseModel {
14
32
  constructor(seq) {
15
33
  super(seq);
@@ -30,4 +48,4 @@ Sequence = __decorate([
30
48
  __metadata("design:paramtypes", [Object])
31
49
  ], Sequence);
32
50
  export { Sequence };
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtU2VxdWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcmFtL21vZGVsL1JhbVNlcXVlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3QixJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxTQUFTO0lBb0JyQyxZQUFZLEdBQXdCO1FBQ2xDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNiLENBQUM7Q0FDRixDQUFBO0FBZkM7SUFEQyxFQUFFLEVBQUU7O29DQUNPO0FBVVo7SUFGQyxRQUFRLEVBQUU7SUFDVixLQUFLLEVBQUU7O3lDQUNrQjtBQWxCZixRQUFRO0lBRnBCLEtBQUssQ0FBQyxlQUFlLENBQUM7SUFDdEIsS0FBSyxFQUFFOztHQUNLLFFBQVEsQ0F1QnBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEJhc2VNb2RlbCwgaW5kZXgsIHRhYmxlIH0gZnJvbSBcIi4uLy4uL21vZGVsXCI7XG5pbXBvcnQgeyBwayB9IGZyb20gXCIuLi8uLi9pZGVudGl0eVwiO1xuXG5AdGFibGUoXCJfX1JhbVNlcXVlbmNlXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFNlcXVlbmNlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHRoZSBQcmltYXJ5IGtleSBmb3IgdGhlIERCU2VxdWVuY2VcbiAgICogQHByb3AgbmFtZVxuICAgKlxuICAgKiBAc2VlIHBrXG4gICAqL1xuICBAcGsoKVxuICBpZCE6IHN0cmluZztcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgREJTZXF1ZW5jZVxuICAgKiBAcHJvcCBjdXJyZW50XG4gICAqXG4gICAqIEBzZWUgcmVxdWlyZWRcbiAgICogQHNlZSBpbmRleFxuICAgKi9cbiAgQHJlcXVpcmVkKClcbiAgQGluZGV4KClcbiAgY3VycmVudCE6IHN0cmluZyB8IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZXE/OiBNb2RlbEFyZzxTZXF1ZW5jZT4pIHtcbiAgICBzdXBlcihzZXEpO1xuICB9XG59XG4iXX0=
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtU2VxdWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcmFtL21vZGVsL1JhbVNlcXVlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSSxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxTQUFTO0lBZXJDLFlBQVksR0FBd0I7UUFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUNGLENBQUE7QUFiQztJQURDLEVBQUUsRUFBRTs7b0NBQ087QUFRWjtJQUZDLFFBQVEsRUFBRTtJQUNWLEtBQUssRUFBRTs7eUNBQ2tCO0FBYmYsUUFBUTtJQUZwQixLQUFLLENBQUMsZUFBZSxDQUFDO0lBQ3RCLEtBQUssRUFBRTs7R0FDSyxRQUFRLENBa0JwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxBcmcgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwsIGluZGV4LCB0YWJsZSB9IGZyb20gXCIuLi8uLi9tb2RlbFwiO1xuaW1wb3J0IHsgcGsgfSBmcm9tIFwiLi4vLi4vaWRlbnRpdHlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUkFNIHNlcXVlbmNlIG1vZGVsIGZvciBhdXRvLWluY3JlbWVudGluZyB2YWx1ZXNcbiAqIEBzdW1tYXJ5IEEgbW9kZWwgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc2VxdWVuY2UgaW4gdGhlIFJBTSBhZGFwdGVyLiBJdCBzdG9yZXMgdGhlIGN1cnJlbnQgdmFsdWVcbiAqIG9mIGEgc2VxdWVuY2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIGlkZW50aWZpZXJzIGZvciBlbnRpdGllcy5cbiAqIFRoZSBzZXF1ZW5jZSBpcyBpZGVudGlmaWVkIGJ5IGl0cyBJRCBhbmQgbWFpbnRhaW5zIHRoZSBjdXJyZW50IHZhbHVlLlxuICogQHBhcmFtIHtNb2RlbEFyZzxTZXF1ZW5jZT59IHNlcSAtIEluaXRpYWwgc2VxdWVuY2UgZGF0YVxuICogQGNsYXNzIFNlcXVlbmNlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IHNlcXVlbmNlXG4gKiBjb25zdCBvcmRlclNlcXVlbmNlID0gbmV3IFNlcXVlbmNlKHsgaWQ6ICdvcmRlcl9zZXEnLCBjdXJyZW50OiAxIH0pO1xuICpcbiAqIC8vIFVzZSB0aGUgc2VxdWVuY2UgdG8gZ2V0IHRoZSBuZXh0IHZhbHVlXG4gKiBjb25zdCBuZXh0T3JkZXJJZCA9IHBhcnNlSW50KG9yZGVyU2VxdWVuY2UuY3VycmVudC50b1N0cmluZygpKSArIDE7XG4gKiBvcmRlclNlcXVlbmNlLmN1cnJlbnQgPSBuZXh0T3JkZXJJZDtcbiAqIGBgYFxuICovXG5AdGFibGUoXCJfX1JhbVNlcXVlbmNlXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFNlcXVlbmNlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBpZGVudGlmaWVyIGZvciB0aGUgc2VxdWVuY2VcbiAgICovXG4gIEBwaygpXG4gIGlkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2VcbiAgICogVXNlZCB0byBnZW5lcmF0ZSB0aGUgbmV4dCBzZXF1ZW50aWFsIHZhbHVlXG4gICAqL1xuICBAcmVxdWlyZWQoKVxuICBAaW5kZXgoKVxuICBjdXJyZW50ITogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNlcT86IE1vZGVsQXJnPFNlcXVlbmNlPikge1xuICAgIHN1cGVyKHNlcSk7XG4gIH1cbn1cbiJdfQ==
@@ -2,16 +2,58 @@ import { Constructor, Model } from "@decaf-ts/decorator-validation";
2
2
  import { Repository } from "../repository";
3
3
  import { Context, RepositoryFlags } from "@decaf-ts/db-decorators";
4
4
  import { RamAdapter } from "./RamAdapter";
5
- export type RamStorage = Record<string, Record<string, any>>;
6
- export type RamQuery<M extends Model> = {
7
- select: undefined | keyof M | (keyof M)[];
8
- from: string | M | Constructor<M>;
5
+ /**
6
+ * @description In-memory storage structure for the RAM adapter
7
+ * @summary A nested Map structure that stores all entities by their table name and primary key.
8
+ * The outer Map uses table names as keys, while the inner Map uses entity IDs as keys and entity instances as values.
9
+ * @typedef {Map<string, Map<string | number, any>>} RamStorage
10
+ * @memberOf module:core
11
+ * @category Ram
12
+ */
13
+ export type RamStorage = Map<string, Map<string | number, any>>;
14
+ /**
15
+ * @description Query specification for RAM adapter
16
+ * @summary Defines the structure of a query for retrieving data from the in-memory storage.
17
+ * It specifies what fields to select, which model to query, filtering conditions,
18
+ * sorting criteria, and pagination options.
19
+ * @template M - The model type being queried
20
+ * @typedef {Object} RawRamQuery
21
+ * @property select - Fields to select from the model, or undefined for all fields
22
+ * @property {Constructor<M>} from - The model constructor to query
23
+ * @property {function(M): boolean} where - Predicate function for filtering entities
24
+ * @property {function(M, M): number} [sort] - Optional comparator function for sorting results
25
+ * @property {number} [limit] - Optional maximum number of results to return
26
+ * @property {number} [skip] - Optional number of results to skip (for pagination)
27
+ * @memberOf module:core
28
+ * @category Ram
29
+ */
30
+ export type RawRamQuery<M extends Model> = {
31
+ select: undefined | (keyof M)[];
32
+ from: Constructor<M>;
9
33
  where: (el: M) => boolean;
10
34
  sort?: (el: M, el2: M) => number;
11
35
  limit?: number;
12
36
  skip?: number;
13
37
  };
38
+ /**
39
+ * @description Flags for RAM adapter operations
40
+ * @summary Interface that extends the base repository flags with RAM-specific flags.
41
+ * Contains user identification information needed for tracking entity creation and updates.
42
+ * @interface RamFlags
43
+ * @property {string} UUID - Unique identifier for the current user
44
+ * @memberOf module:core
45
+ * @category Ram
46
+ */
14
47
  export interface RamFlags extends RepositoryFlags {
15
48
  UUID: string;
16
49
  }
17
- export type RamRepository<M extends Model> = Repository<M, RamQuery<M>, RamAdapter, RamFlags, Context<RamFlags>>;
50
+ /**
51
+ * @description Type definition for RAM-specific repository
52
+ * @summary A specialized repository type for working with models in the RAM adapter.
53
+ * It combines the model type with RAM-specific query, adapter, flags, and context types.
54
+ * @template M - The model type managed by the repository
55
+ * @typedef {Repository<M, RawRamQuery<any>, RamAdapter, RamFlags, Context<RamFlags>>} RamRepository
56
+ * @memberOf module:core
57
+ * @category Ram
58
+ */
59
+ export type RamRepository<M extends Model> = Repository<M, RawRamQuery<any>, RamAdapter, RamFlags, Context<RamFlags>>;
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmFtL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnRleHQsIFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcblxuZXhwb3J0IHR5cGUgUmFtU3RvcmFnZSA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG5leHBvcnQgdHlwZSBSYW1RdWVyeTxNIGV4dGVuZHMgTW9kZWw+ID0ge1xuICBzZWxlY3Q6IHVuZGVmaW5lZCB8IGtleW9mIE0gfCAoa2V5b2YgTSlbXTtcbiAgZnJvbTogc3RyaW5nIHwgTSB8IENvbnN0cnVjdG9yPE0+O1xuICB3aGVyZTogKGVsOiBNKSA9PiBib29sZWFuO1xuICBzb3J0PzogKGVsOiBNLCBlbDI6IE0pID0+IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHNraXA/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhbUZsYWdzIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzIHtcbiAgVVVJRDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSYW1SZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4gPSBSZXBvc2l0b3J5PFxuICBNLFxuICBSYW1RdWVyeTxNPixcbiAgUmFtQWRhcHRlcixcbiAgUmFtRmxhZ3MsXG4gIENvbnRleHQ8UmFtRmxhZ3M+XG4+O1xuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmFtL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IENvbnRleHQsIFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtQWRhcHRlciB9IGZyb20gXCIuL1JhbUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW4tbWVtb3J5IHN0b3JhZ2Ugc3RydWN0dXJlIGZvciB0aGUgUkFNIGFkYXB0ZXJcbiAqIEBzdW1tYXJ5IEEgbmVzdGVkIE1hcCBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgYWxsIGVudGl0aWVzIGJ5IHRoZWlyIHRhYmxlIG5hbWUgYW5kIHByaW1hcnkga2V5LlxuICogVGhlIG91dGVyIE1hcCB1c2VzIHRhYmxlIG5hbWVzIGFzIGtleXMsIHdoaWxlIHRoZSBpbm5lciBNYXAgdXNlcyBlbnRpdHkgSURzIGFzIGtleXMgYW5kIGVudGl0eSBpbnN0YW5jZXMgYXMgdmFsdWVzLlxuICogQHR5cGVkZWYge01hcDxzdHJpbmcsIE1hcDxzdHJpbmcgfCBudW1iZXIsIGFueT4+fSBSYW1TdG9yYWdlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBjYXRlZ29yeSBSYW1cbiAqL1xuZXhwb3J0IHR5cGUgUmFtU3RvcmFnZSA9IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcgfCBudW1iZXIsIGFueT4+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBRdWVyeSBzcGVjaWZpY2F0aW9uIGZvciBSQU0gYWRhcHRlclxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIGEgcXVlcnkgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIHRoZSBpbi1tZW1vcnkgc3RvcmFnZS5cbiAqIEl0IHNwZWNpZmllcyB3aGF0IGZpZWxkcyB0byBzZWxlY3QsIHdoaWNoIG1vZGVsIHRvIHF1ZXJ5LCBmaWx0ZXJpbmcgY29uZGl0aW9ucyxcbiAqIHNvcnRpbmcgY3JpdGVyaWEsIGFuZCBwYWdpbmF0aW9uIG9wdGlvbnMuXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGJlaW5nIHF1ZXJpZWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJhd1JhbVF1ZXJ5XG4gKiBAcHJvcGVydHkgc2VsZWN0IC0gRmllbGRzIHRvIHNlbGVjdCBmcm9tIHRoZSBtb2RlbCwgb3IgdW5kZWZpbmVkIGZvciBhbGwgZmllbGRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE0+fSBmcm9tIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yIHRvIHF1ZXJ5XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKE0pOiBib29sZWFufSB3aGVyZSAtIFByZWRpY2F0ZSBmdW5jdGlvbiBmb3IgZmlsdGVyaW5nIGVudGl0aWVzXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKE0sIE0pOiBudW1iZXJ9IFtzb3J0XSAtIE9wdGlvbmFsIGNvbXBhcmF0b3IgZnVuY3Rpb24gZm9yIHNvcnRpbmcgcmVzdWx0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsaW1pdF0gLSBPcHRpb25hbCBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVyblxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtza2lwXSAtIE9wdGlvbmFsIG51bWJlciBvZiByZXN1bHRzIHRvIHNraXAgKGZvciBwYWdpbmF0aW9uKVxuICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKi9cbmV4cG9ydCB0eXBlIFJhd1JhbVF1ZXJ5PE0gZXh0ZW5kcyBNb2RlbD4gPSB7XG4gIHNlbGVjdDogdW5kZWZpbmVkIHwgKGtleW9mIE0pW107XG4gIGZyb206IENvbnN0cnVjdG9yPE0+O1xuICB3aGVyZTogKGVsOiBNKSA9PiBib29sZWFuO1xuICBzb3J0PzogKGVsOiBNLCBlbDI6IE0pID0+IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHNraXA/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGbGFncyBmb3IgUkFNIGFkYXB0ZXIgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgSW50ZXJmYWNlIHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSByZXBvc2l0b3J5IGZsYWdzIHdpdGggUkFNLXNwZWNpZmljIGZsYWdzLlxuICogQ29udGFpbnMgdXNlciBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHRyYWNraW5nIGVudGl0eSBjcmVhdGlvbiBhbmQgdXBkYXRlcy5cbiAqIEBpbnRlcmZhY2UgUmFtRmxhZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVVUlEIC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHVzZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQGNhdGVnb3J5IFJhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbUZsYWdzIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzIHtcbiAgVVVJRDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIFJBTS1zcGVjaWZpYyByZXBvc2l0b3J5XG4gKiBAc3VtbWFyeSBBIHNwZWNpYWxpemVkIHJlcG9zaXRvcnkgdHlwZSBmb3Igd29ya2luZyB3aXRoIG1vZGVscyBpbiB0aGUgUkFNIGFkYXB0ZXIuXG4gKiBJdCBjb21iaW5lcyB0aGUgbW9kZWwgdHlwZSB3aXRoIFJBTS1zcGVjaWZpYyBxdWVyeSwgYWRhcHRlciwgZmxhZ3MsIGFuZCBjb250ZXh0IHR5cGVzLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBtYW5hZ2VkIGJ5IHRoZSByZXBvc2l0b3J5XG4gKiBAdHlwZWRlZiB7UmVwb3NpdG9yeTxNLCBSYXdSYW1RdWVyeTxhbnk+LCBSYW1BZGFwdGVyLCBSYW1GbGFncywgQ29udGV4dDxSYW1GbGFncz4+fSBSYW1SZXBvc2l0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBjYXRlZ29yeSBSYW1cbiAqL1xuZXhwb3J0IHR5cGUgUmFtUmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+ID0gUmVwb3NpdG9yeTxcbiAgTSxcbiAgUmF3UmFtUXVlcnk8YW55PixcbiAgUmFtQWRhcHRlcixcbiAgUmFtRmxhZ3MsXG4gIENvbnRleHQ8UmFtRmxhZ3M+XG4+O1xuIl19