joist-core 2.4.0-next.4 → 2.4.0-next.41

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 (791) hide show
  1. package/build/BaseEntity.d.cts +3 -4
  2. package/build/BaseEntity.d.cts.map +1 -1
  3. package/build/BaseEntity.d.mts +3 -4
  4. package/build/BaseEntity.d.mts.map +1 -1
  5. package/build/Entity.d.cts +3 -4
  6. package/build/Entity.d.cts.map +1 -1
  7. package/build/Entity.d.mts +3 -4
  8. package/build/Entity.d.mts.map +1 -1
  9. package/build/EntityFields.d.cts +3 -4
  10. package/build/EntityFields.d.cts.map +1 -1
  11. package/build/EntityFields.d.mts +3 -4
  12. package/build/EntityFields.d.mts.map +1 -1
  13. package/build/EntityManager.cjs +64 -20
  14. package/build/EntityManager.cjs.map +1 -1
  15. package/build/EntityManager.d.cts +86 -53
  16. package/build/EntityManager.d.cts.map +1 -1
  17. package/build/EntityManager.d.mts +86 -53
  18. package/build/EntityManager.d.mts.map +1 -1
  19. package/build/EntityManager.js +64 -22
  20. package/build/EntityManager.js.map +1 -1
  21. package/build/EntityMetadata.cjs +0 -1
  22. package/build/EntityMetadata.cjs.map +1 -1
  23. package/build/EntityMetadata.d.cts +39 -36
  24. package/build/EntityMetadata.d.cts.map +1 -1
  25. package/build/EntityMetadata.d.mts +39 -36
  26. package/build/EntityMetadata.d.mts.map +1 -1
  27. package/build/EntityMetadata.js +0 -1
  28. package/build/EntityMetadata.js.map +1 -1
  29. package/build/EnumMetadata.d.cts +1 -2
  30. package/build/EnumMetadata.d.cts.map +1 -1
  31. package/build/EnumMetadata.d.mts +1 -2
  32. package/build/EnumMetadata.d.mts.map +1 -1
  33. package/build/IndexManager.cjs +23 -5
  34. package/build/IndexManager.cjs.map +1 -1
  35. package/build/IndexManager.d.cts +2 -3
  36. package/build/IndexManager.d.cts.map +1 -1
  37. package/build/IndexManager.d.mts +2 -3
  38. package/build/IndexManager.d.mts.map +1 -1
  39. package/build/IndexManager.js +23 -5
  40. package/build/IndexManager.js.map +1 -1
  41. package/build/InstanceData.cjs.map +1 -1
  42. package/build/InstanceData.d.cts +1 -2
  43. package/build/InstanceData.d.cts.map +1 -1
  44. package/build/InstanceData.d.mts +1 -2
  45. package/build/InstanceData.d.mts.map +1 -1
  46. package/build/InstanceData.js.map +1 -1
  47. package/build/PluginManager.cjs.map +1 -1
  48. package/build/PluginManager.d.cts +4 -4
  49. package/build/PluginManager.d.cts.map +1 -1
  50. package/build/PluginManager.d.mts +4 -4
  51. package/build/PluginManager.d.mts.map +1 -1
  52. package/build/PluginManager.js.map +1 -1
  53. package/build/RowData.d.cts +3 -4
  54. package/build/RowData.d.cts.map +1 -1
  55. package/build/RowData.d.mts +3 -4
  56. package/build/RowData.d.mts.map +1 -1
  57. package/build/batchloaders/BatchLoader.cjs.map +1 -1
  58. package/build/batchloaders/BatchLoader.d.cts +1 -2
  59. package/build/batchloaders/BatchLoader.d.cts.map +1 -1
  60. package/build/batchloaders/BatchLoader.d.mts +1 -2
  61. package/build/batchloaders/BatchLoader.d.mts.map +1 -1
  62. package/build/batchloaders/BatchLoader.js.map +1 -1
  63. package/build/batchloaders/enumCollectionBatchLoader.d.cts +2 -3
  64. package/build/batchloaders/enumCollectionBatchLoader.d.cts.map +1 -1
  65. package/build/batchloaders/enumCollectionBatchLoader.d.mts +2 -3
  66. package/build/batchloaders/enumCollectionBatchLoader.d.mts.map +1 -1
  67. package/build/batchloaders/loadBatchLoader.d.cts +2 -3
  68. package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
  69. package/build/batchloaders/loadBatchLoader.d.mts +2 -3
  70. package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
  71. package/build/batchloaders/manyToManyBatchLoader.d.cts +2 -3
  72. package/build/batchloaders/manyToManyBatchLoader.d.cts.map +1 -1
  73. package/build/batchloaders/manyToManyBatchLoader.d.mts +2 -3
  74. package/build/batchloaders/manyToManyBatchLoader.d.mts.map +1 -1
  75. package/build/batchloaders/oneToManyBatchLoader.d.cts +2 -3
  76. package/build/batchloaders/oneToManyBatchLoader.d.cts.map +1 -1
  77. package/build/batchloaders/oneToManyBatchLoader.d.mts +2 -3
  78. package/build/batchloaders/oneToManyBatchLoader.d.mts.map +1 -1
  79. package/build/batchloaders/oneToOneBatchLoader.d.cts +2 -3
  80. package/build/batchloaders/oneToOneBatchLoader.d.cts.map +1 -1
  81. package/build/batchloaders/oneToOneBatchLoader.d.mts +2 -3
  82. package/build/batchloaders/oneToOneBatchLoader.d.mts.map +1 -1
  83. package/build/batchloaders/populateBatchLoader.cjs +2 -2
  84. package/build/batchloaders/populateBatchLoader.d.cts +2 -3
  85. package/build/batchloaders/populateBatchLoader.d.cts.map +1 -1
  86. package/build/batchloaders/populateBatchLoader.d.mts +2 -3
  87. package/build/batchloaders/populateBatchLoader.d.mts.map +1 -1
  88. package/build/batchloaders/populateBatchLoader.js +2 -2
  89. package/build/batchloaders/recursiveChildrenBatchLoader.cjs +1 -1
  90. package/build/batchloaders/recursiveChildrenBatchLoader.d.cts +2 -3
  91. package/build/batchloaders/recursiveChildrenBatchLoader.d.cts.map +1 -1
  92. package/build/batchloaders/recursiveChildrenBatchLoader.d.mts +2 -3
  93. package/build/batchloaders/recursiveChildrenBatchLoader.d.mts.map +1 -1
  94. package/build/batchloaders/recursiveChildrenBatchLoader.js +1 -1
  95. package/build/batchloaders/recursiveM2mBatchLoader.cjs +1 -1
  96. package/build/batchloaders/recursiveM2mBatchLoader.d.cts +2 -3
  97. package/build/batchloaders/recursiveM2mBatchLoader.d.cts.map +1 -1
  98. package/build/batchloaders/recursiveM2mBatchLoader.d.mts +2 -3
  99. package/build/batchloaders/recursiveM2mBatchLoader.d.mts.map +1 -1
  100. package/build/batchloaders/recursiveM2mBatchLoader.js +1 -1
  101. package/build/batchloaders/recursiveParentsBatchLoader.cjs +1 -1
  102. package/build/batchloaders/recursiveParentsBatchLoader.d.cts +2 -3
  103. package/build/batchloaders/recursiveParentsBatchLoader.d.cts.map +1 -1
  104. package/build/batchloaders/recursiveParentsBatchLoader.d.mts +2 -3
  105. package/build/batchloaders/recursiveParentsBatchLoader.d.mts.map +1 -1
  106. package/build/batchloaders/recursiveParentsBatchLoader.js +1 -1
  107. package/build/changes.cjs.map +1 -1
  108. package/build/changes.d.cts +9 -10
  109. package/build/changes.d.cts.map +1 -1
  110. package/build/changes.d.mts +9 -10
  111. package/build/changes.d.mts.map +1 -1
  112. package/build/changes.js.map +1 -1
  113. package/build/config.cjs +75 -1
  114. package/build/config.cjs.map +1 -1
  115. package/build/config.d.cts +99 -17
  116. package/build/config.d.cts.map +1 -1
  117. package/build/config.d.mts +99 -17
  118. package/build/config.d.mts.map +1 -1
  119. package/build/config.js +75 -1
  120. package/build/config.js.map +1 -1
  121. package/build/configure.cjs +6 -2
  122. package/build/configure.cjs.map +1 -1
  123. package/build/configure.d.cts +8 -9
  124. package/build/configure.d.cts.map +1 -1
  125. package/build/configure.d.mts +8 -9
  126. package/build/configure.d.mts.map +1 -1
  127. package/build/configure.js +6 -2
  128. package/build/configure.js.map +1 -1
  129. package/build/dataloaders/fastWhereFilterHash.d.cts +1 -2
  130. package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
  131. package/build/dataloaders/fastWhereFilterHash.d.mts +1 -2
  132. package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
  133. package/build/dataloaders/findByUniqueDataLoader.d.cts +2 -3
  134. package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
  135. package/build/dataloaders/findByUniqueDataLoader.d.mts +2 -3
  136. package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
  137. package/build/dataloaders/findCountDataLoader.d.cts +4 -5
  138. package/build/dataloaders/findCountDataLoader.d.cts.map +1 -1
  139. package/build/dataloaders/findCountDataLoader.d.mts +4 -5
  140. package/build/dataloaders/findCountDataLoader.d.mts.map +1 -1
  141. package/build/dataloaders/findDataLoader.cjs +1 -1
  142. package/build/dataloaders/findDataLoader.d.cts +11 -12
  143. package/build/dataloaders/findDataLoader.d.cts.map +1 -1
  144. package/build/dataloaders/findDataLoader.d.mts +11 -12
  145. package/build/dataloaders/findDataLoader.d.mts.map +1 -1
  146. package/build/dataloaders/findDataLoader.js +1 -1
  147. package/build/dataloaders/findIdsDataLoader.d.cts +2 -3
  148. package/build/dataloaders/findIdsDataLoader.d.cts.map +1 -1
  149. package/build/dataloaders/findIdsDataLoader.d.mts +2 -3
  150. package/build/dataloaders/findIdsDataLoader.d.mts.map +1 -1
  151. package/build/dataloaders/findOrCreateDataLoader.cjs +6 -2
  152. package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
  153. package/build/dataloaders/findOrCreateDataLoader.d.cts +3 -3
  154. package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
  155. package/build/dataloaders/findOrCreateDataLoader.d.mts +3 -3
  156. package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
  157. package/build/dataloaders/findOrCreateDataLoader.js +7 -3
  158. package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
  159. package/build/dataloaders/findPaginatedDataLoader.cjs +1 -1
  160. package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -2
  161. package/build/dataloaders/findPaginatedDataLoader.d.cts.map +1 -1
  162. package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -2
  163. package/build/dataloaders/findPaginatedDataLoader.d.mts.map +1 -1
  164. package/build/dataloaders/findPaginatedDataLoader.js +1 -1
  165. package/build/dataloaders/lensDataLoader.d.cts +2 -3
  166. package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
  167. package/build/dataloaders/lensDataLoader.d.mts +2 -3
  168. package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
  169. package/build/dataloaders/manyToManyFindDataLoader.d.cts +2 -3
  170. package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
  171. package/build/dataloaders/manyToManyFindDataLoader.d.mts +2 -3
  172. package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
  173. package/build/dataloaders/oneToManyFindDataLoader.d.cts +2 -3
  174. package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
  175. package/build/dataloaders/oneToManyFindDataLoader.d.mts +2 -3
  176. package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
  177. package/build/defaults.cjs +2 -2
  178. package/build/defaults.cjs.map +1 -1
  179. package/build/defaults.d.cts +7 -7
  180. package/build/defaults.d.cts.map +1 -1
  181. package/build/defaults.d.mts +7 -7
  182. package/build/defaults.d.mts.map +1 -1
  183. package/build/defaults.js +2 -2
  184. package/build/defaults.js.map +1 -1
  185. package/build/drivers/Driver.d.cts +2 -3
  186. package/build/drivers/Driver.d.cts.map +1 -1
  187. package/build/drivers/Driver.d.mts +2 -3
  188. package/build/drivers/Driver.d.mts.map +1 -1
  189. package/build/drivers/EntityWriter.d.cts +7 -7
  190. package/build/drivers/EntityWriter.d.cts.map +1 -1
  191. package/build/drivers/EntityWriter.d.mts +7 -7
  192. package/build/drivers/EntityWriter.d.mts.map +1 -1
  193. package/build/drivers/IdAssigner.cjs.map +1 -1
  194. package/build/drivers/IdAssigner.d.cts +5 -5
  195. package/build/drivers/IdAssigner.d.cts.map +1 -1
  196. package/build/drivers/IdAssigner.d.mts +5 -5
  197. package/build/drivers/IdAssigner.d.mts.map +1 -1
  198. package/build/drivers/IdAssigner.js.map +1 -1
  199. package/build/drivers/driverApi.d.cts +2 -3
  200. package/build/drivers/driverApi.d.cts.map +1 -1
  201. package/build/drivers/driverApi.d.mts +2 -3
  202. package/build/drivers/driverApi.d.mts.map +1 -1
  203. package/build/fields.cjs +1 -0
  204. package/build/fields.cjs.map +1 -1
  205. package/build/fields.d.cts +6 -7
  206. package/build/fields.d.cts.map +1 -1
  207. package/build/fields.d.mts +6 -7
  208. package/build/fields.d.mts.map +1 -1
  209. package/build/fields.js +1 -0
  210. package/build/fields.js.map +1 -1
  211. package/build/flush/FlushLock.cjs.map +1 -1
  212. package/build/flush/FlushLock.d.cts +1 -2
  213. package/build/flush/FlushLock.d.cts.map +1 -1
  214. package/build/flush/FlushLock.d.mts +1 -2
  215. package/build/flush/FlushLock.d.mts.map +1 -1
  216. package/build/flush/FlushLock.js.map +1 -1
  217. package/build/flush/JoinRows.cjs.map +1 -1
  218. package/build/flush/JoinRows.d.cts +5 -6
  219. package/build/flush/JoinRows.d.cts.map +1 -1
  220. package/build/flush/JoinRows.d.mts +5 -6
  221. package/build/flush/JoinRows.d.mts.map +1 -1
  222. package/build/flush/JoinRows.js.map +1 -1
  223. package/build/flush/PendingChanges.d.cts +5 -6
  224. package/build/flush/PendingChanges.d.cts.map +1 -1
  225. package/build/flush/PendingChanges.d.mts +5 -6
  226. package/build/flush/PendingChanges.d.mts.map +1 -1
  227. package/build/flush/Todo.d.cts +5 -6
  228. package/build/flush/Todo.d.cts.map +1 -1
  229. package/build/flush/Todo.d.mts +5 -6
  230. package/build/flush/Todo.d.mts.map +1 -1
  231. package/build/getProperties.d.cts +3 -4
  232. package/build/getProperties.d.cts.map +1 -1
  233. package/build/getProperties.d.mts +3 -4
  234. package/build/getProperties.d.mts.map +1 -1
  235. package/build/index.cjs +14 -8
  236. package/build/index.cjs.map +1 -1
  237. package/build/index.d.cts +20 -19
  238. package/build/index.d.cts.map +1 -1
  239. package/build/index.d.mts +20 -19
  240. package/build/index.d.mts.map +1 -1
  241. package/build/index.js +14 -11
  242. package/build/index.js.map +1 -1
  243. package/build/json.cjs +3 -3
  244. package/build/json.d.cts +11 -11
  245. package/build/json.d.cts.map +1 -1
  246. package/build/json.d.mts +11 -11
  247. package/build/json.d.mts.map +1 -1
  248. package/build/json.js +3 -3
  249. package/build/keys.d.cts +27 -27
  250. package/build/keys.d.cts.map +1 -1
  251. package/build/keys.d.mts +27 -27
  252. package/build/keys.d.mts.map +1 -1
  253. package/build/loading/HintTree.d.cts +3 -4
  254. package/build/loading/HintTree.d.cts.map +1 -1
  255. package/build/loading/HintTree.d.mts +3 -4
  256. package/build/loading/HintTree.d.mts.map +1 -1
  257. package/build/loading/IsLoadedCache.cjs.map +1 -1
  258. package/build/loading/IsLoadedCache.d.cts +2 -3
  259. package/build/loading/IsLoadedCache.d.cts.map +1 -1
  260. package/build/loading/IsLoadedCache.d.mts +2 -3
  261. package/build/loading/IsLoadedCache.d.mts.map +1 -1
  262. package/build/loading/IsLoadedCache.js.map +1 -1
  263. package/build/loading/loadHints.cjs +1 -1
  264. package/build/loading/loadHints.d.cts +17 -17
  265. package/build/loading/loadHints.d.cts.map +1 -1
  266. package/build/loading/loadHints.d.mts +17 -17
  267. package/build/loading/loadHints.d.mts.map +1 -1
  268. package/build/loading/loadHints.js +1 -1
  269. package/build/loading/loadLens.d.cts +13 -13
  270. package/build/loading/loadLens.d.cts.map +1 -1
  271. package/build/loading/loadLens.d.mts +13 -13
  272. package/build/loading/loadLens.d.mts.map +1 -1
  273. package/build/loading/withLoaded.cjs +2 -2
  274. package/build/loading/withLoaded.d.cts +5 -6
  275. package/build/loading/withLoaded.d.cts.map +1 -1
  276. package/build/loading/withLoaded.d.mts +5 -6
  277. package/build/loading/withLoaded.d.mts.map +1 -1
  278. package/build/loading/withLoaded.js +2 -2
  279. package/build/logging/FactoryLogger.d.cts +3 -4
  280. package/build/logging/FactoryLogger.d.cts.map +1 -1
  281. package/build/logging/FactoryLogger.d.mts +3 -4
  282. package/build/logging/FactoryLogger.d.mts.map +1 -1
  283. package/build/logging/FieldLogger.cjs.map +1 -1
  284. package/build/logging/FieldLogger.d.cts +4 -5
  285. package/build/logging/FieldLogger.d.cts.map +1 -1
  286. package/build/logging/FieldLogger.d.mts +4 -5
  287. package/build/logging/FieldLogger.d.mts.map +1 -1
  288. package/build/logging/FieldLogger.js.map +1 -1
  289. package/build/logging/ReactionLogger.d.cts +7 -7
  290. package/build/logging/ReactionLogger.d.cts.map +1 -1
  291. package/build/logging/ReactionLogger.d.mts +7 -7
  292. package/build/logging/ReactionLogger.d.mts.map +1 -1
  293. package/build/newEntity.cjs.map +1 -1
  294. package/build/newEntity.d.cts +4 -5
  295. package/build/newEntity.d.cts.map +1 -1
  296. package/build/newEntity.d.mts +4 -5
  297. package/build/newEntity.d.mts.map +1 -1
  298. package/build/newEntity.js.map +1 -1
  299. package/build/newTestInstance.cjs +1 -0
  300. package/build/newTestInstance.cjs.map +1 -1
  301. package/build/newTestInstance.d.cts +21 -21
  302. package/build/newTestInstance.d.cts.map +1 -1
  303. package/build/newTestInstance.d.mts +21 -21
  304. package/build/newTestInstance.d.mts.map +1 -1
  305. package/build/newTestInstance.js +1 -0
  306. package/build/newTestInstance.js.map +1 -1
  307. package/build/normalizeHints.d.cts +7 -8
  308. package/build/normalizeHints.d.cts.map +1 -1
  309. package/build/normalizeHints.d.mts +7 -8
  310. package/build/normalizeHints.d.mts.map +1 -1
  311. package/build/nowUTC.d.cts +4 -5
  312. package/build/nowUTC.d.cts.map +1 -1
  313. package/build/nowUTC.d.mts +4 -5
  314. package/build/nowUTC.d.mts.map +1 -1
  315. package/build/plugins/ImmutableEntitiesPlugin.d.cts +1 -2
  316. package/build/plugins/ImmutableEntitiesPlugin.d.cts.map +1 -1
  317. package/build/plugins/ImmutableEntitiesPlugin.d.mts +1 -2
  318. package/build/plugins/ImmutableEntitiesPlugin.d.mts.map +1 -1
  319. package/build/plugins/PreloadPlugin.d.cts +3 -4
  320. package/build/plugins/PreloadPlugin.d.cts.map +1 -1
  321. package/build/plugins/PreloadPlugin.d.mts +3 -4
  322. package/build/plugins/PreloadPlugin.d.mts.map +1 -1
  323. package/build/preloading/JsonAggregatePreloader.d.cts +1 -2
  324. package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
  325. package/build/preloading/JsonAggregatePreloader.d.mts +1 -2
  326. package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
  327. package/build/preloading/canPreload.d.cts +1 -2
  328. package/build/preloading/canPreload.d.cts.map +1 -1
  329. package/build/preloading/canPreload.d.mts +1 -2
  330. package/build/preloading/canPreload.d.mts.map +1 -1
  331. package/build/preloading/partitionHint.cjs +1 -1
  332. package/build/preloading/partitionHint.d.cts +1 -2
  333. package/build/preloading/partitionHint.d.cts.map +1 -1
  334. package/build/preloading/partitionHint.d.mts +1 -2
  335. package/build/preloading/partitionHint.d.mts.map +1 -1
  336. package/build/preloading/partitionHint.js +1 -1
  337. package/build/queries/ConditionBuilder.d.cts +2 -2
  338. package/build/queries/ConditionBuilder.d.cts.map +1 -1
  339. package/build/queries/ConditionBuilder.d.mts +2 -2
  340. package/build/queries/ConditionBuilder.d.mts.map +1 -1
  341. package/build/queries/conditions.d.cts +11 -12
  342. package/build/queries/conditions.d.cts.map +1 -1
  343. package/build/queries/conditions.d.mts +11 -12
  344. package/build/queries/conditions.d.mts.map +1 -1
  345. package/build/queries/entityQueryUtils.d.cts +4 -5
  346. package/build/queries/entityQueryUtils.d.cts.map +1 -1
  347. package/build/queries/entityQueryUtils.d.mts +4 -5
  348. package/build/queries/entityQueryUtils.d.mts.map +1 -1
  349. package/build/queries/find/Aliases.d.cts +16 -16
  350. package/build/queries/find/Aliases.d.cts.map +1 -1
  351. package/build/queries/find/Aliases.d.mts +16 -16
  352. package/build/queries/find/Aliases.d.mts.map +1 -1
  353. package/build/queries/find/DeferredAlias.d.cts +5 -6
  354. package/build/queries/find/DeferredAlias.d.cts.map +1 -1
  355. package/build/queries/find/DeferredAlias.d.mts +5 -6
  356. package/build/queries/find/DeferredAlias.d.mts.map +1 -1
  357. package/build/queries/find/EntityFilter.d.cts +12 -13
  358. package/build/queries/find/EntityFilter.d.cts.map +1 -1
  359. package/build/queries/find/EntityFilter.d.mts +12 -13
  360. package/build/queries/find/EntityFilter.d.mts.map +1 -1
  361. package/build/queries/find/EntityGraphQLFilter.d.cts +8 -9
  362. package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -1
  363. package/build/queries/find/EntityGraphQLFilter.d.mts +8 -9
  364. package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -1
  365. package/build/queries/find/QueryParser.collectionJoins.d.cts +1 -2
  366. package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -1
  367. package/build/queries/find/QueryParser.collectionJoins.d.mts +1 -2
  368. package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -1
  369. package/build/queries/find/QueryParser.d.cts +18 -18
  370. package/build/queries/find/QueryParser.d.cts.map +1 -1
  371. package/build/queries/find/QueryParser.d.mts +18 -18
  372. package/build/queries/find/QueryParser.d.mts.map +1 -1
  373. package/build/queries/find/QueryParser.pruning.d.cts +2 -3
  374. package/build/queries/find/QueryParser.pruning.d.cts.map +1 -1
  375. package/build/queries/find/QueryParser.pruning.d.mts +2 -3
  376. package/build/queries/find/QueryParser.pruning.d.mts.map +1 -1
  377. package/build/queries/find/QueryVisitor.d.cts +4 -4
  378. package/build/queries/find/QueryVisitor.d.cts.map +1 -1
  379. package/build/queries/find/QueryVisitor.d.mts +4 -4
  380. package/build/queries/find/QueryVisitor.d.mts.map +1 -1
  381. package/build/queries/find/buildFindQuery.d.cts +3 -3
  382. package/build/queries/find/buildFindQuery.d.cts.map +1 -1
  383. package/build/queries/find/buildFindQuery.d.mts +3 -3
  384. package/build/queries/find/buildFindQuery.d.mts.map +1 -1
  385. package/build/queries/find/scopes.cjs.map +1 -1
  386. package/build/queries/find/scopes.d.cts +12 -13
  387. package/build/queries/find/scopes.d.cts.map +1 -1
  388. package/build/queries/find/scopes.d.mts +12 -13
  389. package/build/queries/find/scopes.d.mts.map +1 -1
  390. package/build/queries/find/scopes.js.map +1 -1
  391. package/build/queries/parsedConditions.d.cts +7 -8
  392. package/build/queries/parsedConditions.d.cts.map +1 -1
  393. package/build/queries/parsedConditions.d.mts +7 -8
  394. package/build/queries/parsedConditions.d.mts.map +1 -1
  395. package/build/queries/renderConditions.d.cts +3 -4
  396. package/build/queries/renderConditions.d.cts.map +1 -1
  397. package/build/queries/renderConditions.d.mts +3 -4
  398. package/build/queries/renderConditions.d.mts.map +1 -1
  399. package/build/queries/skipCondition.d.cts +1 -2
  400. package/build/queries/skipCondition.d.cts.map +1 -1
  401. package/build/queries/skipCondition.d.mts +1 -2
  402. package/build/queries/skipCondition.d.mts.map +1 -1
  403. package/build/queries/sql/AliasAssigner.cjs.map +1 -1
  404. package/build/queries/sql/AliasAssigner.d.cts +1 -2
  405. package/build/queries/sql/AliasAssigner.d.cts.map +1 -1
  406. package/build/queries/sql/AliasAssigner.d.mts +1 -2
  407. package/build/queries/sql/AliasAssigner.d.mts.map +1 -1
  408. package/build/queries/sql/AliasAssigner.js.map +1 -1
  409. package/build/queries/sql/Expr.cjs +38 -0
  410. package/build/queries/sql/Expr.cjs.map +1 -1
  411. package/build/queries/sql/Expr.d.cts +45 -27
  412. package/build/queries/sql/Expr.d.cts.map +1 -1
  413. package/build/queries/sql/Expr.d.mts +45 -27
  414. package/build/queries/sql/Expr.d.mts.map +1 -1
  415. package/build/queries/sql/Expr.js +38 -1
  416. package/build/queries/sql/Expr.js.map +1 -1
  417. package/build/queries/sql/JoinTree.d.cts +5 -5
  418. package/build/queries/sql/JoinTree.d.cts.map +1 -1
  419. package/build/queries/sql/JoinTree.d.mts +5 -5
  420. package/build/queries/sql/JoinTree.d.mts.map +1 -1
  421. package/build/queries/sql/Tables.cjs +9 -0
  422. package/build/queries/sql/Tables.cjs.map +1 -1
  423. package/build/queries/sql/Tables.d.cts +46 -39
  424. package/build/queries/sql/Tables.d.cts.map +1 -1
  425. package/build/queries/sql/Tables.d.mts +46 -39
  426. package/build/queries/sql/Tables.d.mts.map +1 -1
  427. package/build/queries/sql/Tables.js +10 -1
  428. package/build/queries/sql/Tables.js.map +1 -1
  429. package/build/queries/sql/custom.d.cts +14 -14
  430. package/build/queries/sql/custom.d.cts.map +1 -1
  431. package/build/queries/sql/custom.d.mts +14 -14
  432. package/build/queries/sql/custom.d.mts.map +1 -1
  433. package/build/queries/sql/execute.cjs +4 -9
  434. package/build/queries/sql/execute.cjs.map +1 -1
  435. package/build/queries/sql/execute.d.cts +45 -28
  436. package/build/queries/sql/execute.d.cts.map +1 -1
  437. package/build/queries/sql/execute.d.mts +45 -28
  438. package/build/queries/sql/execute.d.mts.map +1 -1
  439. package/build/queries/sql/execute.js +5 -10
  440. package/build/queries/sql/execute.js.map +1 -1
  441. package/build/queries/sql/expressions/arrayAgg.d.cts +5 -6
  442. package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -1
  443. package/build/queries/sql/expressions/arrayAgg.d.mts +5 -6
  444. package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -1
  445. package/build/queries/sql/expressions/case.d.cts +10 -10
  446. package/build/queries/sql/expressions/case.d.cts.map +1 -1
  447. package/build/queries/sql/expressions/case.d.mts +10 -10
  448. package/build/queries/sql/expressions/case.d.mts.map +1 -1
  449. package/build/queries/sql/expressions/coalesce.d.cts +5 -6
  450. package/build/queries/sql/expressions/coalesce.d.cts.map +1 -1
  451. package/build/queries/sql/expressions/coalesce.d.mts +5 -6
  452. package/build/queries/sql/expressions/coalesce.d.mts.map +1 -1
  453. package/build/queries/sql/expressions/codecs.d.cts +1 -2
  454. package/build/queries/sql/expressions/codecs.d.cts.map +1 -1
  455. package/build/queries/sql/expressions/codecs.d.mts +1 -2
  456. package/build/queries/sql/expressions/codecs.d.mts.map +1 -1
  457. package/build/queries/sql/expressions/expression.d.cts +6 -6
  458. package/build/queries/sql/expressions/expression.d.cts.map +1 -1
  459. package/build/queries/sql/expressions/expression.d.mts +6 -6
  460. package/build/queries/sql/expressions/expression.d.mts.map +1 -1
  461. package/build/queries/sql/expressions/greatest.d.cts +5 -6
  462. package/build/queries/sql/expressions/greatest.d.cts.map +1 -1
  463. package/build/queries/sql/expressions/greatest.d.mts +5 -6
  464. package/build/queries/sql/expressions/greatest.d.mts.map +1 -1
  465. package/build/queries/sql/expressions/least.d.cts +5 -6
  466. package/build/queries/sql/expressions/least.d.cts.map +1 -1
  467. package/build/queries/sql/expressions/least.d.mts +5 -6
  468. package/build/queries/sql/expressions/least.d.mts.map +1 -1
  469. package/build/queries/sql/expressions/nullIf.d.cts +5 -6
  470. package/build/queries/sql/expressions/nullIf.d.cts.map +1 -1
  471. package/build/queries/sql/expressions/nullIf.d.mts +5 -6
  472. package/build/queries/sql/expressions/nullIf.d.mts.map +1 -1
  473. package/build/queries/sql/expressions/parseExpression.d.cts +5 -6
  474. package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -1
  475. package/build/queries/sql/expressions/parseExpression.d.mts +5 -6
  476. package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -1
  477. package/build/queries/sql/expressions/types.d.cts +11 -11
  478. package/build/queries/sql/expressions/types.d.cts.map +1 -1
  479. package/build/queries/sql/expressions/types.d.mts +11 -11
  480. package/build/queries/sql/expressions/types.d.mts.map +1 -1
  481. package/build/queries/sql/keywords.d.cts +4 -5
  482. package/build/queries/sql/keywords.d.cts.map +1 -1
  483. package/build/queries/sql/keywords.d.mts +4 -5
  484. package/build/queries/sql/keywords.d.mts.map +1 -1
  485. package/build/queries/sql/query.cjs +59 -23
  486. package/build/queries/sql/query.cjs.map +1 -1
  487. package/build/queries/sql/query.d.cts +108 -77
  488. package/build/queries/sql/query.d.cts.map +1 -1
  489. package/build/queries/sql/query.d.mts +108 -77
  490. package/build/queries/sql/query.d.mts.map +1 -1
  491. package/build/queries/sql/query.js +58 -23
  492. package/build/queries/sql/query.js.map +1 -1
  493. package/build/queries/unnest.d.cts +2 -3
  494. package/build/queries/unnest.d.cts.map +1 -1
  495. package/build/queries/unnest.d.mts +2 -3
  496. package/build/queries/unnest.d.mts.map +1 -1
  497. package/build/queries/valueFilters.d.cts +5 -6
  498. package/build/queries/valueFilters.d.cts.map +1 -1
  499. package/build/queries/valueFilters.d.mts +5 -6
  500. package/build/queries/valueFilters.d.mts.map +1 -1
  501. package/build/reactivity/ReactionsManager.cjs +168 -2
  502. package/build/reactivity/ReactionsManager.cjs.map +1 -1
  503. package/build/reactivity/ReactionsManager.d.cts +56 -4
  504. package/build/reactivity/ReactionsManager.d.cts.map +1 -1
  505. package/build/reactivity/ReactionsManager.d.mts +56 -4
  506. package/build/reactivity/ReactionsManager.d.mts.map +1 -1
  507. package/build/reactivity/ReactionsManager.js +169 -3
  508. package/build/reactivity/ReactionsManager.js.map +1 -1
  509. package/build/reactivity/reactiveHints.cjs +3 -3
  510. package/build/reactivity/reactiveHints.cjs.map +1 -1
  511. package/build/reactivity/reactiveHints.d.cts +18 -18
  512. package/build/reactivity/reactiveHints.d.cts.map +1 -1
  513. package/build/reactivity/reactiveHints.d.mts +18 -18
  514. package/build/reactivity/reactiveHints.d.mts.map +1 -1
  515. package/build/reactivity/reactiveHints.js +3 -3
  516. package/build/reactivity/reactiveHints.js.map +1 -1
  517. package/build/relations/AbstractPropertyImpl.cjs.map +1 -1
  518. package/build/relations/AbstractPropertyImpl.d.cts +1 -2
  519. package/build/relations/AbstractPropertyImpl.d.cts.map +1 -1
  520. package/build/relations/AbstractPropertyImpl.d.mts +1 -2
  521. package/build/relations/AbstractPropertyImpl.d.mts.map +1 -1
  522. package/build/relations/AbstractPropertyImpl.js.map +1 -1
  523. package/build/relations/AbstractRelationImpl.d.cts +1 -2
  524. package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
  525. package/build/relations/AbstractRelationImpl.d.mts +1 -2
  526. package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
  527. package/build/relations/AsyncProperty.cjs.map +1 -1
  528. package/build/relations/AsyncProperty.d.cts +5 -6
  529. package/build/relations/AsyncProperty.d.cts.map +1 -1
  530. package/build/relations/AsyncProperty.d.mts +5 -6
  531. package/build/relations/AsyncProperty.d.mts.map +1 -1
  532. package/build/relations/AsyncProperty.js.map +1 -1
  533. package/build/relations/AsyncReactiveField.cjs +3 -3
  534. package/build/relations/AsyncReactiveField.cjs.map +1 -1
  535. package/build/relations/AsyncReactiveField.d.cts +4 -5
  536. package/build/relations/AsyncReactiveField.d.cts.map +1 -1
  537. package/build/relations/AsyncReactiveField.d.mts +4 -5
  538. package/build/relations/AsyncReactiveField.d.mts.map +1 -1
  539. package/build/relations/AsyncReactiveField.js +3 -3
  540. package/build/relations/AsyncReactiveField.js.map +1 -1
  541. package/build/relations/Collection.d.cts +4 -5
  542. package/build/relations/Collection.d.cts.map +1 -1
  543. package/build/relations/Collection.d.mts +4 -5
  544. package/build/relations/Collection.d.mts.map +1 -1
  545. package/build/relations/CustomCollection.cjs.map +1 -1
  546. package/build/relations/CustomCollection.d.cts +3 -4
  547. package/build/relations/CustomCollection.d.cts.map +1 -1
  548. package/build/relations/CustomCollection.d.mts +3 -4
  549. package/build/relations/CustomCollection.d.mts.map +1 -1
  550. package/build/relations/CustomCollection.js.map +1 -1
  551. package/build/relations/CustomReference.cjs.map +1 -1
  552. package/build/relations/CustomReference.d.cts +3 -4
  553. package/build/relations/CustomReference.d.cts.map +1 -1
  554. package/build/relations/CustomReference.d.mts +3 -4
  555. package/build/relations/CustomReference.d.mts.map +1 -1
  556. package/build/relations/CustomReference.js.map +1 -1
  557. package/build/relations/EnumCollection.cjs.map +1 -1
  558. package/build/relations/EnumCollection.d.cts +5 -5
  559. package/build/relations/EnumCollection.d.cts.map +1 -1
  560. package/build/relations/EnumCollection.d.mts +5 -5
  561. package/build/relations/EnumCollection.d.mts.map +1 -1
  562. package/build/relations/EnumCollection.js.map +1 -1
  563. package/build/relations/LargeCollection.d.cts +1 -2
  564. package/build/relations/LargeCollection.d.cts.map +1 -1
  565. package/build/relations/LargeCollection.d.mts +1 -2
  566. package/build/relations/LargeCollection.d.mts.map +1 -1
  567. package/build/relations/LazyField.cjs +14 -0
  568. package/build/relations/LazyField.cjs.map +1 -1
  569. package/build/relations/LazyField.d.cts +13 -8
  570. package/build/relations/LazyField.d.cts.map +1 -1
  571. package/build/relations/LazyField.d.mts +13 -8
  572. package/build/relations/LazyField.d.mts.map +1 -1
  573. package/build/relations/LazyField.js +14 -0
  574. package/build/relations/LazyField.js.map +1 -1
  575. package/build/relations/ManyToManyCollection.cjs.map +1 -1
  576. package/build/relations/ManyToManyCollection.d.cts +2 -3
  577. package/build/relations/ManyToManyCollection.d.cts.map +1 -1
  578. package/build/relations/ManyToManyCollection.d.mts +2 -3
  579. package/build/relations/ManyToManyCollection.d.mts.map +1 -1
  580. package/build/relations/ManyToManyCollection.js.map +1 -1
  581. package/build/relations/ManyToManyLargeCollection.d.cts +2 -3
  582. package/build/relations/ManyToManyLargeCollection.d.cts.map +1 -1
  583. package/build/relations/ManyToManyLargeCollection.d.mts +2 -3
  584. package/build/relations/ManyToManyLargeCollection.d.mts.map +1 -1
  585. package/build/relations/ManyToOneReference.cjs.map +1 -1
  586. package/build/relations/ManyToOneReference.d.cts +6 -7
  587. package/build/relations/ManyToOneReference.d.cts.map +1 -1
  588. package/build/relations/ManyToOneReference.d.mts +6 -7
  589. package/build/relations/ManyToOneReference.d.mts.map +1 -1
  590. package/build/relations/ManyToOneReference.js.map +1 -1
  591. package/build/relations/OneToManyCollection.cjs.map +1 -1
  592. package/build/relations/OneToManyCollection.d.cts +2 -3
  593. package/build/relations/OneToManyCollection.d.cts.map +1 -1
  594. package/build/relations/OneToManyCollection.d.mts +2 -3
  595. package/build/relations/OneToManyCollection.d.mts.map +1 -1
  596. package/build/relations/OneToManyCollection.js.map +1 -1
  597. package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
  598. package/build/relations/OneToManyLargeCollection.d.cts +2 -3
  599. package/build/relations/OneToManyLargeCollection.d.cts.map +1 -1
  600. package/build/relations/OneToManyLargeCollection.d.mts +2 -3
  601. package/build/relations/OneToManyLargeCollection.d.mts.map +1 -1
  602. package/build/relations/OneToManyLargeCollection.js.map +1 -1
  603. package/build/relations/OneToOneReference.cjs.map +1 -1
  604. package/build/relations/OneToOneReference.d.cts +7 -7
  605. package/build/relations/OneToOneReference.d.cts.map +1 -1
  606. package/build/relations/OneToOneReference.d.mts +7 -7
  607. package/build/relations/OneToOneReference.d.mts.map +1 -1
  608. package/build/relations/OneToOneReference.js.map +1 -1
  609. package/build/relations/PolymorphicReference.cjs.map +1 -1
  610. package/build/relations/PolymorphicReference.d.cts +4 -5
  611. package/build/relations/PolymorphicReference.d.cts.map +1 -1
  612. package/build/relations/PolymorphicReference.d.mts +4 -5
  613. package/build/relations/PolymorphicReference.d.mts.map +1 -1
  614. package/build/relations/PolymorphicReference.js.map +1 -1
  615. package/build/relations/PropertySymbols.d.cts +1 -2
  616. package/build/relations/PropertySymbols.d.cts.map +1 -1
  617. package/build/relations/PropertySymbols.d.mts +1 -2
  618. package/build/relations/PropertySymbols.d.mts.map +1 -1
  619. package/build/relations/ReactiveField.cjs +2 -2
  620. package/build/relations/ReactiveField.cjs.map +1 -1
  621. package/build/relations/ReactiveField.d.cts +4 -5
  622. package/build/relations/ReactiveField.d.cts.map +1 -1
  623. package/build/relations/ReactiveField.d.mts +4 -5
  624. package/build/relations/ReactiveField.d.mts.map +1 -1
  625. package/build/relations/ReactiveField.js +2 -2
  626. package/build/relations/ReactiveField.js.map +1 -1
  627. package/build/relations/ReactiveGetter.cjs.map +1 -1
  628. package/build/relations/ReactiveGetter.d.cts +4 -5
  629. package/build/relations/ReactiveGetter.d.cts.map +1 -1
  630. package/build/relations/ReactiveGetter.d.mts +4 -5
  631. package/build/relations/ReactiveGetter.d.mts.map +1 -1
  632. package/build/relations/ReactiveGetter.js.map +1 -1
  633. package/build/relations/ReactiveManyToMany.cjs +1 -1
  634. package/build/relations/ReactiveManyToMany.cjs.map +1 -1
  635. package/build/relations/ReactiveManyToMany.d.cts +4 -5
  636. package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
  637. package/build/relations/ReactiveManyToMany.d.mts +4 -5
  638. package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
  639. package/build/relations/ReactiveManyToMany.js +1 -1
  640. package/build/relations/ReactiveManyToMany.js.map +1 -1
  641. package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
  642. package/build/relations/ReactiveManyToManyOtherSide.d.cts +4 -5
  643. package/build/relations/ReactiveManyToManyOtherSide.d.cts.map +1 -1
  644. package/build/relations/ReactiveManyToManyOtherSide.d.mts +4 -5
  645. package/build/relations/ReactiveManyToManyOtherSide.d.mts.map +1 -1
  646. package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
  647. package/build/relations/ReactiveReference.cjs +1 -1
  648. package/build/relations/ReactiveReference.cjs.map +1 -1
  649. package/build/relations/ReactiveReference.d.cts +5 -6
  650. package/build/relations/ReactiveReference.d.cts.map +1 -1
  651. package/build/relations/ReactiveReference.d.mts +5 -6
  652. package/build/relations/ReactiveReference.d.mts.map +1 -1
  653. package/build/relations/ReactiveReference.js +1 -1
  654. package/build/relations/ReactiveReference.js.map +1 -1
  655. package/build/relations/ReadOnlyCollection.d.cts +4 -5
  656. package/build/relations/ReadOnlyCollection.d.cts.map +1 -1
  657. package/build/relations/ReadOnlyCollection.d.mts +4 -5
  658. package/build/relations/ReadOnlyCollection.d.mts.map +1 -1
  659. package/build/relations/RecursiveCollection.cjs +3 -3
  660. package/build/relations/RecursiveCollection.cjs.map +1 -1
  661. package/build/relations/RecursiveCollection.d.cts +10 -10
  662. package/build/relations/RecursiveCollection.d.cts.map +1 -1
  663. package/build/relations/RecursiveCollection.d.mts +10 -10
  664. package/build/relations/RecursiveCollection.d.mts.map +1 -1
  665. package/build/relations/RecursiveCollection.js +3 -3
  666. package/build/relations/RecursiveCollection.js.map +1 -1
  667. package/build/relations/RecursiveCycleError.d.cts +2 -2
  668. package/build/relations/RecursiveCycleError.d.cts.map +1 -1
  669. package/build/relations/RecursiveCycleError.d.mts +2 -2
  670. package/build/relations/RecursiveCycleError.d.mts.map +1 -1
  671. package/build/relations/Reference.d.cts +5 -5
  672. package/build/relations/Reference.d.cts.map +1 -1
  673. package/build/relations/Reference.d.mts +5 -5
  674. package/build/relations/Reference.d.mts.map +1 -1
  675. package/build/relations/ReferenceSymbols.d.cts +1 -2
  676. package/build/relations/ReferenceSymbols.d.cts.map +1 -1
  677. package/build/relations/ReferenceSymbols.d.mts +1 -2
  678. package/build/relations/ReferenceSymbols.d.mts.map +1 -1
  679. package/build/relations/Relation.d.cts +3 -3
  680. package/build/relations/Relation.d.cts.map +1 -1
  681. package/build/relations/Relation.d.mts +3 -3
  682. package/build/relations/Relation.d.mts.map +1 -1
  683. package/build/relations/RelationSymbols.d.cts +2 -3
  684. package/build/relations/RelationSymbols.d.cts.map +1 -1
  685. package/build/relations/RelationSymbols.d.mts +2 -3
  686. package/build/relations/RelationSymbols.d.mts.map +1 -1
  687. package/build/relations/hasAsyncMethod.cjs.map +1 -1
  688. package/build/relations/hasAsyncMethod.d.cts +6 -6
  689. package/build/relations/hasAsyncMethod.d.cts.map +1 -1
  690. package/build/relations/hasAsyncMethod.d.mts +6 -6
  691. package/build/relations/hasAsyncMethod.d.mts.map +1 -1
  692. package/build/relations/hasAsyncMethod.js.map +1 -1
  693. package/build/relations/hasManyDerived.d.cts +2 -2
  694. package/build/relations/hasManyDerived.d.cts.map +1 -1
  695. package/build/relations/hasManyDerived.d.mts +2 -2
  696. package/build/relations/hasManyDerived.d.mts.map +1 -1
  697. package/build/relations/hasManyThrough.d.cts +1 -2
  698. package/build/relations/hasManyThrough.d.cts.map +1 -1
  699. package/build/relations/hasManyThrough.d.mts +1 -2
  700. package/build/relations/hasManyThrough.d.mts.map +1 -1
  701. package/build/relations/hasOneDerived.d.cts +1 -2
  702. package/build/relations/hasOneDerived.d.cts.map +1 -1
  703. package/build/relations/hasOneDerived.d.mts +1 -2
  704. package/build/relations/hasOneDerived.d.mts.map +1 -1
  705. package/build/relations/hasOneThrough.d.cts +1 -2
  706. package/build/relations/hasOneThrough.d.cts.map +1 -1
  707. package/build/relations/hasOneThrough.d.mts +1 -2
  708. package/build/relations/hasOneThrough.d.mts.map +1 -1
  709. package/build/relations/hasProperty.cjs +2 -2
  710. package/build/relations/hasProperty.cjs.map +1 -1
  711. package/build/relations/hasProperty.d.cts +8 -8
  712. package/build/relations/hasProperty.d.cts.map +1 -1
  713. package/build/relations/hasProperty.d.mts +8 -8
  714. package/build/relations/hasProperty.d.mts.map +1 -1
  715. package/build/relations/hasProperty.js +2 -2
  716. package/build/relations/hasProperty.js.map +1 -1
  717. package/build/relations/index.cjs +5 -5
  718. package/build/relations/index.js +5 -5
  719. package/build/relations/isCascadeDelete.d.cts +1 -2
  720. package/build/relations/isCascadeDelete.d.cts.map +1 -1
  721. package/build/relations/isCascadeDelete.d.mts +1 -2
  722. package/build/relations/isCascadeDelete.d.mts.map +1 -1
  723. package/build/resurrection.cjs +11 -1
  724. package/build/resurrection.cjs.map +1 -1
  725. package/build/resurrection.d.cts +5 -3
  726. package/build/resurrection.d.cts.map +1 -1
  727. package/build/resurrection.d.mts +5 -3
  728. package/build/resurrection.d.mts.map +1 -1
  729. package/build/resurrection.js +11 -2
  730. package/build/resurrection.js.map +1 -1
  731. package/build/rules.d.cts +20 -20
  732. package/build/rules.d.cts.map +1 -1
  733. package/build/rules.d.mts +20 -20
  734. package/build/rules.d.mts.map +1 -1
  735. package/build/runtimeConfig.d.cts +4 -5
  736. package/build/runtimeConfig.d.cts.map +1 -1
  737. package/build/runtimeConfig.d.mts +4 -5
  738. package/build/runtimeConfig.d.mts.map +1 -1
  739. package/build/serde/TypeInfo.d.cts +3 -4
  740. package/build/serde/TypeInfo.d.cts.map +1 -1
  741. package/build/serde/TypeInfo.d.mts +3 -4
  742. package/build/serde/TypeInfo.d.mts.map +1 -1
  743. package/build/serde/columns.d.cts +2 -3
  744. package/build/serde/columns.d.cts.map +1 -1
  745. package/build/serde/columns.d.mts +2 -3
  746. package/build/serde/columns.d.mts.map +1 -1
  747. package/build/serde/fieldSerde.d.cts +9 -9
  748. package/build/serde/fieldSerde.d.cts.map +1 -1
  749. package/build/serde/fieldSerde.d.mts +9 -9
  750. package/build/serde/fieldSerde.d.mts.map +1 -1
  751. package/build/serde/serde.cjs +35 -0
  752. package/build/serde/serde.cjs.map +1 -1
  753. package/build/serde/serde.d.cts +37 -19
  754. package/build/serde/serde.d.cts.map +1 -1
  755. package/build/serde/serde.d.mts +37 -19
  756. package/build/serde/serde.d.mts.map +1 -1
  757. package/build/serde/serde.js +35 -1
  758. package/build/serde/serde.js.map +1 -1
  759. package/build/serde/temporal.d.cts +5 -5
  760. package/build/serde/temporal.d.cts.map +1 -1
  761. package/build/serde/temporal.d.mts +5 -5
  762. package/build/serde/temporal.d.mts.map +1 -1
  763. package/build/serde/temporalMappers.d.cts +4 -5
  764. package/build/serde/temporalMappers.d.cts.map +1 -1
  765. package/build/serde/temporalMappers.d.mts +4 -5
  766. package/build/serde/temporalMappers.d.mts.map +1 -1
  767. package/build/transitions.cjs +89 -0
  768. package/build/transitions.cjs.map +1 -0
  769. package/build/transitions.d.cts +109 -0
  770. package/build/transitions.d.cts.map +1 -0
  771. package/build/transitions.d.mts +109 -0
  772. package/build/transitions.d.mts.map +1 -0
  773. package/build/transitions.js +84 -0
  774. package/build/transitions.js.map +1 -0
  775. package/build/trusted.d.cts +2 -3
  776. package/build/trusted.d.cts.map +1 -1
  777. package/build/trusted.d.mts +2 -3
  778. package/build/trusted.d.mts.map +1 -1
  779. package/build/typeMap.d.cts +17 -17
  780. package/build/typeMap.d.cts.map +1 -1
  781. package/build/typeMap.d.mts +17 -17
  782. package/build/typeMap.d.mts.map +1 -1
  783. package/build/upsert.d.cts +4 -4
  784. package/build/upsert.d.cts.map +1 -1
  785. package/build/upsert.d.mts +4 -4
  786. package/build/upsert.d.mts.map +1 -1
  787. package/build/utils.d.cts +27 -28
  788. package/build/utils.d.cts.map +1 -1
  789. package/build/utils.d.mts +27 -28
  790. package/build/utils.d.mts.map +1 -1
  791. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"AsyncReactiveField.js","names":["#loadHint","#reactiveHint","#loaded","#loadPromise","#useFactoryValue"],"sources":["../../src/relations/AsyncReactiveField.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { getMetadata } from \"src/EntityMetadata.ts\";\nimport { getField, isFieldSet, setField } from \"src/fields.ts\";\nimport { type ReactiveField, deepNormalizeHint, isLoaded } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { type Reacted, type ReactiveHint, convertToLoadHint } from \"src/reactivity/reactiveHints.ts\";\nimport { AbstractPropertyImpl } from \"src/relations/AbstractPropertyImpl.ts\";\nimport { PropertyT } from \"src/relations/PropertySymbols.ts\";\nimport { mergeNormalizedHints } from \"src/utils.ts\";\n\n/**\n * An `AsyncReactiveField` is a value that is derived from a SQL query, similar to\n * a `ReactiveField`, but when the value needs to be calculated from SQL because\n * it would be too expensive to calculate in-memory.\n *\n * Its hint is split in two: the `loadHint` names data that is both reacted-to *and*\n * loaded into memory (and passed to `fn`), while the `reactiveHint` names data that is\n * only reacted-to (its changes recompute the value) but is left in the database rather\n * than pulled into memory. The `fn` lambda re-runs when data referred to by either hint\n * changes, but only the `loadHint`'s data is populated.\n */\nexport function hasAsyncReactiveField<\n T extends Entity,\n const H1 extends ReactiveHint<T>,\n const H2 extends ReactiveHint<T>,\n V,\n>(loadHint: H1, reactiveHint: H2, fn: (entity: Reacted<T, H1>) => Promise<V>): ReactiveField<T, V> {\n return lazyField((entity: T, fieldName) => {\n return new AsyncReactiveFieldImpl(entity, fieldName as keyof T & string, loadHint, reactiveHint, fn);\n });\n}\n\nexport class AsyncReactiveFieldImpl<T extends Entity, H1 extends ReactiveHint<T>, H2 extends ReactiveHint<T>, V>\n extends AbstractPropertyImpl<T>\n implements ReactiveField<T, V>\n{\n readonly #loadHint: H1;\n readonly #reactiveHint: H2;\n #loadPromise: any;\n #loaded: boolean;\n #useFactoryValue = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n loadHint: H1,\n reactiveHint: H2,\n private fn: (entity: Reacted<T, H1>) => Promise<V>,\n ) {\n super(entity);\n this.#loadHint = loadHint;\n this.#reactiveHint = reactiveHint;\n this.#loaded = false;\n }\n\n /**\n * Our combined load + reactive-only hint, so that we react to changes within both.\n *\n * The `loadHint` half is populated into memory (and passed to `fn`); the `reactiveHint`\n * half only triggers recalculation, so its data stays in the database.\n */\n get reactiveHint(): ReactiveHint<any> {\n // We do this in a getter (instead of the constructor) b/c it might be a little expensive,\n // and I'm pretty sure this is only called on boot, when hooking up the reactivity.\n const hint = deepNormalizeHint(this.#loadHint);\n mergeNormalizedHints(hint, deepNormalizeHint(this.#reactiveHint));\n return hint;\n }\n\n load(opts?: { forceReload?: boolean }): Promise<V> {\n // if (!this.isSet || opts?.forceReload) {\n return (this.#loadPromise ??= this.entity.em\n .populate(this.entity, { hint: this.loadHint } as any)\n .then(() => {\n // Even if the factory used a `with...`, we'll still go through the RFQ logic, but just ignore the new value\n return this.#useFactoryValue ? this.fieldValue : this.fn(this.entity as Reacted<T, H1>);\n })\n .then((newValue) => {\n setField(this.entity, this.fieldName, newValue);\n this.#loadPromise = undefined;\n this.#loaded = true;\n return newValue;\n })\n .catch((e) => {\n // If we blow up calling `this.fn` i.e. due to a NoIdError, we want to make\n // sure that the next `.load` call tries again.\n this.#loadPromise = undefined;\n throw e;\n }));\n // }\n // return tryResolve(() => this.get);\n }\n\n /** Returns the previously-calculated value. */\n get get(): V {\n // Regular ReactiveFields repeatedly call their `fn` lambda to calculate the value, to ensure\n // they always return the latest/correct value, but because AsyncReactiveFields are fundamentally\n // calculated from DB queries, we can only return the previously-calculated value, if set.\n if (this.isSet) {\n return this.fieldValue;\n } else {\n throw new Error(`${this.fieldName} has not been derived yet`);\n }\n }\n\n get fieldValue(): V {\n return getField(this.entity, this.fieldName);\n }\n\n get isSet() {\n return isFieldSet(this.entity, this.fieldName);\n }\n\n get isLoaded() {\n const hintLoaded = isLoaded(this.entity, this.loadHint);\n if (hintLoaded) {\n this.#loaded = true;\n }\n return hintLoaded;\n }\n\n get loadHint(): any {\n // Only convert the loadHint, so we don't pull the reactiveHint-referenced data into memory\n const meta = getMetadata(this.entity);\n return (meta.config.__data.cachedReactiveLoadHints[this.fieldName] ??= convertToLoadHint(meta, this.#loadHint));\n }\n\n setFactoryValue(newValue: any): void {\n this.#useFactoryValue = true;\n setField(this.entity, this.fieldName, newValue);\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is an AsyncReactiveField. */\nexport function isAsyncReactiveField(maybe: any): maybe is ReactiveField<any, any> {\n return maybe instanceof AsyncReactiveFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded AsyncReactiveField. */\nexport function isLoadedAsyncReactiveField(maybe: any): maybe is ReactiveField<any, any> {\n return isAsyncReactiveField(maybe) && maybe.isLoaded;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,sBAKd,UAAc,cAAkB,IAAiE;CACjG,OAAO,WAAW,QAAW,cAAc;EACzC,OAAO,IAAI,uBAAuB,QAAQ,WAA+B,UAAU,cAAc,EAAE;CACrG,CAAC;AACH;AAEA,IAAa,yBAAb,cACU,qBAEV;CASW;CAGC;CAXV;CACA;CACA;CACA;CACA,mBAAmB;CAEnB,YACE,QACA,WACA,UACA,cACA,IACA;EACA,MAAM,MAAM;EALL,KAAA,YAAA;EAGC,KAAA,KAAA;EAGR,KAAKA,YAAY;EACjB,KAAKC,gBAAgB;EACrB,KAAKC,UAAU;CACjB;;;;;;;CAQA,IAAI,eAAkC;EAGpC,MAAM,OAAO,kBAAkB,KAAKF,SAAS;EAC7C,qBAAqB,MAAM,kBAAkB,KAAKC,aAAa,CAAC;EAChE,OAAO;CACT;CAEA,KAAK,MAA8C;EAEjD,OAAQ,KAAKE,iBAAiB,KAAK,OAAO,GACvC,SAAS,KAAK,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAQ,CAAC,CACrD,WAAW;GAEV,OAAO,KAAKC,mBAAmB,KAAK,aAAa,KAAK,GAAG,KAAK,MAAwB;EACxF,CAAC,CAAC,CACD,MAAM,aAAa;GAClB,SAAS,KAAK,QAAQ,KAAK,WAAW,QAAQ;GAC9C,KAAKD,eAAe,KAAA;GACpB,KAAKD,UAAU;GACf,OAAO;EACT,CAAC,CAAC,CACD,OAAO,MAAM;GAGZ,KAAKC,eAAe,KAAA;GACpB,MAAM;EACR,CAAC;CAGL;;CAGA,IAAI,MAAS;EAIX,IAAI,KAAK,OACP,OAAO,KAAK;OAEZ,MAAM,IAAI,MAAM,GAAG,KAAK,UAAU,0BAA0B;CAEhE;CAEA,IAAI,aAAgB;EAClB,OAAO,SAAS,KAAK,QAAQ,KAAK,SAAS;CAC7C;CAEA,IAAI,QAAQ;EACV,OAAO,WAAW,KAAK,QAAQ,KAAK,SAAS;CAC/C;CAEA,IAAI,WAAW;EACb,MAAM,aAAa,SAAS,KAAK,QAAQ,KAAK,QAAQ;EACtD,IAAI,YACF,KAAKD,UAAU;EAEjB,OAAO;CACT;CAEA,IAAI,WAAgB;EAElB,MAAM,OAAO,YAAY,KAAK,MAAM;EACpC,OAAQ,KAAK,OAAO,OAAO,wBAAwB,KAAK,eAAe,kBAAkB,MAAM,KAAKF,SAAS;CAC/G;CAEA,gBAAgB,UAAqB;EACnC,KAAKI,mBAAmB;EACxB,SAAS,KAAK,QAAQ,KAAK,WAAW,QAAQ;CAChD;CAEA,CAAC,aAAa,KAAA;AAChB;;AAGA,SAAgB,qBAAqB,OAA8C;CACjF,OAAO,iBAAiB;AAC1B;;AAGA,SAAgB,2BAA2B,OAA8C;CACvF,OAAO,qBAAqB,KAAK,KAAK,MAAM;AAC9C"}
1
+ {"version":3,"file":"AsyncReactiveField.js","names":[],"sources":["../../src/relations/AsyncReactiveField.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { getMetadata } from \"src/EntityMetadata.ts\";\nimport { getField, isFieldSet, setField } from \"src/fields.ts\";\nimport { type ReactiveField, deepNormalizeHint, isLoaded } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { type Reacted, type ReactiveHint, convertToLoadHint } from \"src/reactivity/reactiveHints.ts\";\nimport { AbstractPropertyImpl } from \"src/relations/AbstractPropertyImpl.ts\";\nimport { PropertyT } from \"src/relations/PropertySymbols.ts\";\nimport { mergeNormalizedHints } from \"src/utils.ts\";\n\n/**\n * An `AsyncReactiveField` is a value that is derived from a SQL query, similar to\n * a `ReactiveField`, but when the value needs to be calculated from SQL because\n * it would be too expensive to calculate in-memory.\n *\n * Its hint is split in two: the `loadHint` names data that is both reacted-to *and*\n * loaded into memory (and passed to `fn`), while the `reactiveHint` names data that is\n * only reacted-to (its changes recompute the value) but is left in the database rather\n * than pulled into memory. The `fn` lambda re-runs when data referred to by either hint\n * changes, but only the `loadHint`'s data is populated.\n */\nexport function hasAsyncReactiveField<\n T extends Entity,\n const H1 extends ReactiveHint<T>,\n const H2 extends ReactiveHint<T>,\n V,\n>(loadHint: H1, reactiveHint: H2, fn: (entity: Reacted<T, H1>) => Promise<V>): ReactiveField<T, V> {\n return lazyField((entity: T, fieldName) => {\n return new AsyncReactiveFieldImpl(entity, fieldName as keyof T & string, loadHint, reactiveHint, fn);\n });\n}\n\nexport class AsyncReactiveFieldImpl<T extends Entity, H1 extends ReactiveHint<T>, H2 extends ReactiveHint<T>, V>\n extends AbstractPropertyImpl<T>\n implements ReactiveField<T, V>\n{\n readonly #loadHint: H1;\n readonly #reactiveHint: H2;\n #loadPromise: any;\n #loaded: boolean;\n #useFactoryValue = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n loadHint: H1,\n reactiveHint: H2,\n private fn: (entity: Reacted<T, H1>) => Promise<V>,\n ) {\n super(entity);\n this.#loadHint = loadHint;\n this.#reactiveHint = reactiveHint;\n this.#loaded = false;\n }\n\n /**\n * Our combined load + reactive-only hint, so that we react to changes within both.\n *\n * The `loadHint` half is populated into memory (and passed to `fn`); the `reactiveHint`\n * half only triggers recalculation, so its data stays in the database.\n */\n get reactiveHint(): ReactiveHint<any> {\n // We do this in a getter (instead of the constructor) b/c it might be a little expensive,\n // and I'm pretty sure this is only called on boot, when hooking up the reactivity.\n const hint = deepNormalizeHint(this.#loadHint);\n mergeNormalizedHints(hint, deepNormalizeHint(this.#reactiveHint));\n return hint;\n }\n\n load(opts?: { forceReload?: boolean }): Promise<V> {\n // if (!this.isSet || opts?.forceReload) {\n return (this.#loadPromise ??= this.entity.em\n .populate(this.entity, { hint: this.loadHint } as any)\n .then(() => {\n // Even if the factory used a `with...`, we'll still go through the RFQ logic, but just ignore the new value\n return this.#useFactoryValue ? this.fieldValue : this.fn(this.entity as Reacted<T, H1>);\n })\n .then((newValue) => {\n setField(this.entity, this.fieldName, newValue);\n this.#loadPromise = undefined;\n this.#loaded = true;\n return newValue;\n })\n .catch((e) => {\n // If we blow up calling `this.fn` i.e. due to a NoIdError, we want to make\n // sure that the next `.load` call tries again.\n this.#loadPromise = undefined;\n throw e;\n }));\n // }\n // return tryResolve(() => this.get);\n }\n\n /** Returns the previously-calculated value. */\n get get(): V {\n // Regular ReactiveFields repeatedly call their `fn` lambda to calculate the value, to ensure\n // they always return the latest/correct value, but because AsyncReactiveFields are fundamentally\n // calculated from DB queries, we can only return the previously-calculated value, if set.\n if (this.isSet) {\n return this.fieldValue;\n } else {\n throw new Error(`${this.fieldName} has not been derived yet`);\n }\n }\n\n get fieldValue(): V {\n return getField(this.entity, this.fieldName);\n }\n\n get isSet() {\n return isFieldSet(this.entity, this.fieldName);\n }\n\n get isLoaded() {\n const hintLoaded = isLoaded(this.entity, this.loadHint);\n if (hintLoaded) {\n this.#loaded = true;\n }\n return hintLoaded;\n }\n\n get loadHint(): any {\n // Only convert the loadHint, so we don't pull the reactiveHint-referenced data into memory\n const meta = getMetadata(this.entity);\n return (meta.config.__data.cachedReactiveLoadHints[this.fieldName] ??= convertToLoadHint(meta, this.#loadHint));\n }\n\n setFactoryValue(newValue: any): void {\n this.#useFactoryValue = true;\n setField(this.entity, this.fieldName, newValue);\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is an AsyncReactiveField. */\nexport function isAsyncReactiveField(maybe: any): maybe is ReactiveField<any, any> {\n return maybe instanceof AsyncReactiveFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded AsyncReactiveField. */\nexport function isLoadedAsyncReactiveField(maybe: any): maybe is ReactiveField<any, any> {\n return isAsyncReactiveField(maybe) && maybe.isLoaded;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,sBAKd,UAAc,cAAkB,IAAiE;CACjG,OAAO,WAAW,QAAW,cAAc;EACzC,OAAO,IAAI,uBAAuB,QAAQ,WAA+B,UAAU,cAAc,EAAE;CACrG,CAAC;AACH;AAEA,IAAa,yBAAb,cACU,qBAEV;CASW;CAGC;CAXV;CACA;CACA;CACA;CACA,mBAAmB;CAEnB,YACE,QACA,WACA,UACA,cACA,IACA;EACA,MAAM,MAAM;EALL,KAAA,YAAA;EAGC,KAAA,KAAA;EAGR,KAAK,YAAY;EACjB,KAAK,gBAAgB;EACrB,KAAK,UAAU;CACjB;;;;;;;CAQA,IAAI,eAAkC;EAGpC,MAAM,OAAO,kBAAkB,KAAK,SAAS;EAC7C,qBAAqB,MAAM,kBAAkB,KAAK,aAAa,CAAC;EAChE,OAAO;CACT;CAEA,KAAK,MAA8C;EAEjD,OAAQ,KAAK,iBAAiB,KAAK,OAAO,GACvC,SAAS,KAAK,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAQ,CAAC,CACrD,WAAW;GAEV,OAAO,KAAK,mBAAmB,KAAK,aAAa,KAAK,GAAG,KAAK,MAAwB;EACxF,CAAC,CAAC,CACD,MAAM,aAAa;GAClB,SAAS,KAAK,QAAQ,KAAK,WAAW,QAAQ;GAC9C,KAAK,eAAe,KAAA;GACpB,KAAK,UAAU;GACf,OAAO;EACT,CAAC,CAAC,CACD,OAAO,MAAM;GAGZ,KAAK,eAAe,KAAA;GACpB,MAAM;EACR,CAAC;CAGL;;CAGA,IAAI,MAAS;EAIX,IAAI,KAAK,OACP,OAAO,KAAK;OAEZ,MAAM,IAAI,MAAM,GAAG,KAAK,UAAU,0BAA0B;CAEhE;CAEA,IAAI,aAAgB;EAClB,OAAO,SAAS,KAAK,QAAQ,KAAK,SAAS;CAC7C;CAEA,IAAI,QAAQ;EACV,OAAO,WAAW,KAAK,QAAQ,KAAK,SAAS;CAC/C;CAEA,IAAI,WAAW;EACb,MAAM,aAAa,SAAS,KAAK,QAAQ,KAAK,QAAQ;EACtD,IAAI,YACF,KAAK,UAAU;EAEjB,OAAO;CACT;CAEA,IAAI,WAAgB;EAElB,MAAM,OAAO,YAAY,KAAK,MAAM;EACpC,OAAQ,KAAK,OAAO,OAAO,wBAAwB,KAAK,eAAe,kBAAkB,MAAM,KAAK,SAAS;CAC/G;CAEA,gBAAgB,UAAqB;EACnC,KAAK,mBAAmB;EACxB,SAAS,KAAK,QAAQ,KAAK,WAAW,QAAQ;CAChD;CAEA,CAAC,aAAa,KAAA;AAChB;;AAGA,SAAgB,qBAAqB,OAA8C;CACjF,OAAO,iBAAiB;AAC1B;;AAGA,SAAgB,2BAA2B,OAA8C;CACvF,OAAO,qBAAqB,KAAK,KAAK,MAAM;AAC9C"}
@@ -4,7 +4,7 @@ import { IdOf } from "../EntityManager.cjs";
4
4
  import { Entity } from "../Entity.cjs";
5
5
  //#region src/relations/Collection.d.ts
6
6
  /** A collection of `U` within `T`, either one-to-many or many-to-many. */
7
- interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {
7
+ export interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {
8
8
  load(opts?: {
9
9
  withDeleted: boolean;
10
10
  }): Promise<ReadonlyArray<U>>;
@@ -23,15 +23,14 @@ interface Collection<T extends Entity, U extends Entity> extends Relation<T, U>
23
23
  readonly isLoaded: boolean;
24
24
  }
25
25
  /** Adds a known-safe `get` accessor. */
26
- interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {
26
+ export interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {
27
27
  get: ReadonlyArray<U>;
28
28
  getWithDeleted: ReadonlyArray<U>;
29
29
  removeAll(): void;
30
30
  }
31
31
  /** Type guard utility for determining if an entity field is a Collection. */
32
- declare function isCollection(maybeCollection: any): maybeCollection is Collection<any, any>;
32
+ export declare function isCollection(maybeCollection: any): maybeCollection is Collection<any, any>;
33
33
  /** Type guard utility for determining if an entity field is a loaded Collection. */
34
- declare function isLoadedCollection(maybeCollection: any): maybeCollection is Collection<any, any> & LoadedCollection<any, any>;
34
+ export declare function isLoadedCollection(maybeCollection: any): maybeCollection is Collection<any, any> & LoadedCollection<any, any>;
35
35
  //#endregion
36
- export { Collection, LoadedCollection, isCollection, isLoadedCollection };
37
36
  //# sourceMappingURL=Collection.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Collection.d.cts","names":[],"sources":["../../src/relations/Collection.ts"],"mappings":";;;;;;UAYiB,WAAW,UAAU,QAAQ,UAAU,gBAAgB,SAAS,GAAG;EAClF,KAAK;IAAS;MAAyB,QAAQ,cAAc;;EAG7D,KAAK,IAAI,KAAK,KAAK,QAAQ;;EAG3B,SAAS,OAAO,IAAI;EAEpB,IAAI,OAAO;EAEX,OAAO,OAAO;;;;;;EAOd,IAAI,QAAQ;WAEH;;;UAIM,iBAAiB,UAAU,QAAQ,UAAU,gBAAgB,WAAW,GAAG;EAC1F,KAAK,cAAc;EAEnB,gBAAgB,cAAc;EAE9B;;;iBAIc,aAAa,uBAAuB,mBAAmB;;iBAWvD,mBACd,uBACC,mBAAmB,uBAAuB"}
1
+ {"version":3,"file":"Collection.d.cts","names":[],"sources":["../../src/relations/Collection.ts"],"mappings":";;;;;;iBAYiB,WAAW,UAAU,QAAQ,UAAU,gBAAgB,SAAS,GAAG;EAClF,KAAK;IAAS;MAAyB,QAAQ,cAAc;;EAG7D,KAAK,IAAI,KAAK,KAAK,QAAQ;;EAG3B,SAAS,OAAO,IAAI;EAEpB,IAAI,OAAO;EAEX,OAAO,OAAO;;;;;;EAOd,IAAI,QAAQ;WAEH;;;iBAIM,iBAAiB,UAAU,QAAQ,UAAU,gBAAgB,WAAW,GAAG;EAC1F,KAAK,cAAc;EAEnB,gBAAgB,cAAc;EAE9B;;;wBAIc,aAAa,uBAAuB,mBAAmB;;wBAWvD,mBACd,uBACC,mBAAmB,uBAAuB"}
@@ -4,7 +4,7 @@ import { IdOf } from "../EntityManager.mjs";
4
4
  import { Entity } from "../Entity.mjs";
5
5
  //#region src/relations/Collection.d.ts
6
6
  /** A collection of `U` within `T`, either one-to-many or many-to-many. */
7
- interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {
7
+ export interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {
8
8
  load(opts?: {
9
9
  withDeleted: boolean;
10
10
  }): Promise<ReadonlyArray<U>>;
@@ -23,15 +23,14 @@ interface Collection<T extends Entity, U extends Entity> extends Relation<T, U>
23
23
  readonly isLoaded: boolean;
24
24
  }
25
25
  /** Adds a known-safe `get` accessor. */
26
- interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {
26
+ export interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {
27
27
  get: ReadonlyArray<U>;
28
28
  getWithDeleted: ReadonlyArray<U>;
29
29
  removeAll(): void;
30
30
  }
31
31
  /** Type guard utility for determining if an entity field is a Collection. */
32
- declare function isCollection(maybeCollection: any): maybeCollection is Collection<any, any>;
32
+ export declare function isCollection(maybeCollection: any): maybeCollection is Collection<any, any>;
33
33
  /** Type guard utility for determining if an entity field is a loaded Collection. */
34
- declare function isLoadedCollection(maybeCollection: any): maybeCollection is Collection<any, any> & LoadedCollection<any, any>;
34
+ export declare function isLoadedCollection(maybeCollection: any): maybeCollection is Collection<any, any> & LoadedCollection<any, any>;
35
35
  //#endregion
36
- export { Collection, LoadedCollection, isCollection, isLoadedCollection };
37
36
  //# sourceMappingURL=Collection.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Collection.d.mts","names":[],"sources":["../../src/relations/Collection.ts"],"mappings":";;;;;;UAYiB,WAAW,UAAU,QAAQ,UAAU,gBAAgB,SAAS,GAAG;EAClF,KAAK;IAAS;MAAyB,QAAQ,cAAc;;EAG7D,KAAK,IAAI,KAAK,KAAK,QAAQ;;EAG3B,SAAS,OAAO,IAAI;EAEpB,IAAI,OAAO;EAEX,OAAO,OAAO;;;;;;EAOd,IAAI,QAAQ;WAEH;;;UAIM,iBAAiB,UAAU,QAAQ,UAAU,gBAAgB,WAAW,GAAG;EAC1F,KAAK,cAAc;EAEnB,gBAAgB,cAAc;EAE9B;;;iBAIc,aAAa,uBAAuB,mBAAmB;;iBAWvD,mBACd,uBACC,mBAAmB,uBAAuB"}
1
+ {"version":3,"file":"Collection.d.mts","names":[],"sources":["../../src/relations/Collection.ts"],"mappings":";;;;;;iBAYiB,WAAW,UAAU,QAAQ,UAAU,gBAAgB,SAAS,GAAG;EAClF,KAAK;IAAS;MAAyB,QAAQ,cAAc;;EAG7D,KAAK,IAAI,KAAK,KAAK,QAAQ;;EAG3B,SAAS,OAAO,IAAI;EAEpB,IAAI,OAAO;EAEX,OAAO,OAAO;;;;;;EAOd,IAAI,QAAQ;WAEH;;;iBAIM,iBAAiB,UAAU,QAAQ,UAAU,gBAAgB,WAAW,GAAG;EAC1F,KAAK,cAAc;EAEnB,gBAAgB,cAAc;EAE9B;;;wBAIc,aAAa,uBAAuB,mBAAmB;;wBAWvD,mBACd,uBACC,mBAAmB,uBAAuB"}
@@ -1 +1 @@
1
- {"version":3,"file":"CustomCollection.cjs","names":["lazyField","AbstractRelationImpl","#isLoaded","#loadHint","#hasBeenSet","RelationT","RelationU"],"sources":["../../src/relations/CustomCollection.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type Collection, type LoadHint, ensureNotDeleted, fail } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport type CustomCollectionOpts<T extends Entity, U extends Entity> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<any>;\n get: (entity: T) => readonly U[];\n set?: (entity: T, other: U[]) => void;\n find?: (entity: T, id: IdOf<U>) => U | undefined;\n add?: (entity: T, other: U) => void;\n remove?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this collection. Currently\n * only used by em.importEntity and can be omitted if the collection isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\nexport function hasCustomCollection<T extends Entity, U extends Entity>(\n opts: CustomCollectionOpts<T, U>,\n): CustomCollection<T, U> {\n return lazyField((entity: T) => {\n return new CustomCollection<T, U>(entity, opts);\n });\n}\n\n/**\n * Allows user-defined collections that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomCollection` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasManyThrough`, which are built on `CustomCollection`.\n */\nexport class CustomCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, readonly U[]>\n implements Collection<T, U>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the values can become stale; we want to each `.get` call to repeatedly evaluate the latest values.\n private loadPromise: Promise<any> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined = undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomCollectionOpts<T, U>,\n ) {\n super(entity);\n }\n\n get get(): readonly U[] {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): readonly U[] {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n set(values: U[]): void {\n this.ensureNewOrLoaded();\n const { set, add, remove } = this.opts;\n if (set !== undefined) {\n set(this.entity, values);\n this.#hasBeenSet = true;\n } else if (add !== undefined && remove !== undefined) {\n const current = this.get;\n current.filter((value) => !values.includes(value)).forEach((value) => this.remove(value));\n values.filter((value) => !current.includes(value)).forEach((value) => this.add(value));\n this.#hasBeenSet = true;\n } else {\n fail(`'set' not implemented and not inferrable from 'add'/'remove' on ${this}`);\n }\n }\n\n setFromOpts(values: U[]): void {\n this.set(values);\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n if (!this.isLoaded) {\n await this.load();\n }\n const { find } = this.opts;\n if (find === undefined) {\n return this.doGet().find((other) => other.id === id);\n } else {\n return find(this.entity, id);\n }\n }\n\n async includes(other: U): Promise<boolean> {\n throw new Error(\"Not implemented\");\n }\n\n add(other: U): void {\n this.ensureNewOrLoaded();\n const { add } = this.opts;\n if (add === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n add(this.entity, other);\n }\n\n remove(other: U): void {\n this.ensureNewOrLoaded();\n const { remove } = this.opts;\n if (remove === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n remove(this.entity, other);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomCollections field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n // Something about running with the transformations breaks the `[0][0]` and it can NPE\n return Object.entries(this.entity).filter((e) => e[1] === this)[0]?.[0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomCollection(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): readonly U[] {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entities: readonly U[], opts?: { withDeleted?: boolean }): readonly U[] {\n return entities.filter((entity) => opts?.withDeleted === true || !entity.isDeletedEntity);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CustomCollection.cjs","names":["lazyField","AbstractRelationImpl","RelationT","RelationU"],"sources":["../../src/relations/CustomCollection.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type Collection, type LoadHint, ensureNotDeleted, fail } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport type CustomCollectionOpts<T extends Entity, U extends Entity> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<any>;\n get: (entity: T) => readonly U[];\n set?: (entity: T, other: U[]) => void;\n find?: (entity: T, id: IdOf<U>) => U | undefined;\n add?: (entity: T, other: U) => void;\n remove?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this collection. Currently\n * only used by em.importEntity and can be omitted if the collection isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\nexport function hasCustomCollection<T extends Entity, U extends Entity>(\n opts: CustomCollectionOpts<T, U>,\n): CustomCollection<T, U> {\n return lazyField((entity: T) => {\n return new CustomCollection<T, U>(entity, opts);\n });\n}\n\n/**\n * Allows user-defined collections that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomCollection` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasManyThrough`, which are built on `CustomCollection`.\n */\nexport class CustomCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, readonly U[]>\n implements Collection<T, U>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the values can become stale; we want to each `.get` call to repeatedly evaluate the latest values.\n private loadPromise: Promise<any> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined = undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomCollectionOpts<T, U>,\n ) {\n super(entity);\n }\n\n get get(): readonly U[] {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): readonly U[] {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n set(values: U[]): void {\n this.ensureNewOrLoaded();\n const { set, add, remove } = this.opts;\n if (set !== undefined) {\n set(this.entity, values);\n this.#hasBeenSet = true;\n } else if (add !== undefined && remove !== undefined) {\n const current = this.get;\n current.filter((value) => !values.includes(value)).forEach((value) => this.remove(value));\n values.filter((value) => !current.includes(value)).forEach((value) => this.add(value));\n this.#hasBeenSet = true;\n } else {\n fail(`'set' not implemented and not inferrable from 'add'/'remove' on ${this}`);\n }\n }\n\n setFromOpts(values: U[]): void {\n this.set(values);\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n if (!this.isLoaded) {\n await this.load();\n }\n const { find } = this.opts;\n if (find === undefined) {\n return this.doGet().find((other) => other.id === id);\n } else {\n return find(this.entity, id);\n }\n }\n\n async includes(other: U): Promise<boolean> {\n throw new Error(\"Not implemented\");\n }\n\n add(other: U): void {\n this.ensureNewOrLoaded();\n const { add } = this.opts;\n if (add === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n add(this.entity, other);\n }\n\n remove(other: U): void {\n this.ensureNewOrLoaded();\n const { remove } = this.opts;\n if (remove === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n remove(this.entity, other);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomCollections field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n // Something about running with the transformations breaks the `[0][0]` and it can NPE\n return Object.entries(this.entity).filter((e) => e[1] === this)[0]?.[0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomCollection(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): readonly U[] {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entities: readonly U[], opts?: { withDeleted?: boolean }): readonly U[] {\n return entities.filter((entity) => opts?.withDeleted === true || !entity.isDeletedEntity);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import "../index.cjs";
6
6
  import { IdOf } from "../EntityManager.cjs";
7
7
  import { Entity } from "../Entity.cjs";
8
8
  //#region src/relations/CustomCollection.d.ts
9
- type CustomCollectionOpts<T extends Entity, U extends Entity> = {
9
+ export type CustomCollectionOpts<T extends Entity, U extends Entity> = {
10
10
  load: (entity: T, opts: {
11
11
  forceReload?: boolean;
12
12
  }) => Promise<any>;
@@ -23,7 +23,7 @@ type CustomCollectionOpts<T extends Entity, U extends Entity> = {
23
23
  */
24
24
  loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;
25
25
  };
26
- declare function hasCustomCollection<T extends Entity, U extends Entity>(opts: CustomCollectionOpts<T, U>): CustomCollection<T, U>;
26
+ export declare function hasCustomCollection<T extends Entity, U extends Entity>(opts: CustomCollectionOpts<T, U>): CustomCollection<T, U>;
27
27
  /**
28
28
  * Allows user-defined collections that will work in `populate` / preload hints.
29
29
  *
@@ -35,7 +35,7 @@ declare function hasCustomCollection<T extends Entity, U extends Entity>(opts: C
35
35
  * This `CustomCollection` API is fairly low-level; users should more likely prefer higher-level
36
36
  * abstractions like `hasManyThrough`, which are built on `CustomCollection`.
37
37
  */
38
- declare class CustomCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, readonly U[]> implements Collection<T, U> {
38
+ export declare class CustomCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, readonly U[]> implements Collection<T, U> {
39
39
  #private;
40
40
  private opts;
41
41
  private loadPromise;
@@ -70,5 +70,4 @@ declare class CustomCollection<T extends Entity, U extends Entity> extends Abstr
70
70
  [RelationU]: U;
71
71
  }
72
72
  //#endregion
73
- export { CustomCollection, CustomCollectionOpts, hasCustomCollection };
74
73
  //# sourceMappingURL=CustomCollection.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomCollection.d.cts","names":[],"sources":["../../src/relations/CustomCollection.ts"],"mappings":";;;;;;;;KAOY,qBAAqB,UAAU,QAAQ,UAAU;EAG3D,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,eAAe;EAC7B,OAAO,QAAQ,GAAG,OAAO;EACzB,QAAQ,QAAQ,GAAG,IAAI,KAAK,OAAO;EACnC,OAAO,QAAQ,GAAG,OAAO;EACzB,UAAU,QAAQ,GAAG,OAAO;;EAE5B,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;iBAGrC,oBAAoB,UAAU,QAAQ,UAAU,QAC9D,MAAM,qBAAqB,GAAG,KAC7B,iBAAiB,GAAG;;;;;;;;;;;;cAiBV,iBAAiB,UAAU,QAAQ,UAAU,gBAChD,qBAAqB,YAAY,gBAC9B,WAAW,GAAG;;UAWf;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,qBAAqB,GAAG;MAKpC,gBAAgB;MAIhB,2BAA2B;MAI3B;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,iBAAiB;MAetF;EAIJ;EAIA,IAAI,QAAQ;EAgBZ,YAAY,QAAQ;EAId,KAAK,IAAI,KAAK,KAAK,QAAQ;EAY3B,SAAS,OAAO,IAAI;EAI1B,IAAI,OAAO;EASX,OAAO,OAAO;EAUR,0BAA0B;EAChC;;MAGI;MAKA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY"}
1
+ {"version":3,"file":"CustomCollection.d.cts","names":[],"sources":["../../src/relations/CustomCollection.ts"],"mappings":";;;;;;;;YAOY,qBAAqB,UAAU,QAAQ,UAAU;EAG3D,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,eAAe;EAC7B,OAAO,QAAQ,GAAG,OAAO;EACzB,QAAQ,QAAQ,GAAG,IAAI,KAAK,OAAO;EACnC,OAAO,QAAQ,GAAG,OAAO;EACzB,UAAU,QAAQ,GAAG,OAAO;;EAE5B,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;wBAGrC,oBAAoB,UAAU,QAAQ,UAAU,QAC9D,MAAM,qBAAqB,GAAG,KAC7B,iBAAiB,GAAG;;;;;;;;;;;;qBAiBV,iBAAiB,UAAU,QAAQ,UAAU,gBAChD,qBAAqB,YAAY,gBAC9B,WAAW,GAAG;;UAWf;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,qBAAqB,GAAG;MAKpC,gBAAgB;MAIhB,2BAA2B;MAI3B;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,iBAAiB;MAetF;EAIJ;EAIA,IAAI,QAAQ;EAgBZ,YAAY,QAAQ;EAId,KAAK,IAAI,KAAK,KAAK,QAAQ;EAY3B,SAAS,OAAO,IAAI;EAI1B,IAAI,OAAO;EASX,OAAO,OAAO;EAUR,0BAA0B;EAChC;;MAGI;MAKA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY"}
@@ -6,7 +6,7 @@ import "../index.mjs";
6
6
  import { IdOf } from "../EntityManager.mjs";
7
7
  import { Entity } from "../Entity.mjs";
8
8
  //#region src/relations/CustomCollection.d.ts
9
- type CustomCollectionOpts<T extends Entity, U extends Entity> = {
9
+ export type CustomCollectionOpts<T extends Entity, U extends Entity> = {
10
10
  load: (entity: T, opts: {
11
11
  forceReload?: boolean;
12
12
  }) => Promise<any>;
@@ -23,7 +23,7 @@ type CustomCollectionOpts<T extends Entity, U extends Entity> = {
23
23
  */
24
24
  loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;
25
25
  };
26
- declare function hasCustomCollection<T extends Entity, U extends Entity>(opts: CustomCollectionOpts<T, U>): CustomCollection<T, U>;
26
+ export declare function hasCustomCollection<T extends Entity, U extends Entity>(opts: CustomCollectionOpts<T, U>): CustomCollection<T, U>;
27
27
  /**
28
28
  * Allows user-defined collections that will work in `populate` / preload hints.
29
29
  *
@@ -35,7 +35,7 @@ declare function hasCustomCollection<T extends Entity, U extends Entity>(opts: C
35
35
  * This `CustomCollection` API is fairly low-level; users should more likely prefer higher-level
36
36
  * abstractions like `hasManyThrough`, which are built on `CustomCollection`.
37
37
  */
38
- declare class CustomCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, readonly U[]> implements Collection<T, U> {
38
+ export declare class CustomCollection<T extends Entity, U extends Entity> extends AbstractRelationImpl<T, readonly U[]> implements Collection<T, U> {
39
39
  #private;
40
40
  private opts;
41
41
  private loadPromise;
@@ -70,5 +70,4 @@ declare class CustomCollection<T extends Entity, U extends Entity> extends Abstr
70
70
  [RelationU]: U;
71
71
  }
72
72
  //#endregion
73
- export { CustomCollection, CustomCollectionOpts, hasCustomCollection };
74
73
  //# sourceMappingURL=CustomCollection.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomCollection.d.mts","names":[],"sources":["../../src/relations/CustomCollection.ts"],"mappings":";;;;;;;;KAOY,qBAAqB,UAAU,QAAQ,UAAU;EAG3D,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,eAAe;EAC7B,OAAO,QAAQ,GAAG,OAAO;EACzB,QAAQ,QAAQ,GAAG,IAAI,KAAK,OAAO;EACnC,OAAO,QAAQ,GAAG,OAAO;EACzB,UAAU,QAAQ,GAAG,OAAO;;EAE5B,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;iBAGrC,oBAAoB,UAAU,QAAQ,UAAU,QAC9D,MAAM,qBAAqB,GAAG,KAC7B,iBAAiB,GAAG;;;;;;;;;;;;cAiBV,iBAAiB,UAAU,QAAQ,UAAU,gBAChD,qBAAqB,YAAY,gBAC9B,WAAW,GAAG;;UAWf;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,qBAAqB,GAAG;MAKpC,gBAAgB;MAIhB,2BAA2B;MAI3B;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,iBAAiB;MAetF;EAIJ;EAIA,IAAI,QAAQ;EAgBZ,YAAY,QAAQ;EAId,KAAK,IAAI,KAAK,KAAK,QAAQ;EAY3B,SAAS,OAAO,IAAI;EAI1B,IAAI,OAAO;EASX,OAAO,OAAO;EAUR,0BAA0B;EAChC;;MAGI;MAKA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY"}
1
+ {"version":3,"file":"CustomCollection.d.mts","names":[],"sources":["../../src/relations/CustomCollection.ts"],"mappings":";;;;;;;;YAOY,qBAAqB,UAAU,QAAQ,UAAU;EAG3D,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,eAAe;EAC7B,OAAO,QAAQ,GAAG,OAAO;EACzB,QAAQ,QAAQ,GAAG,IAAI,KAAK,OAAO;EACnC,OAAO,QAAQ,GAAG,OAAO;EACzB,UAAU,QAAQ,GAAG,OAAO;;EAE5B,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;wBAGrC,oBAAoB,UAAU,QAAQ,UAAU,QAC9D,MAAM,qBAAqB,GAAG,KAC7B,iBAAiB,GAAG;;;;;;;;;;;;qBAiBV,iBAAiB,UAAU,QAAQ,UAAU,gBAChD,qBAAqB,YAAY,gBAC9B,WAAW,GAAG;;UAWf;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,qBAAqB,GAAG;MAKpC,gBAAgB;MAIhB,2BAA2B;MAI3B;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,iBAAiB;MAetF;EAIJ;EAIA,IAAI,QAAQ;EAgBZ,YAAY,QAAQ;EAId,KAAK,IAAI,KAAK,KAAK,QAAQ;EAY3B,SAAS,OAAO,IAAI;EAI1B,IAAI,OAAO;EASX,OAAO,OAAO;EAUR,0BAA0B;EAChC;;MAGI;MAKA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"CustomCollection.js","names":["#isLoaded","#loadHint","#hasBeenSet"],"sources":["../../src/relations/CustomCollection.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type Collection, type LoadHint, ensureNotDeleted, fail } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport type CustomCollectionOpts<T extends Entity, U extends Entity> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<any>;\n get: (entity: T) => readonly U[];\n set?: (entity: T, other: U[]) => void;\n find?: (entity: T, id: IdOf<U>) => U | undefined;\n add?: (entity: T, other: U) => void;\n remove?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this collection. Currently\n * only used by em.importEntity and can be omitted if the collection isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\nexport function hasCustomCollection<T extends Entity, U extends Entity>(\n opts: CustomCollectionOpts<T, U>,\n): CustomCollection<T, U> {\n return lazyField((entity: T) => {\n return new CustomCollection<T, U>(entity, opts);\n });\n}\n\n/**\n * Allows user-defined collections that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomCollection` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasManyThrough`, which are built on `CustomCollection`.\n */\nexport class CustomCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, readonly U[]>\n implements Collection<T, U>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the values can become stale; we want to each `.get` call to repeatedly evaluate the latest values.\n private loadPromise: Promise<any> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined = undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomCollectionOpts<T, U>,\n ) {\n super(entity);\n }\n\n get get(): readonly U[] {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): readonly U[] {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n set(values: U[]): void {\n this.ensureNewOrLoaded();\n const { set, add, remove } = this.opts;\n if (set !== undefined) {\n set(this.entity, values);\n this.#hasBeenSet = true;\n } else if (add !== undefined && remove !== undefined) {\n const current = this.get;\n current.filter((value) => !values.includes(value)).forEach((value) => this.remove(value));\n values.filter((value) => !current.includes(value)).forEach((value) => this.add(value));\n this.#hasBeenSet = true;\n } else {\n fail(`'set' not implemented and not inferrable from 'add'/'remove' on ${this}`);\n }\n }\n\n setFromOpts(values: U[]): void {\n this.set(values);\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n if (!this.isLoaded) {\n await this.load();\n }\n const { find } = this.opts;\n if (find === undefined) {\n return this.doGet().find((other) => other.id === id);\n } else {\n return find(this.entity, id);\n }\n }\n\n async includes(other: U): Promise<boolean> {\n throw new Error(\"Not implemented\");\n }\n\n add(other: U): void {\n this.ensureNewOrLoaded();\n const { add } = this.opts;\n if (add === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n add(this.entity, other);\n }\n\n remove(other: U): void {\n this.ensureNewOrLoaded();\n const { remove } = this.opts;\n if (remove === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n remove(this.entity, other);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomCollections field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n // Something about running with the transformations breaks the `[0][0]` and it can NPE\n return Object.entries(this.entity).filter((e) => e[1] === this)[0]?.[0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomCollection(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): readonly U[] {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entities: readonly U[], opts?: { withDeleted?: boolean }): readonly U[] {\n return entities.filter((entity) => opts?.withDeleted === true || !entity.isDeletedEntity);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":";;;;;;;;AAyBA,SAAgB,oBACd,MACwB;CACxB,OAAO,WAAW,WAAc;EAC9B,OAAO,IAAI,iBAAuB,QAAQ,IAAI;CAChD,CAAC;AACH;;;;;;;;;;;;AAaA,IAAa,mBAAb,cACU,qBAEV;CAUY;CAPV;CACA,cAAc;CACd,YAAiC,KAAA;CACjC;CAEA,YACE,QACA,MACA;EACA,MAAM,MAAM;EAFJ,KAAA,OAAA;CAGV;CAEA,IAAI,MAAoB;EACtB,OAAO,KAAK,MAAM,EAAE,aAAa,MAAM,CAAC;CAC1C;CAEA,IAAI,iBAA+B;EACjC,OAAO,KAAK,MAAM,EAAE,aAAa,KAAK,CAAC;CACzC;CAEA,IAAI,WAAoB;EACtB,IAAI,KAAKA,cAAc,KAAA,GAAW,OAAO,KAAKA;EAC9C,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,cAAc,SAAS,IAAI;EAC5D,KAAKA,YAAY,KAAK,KAAK,SAAS,KAAK,MAAM;EAC/C,OAAO,KAAKA;CACd;CAEA,gBAAsB;EACpB,KAAKA,YAAY,KAAA;CACnB;CAEA,IAAI,WAAoC;EACtC,IAAI,KAAKC,cAAc,KAAA,KAAa,KAAK,KAAK,aAAa,KAAA,GAAW;GACpE,MAAM,EAAE,aAAa,KAAK;GAC1B,KAAKA,YAAY,OAAO,aAAa,aAAa,SAAS,KAAK,MAAM,IAAI;EAC5E;EACA,OAAO,KAAKA;CACd;CAEA,MAAM,KAAK,OAAyD,CAAC,GAA0B;EAC7F,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,YAAY,KAAK,aAAa;GACtC,IAAI,KAAK,gBAAgB,KAAA,GAAW;IAClC,KAAK,cAAc,KAAK,KAAK,KAAK,KAAK,QAAQ,IAAI;IACnD,MAAM,KAAK;IACX,KAAK,cAAc,KAAA;IACnB,KAAKD,YAAY;GACnB,OACE,MAAM,KAAK;EAEf;EACA,OAAO,KAAK,MAAM,IAAI;CACxB;CAEA,IAAI,cAAuB;EACzB,OAAO;CACT;CAEA,UAAgB;EACd,MAAM,IAAI,MAAM,iBAAiB;CACnC;CAEA,IAAI,QAAmB;EACrB,KAAK,kBAAkB;EACvB,MAAM,EAAE,KAAK,KAAK,WAAW,KAAK;EAClC,IAAI,QAAQ,KAAA,GAAW;GACrB,IAAI,KAAK,QAAQ,MAAM;GACvB,KAAKE,cAAc;EACrB,OAAO,IAAI,QAAQ,KAAA,KAAa,WAAW,KAAA,GAAW;GACpD,MAAM,UAAU,KAAK;GACrB,QAAQ,QAAQ,UAAU,CAAC,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,SAAS,UAAU,KAAK,OAAO,KAAK,CAAC;GACxF,OAAO,QAAQ,UAAU,CAAC,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,SAAS,UAAU,KAAK,IAAI,KAAK,CAAC;GACrF,KAAKA,cAAc;EACrB,OACE,KAAK,mEAAmE,MAAM;CAElF;CAEA,YAAY,QAAmB;EAC7B,KAAK,IAAI,MAAM;CACjB;CAEA,MAAM,KAAK,IAAqC;EAC9C,IAAI,CAAC,KAAK,UACR,MAAM,KAAK,KAAK;EAElB,MAAM,EAAE,SAAS,KAAK;EACtB,IAAI,SAAS,KAAA,GACX,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM,UAAU,MAAM,OAAO,EAAE;OAEnD,OAAO,KAAK,KAAK,QAAQ,EAAE;CAE/B;CAEA,MAAM,SAAS,OAA4B;EACzC,MAAM,IAAI,MAAM,iBAAiB;CACnC;CAEA,IAAI,OAAgB;EAClB,KAAK,kBAAkB;EACvB,MAAM,EAAE,QAAQ,KAAK;EACrB,IAAI,QAAQ,KAAA,GACV,KAAK,4BAA4B,MAAM;EAEzC,IAAI,KAAK,QAAQ,KAAK;CACxB;CAEA,OAAO,OAAgB;EACrB,KAAK,kBAAkB;EACvB,MAAM,EAAE,WAAW,KAAK;EACxB,IAAI,WAAW,KAAA,GACb,KAAK,4BAA4B,MAAM;EAEzC,OAAO,KAAK,QAAQ,KAAK;CAC3B;CAGA,MAAM,yBAAwC,CAAC;CAC/C,qBAA2B,CAAC;;CAG5B,IAAI,YAAoB;EAEtB,OAAO,OAAO,QAAQ,KAAK,MAAM,CAAC,CAAC,QAAQ,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,GAAG;CACvE;CAEA,IAAI,aAAa;EACf,OAAO,KAAKA;CACd;CAEA,WAAmB;EACjB,OAAO,4BAA4B,KAAK,OAAO,eAAe,KAAK,UAAU;CAC/E;CAEA,MAAc,MAAgD;EAC5D,iBAAiB,KAAK,QAAQ,SAAS;EACvC,KAAK,kBAAkB;EACvB,OAAO,KAAK,cAAc,KAAK,KAAK,IAAI,KAAK,MAAM,GAAG,IAAI;CAC5D;CAEA,cAAsB,UAAwB,MAAgD;EAC5F,OAAO,SAAS,QAAQ,WAAW,MAAM,gBAAgB,QAAQ,CAAC,OAAO,eAAe;CAC1F;CAEA,oBAA4B;EAE1B,IAAI,KAAK,UACP;EAEF,KAAK,GAAG,KAAK,OAAO,GAAG,KAAK,UAAU,gBAAgB;CACxD;CAEA,CAAC,aAAgB;CACjB,CAAC,aAAgB;AACnB"}
1
+ {"version":3,"file":"CustomCollection.js","names":[],"sources":["../../src/relations/CustomCollection.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type Collection, type LoadHint, ensureNotDeleted, fail } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport type CustomCollectionOpts<T extends Entity, U extends Entity> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<any>;\n get: (entity: T) => readonly U[];\n set?: (entity: T, other: U[]) => void;\n find?: (entity: T, id: IdOf<U>) => U | undefined;\n add?: (entity: T, other: U) => void;\n remove?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this collection. Currently\n * only used by em.importEntity and can be omitted if the collection isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\nexport function hasCustomCollection<T extends Entity, U extends Entity>(\n opts: CustomCollectionOpts<T, U>,\n): CustomCollection<T, U> {\n return lazyField((entity: T) => {\n return new CustomCollection<T, U>(entity, opts);\n });\n}\n\n/**\n * Allows user-defined collections that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomCollection` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasManyThrough`, which are built on `CustomCollection`.\n */\nexport class CustomCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, readonly U[]>\n implements Collection<T, U>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the values can become stale; we want to each `.get` call to repeatedly evaluate the latest values.\n private loadPromise: Promise<any> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined = undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomCollectionOpts<T, U>,\n ) {\n super(entity);\n }\n\n get get(): readonly U[] {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): readonly U[] {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n set(values: U[]): void {\n this.ensureNewOrLoaded();\n const { set, add, remove } = this.opts;\n if (set !== undefined) {\n set(this.entity, values);\n this.#hasBeenSet = true;\n } else if (add !== undefined && remove !== undefined) {\n const current = this.get;\n current.filter((value) => !values.includes(value)).forEach((value) => this.remove(value));\n values.filter((value) => !current.includes(value)).forEach((value) => this.add(value));\n this.#hasBeenSet = true;\n } else {\n fail(`'set' not implemented and not inferrable from 'add'/'remove' on ${this}`);\n }\n }\n\n setFromOpts(values: U[]): void {\n this.set(values);\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n if (!this.isLoaded) {\n await this.load();\n }\n const { find } = this.opts;\n if (find === undefined) {\n return this.doGet().find((other) => other.id === id);\n } else {\n return find(this.entity, id);\n }\n }\n\n async includes(other: U): Promise<boolean> {\n throw new Error(\"Not implemented\");\n }\n\n add(other: U): void {\n this.ensureNewOrLoaded();\n const { add } = this.opts;\n if (add === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n add(this.entity, other);\n }\n\n remove(other: U): void {\n this.ensureNewOrLoaded();\n const { remove } = this.opts;\n if (remove === undefined) {\n fail(`'add' not implemented on ${this}`);\n }\n remove(this.entity, other);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomCollections field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n // Something about running with the transformations breaks the `[0][0]` and it can NPE\n return Object.entries(this.entity).filter((e) => e[1] === this)[0]?.[0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomCollection(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): readonly U[] {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entities: readonly U[], opts?: { withDeleted?: boolean }): readonly U[] {\n return entities.filter((entity) => opts?.withDeleted === true || !entity.isDeletedEntity);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CustomReference.cjs","names":["lazyField","AbstractRelationImpl","#isLoaded","#loadHint","fail","#hasBeenSet","getProperties","getMetadata","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/CustomReference.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type LoadHint, type Reference, ensureNotDeleted, fail, getMetadata, getProperties } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\n/** An alias for creating `CustomReference`s. */\nexport function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(\n opts: CustomReferenceOpts<T, U, N>,\n): CustomReference<T, U, N> {\n return lazyField((entity: T) => {\n return new CustomReference<T, U, N>(entity, opts);\n });\n}\n\nexport type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<unknown>;\n get: (entity: T) => U | N;\n set?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this reference. Currently\n * only used by em.importEntity and can be omitted if the reference isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\n/**\n * Allows user-defined references that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomReference` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasOneThrough`, which are built on `CustomReference.\n */\nexport class CustomReference<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements Reference<T, U, N>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the value can become stale; we want to each `.get` call to repeatedly evaluate the latest value.\n private loadPromise: Promise<unknown> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomReferenceOpts<T, U, N>,\n ) {\n super(entity);\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n get id(): IdOf<U> {\n return fail(`CustomReference cannot resolve 'id'`);\n }\n\n get idMaybe(): IdOf<U> | undefined {\n return fail(`CustomReference cannot resolve 'idMaybe'`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n return fail(`CustomReference cannot resolve 'idTaggedMaybe'`);\n }\n\n get idUntagged(): string {\n return fail(`CustomReference cannot resolve 'idUntagged'`);\n }\n\n get idUntaggedMaybe(): string | undefined {\n return fail(`CustomReference cannot resolve 'idUntaggedMaybe'`);\n }\n\n get isSet(): boolean {\n this.ensureNewOrLoaded();\n const { get } = this.opts;\n return get(this.entity) !== undefined;\n }\n\n set(value: U): void {\n // We allow setting CustomReferences on new entities w/o being loaded\n if (!this.entity.isNewEntity) {\n this.ensureNewOrLoaded();\n }\n const { set } = this.opts;\n if (set === undefined) {\n throw new Error(`'set' not implemented on ${this}`);\n }\n set(this.entity, value);\n this.#hasBeenSet = true;\n }\n\n setFromOpts(value: U): void {\n this.set(value);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomReferences field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n return Object.entries(getProperties(getMetadata(this.entity))).filter(\n ([key]) => (this.entity as any)[key] === this,\n )[0][0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomReference(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CustomReference.cjs","names":["lazyField","AbstractRelationImpl","fail","getProperties","getMetadata","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/CustomReference.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type LoadHint, type Reference, ensureNotDeleted, fail, getMetadata, getProperties } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\n/** An alias for creating `CustomReference`s. */\nexport function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(\n opts: CustomReferenceOpts<T, U, N>,\n): CustomReference<T, U, N> {\n return lazyField((entity: T) => {\n return new CustomReference<T, U, N>(entity, opts);\n });\n}\n\nexport type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<unknown>;\n get: (entity: T) => U | N;\n set?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this reference. Currently\n * only used by em.importEntity and can be omitted if the reference isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\n/**\n * Allows user-defined references that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomReference` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasOneThrough`, which are built on `CustomReference.\n */\nexport class CustomReference<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements Reference<T, U, N>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the value can become stale; we want to each `.get` call to repeatedly evaluate the latest value.\n private loadPromise: Promise<unknown> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomReferenceOpts<T, U, N>,\n ) {\n super(entity);\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n get id(): IdOf<U> {\n return fail(`CustomReference cannot resolve 'id'`);\n }\n\n get idMaybe(): IdOf<U> | undefined {\n return fail(`CustomReference cannot resolve 'idMaybe'`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n return fail(`CustomReference cannot resolve 'idTaggedMaybe'`);\n }\n\n get idUntagged(): string {\n return fail(`CustomReference cannot resolve 'idUntagged'`);\n }\n\n get idUntaggedMaybe(): string | undefined {\n return fail(`CustomReference cannot resolve 'idUntaggedMaybe'`);\n }\n\n get isSet(): boolean {\n this.ensureNewOrLoaded();\n const { get } = this.opts;\n return get(this.entity) !== undefined;\n }\n\n set(value: U): void {\n // We allow setting CustomReferences on new entities w/o being loaded\n if (!this.entity.isNewEntity) {\n this.ensureNewOrLoaded();\n }\n const { set } = this.opts;\n if (set === undefined) {\n throw new Error(`'set' not implemented on ${this}`);\n }\n set(this.entity, value);\n this.#hasBeenSet = true;\n }\n\n setFromOpts(value: U): void {\n this.set(value);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomReferences field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n return Object.entries(getProperties(getMetadata(this.entity))).filter(\n ([key]) => (this.entity as any)[key] === this,\n )[0][0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomReference(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
@@ -8,8 +8,8 @@ import { IdOf, TaggedId } from "../EntityManager.cjs";
8
8
  import { Entity } from "../Entity.cjs";
9
9
  //#region src/relations/CustomReference.d.ts
10
10
  /** An alias for creating `CustomReference`s. */
11
- declare function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(opts: CustomReferenceOpts<T, U, N>): CustomReference<T, U, N>;
12
- type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {
11
+ export declare function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(opts: CustomReferenceOpts<T, U, N>): CustomReference<T, U, N>;
12
+ export type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {
13
13
  load: (entity: T, opts: {
14
14
  forceReload?: boolean;
15
15
  }) => Promise<unknown>;
@@ -34,7 +34,7 @@ type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | u
34
34
  * This `CustomReference` API is fairly low-level; users should more likely prefer higher-level
35
35
  * abstractions like `hasOneThrough`, which are built on `CustomReference.
36
36
  */
37
- declare class CustomReference<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements Reference<T, U, N> {
37
+ export declare class CustomReference<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements Reference<T, U, N> {
38
38
  #private;
39
39
  private opts;
40
40
  private loadPromise;
@@ -72,5 +72,4 @@ declare class CustomReference<T extends Entity, U extends Entity, N extends neve
72
72
  [ReferenceN]: N;
73
73
  }
74
74
  //#endregion
75
- export { CustomReference, CustomReferenceOpts, hasCustomReference };
76
75
  //# sourceMappingURL=CustomReference.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomReference.d.cts","names":[],"sources":["../../src/relations/CustomReference.ts"],"mappings":";;;;;;;;;;iBASgB,mBAAmB,UAAU,QAAQ,UAAU,QAAQ,6BACrE,MAAM,oBAAoB,GAAG,GAAG,KAC/B,gBAAgB,GAAG,GAAG;KAMb,oBAAoB,UAAU,QAAQ,UAAU,QAAQ;EAGlE,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,MAAM,IAAI;EACxB,OAAO,QAAQ,GAAG,OAAO;;EAEzB,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;;;;;;;;;;;;cAcxC,gBAAgB,UAAU,QAAQ,UAAU,QAAQ,qCACvD,qBAAqB,GAAG,cACrB,UAAU,GAAG,GAAG;;UAWjB;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,oBAAoB,GAAG,GAAG;MAKtC,OAAO,IAAI;MAIX,kBAAkB,IAAI;MAItB;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,QAAQ,IAAI;MAejF;EAIJ;MAII,MAAM,KAAK;MAIX,WAAW,KAAK;MAIhB,iBAAiB;MAIjB;MAIA;MAIA;EAMJ,IAAI,OAAO;EAaX,YAAY,OAAO;EAKb,0BAA0B;EAChC;;MAGI;MAMA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY;GACZ,aAAa"}
1
+ {"version":3,"file":"CustomReference.d.cts","names":[],"sources":["../../src/relations/CustomReference.ts"],"mappings":";;;;;;;;;;wBASgB,mBAAmB,UAAU,QAAQ,UAAU,QAAQ,6BACrE,MAAM,oBAAoB,GAAG,GAAG,KAC/B,gBAAgB,GAAG,GAAG;YAMb,oBAAoB,UAAU,QAAQ,UAAU,QAAQ;EAGlE,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,MAAM,IAAI;EACxB,OAAO,QAAQ,GAAG,OAAO;;EAEzB,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;;;;;;;;;;;;qBAcxC,gBAAgB,UAAU,QAAQ,UAAU,QAAQ,qCACvD,qBAAqB,GAAG,cACrB,UAAU,GAAG,GAAG;;UAWjB;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,oBAAoB,GAAG,GAAG;MAKtC,OAAO,IAAI;MAIX,kBAAkB,IAAI;MAItB;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,QAAQ,IAAI;MAejF;EAIJ;MAII,MAAM,KAAK;MAIX,WAAW,KAAK;MAIhB,iBAAiB;MAIjB;MAIA;MAIA;EAMJ,IAAI,OAAO;EAaX,YAAY,OAAO;EAKb,0BAA0B;EAChC;;MAGI;MAMA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY;GACZ,aAAa"}
@@ -8,8 +8,8 @@ import { IdOf, TaggedId } from "../EntityManager.mjs";
8
8
  import { Entity } from "../Entity.mjs";
9
9
  //#region src/relations/CustomReference.d.ts
10
10
  /** An alias for creating `CustomReference`s. */
11
- declare function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(opts: CustomReferenceOpts<T, U, N>): CustomReference<T, U, N>;
12
- type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {
11
+ export declare function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(opts: CustomReferenceOpts<T, U, N>): CustomReference<T, U, N>;
12
+ export type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {
13
13
  load: (entity: T, opts: {
14
14
  forceReload?: boolean;
15
15
  }) => Promise<unknown>;
@@ -34,7 +34,7 @@ type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | u
34
34
  * This `CustomReference` API is fairly low-level; users should more likely prefer higher-level
35
35
  * abstractions like `hasOneThrough`, which are built on `CustomReference.
36
36
  */
37
- declare class CustomReference<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements Reference<T, U, N> {
37
+ export declare class CustomReference<T extends Entity, U extends Entity, N extends never | undefined> extends AbstractRelationImpl<T, U> implements Reference<T, U, N> {
38
38
  #private;
39
39
  private opts;
40
40
  private loadPromise;
@@ -72,5 +72,4 @@ declare class CustomReference<T extends Entity, U extends Entity, N extends neve
72
72
  [ReferenceN]: N;
73
73
  }
74
74
  //#endregion
75
- export { CustomReference, CustomReferenceOpts, hasCustomReference };
76
75
  //# sourceMappingURL=CustomReference.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomReference.d.mts","names":[],"sources":["../../src/relations/CustomReference.ts"],"mappings":";;;;;;;;;;iBASgB,mBAAmB,UAAU,QAAQ,UAAU,QAAQ,6BACrE,MAAM,oBAAoB,GAAG,GAAG,KAC/B,gBAAgB,GAAG,GAAG;KAMb,oBAAoB,UAAU,QAAQ,UAAU,QAAQ;EAGlE,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,MAAM,IAAI;EACxB,OAAO,QAAQ,GAAG,OAAO;;EAEzB,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;;;;;;;;;;;;cAcxC,gBAAgB,UAAU,QAAQ,UAAU,QAAQ,qCACvD,qBAAqB,GAAG,cACrB,UAAU,GAAG,GAAG;;UAWjB;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,oBAAoB,GAAG,GAAG;MAKtC,OAAO,IAAI;MAIX,kBAAkB,IAAI;MAItB;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,QAAQ,IAAI;MAejF;EAIJ;MAII,MAAM,KAAK;MAIX,WAAW,KAAK;MAIhB,iBAAiB;MAIjB;MAIA;MAIA;EAMJ,IAAI,OAAO;EAaX,YAAY,OAAO;EAKb,0BAA0B;EAChC;;MAGI;MAMA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY;GACZ,aAAa"}
1
+ {"version":3,"file":"CustomReference.d.mts","names":[],"sources":["../../src/relations/CustomReference.ts"],"mappings":";;;;;;;;;;wBASgB,mBAAmB,UAAU,QAAQ,UAAU,QAAQ,6BACrE,MAAM,oBAAoB,GAAG,GAAG,KAC/B,gBAAgB,GAAG,GAAG;YAMb,oBAAoB,UAAU,QAAQ,UAAU,QAAQ;EAGlE,OAAO,QAAQ,GAAG;IAAQ;QAA4B;EACtD,MAAM,QAAQ,MAAM,IAAI;EACxB,OAAO,QAAQ,GAAG,OAAO;;EAEzB,WAAW,QAAQ;;;;;EAKnB,aAAa,QAAQ,MAAM,SAAS,MAAM,SAAS;;;;;;;;;;;;;qBAcxC,gBAAgB,UAAU,QAAQ,UAAU,QAAQ,qCACvD,qBAAqB,GAAG,cACrB,UAAU,GAAG,GAAG;;UAWjB;UAPF;EAKR,YACE,QAAQ,GACA,MAAM,oBAAoB,GAAG,GAAG;MAKtC,OAAO,IAAI;MAIX,kBAAkB,IAAI;MAItB;EAOJ;MAII,YAAY,SAAS;EAQnB,KAAK;IAAQ;IAAuB;MAA+B,QAAQ,IAAI;MAejF;EAIJ;MAII,MAAM,KAAK;MAIX,WAAW,KAAK;MAIhB,iBAAiB;MAIjB;MAIA;MAIA;EAMJ,IAAI,OAAO;EAaX,YAAY,OAAO;EAKb,0BAA0B;EAChC;;MAGI;MAMA;EAIJ;UAIQ;UAMA;UAIA;GAQP,YAAY;GACZ,YAAY;GACZ,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"CustomReference.js","names":["#isLoaded","#loadHint","#hasBeenSet"],"sources":["../../src/relations/CustomReference.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type LoadHint, type Reference, ensureNotDeleted, fail, getMetadata, getProperties } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\n/** An alias for creating `CustomReference`s. */\nexport function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(\n opts: CustomReferenceOpts<T, U, N>,\n): CustomReference<T, U, N> {\n return lazyField((entity: T) => {\n return new CustomReference<T, U, N>(entity, opts);\n });\n}\n\nexport type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<unknown>;\n get: (entity: T) => U | N;\n set?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this reference. Currently\n * only used by em.importEntity and can be omitted if the reference isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\n/**\n * Allows user-defined references that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomReference` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasOneThrough`, which are built on `CustomReference.\n */\nexport class CustomReference<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements Reference<T, U, N>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the value can become stale; we want to each `.get` call to repeatedly evaluate the latest value.\n private loadPromise: Promise<unknown> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomReferenceOpts<T, U, N>,\n ) {\n super(entity);\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n get id(): IdOf<U> {\n return fail(`CustomReference cannot resolve 'id'`);\n }\n\n get idMaybe(): IdOf<U> | undefined {\n return fail(`CustomReference cannot resolve 'idMaybe'`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n return fail(`CustomReference cannot resolve 'idTaggedMaybe'`);\n }\n\n get idUntagged(): string {\n return fail(`CustomReference cannot resolve 'idUntagged'`);\n }\n\n get idUntaggedMaybe(): string | undefined {\n return fail(`CustomReference cannot resolve 'idUntaggedMaybe'`);\n }\n\n get isSet(): boolean {\n this.ensureNewOrLoaded();\n const { get } = this.opts;\n return get(this.entity) !== undefined;\n }\n\n set(value: U): void {\n // We allow setting CustomReferences on new entities w/o being loaded\n if (!this.entity.isNewEntity) {\n this.ensureNewOrLoaded();\n }\n const { set } = this.opts;\n if (set === undefined) {\n throw new Error(`'set' not implemented on ${this}`);\n }\n set(this.entity, value);\n this.#hasBeenSet = true;\n }\n\n setFromOpts(value: U): void {\n this.set(value);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomReferences field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n return Object.entries(getProperties(getMetadata(this.entity))).filter(\n ([key]) => (this.entity as any)[key] === this,\n )[0][0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomReference(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CustomReference.js","names":[],"sources":["../../src/relations/CustomReference.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, getEmInternalApi } from \"src/EntityManager.ts\";\nimport { type LoadHint, type Reference, ensureNotDeleted, fail, getMetadata, getProperties } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\n/** An alias for creating `CustomReference`s. */\nexport function hasCustomReference<T extends Entity, U extends Entity, N extends never | undefined>(\n opts: CustomReferenceOpts<T, U, N>,\n): CustomReference<T, U, N> {\n return lazyField((entity: T) => {\n return new CustomReference<T, U, N>(entity, opts);\n });\n}\n\nexport type CustomReferenceOpts<T extends Entity, U extends Entity, N extends never | undefined> = {\n // We purposefully don't capture the return value of `load` b/c we want `get` to re-calc from `entity`\n // each time it's invoked so that it reflects any changed values.\n load: (entity: T, opts: { forceReload?: boolean }) => Promise<unknown>;\n get: (entity: T) => U | N;\n set?: (entity: T, other: U) => void;\n /** Whether the reference is loaded, even w/o an explicit `.load` call, i.e. for DeepNew test instances. */\n isLoaded: (entity: T) => boolean;\n /**\n * A load hint that can be used to speculatively traverse the dependencies of this reference. Currently\n * only used by em.importEntity and can be omitted if the reference isn't used with it.\n */\n loadHint?: ((entity: T) => LoadHint<T>) | LoadHint<T>;\n};\n\n/**\n * Allows user-defined references that will work in `populate` / preload hints.\n *\n * This works because Joist's `populate`/preloading is not based on creating giant SQL joins,\n * but instead by just walking \"1 dataloader per level\". Given this, we don't really care\n * what happens at each \"level\" of resolution, as long as: a) it's a promise, and b) the\n * caller uses dataloader to be batch friendly.\n *\n * This `CustomReference` API is fairly low-level; users should more likely prefer higher-level\n * abstractions like `hasOneThrough`, which are built on `CustomReference.\n */\nexport class CustomReference<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements Reference<T, U, N>\n{\n // We keep both a promise+loaded flag and not an actual `this.loaded = await load` because\n // the value can become stale; we want to each `.get` call to repeatedly evaluate the latest value.\n private loadPromise: Promise<unknown> | undefined;\n #hasBeenSet = false;\n #isLoaded: boolean | undefined;\n #loadHint: LoadHint<T> | undefined;\n\n constructor(\n entity: T,\n private opts: CustomReferenceOpts<T, U, N>,\n ) {\n super(entity);\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get isLoaded(): boolean {\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n this.#isLoaded = this.opts.isLoaded(this.entity);\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n }\n\n get loadHint(): LoadHint<T> | undefined {\n if (this.#loadHint === undefined && this.opts.loadHint !== undefined) {\n const { loadHint } = this.opts;\n this.#loadHint = typeof loadHint === \"function\" ? loadHint(this.entity) : loadHint;\n }\n return this.#loadHint;\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded || opts.forceReload) {\n if (this.loadPromise === undefined) {\n this.loadPromise = this.opts.load(this.entity, opts);\n await this.loadPromise;\n this.loadPromise = undefined;\n this.#isLoaded = true;\n } else {\n await this.loadPromise;\n }\n }\n return this.doGet(opts);\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Not implemented\");\n }\n\n get id(): IdOf<U> {\n return fail(`CustomReference cannot resolve 'id'`);\n }\n\n get idMaybe(): IdOf<U> | undefined {\n return fail(`CustomReference cannot resolve 'idMaybe'`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n return fail(`CustomReference cannot resolve 'idTaggedMaybe'`);\n }\n\n get idUntagged(): string {\n return fail(`CustomReference cannot resolve 'idUntagged'`);\n }\n\n get idUntaggedMaybe(): string | undefined {\n return fail(`CustomReference cannot resolve 'idUntaggedMaybe'`);\n }\n\n get isSet(): boolean {\n this.ensureNewOrLoaded();\n const { get } = this.opts;\n return get(this.entity) !== undefined;\n }\n\n set(value: U): void {\n // We allow setting CustomReferences on new entities w/o being loaded\n if (!this.entity.isNewEntity) {\n this.ensureNewOrLoaded();\n }\n const { set } = this.opts;\n if (set === undefined) {\n throw new Error(`'set' not implemented on ${this}`);\n }\n set(this.entity, value);\n this.#hasBeenSet = true;\n }\n\n setFromOpts(value: U): void {\n this.set(value);\n }\n\n // these callbacks should be no-ops as they ought to be handled by the underlying relations\n async cleanupOnEntityDeleted(): Promise<void> {}\n maybeCascadeDelete(): void {}\n\n /** Finds this CustomReferences field name by looking in the entity for the key that we're assigned to. */\n get fieldName(): string {\n return Object.entries(getProperties(getMetadata(this.entity))).filter(\n ([key]) => (this.entity as any)[key] === this,\n )[0][0];\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `CustomReference(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n this.ensureNewOrLoaded();\n return this.filterDeleted(this.opts.get(this.entity), opts);\n }\n\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : (undefined as N);\n }\n\n private ensureNewOrLoaded() {\n // This should only be callable in the type system if we've already resolved this to an instance\n if (this.isLoaded) {\n return;\n }\n fail(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EnumCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","#loaded","getInstanceData","#getPreloaded","#loadPromise","enumCollectionBatchLoader","appendStack","#pendingSet","#applySet","#joinRows","#idOf","#hasBeenSet","#codesFor","getEmInternalApi","getMetadataForField","RelationT","RelationU"],"sources":["../../src/relations/EnumCollection.ts"],"sourcesContent":["import { enumCollectionBatchLoader } from \"src/batchloaders/enumCollectionBatchLoader.ts\";\nimport { type EnumMetadata } from \"src/EnumMetadata.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyEnumField,\n type ManyToManyLike,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** A nominal brand so `EnumCollection` is not structurally confused with a regular `Collection`. */\ndeclare const enumCollectionTag: unique symbol;\n\n/**\n * A collection of enum codes `E` within `T`, backed by a m2m join table to an enum \"table\".\n *\n * To the user it looks like an array of enum codes (e.g. `Color[]`), but unlike an enum-array\n * column it is lazy and so needs a load hint, like any other relation.\n */\nexport interface EnumCollection<T extends Entity, E> {\n [enumCollectionTag]: true;\n [RelationT]: T;\n [RelationU]: E;\n\n load(opts?: { forceReload?: boolean }): Promise<ReadonlyArray<E>>;\n\n add(code: E): void;\n\n remove(code: E): void;\n\n /**\n * Sets the collection to `codes`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(codes: readonly E[]): void;\n\n includes(code: E): Promise<boolean>;\n\n readonly isLoaded: boolean;\n readonly entity: Entity;\n readonly hasBeenSet: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {\n get: ReadonlyArray<E>;\n\n removeAll(): void;\n}\n\n/** An alias for creating `EnumCollection`s. */\nexport function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as ManyToManyEnumField;\n return new EnumCollectionImpl<T, E>(entity, field);\n });\n}\n\nexport class EnumCollectionImpl<T extends Entity, E>\n extends AbstractRelationImpl<T, E[]>\n implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike\n{\n readonly #field: ManyToManyEnumField;\n #loaded: boolean;\n #loadPromise: any;\n #hasBeenSet = false;\n /** Holds a pending `set()` when called on an unloaded collection, resolved at load. */\n #pendingSet: E[] | undefined;\n\n constructor(entity: T, field: ManyToManyEnumField) {\n super(entity);\n this.#field = field;\n this.#loaded = getInstanceData(entity).isOrWasNew;\n }\n\n async load(opts: { forceReload?: boolean } = {}): Promise<ReadonlyArray<E>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded || (opts.forceReload && !this.entity.isNewEntity)) {\n if (this.#getPreloaded() !== undefined) {\n this.#loaded = true;\n } else {\n await (this.#loadPromise ??= enumCollectionBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => {\n this.#loaded = true;\n })\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n if (this.#pendingSet) {\n const pending = this.#pendingSet;\n this.#pendingSet = undefined;\n this.#applySet(pending);\n }\n }\n return this.get;\n }\n\n add(code: E): void {\n ensureNotDeleted(this.entity);\n if (this.#pendingSet) {\n if (!this.#pendingSet.includes(code)) this.#pendingSet.push(code);\n return;\n }\n if (this.#loaded && this.get.includes(code)) return;\n this.#joinRows.addNew(this, this.entity, this.#idOf(code));\n }\n\n remove(code: E): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) {\n remove(this.#pendingSet, code);\n return;\n }\n this.#joinRows.addRemove(this, this.entity, this.#idOf(code));\n }\n\n set(codes: readonly E[]): void {\n ensureNotDeleted(this.entity);\n this.#hasBeenSet = true;\n if (!this.#loaded) {\n this.#pendingSet = [...codes];\n getEmInternalApi(this.entity.em).pendingLoads.add(this as any);\n return;\n }\n this.#applySet(codes);\n }\n\n async includes(code: E): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) return this.#pendingSet.includes(code);\n if (this.#loaded) return this.get.includes(code);\n if (this.entity.isNewEntity) return false;\n await this.load();\n return this.get.includes(code);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#loaded) throw new Error(\"removeAll was called when not loaded\");\n for (const code of [...this.get]) this.remove(code);\n }\n\n get get(): E[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded) {\n throw new Error(`${this.entity}.${this.fieldName}.get was called when not loaded`);\n }\n return this.#codesFor(this.entity);\n }\n\n get isLoaded(): boolean {\n return this.#loaded;\n }\n\n get isPreloaded(): boolean {\n return this.#getPreloaded() !== undefined;\n }\n\n preload(): void {\n if (this.#getPreloaded() !== undefined) this.#loaded = true;\n }\n\n setFromOpts(codes: E[]): void {\n this.#loaded = true;\n for (const code of codes ?? []) this.add(code);\n }\n\n /**\n * Mirrors `other`'s codes into us for `em.fork`/`importEntity`.\n *\n * Enum codes have no entity identity to remap, and we copy them as already-persisted rows (not\n * pending adds) so the receiving em doesn't think it has spurious inserts to flush.\n */\n import(other: EnumCollectionImpl<T, E>): void {\n if (!other.isLoaded) return;\n this.#loaded = true;\n for (const code of other.get) {\n this.#joinRows.addPreloadedRow(this, undefined, this.entity, this.#idOf(code));\n }\n }\n\n maybeCascadeDelete(): void {\n // The join table FK cascades on the db side, so there's nothing to cascade in memory.\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // The db cascade-deletes our join rows, so just drop any pending in-memory changes for us.\n this.#joinRows.removeAllFor(this.columnName, this.entity);\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `EnumCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, enum: ${this.#field.enumDetailType.name})`;\n }\n\n #applySet(codes: readonly E[]): void {\n const current = this.get;\n for (const code of current) if (!codes.includes(code)) this.remove(code);\n for (const code of codes) if (!current.includes(code)) this.add(code);\n }\n\n /** The current (non-deleted) codes for `entity`, sorted by enum id for a stable order. */\n #codesFor(entity: Entity): E[] {\n return (this.#joinRows.getOthers(this.columnName, entity) as number[])\n .sort((a, b) => a - b)\n .map((id) => this.#field.enumDetailType.findById(id)!.code as E);\n }\n\n #idOf(code: E): number {\n return this.#field.enumDetailType.getByCode(code).id;\n }\n\n #getPreloaded(): E[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<E>(this.entity.idTagged, this.fieldName);\n }\n\n get #joinRows() {\n return getEmInternalApi(this.entity.em).joinRows(this);\n }\n\n // The `ManyToManyLike` surface, so JoinRows/batch loaders can use us directly. There is no\n // `otherMeta`/`otherFieldName` because the \"other\" side is an enum table, not an entity.\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.#field.fieldName);\n }\n\n get otherEnum(): EnumMetadata<any, any, number> {\n return this.#field.enumDetailType;\n }\n\n get otherMeta(): undefined {\n return undefined;\n }\n\n get otherFieldName(): undefined {\n return undefined;\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n declare [enumCollectionTag]: true;\n [RelationT]: T = null!;\n [RelationU]: E = null!;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EnumCollection.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","getInstanceData","enumCollectionBatchLoader","appendStack","getEmInternalApi","getMetadataForField","RelationT","RelationU"],"sources":["../../src/relations/EnumCollection.ts"],"sourcesContent":["import { enumCollectionBatchLoader } from \"src/batchloaders/enumCollectionBatchLoader.ts\";\nimport { type EnumMetadata } from \"src/EnumMetadata.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyEnumField,\n type ManyToManyLike,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** A nominal brand so `EnumCollection` is not structurally confused with a regular `Collection`. */\ndeclare const enumCollectionTag: unique symbol;\n\n/**\n * A collection of enum codes `E` within `T`, backed by a m2m join table to an enum \"table\".\n *\n * To the user it looks like an array of enum codes (e.g. `Color[]`), but unlike an enum-array\n * column it is lazy and so needs a load hint, like any other relation.\n */\nexport interface EnumCollection<T extends Entity, E> {\n [enumCollectionTag]: true;\n [RelationT]: T;\n [RelationU]: E;\n\n load(opts?: { forceReload?: boolean }): Promise<ReadonlyArray<E>>;\n\n add(code: E): void;\n\n remove(code: E): void;\n\n /**\n * Sets the collection to `codes`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(codes: readonly E[]): void;\n\n includes(code: E): Promise<boolean>;\n\n readonly isLoaded: boolean;\n readonly entity: Entity;\n readonly hasBeenSet: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {\n get: ReadonlyArray<E>;\n\n removeAll(): void;\n}\n\n/** An alias for creating `EnumCollection`s. */\nexport function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as ManyToManyEnumField;\n return new EnumCollectionImpl<T, E>(entity, field);\n });\n}\n\nexport class EnumCollectionImpl<T extends Entity, E>\n extends AbstractRelationImpl<T, E[]>\n implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike\n{\n readonly #field: ManyToManyEnumField;\n #loaded: boolean;\n #loadPromise: any;\n #hasBeenSet = false;\n /** Holds a pending `set()` when called on an unloaded collection, resolved at load. */\n #pendingSet: E[] | undefined;\n\n constructor(entity: T, field: ManyToManyEnumField) {\n super(entity);\n this.#field = field;\n this.#loaded = getInstanceData(entity).isOrWasNew;\n }\n\n async load(opts: { forceReload?: boolean } = {}): Promise<ReadonlyArray<E>> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded || (opts.forceReload && !this.entity.isNewEntity)) {\n if (this.#getPreloaded() !== undefined) {\n this.#loaded = true;\n } else {\n await (this.#loadPromise ??= enumCollectionBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => {\n this.#loaded = true;\n })\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n if (this.#pendingSet) {\n const pending = this.#pendingSet;\n this.#pendingSet = undefined;\n this.#applySet(pending);\n }\n }\n return this.get;\n }\n\n add(code: E): void {\n ensureNotDeleted(this.entity);\n if (this.#pendingSet) {\n if (!this.#pendingSet.includes(code)) this.#pendingSet.push(code);\n return;\n }\n if (this.#loaded && this.get.includes(code)) return;\n this.#joinRows.addNew(this, this.entity, this.#idOf(code));\n }\n\n remove(code: E): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) {\n remove(this.#pendingSet, code);\n return;\n }\n this.#joinRows.addRemove(this, this.entity, this.#idOf(code));\n }\n\n set(codes: readonly E[]): void {\n ensureNotDeleted(this.entity);\n this.#hasBeenSet = true;\n if (!this.#loaded) {\n this.#pendingSet = [...codes];\n getEmInternalApi(this.entity.em).pendingLoads.add(this as any);\n return;\n }\n this.#applySet(codes);\n }\n\n async includes(code: E): Promise<boolean> {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#pendingSet) return this.#pendingSet.includes(code);\n if (this.#loaded) return this.get.includes(code);\n if (this.entity.isNewEntity) return false;\n await this.load();\n return this.get.includes(code);\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#loaded) throw new Error(\"removeAll was called when not loaded\");\n for (const code of [...this.get]) this.remove(code);\n }\n\n get get(): E[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#loaded) {\n throw new Error(`${this.entity}.${this.fieldName}.get was called when not loaded`);\n }\n return this.#codesFor(this.entity);\n }\n\n get isLoaded(): boolean {\n return this.#loaded;\n }\n\n get isPreloaded(): boolean {\n return this.#getPreloaded() !== undefined;\n }\n\n preload(): void {\n if (this.#getPreloaded() !== undefined) this.#loaded = true;\n }\n\n setFromOpts(codes: E[]): void {\n this.#loaded = true;\n for (const code of codes ?? []) this.add(code);\n }\n\n /**\n * Mirrors `other`'s codes into us for `em.fork`/`importEntity`.\n *\n * Enum codes have no entity identity to remap, and we copy them as already-persisted rows (not\n * pending adds) so the receiving em doesn't think it has spurious inserts to flush.\n */\n import(other: EnumCollectionImpl<T, E>): void {\n if (!other.isLoaded) return;\n this.#loaded = true;\n for (const code of other.get) {\n this.#joinRows.addPreloadedRow(this, undefined, this.entity, this.#idOf(code));\n }\n }\n\n maybeCascadeDelete(): void {\n // The join table FK cascades on the db side, so there's nothing to cascade in memory.\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // The db cascade-deletes our join rows, so just drop any pending in-memory changes for us.\n this.#joinRows.removeAllFor(this.columnName, this.entity);\n }\n\n get fieldName(): string {\n return this.#field.fieldName;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n toString(): string {\n return `EnumCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, enum: ${this.#field.enumDetailType.name})`;\n }\n\n #applySet(codes: readonly E[]): void {\n const current = this.get;\n for (const code of current) if (!codes.includes(code)) this.remove(code);\n for (const code of codes) if (!current.includes(code)) this.add(code);\n }\n\n /** The current (non-deleted) codes for `entity`, sorted by enum id for a stable order. */\n #codesFor(entity: Entity): E[] {\n return (this.#joinRows.getOthers(this.columnName, entity) as number[])\n .sort((a, b) => a - b)\n .map((id) => this.#field.enumDetailType.findById(id)!.code as E);\n }\n\n #idOf(code: E): number {\n return this.#field.enumDetailType.getByCode(code).id;\n }\n\n #getPreloaded(): E[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<E>(this.entity.idTagged, this.fieldName);\n }\n\n get #joinRows() {\n return getEmInternalApi(this.entity.em).joinRows(this);\n }\n\n // The `ManyToManyLike` surface, so JoinRows/batch loaders can use us directly. There is no\n // `otherMeta`/`otherFieldName` because the \"other\" side is an enum table, not an entity.\n\n get joinTableName(): string {\n return this.#field.joinTableName;\n }\n\n get columnName(): string {\n return this.#field.columnNames[0];\n }\n\n get otherColumnName(): string {\n return this.#field.columnNames[1];\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.#field.fieldName);\n }\n\n get otherEnum(): EnumMetadata<any, any, number> {\n return this.#field.enumDetailType;\n }\n\n get otherMeta(): undefined {\n return undefined;\n }\n\n get otherFieldName(): undefined {\n return undefined;\n }\n\n get hasJoinTableId(): boolean {\n return this.#field.hasJoinTableId;\n }\n\n declare [enumCollectionTag]: true;\n [RelationT]: T = null!;\n [RelationU]: E = null!;\n}\n"],"mappings":"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"}
@@ -14,7 +14,7 @@ declare const enumCollectionTag: unique symbol;
14
14
  * To the user it looks like an array of enum codes (e.g. `Color[]`), but unlike an enum-array
15
15
  * column it is lazy and so needs a load hint, like any other relation.
16
16
  */
17
- interface EnumCollection<T extends Entity, E> {
17
+ export interface EnumCollection<T extends Entity, E> {
18
18
  [enumCollectionTag]: true;
19
19
  [RelationT]: T;
20
20
  [RelationU]: E;
@@ -35,13 +35,13 @@ interface EnumCollection<T extends Entity, E> {
35
35
  readonly hasBeenSet: boolean;
36
36
  }
37
37
  /** Adds a known-safe `get` accessor. */
38
- interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {
38
+ export interface LoadedEnumCollection<T extends Entity, E> extends EnumCollection<T, E> {
39
39
  get: ReadonlyArray<E>;
40
40
  removeAll(): void;
41
41
  }
42
42
  /** An alias for creating `EnumCollection`s. */
43
- declare function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E>;
44
- declare class EnumCollectionImpl<T extends Entity, E> extends AbstractRelationImpl<T, E[]> implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike {
43
+ export declare function hasEnumCollection<T extends Entity, E>(): EnumCollection<T, E>;
44
+ export declare class EnumCollectionImpl<T extends Entity, E> extends AbstractRelationImpl<T, E[]> implements EnumCollection<T, E>, LoadedEnumCollection<T, E>, ManyToManyLike {
45
45
  #private;
46
46
  constructor(entity: T, field: ManyToManyEnumField);
47
47
  load(opts?: {
@@ -82,5 +82,5 @@ declare class EnumCollectionImpl<T extends Entity, E> extends AbstractRelationIm
82
82
  [RelationU]: E;
83
83
  }
84
84
  //#endregion
85
- export { EnumCollection, EnumCollectionImpl, LoadedEnumCollection, hasEnumCollection };
85
+ export {};
86
86
  //# sourceMappingURL=EnumCollection.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EnumCollection.d.cts","names":[],"sources":["../../src/relations/EnumCollection.ts"],"mappings":";;;;;;;;;cAoBc;;;;;;;UAQG,eAAe,UAAU,QAAQ;GAC/C;GACA,YAAY;GACZ,YAAY;EAEb,KAAK;IAAS;MAA0B,QAAQ,cAAc;EAE9D,IAAI,MAAM;EAEV,OAAO,MAAM;;;;;;EAOb,IAAI,gBAAgB;EAEpB,SAAS,MAAM,IAAI;WAEV;WACA,QAAQ;WACR;;;UAIM,qBAAqB,UAAU,QAAQ,WAAW,eAAe,GAAG;EACnF,KAAK,cAAc;EAEnB;;;iBAIc,kBAAkB,UAAU,QAAQ,MAAM,eAAe,GAAG;cAO/D,mBAAmB,UAAU,QAAQ,WACxC,qBAAqB,GAAG,gBACrB,eAAe,GAAG,IAAI,qBAAqB,GAAG,IAAI;;EAS7D,YAAY,QAAQ,GAAG,OAAO;EAMxB,KAAK;IAAQ;MAA+B,QAAQ,cAAc;EA0BxE,IAAI,MAAM;EAUV,OAAO,MAAM;EASb,IAAI,gBAAgB;EAWd,SAAS,MAAM,IAAI;EASzB;MAMI,OAAO;MAQP;MAIA;EAIJ;EAIA,YAAY,OAAO;;;;;;;EAWnB,OAAO,OAAO,mBAAmB,GAAG;EAQpC;EAIM,0BAA0B;MAK5B;MAIA;EAIJ;MAiCI;MAIA;MAIA;MAIA,QAAQ;MAIR,aAAa;MAIb;MAIA;MAIA;GAIK;GACR,YAAY;GACZ,YAAY"}
1
+ {"version":3,"file":"EnumCollection.d.cts","names":[],"sources":["../../src/relations/EnumCollection.ts"],"mappings":";;;;;;;;;cAoBc;;;;;;;iBAQG,eAAe,UAAU,QAAQ;GAC/C;GACA,YAAY;GACZ,YAAY;EAEb,KAAK;IAAS;MAA0B,QAAQ,cAAc;EAE9D,IAAI,MAAM;EAEV,OAAO,MAAM;;;;;;EAOb,IAAI,gBAAgB;EAEpB,SAAS,MAAM,IAAI;WAEV;WACA,QAAQ;WACR;;;iBAIM,qBAAqB,UAAU,QAAQ,WAAW,eAAe,GAAG;EACnF,KAAK,cAAc;EAEnB;;;wBAIc,kBAAkB,UAAU,QAAQ,MAAM,eAAe,GAAG;qBAO/D,mBAAmB,UAAU,QAAQ,WACxC,qBAAqB,GAAG,gBACrB,eAAe,GAAG,IAAI,qBAAqB,GAAG,IAAI;;EAS7D,YAAY,QAAQ,GAAG,OAAO;EAMxB,KAAK;IAAQ;MAA+B,QAAQ,cAAc;EA0BxE,IAAI,MAAM;EAUV,OAAO,MAAM;EASb,IAAI,gBAAgB;EAWd,SAAS,MAAM,IAAI;EASzB;MAMI,OAAO;MAQP;MAIA;EAIJ;EAIA,YAAY,OAAO;;;;;;;EAWnB,OAAO,OAAO,mBAAmB,GAAG;EAQpC;EAIM,0BAA0B;MAK5B;MAIA;EAIJ;MAiCI;MAIA;MAIA;MAIA,QAAQ;MAIR,aAAa;MAIb;MAIA;MAIA;GAIK;GACR,YAAY;GACZ,YAAY"}