joist-core 2.3.0-next.97 → 2.3.0-next.99

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 (747) hide show
  1. package/build/BaseEntity.cjs.map +1 -1
  2. package/build/BaseEntity.js.map +1 -1
  3. package/build/Entity.cjs.map +1 -1
  4. package/build/Entity.js.map +1 -1
  5. package/build/EntityManager.cjs +45 -46
  6. package/build/EntityManager.cjs.map +1 -1
  7. package/build/EntityManager.d.cts +7 -7
  8. package/build/EntityManager.d.cts.map +1 -1
  9. package/build/EntityManager.d.mts +7 -7
  10. package/build/EntityManager.d.mts.map +1 -1
  11. package/build/EntityManager.js +27 -28
  12. package/build/EntityManager.js.map +1 -1
  13. package/build/EntityMetadata.cjs +0 -2
  14. package/build/EntityMetadata.cjs.map +1 -1
  15. package/build/EntityMetadata.d.cts +3 -3
  16. package/build/EntityMetadata.d.mts +3 -3
  17. package/build/EntityMetadata.js +0 -2
  18. package/build/EntityMetadata.js.map +1 -1
  19. package/build/IndexManager.cjs +1 -1
  20. package/build/IndexManager.cjs.map +1 -1
  21. package/build/IndexManager.js +1 -1
  22. package/build/IndexManager.js.map +1 -1
  23. package/build/InstanceData.cjs.map +1 -1
  24. package/build/InstanceData.js.map +1 -1
  25. package/build/PluginManager.cjs +0 -1
  26. package/build/PluginManager.cjs.map +1 -1
  27. package/build/PluginManager.d.cts +1 -1
  28. package/build/PluginManager.d.mts +1 -1
  29. package/build/PluginManager.js +0 -1
  30. package/build/PluginManager.js.map +1 -1
  31. package/build/batchloaders/enumCollectionBatchLoader.cjs +1 -1
  32. package/build/batchloaders/enumCollectionBatchLoader.cjs.map +1 -1
  33. package/build/batchloaders/enumCollectionBatchLoader.d.cts +1 -1
  34. package/build/batchloaders/enumCollectionBatchLoader.d.mts +1 -1
  35. package/build/batchloaders/enumCollectionBatchLoader.js +1 -1
  36. package/build/batchloaders/enumCollectionBatchLoader.js.map +1 -1
  37. package/build/batchloaders/loadBatchLoader.cjs +3 -4
  38. package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
  39. package/build/batchloaders/loadBatchLoader.d.cts +1 -1
  40. package/build/batchloaders/loadBatchLoader.d.mts +1 -1
  41. package/build/batchloaders/loadBatchLoader.js +2 -3
  42. package/build/batchloaders/loadBatchLoader.js.map +1 -1
  43. package/build/batchloaders/manyToManyBatchLoader.cjs +1 -1
  44. package/build/batchloaders/manyToManyBatchLoader.cjs.map +1 -1
  45. package/build/batchloaders/manyToManyBatchLoader.d.cts +1 -1
  46. package/build/batchloaders/manyToManyBatchLoader.d.mts +1 -1
  47. package/build/batchloaders/manyToManyBatchLoader.js +1 -1
  48. package/build/batchloaders/manyToManyBatchLoader.js.map +1 -1
  49. package/build/batchloaders/oneToManyBatchLoader.cjs +1 -1
  50. package/build/batchloaders/oneToManyBatchLoader.cjs.map +1 -1
  51. package/build/batchloaders/oneToManyBatchLoader.js +1 -1
  52. package/build/batchloaders/oneToManyBatchLoader.js.map +1 -1
  53. package/build/batchloaders/oneToOneBatchLoader.cjs +1 -1
  54. package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
  55. package/build/batchloaders/oneToOneBatchLoader.js +1 -1
  56. package/build/batchloaders/oneToOneBatchLoader.js.map +1 -1
  57. package/build/batchloaders/populateBatchLoader.cjs +11 -12
  58. package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
  59. package/build/batchloaders/populateBatchLoader.d.cts +1 -1
  60. package/build/batchloaders/populateBatchLoader.d.mts +1 -1
  61. package/build/batchloaders/populateBatchLoader.js +7 -8
  62. package/build/batchloaders/populateBatchLoader.js.map +1 -1
  63. package/build/batchloaders/recursiveChildrenBatchLoader.cjs +2 -2
  64. package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
  65. package/build/batchloaders/recursiveChildrenBatchLoader.js +2 -2
  66. package/build/batchloaders/recursiveChildrenBatchLoader.js.map +1 -1
  67. package/build/batchloaders/recursiveM2mBatchLoader.cjs +2 -2
  68. package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
  69. package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
  70. package/build/batchloaders/recursiveM2mBatchLoader.js.map +1 -1
  71. package/build/batchloaders/recursiveParentsBatchLoader.cjs +2 -2
  72. package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
  73. package/build/batchloaders/recursiveParentsBatchLoader.js +2 -2
  74. package/build/batchloaders/recursiveParentsBatchLoader.js.map +1 -1
  75. package/build/changes.cjs +2 -3
  76. package/build/changes.cjs.map +1 -1
  77. package/build/changes.js +2 -3
  78. package/build/changes.js.map +1 -1
  79. package/build/config.cjs +3 -3
  80. package/build/config.cjs.map +1 -1
  81. package/build/config.d.cts +2 -2
  82. package/build/config.d.mts +2 -2
  83. package/build/config.js +1 -1
  84. package/build/config.js.map +1 -1
  85. package/build/configure.cjs +10 -10
  86. package/build/configure.cjs.map +1 -1
  87. package/build/configure.js +5 -5
  88. package/build/configure.js.map +1 -1
  89. package/build/dataloaders/fastWhereFilterHash.cjs +8 -8
  90. package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
  91. package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
  92. package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
  93. package/build/dataloaders/fastWhereFilterHash.js +3 -3
  94. package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
  95. package/build/dataloaders/findByUniqueDataLoader.cjs.map +1 -1
  96. package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
  97. package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
  98. package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
  99. package/build/dataloaders/findCountDataLoader.cjs +2 -2
  100. package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
  101. package/build/dataloaders/findCountDataLoader.js +1 -1
  102. package/build/dataloaders/findCountDataLoader.js.map +1 -1
  103. package/build/dataloaders/findDataLoader.cjs +6 -6
  104. package/build/dataloaders/findDataLoader.cjs.map +1 -1
  105. package/build/dataloaders/findDataLoader.d.cts +1 -1
  106. package/build/dataloaders/findDataLoader.d.mts +1 -1
  107. package/build/dataloaders/findDataLoader.js +3 -3
  108. package/build/dataloaders/findDataLoader.js.map +1 -1
  109. package/build/dataloaders/findIdsDataLoader.cjs +3 -3
  110. package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
  111. package/build/dataloaders/findIdsDataLoader.js +2 -2
  112. package/build/dataloaders/findIdsDataLoader.js.map +1 -1
  113. package/build/dataloaders/findOrCreateDataLoader.cjs +1 -1
  114. package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
  115. package/build/dataloaders/findOrCreateDataLoader.d.cts.map +1 -1
  116. package/build/dataloaders/findOrCreateDataLoader.d.mts.map +1 -1
  117. package/build/dataloaders/findOrCreateDataLoader.js +1 -1
  118. package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
  119. package/build/dataloaders/findPaginatedDataLoader.cjs +6 -6
  120. package/build/dataloaders/findPaginatedDataLoader.cjs.map +1 -1
  121. package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -1
  122. package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -1
  123. package/build/dataloaders/findPaginatedDataLoader.js +3 -3
  124. package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
  125. package/build/dataloaders/lensDataLoader.cjs +3 -3
  126. package/build/dataloaders/lensDataLoader.cjs.map +1 -1
  127. package/build/dataloaders/lensDataLoader.d.cts.map +1 -1
  128. package/build/dataloaders/lensDataLoader.d.mts.map +1 -1
  129. package/build/dataloaders/lensDataLoader.js +2 -2
  130. package/build/dataloaders/lensDataLoader.js.map +1 -1
  131. package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -1
  132. package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
  133. package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
  134. package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
  135. package/build/dataloaders/manyToManyFindDataLoader.js +1 -1
  136. package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
  137. package/build/dataloaders/oneToManyFindDataLoader.cjs +1 -1
  138. package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
  139. package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
  140. package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
  141. package/build/dataloaders/oneToManyFindDataLoader.js +1 -1
  142. package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
  143. package/build/defaults.cjs +5 -5
  144. package/build/defaults.cjs.map +1 -1
  145. package/build/defaults.d.cts +1 -1
  146. package/build/defaults.d.cts.map +1 -1
  147. package/build/defaults.d.mts +1 -1
  148. package/build/defaults.d.mts.map +1 -1
  149. package/build/defaults.js +4 -4
  150. package/build/defaults.js.map +1 -1
  151. package/build/drivers/Driver.cjs +0 -1
  152. package/build/drivers/Driver.d.cts +1 -1
  153. package/build/drivers/Driver.d.mts +1 -1
  154. package/build/drivers/Driver.js +0 -1
  155. package/build/drivers/EntityWriter.cjs +6 -7
  156. package/build/drivers/EntityWriter.cjs.map +1 -1
  157. package/build/drivers/EntityWriter.d.cts +1 -1
  158. package/build/drivers/EntityWriter.d.mts +1 -1
  159. package/build/drivers/EntityWriter.js +2 -3
  160. package/build/drivers/EntityWriter.js.map +1 -1
  161. package/build/drivers/IdAssigner.cjs +0 -1
  162. package/build/drivers/IdAssigner.cjs.map +1 -1
  163. package/build/drivers/IdAssigner.d.cts +1 -1
  164. package/build/drivers/IdAssigner.d.mts +1 -1
  165. package/build/drivers/IdAssigner.js +0 -1
  166. package/build/drivers/IdAssigner.js.map +1 -1
  167. package/build/drivers/driverApi.cjs +19 -0
  168. package/build/drivers/driverApi.cjs.map +1 -0
  169. package/build/drivers/driverApi.d.cts +22 -0
  170. package/build/drivers/driverApi.d.cts.map +1 -0
  171. package/build/drivers/driverApi.d.mts +22 -0
  172. package/build/drivers/driverApi.d.mts.map +1 -0
  173. package/build/drivers/driverApi.js +18 -0
  174. package/build/drivers/driverApi.js.map +1 -0
  175. package/build/fields.cjs +3 -3
  176. package/build/fields.cjs.map +1 -1
  177. package/build/fields.js +2 -2
  178. package/build/fields.js.map +1 -1
  179. package/build/{FlushLock.cjs → flush/FlushLock.cjs} +1 -1
  180. package/build/flush/FlushLock.cjs.map +1 -0
  181. package/build/{FlushLock.d.cts → flush/FlushLock.d.cts} +1 -1
  182. package/build/flush/FlushLock.d.cts.map +1 -0
  183. package/build/{FlushLock.d.mts → flush/FlushLock.d.mts} +1 -1
  184. package/build/flush/FlushLock.d.mts.map +1 -0
  185. package/build/{FlushLock.js → flush/FlushLock.js} +1 -1
  186. package/build/flush/FlushLock.js.map +1 -0
  187. package/build/{JoinRows.cjs → flush/JoinRows.cjs} +5 -8
  188. package/build/flush/JoinRows.cjs.map +1 -0
  189. package/build/{JoinRows.d.cts → flush/JoinRows.d.cts} +5 -5
  190. package/build/flush/JoinRows.d.cts.map +1 -0
  191. package/build/{JoinRows.d.mts → flush/JoinRows.d.mts} +5 -5
  192. package/build/flush/JoinRows.d.mts.map +1 -0
  193. package/build/{JoinRows.js → flush/JoinRows.js} +5 -8
  194. package/build/flush/JoinRows.js.map +1 -0
  195. package/build/{PendingChanges.cjs → flush/PendingChanges.cjs} +0 -1
  196. package/build/{PendingChanges.d.cts → flush/PendingChanges.d.cts} +2 -2
  197. package/build/flush/PendingChanges.d.cts.map +1 -0
  198. package/build/{PendingChanges.d.mts → flush/PendingChanges.d.mts} +2 -2
  199. package/build/flush/PendingChanges.d.mts.map +1 -0
  200. package/build/flush/PendingChanges.js +1 -0
  201. package/build/{Todo.cjs → flush/Todo.cjs} +4 -6
  202. package/build/flush/Todo.cjs.map +1 -0
  203. package/build/{Todo.d.cts → flush/Todo.d.cts} +3 -3
  204. package/build/flush/Todo.d.cts.map +1 -0
  205. package/build/{Todo.d.mts → flush/Todo.d.mts} +3 -3
  206. package/build/flush/Todo.d.mts.map +1 -0
  207. package/build/{Todo.js → flush/Todo.js} +4 -6
  208. package/build/flush/Todo.js.map +1 -0
  209. package/build/getProperties.cjs.map +1 -1
  210. package/build/getProperties.js.map +1 -1
  211. package/build/index.cjs +100 -100
  212. package/build/index.cjs.map +1 -1
  213. package/build/index.d.cts +15 -15
  214. package/build/index.d.mts +15 -15
  215. package/build/index.js +42 -42
  216. package/build/index.js.map +1 -1
  217. package/build/json.cjs +4 -4
  218. package/build/json.cjs.map +1 -1
  219. package/build/json.js +3 -3
  220. package/build/json.js.map +1 -1
  221. package/build/keys.cjs +1 -1
  222. package/build/keys.cjs.map +1 -1
  223. package/build/keys.js +1 -1
  224. package/build/keys.js.map +1 -1
  225. package/build/{HintTree.cjs → loading/HintTree.cjs} +2 -5
  226. package/build/loading/HintTree.cjs.map +1 -0
  227. package/build/{HintTree.d.cts → loading/HintTree.d.cts} +3 -3
  228. package/build/loading/HintTree.d.cts.map +1 -0
  229. package/build/{HintTree.d.mts → loading/HintTree.d.mts} +3 -3
  230. package/build/loading/HintTree.d.mts.map +1 -0
  231. package/build/{HintTree.js → loading/HintTree.js} +2 -5
  232. package/build/loading/HintTree.js.map +1 -0
  233. package/build/{IsLoadedCache.cjs → loading/IsLoadedCache.cjs} +2 -3
  234. package/build/loading/IsLoadedCache.cjs.map +1 -0
  235. package/build/{IsLoadedCache.d.cts → loading/IsLoadedCache.d.cts} +2 -2
  236. package/build/loading/IsLoadedCache.d.cts.map +1 -0
  237. package/build/{IsLoadedCache.d.mts → loading/IsLoadedCache.d.mts} +2 -2
  238. package/build/loading/IsLoadedCache.d.mts.map +1 -0
  239. package/build/{IsLoadedCache.js → loading/IsLoadedCache.js} +2 -3
  240. package/build/{IsLoadedCache.cjs.map → loading/IsLoadedCache.js.map} +1 -1
  241. package/build/{loadHints.cjs → loading/loadHints.cjs} +6 -11
  242. package/build/loading/loadHints.cjs.map +1 -0
  243. package/build/{loadHints.d.cts → loading/loadHints.d.cts} +14 -14
  244. package/build/loading/loadHints.d.cts.map +1 -0
  245. package/build/{loadHints.d.mts → loading/loadHints.d.mts} +14 -14
  246. package/build/loading/loadHints.d.mts.map +1 -0
  247. package/build/{loadHints.js → loading/loadHints.js} +3 -8
  248. package/build/loading/loadHints.js.map +1 -0
  249. package/build/{loadLens.cjs → loading/loadLens.cjs} +8 -9
  250. package/build/loading/loadLens.cjs.map +1 -0
  251. package/build/{loadLens.d.cts → loading/loadLens.d.cts} +3 -3
  252. package/build/loading/loadLens.d.cts.map +1 -0
  253. package/build/{loadLens.d.mts → loading/loadLens.d.mts} +3 -3
  254. package/build/loading/loadLens.d.mts.map +1 -0
  255. package/build/{loadLens.js → loading/loadLens.js} +8 -9
  256. package/build/loading/loadLens.js.map +1 -0
  257. package/build/{withLoaded.cjs → loading/withLoaded.cjs} +12 -13
  258. package/build/loading/withLoaded.cjs.map +1 -0
  259. package/build/{withLoaded.d.cts → loading/withLoaded.d.cts} +9 -9
  260. package/build/loading/withLoaded.d.cts.map +1 -0
  261. package/build/{withLoaded.d.mts → loading/withLoaded.d.mts} +9 -9
  262. package/build/loading/withLoaded.d.mts.map +1 -0
  263. package/build/{withLoaded.js → loading/withLoaded.js} +10 -11
  264. package/build/loading/withLoaded.js.map +1 -0
  265. package/build/logging/FactoryLogger.cjs.map +1 -1
  266. package/build/logging/FactoryLogger.d.cts.map +1 -1
  267. package/build/logging/FactoryLogger.d.mts.map +1 -1
  268. package/build/logging/FactoryLogger.js.map +1 -1
  269. package/build/logging/FieldLogger.cjs.map +1 -1
  270. package/build/logging/FieldLogger.d.cts.map +1 -1
  271. package/build/logging/FieldLogger.d.mts.map +1 -1
  272. package/build/logging/FieldLogger.js.map +1 -1
  273. package/build/logging/ReactionLogger.cjs +0 -2
  274. package/build/logging/ReactionLogger.cjs.map +1 -1
  275. package/build/logging/ReactionLogger.d.cts +2 -2
  276. package/build/logging/ReactionLogger.d.cts.map +1 -1
  277. package/build/logging/ReactionLogger.d.mts +2 -2
  278. package/build/logging/ReactionLogger.d.mts.map +1 -1
  279. package/build/logging/ReactionLogger.js +0 -2
  280. package/build/logging/ReactionLogger.js.map +1 -1
  281. package/build/newEntity.cjs.map +1 -1
  282. package/build/newEntity.js.map +1 -1
  283. package/build/newTestInstance.cjs +3 -3
  284. package/build/newTestInstance.cjs.map +1 -1
  285. package/build/newTestInstance.d.cts +1 -1
  286. package/build/newTestInstance.d.cts.map +1 -1
  287. package/build/newTestInstance.d.mts +1 -1
  288. package/build/newTestInstance.d.mts.map +1 -1
  289. package/build/newTestInstance.js +2 -2
  290. package/build/newTestInstance.js.map +1 -1
  291. package/build/normalizeHints.cjs +0 -2
  292. package/build/normalizeHints.cjs.map +1 -1
  293. package/build/normalizeHints.d.cts +2 -2
  294. package/build/normalizeHints.d.mts +2 -2
  295. package/build/normalizeHints.js +0 -2
  296. package/build/normalizeHints.js.map +1 -1
  297. package/build/nowUTC.cjs +2 -2
  298. package/build/nowUTC.cjs.map +1 -1
  299. package/build/nowUTC.d.cts +1 -1
  300. package/build/nowUTC.d.mts +1 -1
  301. package/build/nowUTC.js +1 -1
  302. package/build/nowUTC.js.map +1 -1
  303. package/build/plugins/ImmutableEntitiesPlugin.cjs.map +1 -1
  304. package/build/plugins/ImmutableEntitiesPlugin.js.map +1 -1
  305. package/build/plugins/PreloadPlugin.cjs +0 -2
  306. package/build/plugins/PreloadPlugin.d.cts +2 -2
  307. package/build/plugins/PreloadPlugin.d.mts +2 -2
  308. package/build/plugins/PreloadPlugin.js +0 -2
  309. package/build/preloading/JsonAggregatePreloader.cjs +1 -4
  310. package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
  311. package/build/preloading/JsonAggregatePreloader.d.cts +2 -2
  312. package/build/preloading/JsonAggregatePreloader.d.cts.map +1 -1
  313. package/build/preloading/JsonAggregatePreloader.d.mts +2 -2
  314. package/build/preloading/JsonAggregatePreloader.d.mts.map +1 -1
  315. package/build/preloading/JsonAggregatePreloader.js +1 -4
  316. package/build/preloading/JsonAggregatePreloader.js.map +1 -1
  317. package/build/preloading/canPreload.cjs.map +1 -1
  318. package/build/preloading/canPreload.js.map +1 -1
  319. package/build/preloading/partitionHint.cjs +2 -3
  320. package/build/preloading/partitionHint.cjs.map +1 -1
  321. package/build/preloading/partitionHint.d.cts +1 -1
  322. package/build/preloading/partitionHint.d.mts +1 -1
  323. package/build/preloading/partitionHint.js +2 -3
  324. package/build/preloading/partitionHint.js.map +1 -1
  325. package/build/queries/ConditionBuilder.cjs.map +1 -1
  326. package/build/queries/ConditionBuilder.d.cts +1 -1
  327. package/build/queries/ConditionBuilder.d.mts +1 -1
  328. package/build/queries/ConditionBuilder.js.map +1 -1
  329. package/build/queries/conditions.cjs.map +1 -1
  330. package/build/queries/conditions.js.map +1 -1
  331. package/build/queries/entityQueryUtils.cjs.map +1 -1
  332. package/build/queries/entityQueryUtils.js.map +1 -1
  333. package/build/queries/find/Aliases.cjs +1 -1
  334. package/build/queries/find/Aliases.cjs.map +1 -1
  335. package/build/queries/find/Aliases.d.cts.map +1 -1
  336. package/build/queries/find/Aliases.d.mts.map +1 -1
  337. package/build/queries/find/Aliases.js +1 -1
  338. package/build/queries/find/Aliases.js.map +1 -1
  339. package/build/queries/find/DeferredAlias.cjs.map +1 -1
  340. package/build/queries/find/DeferredAlias.js.map +1 -1
  341. package/build/queries/find/EntityFilter.cjs.map +1 -1
  342. package/build/queries/find/EntityFilter.js.map +1 -1
  343. package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -1
  344. package/build/queries/find/EntityGraphQLFilter.js.map +1 -1
  345. package/build/queries/find/QueryParser.cjs +2 -2
  346. package/build/queries/find/QueryParser.cjs.map +1 -1
  347. package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -1
  348. package/build/queries/find/QueryParser.collectionJoins.js.map +1 -1
  349. package/build/queries/find/QueryParser.d.cts.map +1 -1
  350. package/build/queries/find/QueryParser.d.mts.map +1 -1
  351. package/build/queries/find/QueryParser.js +2 -2
  352. package/build/queries/find/QueryParser.js.map +1 -1
  353. package/build/queries/find/QueryParser.pruning.cjs.map +1 -1
  354. package/build/queries/find/QueryParser.pruning.js.map +1 -1
  355. package/build/queries/find/QueryVisitor.cjs.map +1 -1
  356. package/build/queries/find/QueryVisitor.js.map +1 -1
  357. package/build/queries/find/buildFindQuery.cjs.map +1 -1
  358. package/build/queries/find/buildFindQuery.js.map +1 -1
  359. package/build/queries/find/scopes.cjs.map +1 -1
  360. package/build/queries/find/scopes.d.cts +1 -1
  361. package/build/queries/find/scopes.d.mts +1 -1
  362. package/build/queries/find/scopes.js.map +1 -1
  363. package/build/queries/parsedConditions.cjs.map +1 -1
  364. package/build/queries/parsedConditions.js.map +1 -1
  365. package/build/queries/renderConditions.cjs.map +1 -1
  366. package/build/queries/renderConditions.js.map +1 -1
  367. package/build/queries/skipCondition.cjs.map +1 -1
  368. package/build/queries/skipCondition.js.map +1 -1
  369. package/build/queries/sql/AliasAssigner.cjs.map +1 -1
  370. package/build/queries/sql/AliasAssigner.js.map +1 -1
  371. package/build/queries/sql/Expr.cjs +2 -2
  372. package/build/queries/sql/Expr.cjs.map +1 -1
  373. package/build/queries/sql/Expr.d.cts +1 -1
  374. package/build/queries/sql/Expr.d.mts +1 -1
  375. package/build/queries/sql/Expr.js +1 -1
  376. package/build/queries/sql/Expr.js.map +1 -1
  377. package/build/queries/sql/Tables.cjs +1 -1
  378. package/build/queries/sql/Tables.cjs.map +1 -1
  379. package/build/queries/sql/Tables.d.cts.map +1 -1
  380. package/build/queries/sql/Tables.d.mts.map +1 -1
  381. package/build/queries/sql/Tables.js +1 -1
  382. package/build/queries/sql/Tables.js.map +1 -1
  383. package/build/queries/sql/execute.cjs +1 -1
  384. package/build/queries/sql/execute.cjs.map +1 -1
  385. package/build/queries/sql/execute.js +1 -1
  386. package/build/queries/sql/execute.js.map +1 -1
  387. package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -1
  388. package/build/queries/sql/expressions/arrayAgg.js.map +1 -1
  389. package/build/queries/sql/expressions/case.cjs.map +1 -1
  390. package/build/queries/sql/expressions/case.js.map +1 -1
  391. package/build/queries/sql/expressions/coalesce.cjs.map +1 -1
  392. package/build/queries/sql/expressions/coalesce.js.map +1 -1
  393. package/build/queries/sql/expressions/codecs.cjs +2 -2
  394. package/build/queries/sql/expressions/codecs.cjs.map +1 -1
  395. package/build/queries/sql/expressions/codecs.js +1 -1
  396. package/build/queries/sql/expressions/codecs.js.map +1 -1
  397. package/build/queries/sql/expressions/expression.cjs.map +1 -1
  398. package/build/queries/sql/expressions/expression.d.cts.map +1 -1
  399. package/build/queries/sql/expressions/expression.d.mts.map +1 -1
  400. package/build/queries/sql/expressions/expression.js.map +1 -1
  401. package/build/queries/sql/expressions/greatest.cjs.map +1 -1
  402. package/build/queries/sql/expressions/greatest.js.map +1 -1
  403. package/build/queries/sql/expressions/least.cjs.map +1 -1
  404. package/build/queries/sql/expressions/least.js.map +1 -1
  405. package/build/queries/sql/expressions/nullIf.cjs.map +1 -1
  406. package/build/queries/sql/expressions/nullIf.js.map +1 -1
  407. package/build/queries/sql/expressions/parseExpression.cjs.map +1 -1
  408. package/build/queries/sql/expressions/parseExpression.js.map +1 -1
  409. package/build/queries/sql/expressions/types.d.cts.map +1 -1
  410. package/build/queries/sql/expressions/types.d.mts.map +1 -1
  411. package/build/queries/sql/query.cjs +1 -1
  412. package/build/queries/sql/query.cjs.map +1 -1
  413. package/build/queries/sql/query.d.cts +1 -1
  414. package/build/queries/sql/query.d.mts +1 -1
  415. package/build/queries/sql/query.js +1 -1
  416. package/build/queries/sql/query.js.map +1 -1
  417. package/build/{unnest.cjs → queries/unnest.cjs} +1 -2
  418. package/build/queries/unnest.cjs.map +1 -0
  419. package/build/{unnest.d.cts → queries/unnest.d.cts} +3 -3
  420. package/build/queries/unnest.d.cts.map +1 -0
  421. package/build/{unnest.d.mts → queries/unnest.d.mts} +3 -3
  422. package/build/queries/unnest.d.mts.map +1 -0
  423. package/build/{unnest.js → queries/unnest.js} +1 -2
  424. package/build/queries/unnest.js.map +1 -0
  425. package/build/queries/valueFilters.cjs.map +1 -1
  426. package/build/queries/valueFilters.d.cts +1 -1
  427. package/build/queries/valueFilters.d.cts.map +1 -1
  428. package/build/queries/valueFilters.d.mts +1 -1
  429. package/build/queries/valueFilters.d.mts.map +1 -1
  430. package/build/queries/valueFilters.js.map +1 -1
  431. package/build/{ReactionsManager.cjs → reactivity/ReactionsManager.cjs} +8 -10
  432. package/build/reactivity/ReactionsManager.cjs.map +1 -0
  433. package/build/{ReactionsManager.d.cts → reactivity/ReactionsManager.d.cts} +5 -6
  434. package/build/reactivity/ReactionsManager.d.cts.map +1 -0
  435. package/build/{ReactionsManager.d.mts → reactivity/ReactionsManager.d.mts} +5 -6
  436. package/build/reactivity/ReactionsManager.d.mts.map +1 -0
  437. package/build/{ReactionsManager.js → reactivity/ReactionsManager.js} +6 -8
  438. package/build/reactivity/ReactionsManager.js.map +1 -0
  439. package/build/{reactiveHints.cjs → reactivity/reactiveHints.cjs} +12 -16
  440. package/build/reactivity/reactiveHints.cjs.map +1 -0
  441. package/build/{reactiveHints.d.cts → reactivity/reactiveHints.d.cts} +17 -17
  442. package/build/reactivity/reactiveHints.d.cts.map +1 -0
  443. package/build/{reactiveHints.d.mts → reactivity/reactiveHints.d.mts} +17 -17
  444. package/build/reactivity/reactiveHints.d.mts.map +1 -0
  445. package/build/{reactiveHints.js → reactivity/reactiveHints.js} +12 -16
  446. package/build/reactivity/reactiveHints.js.map +1 -0
  447. package/build/relations/AbstractRelationImpl.cjs.map +1 -1
  448. package/build/relations/AbstractRelationImpl.js.map +1 -1
  449. package/build/relations/AsyncProperty.cjs.map +1 -1
  450. package/build/relations/AsyncProperty.js.map +1 -1
  451. package/build/relations/AsyncReactiveField.cjs +6 -6
  452. package/build/relations/AsyncReactiveField.cjs.map +1 -1
  453. package/build/relations/AsyncReactiveField.d.cts +1 -1
  454. package/build/relations/AsyncReactiveField.d.mts +1 -1
  455. package/build/relations/AsyncReactiveField.js +4 -4
  456. package/build/relations/AsyncReactiveField.js.map +1 -1
  457. package/build/relations/Collection.cjs +1 -1
  458. package/build/relations/Collection.cjs.map +1 -1
  459. package/build/relations/Collection.js +1 -1
  460. package/build/relations/Collection.js.map +1 -1
  461. package/build/relations/CustomCollection.cjs.map +1 -1
  462. package/build/relations/CustomCollection.d.cts +1 -1
  463. package/build/relations/CustomCollection.d.mts +1 -1
  464. package/build/relations/CustomCollection.js.map +1 -1
  465. package/build/relations/CustomReference.cjs +1 -1
  466. package/build/relations/CustomReference.cjs.map +1 -1
  467. package/build/relations/CustomReference.d.cts +1 -1
  468. package/build/relations/CustomReference.d.mts +1 -1
  469. package/build/relations/CustomReference.js +1 -1
  470. package/build/relations/CustomReference.js.map +1 -1
  471. package/build/relations/EnumCollection.cjs.map +1 -1
  472. package/build/relations/EnumCollection.d.cts +1 -1
  473. package/build/relations/EnumCollection.d.mts +1 -1
  474. package/build/relations/EnumCollection.js.map +1 -1
  475. package/build/relations/LazyField.cjs +4 -4
  476. package/build/relations/LazyField.cjs.map +1 -1
  477. package/build/relations/LazyField.js +4 -4
  478. package/build/relations/LazyField.js.map +1 -1
  479. package/build/relations/ManyToManyCollection.cjs +3 -3
  480. package/build/relations/ManyToManyCollection.cjs.map +1 -1
  481. package/build/relations/ManyToManyCollection.js +3 -3
  482. package/build/relations/ManyToManyCollection.js.map +1 -1
  483. package/build/relations/ManyToManyLargeCollection.cjs +3 -3
  484. package/build/relations/ManyToManyLargeCollection.cjs.map +1 -1
  485. package/build/relations/ManyToManyLargeCollection.js +3 -3
  486. package/build/relations/ManyToManyLargeCollection.js.map +1 -1
  487. package/build/relations/ManyToOneReference.cjs +4 -4
  488. package/build/relations/ManyToOneReference.cjs.map +1 -1
  489. package/build/relations/ManyToOneReference.js +4 -4
  490. package/build/relations/ManyToOneReference.js.map +1 -1
  491. package/build/relations/OneToManyCollection.cjs +1 -2
  492. package/build/relations/OneToManyCollection.cjs.map +1 -1
  493. package/build/relations/OneToManyCollection.d.cts +1 -1
  494. package/build/relations/OneToManyCollection.d.mts +1 -1
  495. package/build/relations/OneToManyCollection.js +1 -2
  496. package/build/relations/OneToManyCollection.js.map +1 -1
  497. package/build/relations/OneToManyLargeCollection.cjs +1 -1
  498. package/build/relations/OneToManyLargeCollection.cjs.map +1 -1
  499. package/build/relations/OneToManyLargeCollection.js +1 -1
  500. package/build/relations/OneToManyLargeCollection.js.map +1 -1
  501. package/build/relations/OneToOneReference.cjs +5 -5
  502. package/build/relations/OneToOneReference.cjs.map +1 -1
  503. package/build/relations/OneToOneReference.js +5 -5
  504. package/build/relations/OneToOneReference.js.map +1 -1
  505. package/build/relations/PolymorphicReference.cjs +3 -3
  506. package/build/relations/PolymorphicReference.cjs.map +1 -1
  507. package/build/relations/PolymorphicReference.js +3 -3
  508. package/build/relations/PolymorphicReference.js.map +1 -1
  509. package/build/relations/ReactiveField.cjs +5 -6
  510. package/build/relations/ReactiveField.cjs.map +1 -1
  511. package/build/relations/ReactiveField.d.cts +2 -2
  512. package/build/relations/ReactiveField.d.mts +2 -2
  513. package/build/relations/ReactiveField.js +3 -4
  514. package/build/relations/ReactiveField.js.map +1 -1
  515. package/build/relations/ReactiveGetter.cjs +0 -1
  516. package/build/relations/ReactiveGetter.cjs.map +1 -1
  517. package/build/relations/ReactiveGetter.d.cts +1 -1
  518. package/build/relations/ReactiveGetter.d.mts +1 -1
  519. package/build/relations/ReactiveGetter.js +0 -1
  520. package/build/relations/ReactiveGetter.js.map +1 -1
  521. package/build/relations/ReactiveManyToMany.cjs +5 -6
  522. package/build/relations/ReactiveManyToMany.cjs.map +1 -1
  523. package/build/relations/ReactiveManyToMany.d.cts +2 -2
  524. package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
  525. package/build/relations/ReactiveManyToMany.d.mts +2 -2
  526. package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
  527. package/build/relations/ReactiveManyToMany.js +3 -4
  528. package/build/relations/ReactiveManyToMany.js.map +1 -1
  529. package/build/relations/ReactiveManyToManyOtherSide.cjs +1 -3
  530. package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
  531. package/build/relations/ReactiveManyToManyOtherSide.d.cts +2 -2
  532. package/build/relations/ReactiveManyToManyOtherSide.d.mts +2 -2
  533. package/build/relations/ReactiveManyToManyOtherSide.js +1 -3
  534. package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
  535. package/build/relations/ReactiveReference.cjs +8 -9
  536. package/build/relations/ReactiveReference.cjs.map +1 -1
  537. package/build/relations/ReactiveReference.d.cts +2 -2
  538. package/build/relations/ReactiveReference.d.cts.map +1 -1
  539. package/build/relations/ReactiveReference.d.mts +2 -2
  540. package/build/relations/ReactiveReference.d.mts.map +1 -1
  541. package/build/relations/ReactiveReference.js +6 -7
  542. package/build/relations/ReactiveReference.js.map +1 -1
  543. package/build/relations/ReadOnlyCollection.cjs.map +1 -1
  544. package/build/relations/ReadOnlyCollection.js.map +1 -1
  545. package/build/relations/RecursiveCollection.cjs +3 -4
  546. package/build/relations/RecursiveCollection.cjs.map +1 -1
  547. package/build/relations/RecursiveCollection.d.cts +1 -1
  548. package/build/relations/RecursiveCollection.d.mts +1 -1
  549. package/build/relations/RecursiveCollection.js +3 -4
  550. package/build/relations/RecursiveCollection.js.map +1 -1
  551. package/build/relations/RecursiveCycleError.cjs.map +1 -1
  552. package/build/relations/RecursiveCycleError.js.map +1 -1
  553. package/build/relations/Reference.cjs +1 -1
  554. package/build/relations/Reference.cjs.map +1 -1
  555. package/build/relations/Reference.js +1 -1
  556. package/build/relations/Reference.js.map +1 -1
  557. package/build/relations/Relation.cjs.map +1 -1
  558. package/build/relations/Relation.js.map +1 -1
  559. package/build/relations/hasAsyncMethod.cjs +2 -2
  560. package/build/relations/hasAsyncMethod.cjs.map +1 -1
  561. package/build/relations/hasAsyncMethod.d.cts +1 -1
  562. package/build/relations/hasAsyncMethod.d.mts +1 -1
  563. package/build/relations/hasAsyncMethod.js +1 -1
  564. package/build/relations/hasAsyncMethod.js.map +1 -1
  565. package/build/relations/hasManyDerived.cjs +3 -3
  566. package/build/relations/hasManyDerived.cjs.map +1 -1
  567. package/build/relations/hasManyDerived.d.cts +1 -1
  568. package/build/relations/hasManyDerived.d.mts +1 -1
  569. package/build/relations/hasManyDerived.js +2 -2
  570. package/build/relations/hasManyDerived.js.map +1 -1
  571. package/build/relations/hasManyThrough.cjs +6 -6
  572. package/build/relations/hasManyThrough.cjs.map +1 -1
  573. package/build/relations/hasManyThrough.d.cts +1 -1
  574. package/build/relations/hasManyThrough.d.mts +1 -1
  575. package/build/relations/hasManyThrough.js +2 -2
  576. package/build/relations/hasManyThrough.js.map +1 -1
  577. package/build/relations/hasOneDerived.cjs +3 -3
  578. package/build/relations/hasOneDerived.cjs.map +1 -1
  579. package/build/relations/hasOneDerived.d.cts +1 -1
  580. package/build/relations/hasOneDerived.d.mts +1 -1
  581. package/build/relations/hasOneDerived.js +2 -2
  582. package/build/relations/hasOneDerived.js.map +1 -1
  583. package/build/relations/hasOneThrough.cjs +7 -7
  584. package/build/relations/hasOneThrough.cjs.map +1 -1
  585. package/build/relations/hasOneThrough.d.cts +1 -1
  586. package/build/relations/hasOneThrough.d.mts +1 -1
  587. package/build/relations/hasOneThrough.js +2 -2
  588. package/build/relations/hasOneThrough.js.map +1 -1
  589. package/build/relations/hasProperty.cjs +4 -4
  590. package/build/relations/hasProperty.cjs.map +1 -1
  591. package/build/relations/hasProperty.d.cts +2 -2
  592. package/build/relations/hasProperty.d.mts +2 -2
  593. package/build/relations/hasProperty.js +2 -2
  594. package/build/relations/hasProperty.js.map +1 -1
  595. package/build/relations/index.cjs +10 -10
  596. package/build/relations/index.js +10 -10
  597. package/build/relations/isCascadeDelete.cjs.map +1 -1
  598. package/build/relations/isCascadeDelete.js.map +1 -1
  599. package/build/resurrection.cjs.map +1 -1
  600. package/build/resurrection.js.map +1 -1
  601. package/build/rules.cjs +3 -4
  602. package/build/rules.cjs.map +1 -1
  603. package/build/rules.d.cts +1 -1
  604. package/build/rules.d.mts +1 -1
  605. package/build/rules.js +3 -4
  606. package/build/rules.js.map +1 -1
  607. package/build/runtimeConfig.cjs.map +1 -1
  608. package/build/runtimeConfig.js.map +1 -1
  609. package/build/{TypeInfo.cjs → serde/TypeInfo.cjs} +1 -1
  610. package/build/serde/TypeInfo.cjs.map +1 -0
  611. package/build/{TypeInfo.d.cts → serde/TypeInfo.d.cts} +2 -2
  612. package/build/serde/TypeInfo.d.cts.map +1 -0
  613. package/build/{TypeInfo.d.mts → serde/TypeInfo.d.mts} +2 -2
  614. package/build/serde/TypeInfo.d.mts.map +1 -0
  615. package/build/{TypeInfo.js → serde/TypeInfo.js} +1 -1
  616. package/build/serde/TypeInfo.js.map +1 -0
  617. package/build/{columns.cjs → serde/columns.cjs} +1 -1
  618. package/build/serde/columns.cjs.map +1 -0
  619. package/build/{columns.d.cts → serde/columns.d.cts} +2 -2
  620. package/build/serde/columns.d.cts.map +1 -0
  621. package/build/{columns.d.mts → serde/columns.d.mts} +2 -2
  622. package/build/serde/columns.d.mts.map +1 -0
  623. package/build/{columns.js → serde/columns.js} +1 -1
  624. package/build/serde/columns.js.map +1 -0
  625. package/build/{fieldSerde.cjs → serde/fieldSerde.cjs} +6 -6
  626. package/build/serde/fieldSerde.cjs.map +1 -0
  627. package/build/{fieldSerde.d.cts → serde/fieldSerde.d.cts} +5 -5
  628. package/build/serde/fieldSerde.d.cts.map +1 -0
  629. package/build/{fieldSerde.d.mts → serde/fieldSerde.d.mts} +5 -5
  630. package/build/serde/fieldSerde.d.mts.map +1 -0
  631. package/build/{fieldSerde.js → serde/fieldSerde.js} +6 -6
  632. package/build/serde/fieldSerde.js.map +1 -0
  633. package/build/{serde.cjs → serde/serde.cjs} +25 -26
  634. package/build/serde/serde.cjs.map +1 -0
  635. package/build/{serde.d.cts → serde/serde.d.cts} +1 -1
  636. package/build/serde/serde.d.cts.map +1 -0
  637. package/build/{serde.d.mts → serde/serde.d.mts} +1 -1
  638. package/build/serde/serde.d.mts.map +1 -0
  639. package/build/{serde.js → serde/serde.js} +4 -5
  640. package/build/serde/serde.js.map +1 -0
  641. package/build/{temporal.cjs → serde/temporal.cjs} +1 -1
  642. package/build/serde/temporal.cjs.map +1 -0
  643. package/build/{temporal.d.cts → serde/temporal.d.cts} +1 -1
  644. package/build/serde/temporal.d.cts.map +1 -0
  645. package/build/{temporal.d.mts → serde/temporal.d.mts} +1 -1
  646. package/build/serde/temporal.d.mts.map +1 -0
  647. package/build/{temporal.js → serde/temporal.js} +1 -1
  648. package/build/serde/temporal.js.map +1 -0
  649. package/build/{temporalMappers.cjs → serde/temporalMappers.cjs} +4 -5
  650. package/build/serde/temporalMappers.cjs.map +1 -0
  651. package/build/{temporalMappers.d.cts → serde/temporalMappers.d.cts} +1 -1
  652. package/build/serde/temporalMappers.d.cts.map +1 -0
  653. package/build/{temporalMappers.d.mts → serde/temporalMappers.d.mts} +1 -1
  654. package/build/serde/temporalMappers.d.mts.map +1 -0
  655. package/build/{temporalMappers.js → serde/temporalMappers.js} +2 -3
  656. package/build/serde/temporalMappers.js.map +1 -0
  657. package/build/upsert.cjs +1 -1
  658. package/build/upsert.cjs.map +1 -1
  659. package/build/upsert.d.cts.map +1 -1
  660. package/build/upsert.d.mts.map +1 -1
  661. package/build/upsert.js +1 -1
  662. package/build/upsert.js.map +1 -1
  663. package/build/utils.cjs +0 -1
  664. package/build/utils.cjs.map +1 -1
  665. package/build/utils.d.cts +1 -1
  666. package/build/utils.d.mts +1 -1
  667. package/build/utils.js +0 -1
  668. package/build/utils.js.map +1 -1
  669. package/package.json +2 -2
  670. package/build/FlushLock.cjs.map +0 -1
  671. package/build/FlushLock.d.cts.map +0 -1
  672. package/build/FlushLock.d.mts.map +0 -1
  673. package/build/FlushLock.js.map +0 -1
  674. package/build/HintTree.cjs.map +0 -1
  675. package/build/HintTree.d.cts.map +0 -1
  676. package/build/HintTree.d.mts.map +0 -1
  677. package/build/HintTree.js.map +0 -1
  678. package/build/IsLoadedCache.d.cts.map +0 -1
  679. package/build/IsLoadedCache.d.mts.map +0 -1
  680. package/build/IsLoadedCache.js.map +0 -1
  681. package/build/JoinRows.cjs.map +0 -1
  682. package/build/JoinRows.d.cts.map +0 -1
  683. package/build/JoinRows.d.mts.map +0 -1
  684. package/build/JoinRows.js.map +0 -1
  685. package/build/PendingChanges.d.cts.map +0 -1
  686. package/build/PendingChanges.d.mts.map +0 -1
  687. package/build/PendingChanges.js +0 -2
  688. package/build/ReactionsManager.cjs.map +0 -1
  689. package/build/ReactionsManager.d.cts.map +0 -1
  690. package/build/ReactionsManager.d.mts.map +0 -1
  691. package/build/ReactionsManager.js.map +0 -1
  692. package/build/Todo.cjs.map +0 -1
  693. package/build/Todo.d.cts.map +0 -1
  694. package/build/Todo.d.mts.map +0 -1
  695. package/build/Todo.js.map +0 -1
  696. package/build/TypeInfo.cjs.map +0 -1
  697. package/build/TypeInfo.d.cts.map +0 -1
  698. package/build/TypeInfo.d.mts.map +0 -1
  699. package/build/TypeInfo.js.map +0 -1
  700. package/build/columns.cjs.map +0 -1
  701. package/build/columns.d.cts.map +0 -1
  702. package/build/columns.d.mts.map +0 -1
  703. package/build/columns.js.map +0 -1
  704. package/build/driverApi.cjs +0 -18
  705. package/build/driverApi.cjs.map +0 -1
  706. package/build/driverApi.d.cts +0 -22
  707. package/build/driverApi.d.cts.map +0 -1
  708. package/build/driverApi.d.mts +0 -22
  709. package/build/driverApi.d.mts.map +0 -1
  710. package/build/driverApi.js +0 -18
  711. package/build/driverApi.js.map +0 -1
  712. package/build/fieldSerde.cjs.map +0 -1
  713. package/build/fieldSerde.d.cts.map +0 -1
  714. package/build/fieldSerde.d.mts.map +0 -1
  715. package/build/fieldSerde.js.map +0 -1
  716. package/build/loadHints.cjs.map +0 -1
  717. package/build/loadHints.d.cts.map +0 -1
  718. package/build/loadHints.d.mts.map +0 -1
  719. package/build/loadHints.js.map +0 -1
  720. package/build/loadLens.cjs.map +0 -1
  721. package/build/loadLens.d.cts.map +0 -1
  722. package/build/loadLens.d.mts.map +0 -1
  723. package/build/loadLens.js.map +0 -1
  724. package/build/reactiveHints.cjs.map +0 -1
  725. package/build/reactiveHints.d.cts.map +0 -1
  726. package/build/reactiveHints.d.mts.map +0 -1
  727. package/build/reactiveHints.js.map +0 -1
  728. package/build/serde.cjs.map +0 -1
  729. package/build/serde.d.cts.map +0 -1
  730. package/build/serde.d.mts.map +0 -1
  731. package/build/serde.js.map +0 -1
  732. package/build/temporal.cjs.map +0 -1
  733. package/build/temporal.d.cts.map +0 -1
  734. package/build/temporal.d.mts.map +0 -1
  735. package/build/temporal.js.map +0 -1
  736. package/build/temporalMappers.cjs.map +0 -1
  737. package/build/temporalMappers.d.cts.map +0 -1
  738. package/build/temporalMappers.d.mts.map +0 -1
  739. package/build/temporalMappers.js.map +0 -1
  740. package/build/unnest.cjs.map +0 -1
  741. package/build/unnest.d.cts.map +0 -1
  742. package/build/unnest.d.mts.map +0 -1
  743. package/build/unnest.js.map +0 -1
  744. package/build/withLoaded.cjs.map +0 -1
  745. package/build/withLoaded.d.cts.map +0 -1
  746. package/build/withLoaded.d.mts.map +0 -1
  747. package/build/withLoaded.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Collection.cjs","names":["OneToManyCollection","ManyToManyCollection","ReactiveManyToManyImpl","ReactiveManyToManyOtherSideImpl","CustomCollection"],"sources":["../../src/relations/Collection.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf } from \"../EntityManager.ts\";\nimport {\n CustomCollection,\n ManyToManyCollection,\n OneToManyCollection,\n ReactiveManyToManyImpl,\n ReactiveManyToManyOtherSideImpl,\n type Relation,\n} from \"./index.ts\";\n\n/** A collection of `U` within `T`, either one-to-many or many-to-many. */\nexport interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {\n load(opts?: { withDeleted: boolean }): Promise<ReadonlyArray<U>>;\n\n /** Looks up the specific `id` without fully loading the collection. */\n find(id: IdOf<U>): Promise<U | undefined>;\n\n /** Looks up the specific `other` without fully loading the collection. */\n includes(other: U): Promise<boolean>;\n\n add(other: U): void;\n\n remove(other: U): void;\n\n /**\n * Sets the collection to `values`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(values: U[]): void;\n\n readonly isLoaded: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {\n get: ReadonlyArray<U>;\n\n getWithDeleted: ReadonlyArray<U>;\n\n removeAll(): void;\n}\n\n/** Type guard utility for determining if an entity field is a Collection. */\nexport function isCollection(maybeCollection: any): maybeCollection is Collection<any, any> {\n return (\n maybeCollection instanceof OneToManyCollection ||\n maybeCollection instanceof ManyToManyCollection ||\n maybeCollection instanceof ReactiveManyToManyImpl ||\n maybeCollection instanceof ReactiveManyToManyOtherSideImpl ||\n maybeCollection instanceof CustomCollection\n );\n}\n\n/** Type guard utility for determining if an entity field is a loaded Collection. */\nexport function isLoadedCollection(\n maybeCollection: any,\n): maybeCollection is Collection<any, any> & LoadedCollection<any, any> {\n return isCollection(maybeCollection) && maybeCollection.isLoaded;\n}\n"],"mappings":";;;;;;;;;;;AA6CA,SAAgB,aAAa,iBAA+D;CAC1F,OACE,2BAA2BA,sCAAAA,uBAC3B,2BAA2BC,uCAAAA,wBAC3B,2BAA2BC,qCAAAA,0BAC3B,2BAA2BC,8CAAAA,mCAC3B,2BAA2BC,mCAAAA;AAE/B;;AAGA,SAAgB,mBACd,iBACsE;CACtE,OAAO,aAAa,eAAe,KAAK,gBAAgB;AAC1D"}
1
+ {"version":3,"file":"Collection.cjs","names":["OneToManyCollection","ManyToManyCollection","ReactiveManyToManyImpl","ReactiveManyToManyOtherSideImpl","CustomCollection"],"sources":["../../src/relations/Collection.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf } from \"src/EntityManager.ts\";\nimport {\n CustomCollection,\n ManyToManyCollection,\n OneToManyCollection,\n ReactiveManyToManyImpl,\n ReactiveManyToManyOtherSideImpl,\n type Relation,\n} from \"src/relations/index.ts\";\n\n/** A collection of `U` within `T`, either one-to-many or many-to-many. */\nexport interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {\n load(opts?: { withDeleted: boolean }): Promise<ReadonlyArray<U>>;\n\n /** Looks up the specific `id` without fully loading the collection. */\n find(id: IdOf<U>): Promise<U | undefined>;\n\n /** Looks up the specific `other` without fully loading the collection. */\n includes(other: U): Promise<boolean>;\n\n add(other: U): void;\n\n remove(other: U): void;\n\n /**\n * Sets the collection to `values`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(values: U[]): void;\n\n readonly isLoaded: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {\n get: ReadonlyArray<U>;\n\n getWithDeleted: ReadonlyArray<U>;\n\n removeAll(): void;\n}\n\n/** Type guard utility for determining if an entity field is a Collection. */\nexport function isCollection(maybeCollection: any): maybeCollection is Collection<any, any> {\n return (\n maybeCollection instanceof OneToManyCollection ||\n maybeCollection instanceof ManyToManyCollection ||\n maybeCollection instanceof ReactiveManyToManyImpl ||\n maybeCollection instanceof ReactiveManyToManyOtherSideImpl ||\n maybeCollection instanceof CustomCollection\n );\n}\n\n/** Type guard utility for determining if an entity field is a loaded Collection. */\nexport function isLoadedCollection(\n maybeCollection: any,\n): maybeCollection is Collection<any, any> & LoadedCollection<any, any> {\n return isCollection(maybeCollection) && maybeCollection.isLoaded;\n}\n"],"mappings":";;;;;;;;;;;AA6CA,SAAgB,aAAa,iBAA+D;CAC1F,OACE,2BAA2BA,sCAAAA,uBAC3B,2BAA2BC,uCAAAA,wBAC3B,2BAA2BC,qCAAAA,0BAC3B,2BAA2BC,8CAAAA,mCAC3B,2BAA2BC,mCAAAA;AAE/B;;AAGA,SAAgB,mBACd,iBACsE;CACtE,OAAO,aAAa,eAAe,KAAK,gBAAgB;AAC1D"}
@@ -1,6 +1,6 @@
1
- import { OneToManyCollection } from "./OneToManyCollection.js";
2
1
  import { CustomCollection } from "./CustomCollection.js";
3
2
  import { ManyToManyCollection } from "./ManyToManyCollection.js";
3
+ import { OneToManyCollection } from "./OneToManyCollection.js";
4
4
  import { ReactiveManyToManyImpl } from "./ReactiveManyToMany.js";
5
5
  import { ReactiveManyToManyOtherSideImpl } from "./ReactiveManyToManyOtherSide.js";
6
6
  import "./index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Collection.js","names":[],"sources":["../../src/relations/Collection.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf } from \"../EntityManager.ts\";\nimport {\n CustomCollection,\n ManyToManyCollection,\n OneToManyCollection,\n ReactiveManyToManyImpl,\n ReactiveManyToManyOtherSideImpl,\n type Relation,\n} from \"./index.ts\";\n\n/** A collection of `U` within `T`, either one-to-many or many-to-many. */\nexport interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {\n load(opts?: { withDeleted: boolean }): Promise<ReadonlyArray<U>>;\n\n /** Looks up the specific `id` without fully loading the collection. */\n find(id: IdOf<U>): Promise<U | undefined>;\n\n /** Looks up the specific `other` without fully loading the collection. */\n includes(other: U): Promise<boolean>;\n\n add(other: U): void;\n\n remove(other: U): void;\n\n /**\n * Sets the collection to `values`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(values: U[]): void;\n\n readonly isLoaded: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {\n get: ReadonlyArray<U>;\n\n getWithDeleted: ReadonlyArray<U>;\n\n removeAll(): void;\n}\n\n/** Type guard utility for determining if an entity field is a Collection. */\nexport function isCollection(maybeCollection: any): maybeCollection is Collection<any, any> {\n return (\n maybeCollection instanceof OneToManyCollection ||\n maybeCollection instanceof ManyToManyCollection ||\n maybeCollection instanceof ReactiveManyToManyImpl ||\n maybeCollection instanceof ReactiveManyToManyOtherSideImpl ||\n maybeCollection instanceof CustomCollection\n );\n}\n\n/** Type guard utility for determining if an entity field is a loaded Collection. */\nexport function isLoadedCollection(\n maybeCollection: any,\n): maybeCollection is Collection<any, any> & LoadedCollection<any, any> {\n return isCollection(maybeCollection) && maybeCollection.isLoaded;\n}\n"],"mappings":";;;;;;;;;;AA6CA,SAAgB,aAAa,iBAA+D;CAC1F,OACE,2BAA2B,uBAC3B,2BAA2B,wBAC3B,2BAA2B,0BAC3B,2BAA2B,mCAC3B,2BAA2B;AAE/B;;AAGA,SAAgB,mBACd,iBACsE;CACtE,OAAO,aAAa,eAAe,KAAK,gBAAgB;AAC1D"}
1
+ {"version":3,"file":"Collection.js","names":[],"sources":["../../src/relations/Collection.ts"],"sourcesContent":["import { type Entity } from \"src/Entity.ts\";\nimport { type IdOf } from \"src/EntityManager.ts\";\nimport {\n CustomCollection,\n ManyToManyCollection,\n OneToManyCollection,\n ReactiveManyToManyImpl,\n ReactiveManyToManyOtherSideImpl,\n type Relation,\n} from \"src/relations/index.ts\";\n\n/** A collection of `U` within `T`, either one-to-many or many-to-many. */\nexport interface Collection<T extends Entity, U extends Entity> extends Relation<T, U> {\n load(opts?: { withDeleted: boolean }): Promise<ReadonlyArray<U>>;\n\n /** Looks up the specific `id` without fully loading the collection. */\n find(id: IdOf<U>): Promise<U | undefined>;\n\n /** Looks up the specific `other` without fully loading the collection. */\n includes(other: U): Promise<boolean>;\n\n add(other: U): void;\n\n remove(other: U): void;\n\n /**\n * Sets the collection to `values`.\n *\n * Can be called on unloaded collections - the diff will be resolved at load or flush time.\n */\n set(values: U[]): void;\n\n readonly isLoaded: boolean;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedCollection<T extends Entity, U extends Entity> extends Collection<T, U> {\n get: ReadonlyArray<U>;\n\n getWithDeleted: ReadonlyArray<U>;\n\n removeAll(): void;\n}\n\n/** Type guard utility for determining if an entity field is a Collection. */\nexport function isCollection(maybeCollection: any): maybeCollection is Collection<any, any> {\n return (\n maybeCollection instanceof OneToManyCollection ||\n maybeCollection instanceof ManyToManyCollection ||\n maybeCollection instanceof ReactiveManyToManyImpl ||\n maybeCollection instanceof ReactiveManyToManyOtherSideImpl ||\n maybeCollection instanceof CustomCollection\n );\n}\n\n/** Type guard utility for determining if an entity field is a loaded Collection. */\nexport function isLoadedCollection(\n maybeCollection: any,\n): maybeCollection is Collection<any, any> & LoadedCollection<any, any> {\n return isCollection(maybeCollection) && maybeCollection.isLoaded;\n}\n"],"mappings":";;;;;;;;;;AA6CA,SAAgB,aAAa,iBAA+D;CAC1F,OACE,2BAA2B,uBAC3B,2BAA2B,wBAC3B,2BAA2B,0BAC3B,2BAA2B,mCAC3B,2BAA2B;AAE/B;;AAGA,SAAgB,mBACd,iBACsE;CACtE,OAAO,aAAa,eAAe,KAAK,gBAAgB;AAC1D"}
@@ -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 \"../Entity.ts\";\nimport { type IdOf, getEmInternalApi } from \"../EntityManager.ts\";\nimport { type Collection, type LoadHint, ensureNotDeleted, fail } from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"./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","#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,7 +1,7 @@
1
1
  import { Collection } from "./Collection.cjs";
2
2
  import { AbstractRelationImpl } from "./AbstractRelationImpl.cjs";
3
3
  import { RelationT, RelationU } from "./RelationSymbols.cjs";
4
- import { LoadHint } from "../loadHints.cjs";
4
+ import { LoadHint } from "../loading/loadHints.cjs";
5
5
  import "../index.cjs";
6
6
  import { IdOf } from "../EntityManager.cjs";
7
7
  import { Entity } from "../Entity.cjs";
@@ -1,7 +1,7 @@
1
1
  import { Collection } from "./Collection.mjs";
2
2
  import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
3
3
  import { RelationT, RelationU } from "./RelationSymbols.mjs";
4
- import { LoadHint } from "../loadHints.mjs";
4
+ import { LoadHint } from "../loading/loadHints.mjs";
5
5
  import "../index.mjs";
6
6
  import { IdOf } from "../EntityManager.mjs";
7
7
  import { Entity } from "../Entity.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"CustomCollection.js","names":["#isLoaded","#loadHint","#hasBeenSet"],"sources":["../../src/relations/CustomCollection.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf, getEmInternalApi } from \"../EntityManager.ts\";\nimport { type Collection, type LoadHint, ensureNotDeleted, fail } from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"./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":["#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":"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"}
@@ -3,8 +3,8 @@ const require_relations_AbstractRelationImpl = require("./AbstractRelationImpl.c
3
3
  const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
4
4
  const require_relations_ReferenceSymbols = require("./ReferenceSymbols.cjs");
5
5
  const require_utils = require("../utils.cjs");
6
- const require_getProperties = require("../getProperties.cjs");
7
6
  const require_newEntity = require("../newEntity.cjs");
7
+ const require_getProperties = require("../getProperties.cjs");
8
8
  const require_EntityMetadata = require("../EntityMetadata.cjs");
9
9
  const require_index = require("../index.cjs");
10
10
  const require_EntityManager = require("../EntityManager.cjs");
@@ -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 \"../Entity.ts\";\nimport { type IdOf, type TaggedId, getEmInternalApi } from \"../EntityManager.ts\";\nimport { type LoadHint, type Reference, ensureNotDeleted, fail, getMetadata, getProperties } from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./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","#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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"}
@@ -2,7 +2,7 @@ import { AbstractRelationImpl } from "./AbstractRelationImpl.cjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.cjs";
3
3
  import { ReferenceN } from "./ReferenceSymbols.cjs";
4
4
  import { Reference } from "./Reference.cjs";
5
- import { LoadHint } from "../loadHints.cjs";
5
+ import { LoadHint } from "../loading/loadHints.cjs";
6
6
  import "../index.cjs";
7
7
  import { IdOf, TaggedId } from "../EntityManager.cjs";
8
8
  import { Entity } from "../Entity.cjs";
@@ -2,7 +2,7 @@ import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.mjs";
3
3
  import { ReferenceN } from "./ReferenceSymbols.mjs";
4
4
  import { Reference } from "./Reference.mjs";
5
- import { LoadHint } from "../loadHints.mjs";
5
+ import { LoadHint } from "../loading/loadHints.mjs";
6
6
  import "../index.mjs";
7
7
  import { IdOf, TaggedId } from "../EntityManager.mjs";
8
8
  import { Entity } from "../Entity.mjs";
@@ -2,8 +2,8 @@ import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.js";
3
3
  import { ReferenceN } from "./ReferenceSymbols.js";
4
4
  import { fail } from "../utils.js";
5
- import { getProperties } from "../getProperties.js";
6
5
  import { lazyField } from "../newEntity.js";
6
+ import { getProperties } from "../getProperties.js";
7
7
  import { getMetadata } from "../EntityMetadata.js";
8
8
  import { ensureNotDeleted } from "../index.js";
9
9
  import { getEmInternalApi } from "../EntityManager.js";
@@ -1 +1 @@
1
- {"version":3,"file":"CustomReference.js","names":["#isLoaded","#loadHint","#hasBeenSet"],"sources":["../../src/relations/CustomReference.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf, type TaggedId, getEmInternalApi } from \"../EntityManager.ts\";\nimport { type LoadHint, type Reference, ensureNotDeleted, fail, getMetadata, getProperties } from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./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":["#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 +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 {\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 \"..//index.ts\";\nimport { enumCollectionBatchLoader } from \"../batchloaders/enumCollectionBatchLoader.ts\";\nimport { type EnumMetadata } from \"../EnumMetadata.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { remove } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.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","#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,7 +1,7 @@
1
1
  import { AbstractRelationImpl } from "./AbstractRelationImpl.cjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.cjs";
3
3
  import { EnumMetadata } from "../EnumMetadata.cjs";
4
- import { ManyToManyLike } from "../JoinRows.cjs";
4
+ import { ManyToManyLike } from "../flush/JoinRows.cjs";
5
5
  import { EntityMetadata, ManyToManyEnumField } from "../EntityMetadata.cjs";
6
6
  import "../index.cjs";
7
7
  import { Entity } from "../Entity.cjs";
@@ -1,7 +1,7 @@
1
1
  import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.mjs";
3
3
  import { EnumMetadata } from "../EnumMetadata.mjs";
4
- import { ManyToManyLike } from "../JoinRows.mjs";
4
+ import { ManyToManyLike } from "../flush/JoinRows.mjs";
5
5
  import { EntityMetadata, ManyToManyEnumField } from "../EntityMetadata.mjs";
6
6
  import "../index.mjs";
7
7
  import { Entity } from "../Entity.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"EnumCollection.js","names":["#field","#loaded","#getPreloaded","#loadPromise","#pendingSet","#applySet","#joinRows","#idOf","#hasBeenSet","#codesFor"],"sources":["../../src/relations/EnumCollection.ts"],"sourcesContent":["import {\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 \"..//index.ts\";\nimport { enumCollectionBatchLoader } from \"../batchloaders/enumCollectionBatchLoader.ts\";\nimport { type EnumMetadata } from \"../EnumMetadata.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { remove } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.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.js","names":["#field","#loaded","#getPreloaded","#loadPromise","#pendingSet","#applySet","#joinRows","#idOf","#hasBeenSet","#codesFor"],"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,14 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("../batchloaders/BatchLoader.cjs");
3
- const require_fields = require("../fields.cjs");
4
3
  const require_relations_AbstractPropertyImpl = require("./AbstractPropertyImpl.cjs");
5
- const require_queries_sql_keywords = require("../queries/sql/keywords.cjs");
6
- const require_RowData = require("../RowData.cjs");
7
4
  const require_relations_PropertySymbols = require("./PropertySymbols.cjs");
8
5
  require("./hasProperty.cjs");
6
+ const require_fields = require("../fields.cjs");
7
+ const require_keys = require("../keys.cjs");
8
+ const require_queries_sql_keywords = require("../queries/sql/keywords.cjs");
9
+ const require_RowData = require("../RowData.cjs");
9
10
  const require_utils = require("../utils.cjs");
10
11
  const require_newEntity = require("../newEntity.cjs");
11
- const require_keys = require("../keys.cjs");
12
12
  const require_EntityMetadata = require("../EntityMetadata.cjs");
13
13
  require("../EntityManager.cjs");
14
14
  require("../Entity.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"LazyField.cjs","names":["lazyField","AbstractPropertyImpl","#fieldName","#loaded","#loadPromise","#value","getMetadata","getInstanceData","PropertyT","abbreviation","keyToNumber","kqDot","PojoRowData","tagId"],"sources":["../../src/relations/LazyField.ts"],"sourcesContent":["import { getInstanceData } from \"../BaseEntity.ts\";\nimport { type BatchLoader } from \"../batchloaders/BatchLoader.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport { type EntityManager } from \"../EntityManager.ts\";\nimport { type EntityMetadata, type PrimitiveField, getMetadata } from \"../EntityMetadata.ts\";\nimport { setField } from \"../fields.ts\";\nimport { keyToNumber, tagId } from \"../keys.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport type { ParsedFindQuery } from \"../queries/find/QueryParser.ts\";\nimport { kqDot } from \"../queries/sql/keywords.ts\";\nimport { PojoRowData } from \"../RowData.ts\";\nimport { abbreviation } from \"../utils.ts\";\nimport { AbstractPropertyImpl } from \"./AbstractPropertyImpl.ts\";\nimport { type LoadedProperty, type Property } from \"./hasProperty.ts\";\nimport { PropertyT } from \"./PropertySymbols.ts\";\n\nexport const lazyColumnLoadOperation = \"lazy-column-load\";\n\n/**\n * The \"original value\" of an unloaded lazy column: unknown, and never equal to any set value.\n *\n * Seeded into `__orm.data` by `LazyFieldImpl.set` so that setting an unloaded column (even to\n * `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`\n * that the excluded column would otherwise read as.\n */\nexport const notLoadedValue = Symbol(\"notLoadedValue\");\n\n/**\n * A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the\n * entity's default SELECT and only fetched from the database on demand.\n *\n * I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.\n */\nexport interface LazyField<T extends Entity, V> extends Property<T, V> {\n load(opts?: { forceReload?: boolean }): Promise<V>;\n /** Sets the value in memory (dirtied for the next flush), i.e. without loading the current db value first. */\n set(value: V): void;\n}\n\n/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */\nexport function hasLazyField<T extends Entity, V>(): LazyField<T, V> {\n return lazyField((entity: T, fieldName: string) => new LazyFieldImpl<T, V>(entity, fieldName));\n}\n\nexport class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {\n #fieldName: string;\n #loaded = false;\n #loadPromise: Promise<V> | undefined;\n\n constructor(entity: T, fieldName: string) {\n super(entity);\n this.#fieldName = fieldName;\n }\n\n /** Fetches this column from the database (batched across peers) and caches it on the entity. */\n load(opts?: { forceReload?: boolean }): Promise<V> {\n const { entity } = this;\n if (opts?.forceReload) {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n if (this.isLoaded) return Promise.resolve(this.#value);\n const meta = getMetadata(entity);\n return (this.#loadPromise ??= lazyColumnBatchLoader(entity.em, meta, this.#fieldName)\n .load(entity.idTagged)\n .then(() => {\n this.#loaded = true;\n return this.#value;\n }));\n }\n\n get get(): V {\n if (!this.isLoaded) {\n throw new Error(`${this.#fieldName} has not been loaded yet, use '.load()' or an 'em.populate' hint`);\n }\n return this.#value;\n }\n\n /** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */\n set(value: V): void {\n if (this.isLoaded) {\n setField(this.entity, this.#fieldName, value);\n } else {\n // Seed `notLoadedValue` as the current value so the set always registers as a change against\n // the unknown db value: an unloaded column otherwise reads as `undefined`, which would make\n // `set(undefined)` a silent no-op, and a later `set(undefined)` falsely revert to clean.\n const { data } = getInstanceData(this.entity);\n data[this.#fieldName] = notLoadedValue;\n try {\n setField(this.entity, this.#fieldName, value);\n } catch (e) {\n // Don't leak the marker as a readable value, i.e. if setting on a deleted entity throws\n delete data[this.#fieldName];\n throw e;\n }\n }\n this.#loaded = true;\n }\n\n get isLoaded(): boolean {\n // New entities keep their value in-memory, so there's nothing to lazy-load.\n if (getInstanceData(this.entity).isOrWasNew) return true;\n return this.#loaded;\n }\n\n /** Called after em.flush to invalidate the cached value, since the db state may have changed. */\n resetAfterFlush(): void {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n\n /** The domain value, which `load`/`set` keep in the entity's `__orm.data` like any other column. */\n get #value(): V {\n return getInstanceData(this.entity).data[this.#fieldName] as V;\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is a LazyField. */\nexport function isLazyField(maybe: any): maybe is LazyField<any, any> {\n return maybe instanceof LazyFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded LazyField. */\nexport function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any> {\n return isLazyField(maybe) && maybe.isLoaded;\n}\n\n/** Batches `LazyField.load`s for the same column into a single `SELECT id, <column> ... WHERE id IN (...)`. */\nfunction lazyColumnBatchLoader(em: EntityManager, meta: EntityMetadata, fieldName: string): BatchLoader<string> {\n return em.getBatchLoader(lazyColumnLoadOperation, `${meta.tableName}-${fieldName}`, async (taggedIds) => {\n const field = meta.allFields[fieldName] as PrimitiveField;\n const column = field.serde.columns[0];\n const alias = abbreviation(meta.tableName);\n const keys = taggedIds.map((id) => keyToNumber(meta, id));\n const query: ParsedFindQuery = {\n selects: [`${kqDot(alias, \"id\")} as id`, kqDot(alias, column.columnName)],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: {\n kind: \"exp\",\n op: \"and\",\n conditions: [{ kind: \"column\", alias, column: \"id\", dbType: meta.idDbType, cond: { kind: \"in\", value: keys } }],\n },\n orderBys: [],\n };\n const rows = await em[\"executeFind\"](meta, lazyColumnLoadOperation, query, {});\n const rowData = new PojoRowData(rows);\n for (let i = 0; i < rows.length; i++) {\n const entity = em.findExistingInstance(tagId(meta, rows[i].id));\n if (entity) getInstanceData(entity).data[fieldName] = field.serde.fromRow(rowData, i);\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LazyField.cjs","names":["lazyField","AbstractPropertyImpl","#fieldName","#loaded","#loadPromise","#value","getMetadata","getInstanceData","PropertyT","abbreviation","keyToNumber","kqDot","PojoRowData","tagId"],"sources":["../../src/relations/LazyField.ts"],"sourcesContent":["import { getInstanceData } from \"src/BaseEntity.ts\";\nimport { type BatchLoader } from \"src/batchloaders/BatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityManager } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, type PrimitiveField, getMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport { keyToNumber, tagId } from \"src/keys.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport type { ParsedFindQuery } from \"src/queries/find/QueryParser.ts\";\nimport { kqDot } from \"src/queries/sql/keywords.ts\";\nimport { AbstractPropertyImpl } from \"src/relations/AbstractPropertyImpl.ts\";\nimport { type LoadedProperty, type Property } from \"src/relations/hasProperty.ts\";\nimport { PropertyT } from \"src/relations/PropertySymbols.ts\";\nimport { PojoRowData } from \"src/RowData.ts\";\nimport { abbreviation } from \"src/utils.ts\";\n\nexport const lazyColumnLoadOperation = \"lazy-column-load\";\n\n/**\n * The \"original value\" of an unloaded lazy column: unknown, and never equal to any set value.\n *\n * Seeded into `__orm.data` by `LazyFieldImpl.set` so that setting an unloaded column (even to\n * `undefined`) always registers as a change, i.e. instead of comparing equal to the `undefined`\n * that the excluded column would otherwise read as.\n */\nexport const notLoadedValue = Symbol(\"notLoadedValue\");\n\n/**\n * A single-column primitive (i.e. a large `jsonb`/`text`) that is deliberately excluded from the\n * entity's default SELECT and only fetched from the database on demand.\n *\n * I.e. `await author.someBigColumn.load()`, or synchronously via `.get` after `em.populate`.\n */\nexport interface LazyField<T extends Entity, V> extends Property<T, V> {\n load(opts?: { forceReload?: boolean }): Promise<V>;\n /** Sets the value in memory (dirtied for the next flush), i.e. without loading the current db value first. */\n set(value: V): void;\n}\n\n/** Creates a `LazyField` for a column that codegen has marked `lazy: true`. */\nexport function hasLazyField<T extends Entity, V>(): LazyField<T, V> {\n return lazyField((entity: T, fieldName: string) => new LazyFieldImpl<T, V>(entity, fieldName));\n}\n\nexport class LazyFieldImpl<T extends Entity, V> extends AbstractPropertyImpl<T> implements LazyField<T, V> {\n #fieldName: string;\n #loaded = false;\n #loadPromise: Promise<V> | undefined;\n\n constructor(entity: T, fieldName: string) {\n super(entity);\n this.#fieldName = fieldName;\n }\n\n /** Fetches this column from the database (batched across peers) and caches it on the entity. */\n load(opts?: { forceReload?: boolean }): Promise<V> {\n const { entity } = this;\n if (opts?.forceReload) {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n if (this.isLoaded) return Promise.resolve(this.#value);\n const meta = getMetadata(entity);\n return (this.#loadPromise ??= lazyColumnBatchLoader(entity.em, meta, this.#fieldName)\n .load(entity.idTagged)\n .then(() => {\n this.#loaded = true;\n return this.#value;\n }));\n }\n\n get get(): V {\n if (!this.isLoaded) {\n throw new Error(`${this.#fieldName} has not been loaded yet, use '.load()' or an 'em.populate' hint`);\n }\n return this.#value;\n }\n\n /** Sets the value in memory; the column is dirtied and written on the next `em.flush`. */\n set(value: V): void {\n if (this.isLoaded) {\n setField(this.entity, this.#fieldName, value);\n } else {\n // Seed `notLoadedValue` as the current value so the set always registers as a change against\n // the unknown db value: an unloaded column otherwise reads as `undefined`, which would make\n // `set(undefined)` a silent no-op, and a later `set(undefined)` falsely revert to clean.\n const { data } = getInstanceData(this.entity);\n data[this.#fieldName] = notLoadedValue;\n try {\n setField(this.entity, this.#fieldName, value);\n } catch (e) {\n // Don't leak the marker as a readable value, i.e. if setting on a deleted entity throws\n delete data[this.#fieldName];\n throw e;\n }\n }\n this.#loaded = true;\n }\n\n get isLoaded(): boolean {\n // New entities keep their value in-memory, so there's nothing to lazy-load.\n if (getInstanceData(this.entity).isOrWasNew) return true;\n return this.#loaded;\n }\n\n /** Called after em.flush to invalidate the cached value, since the db state may have changed. */\n resetAfterFlush(): void {\n this.#loaded = false;\n this.#loadPromise = undefined;\n }\n\n /** The domain value, which `load`/`set` keep in the entity's `__orm.data` like any other column. */\n get #value(): V {\n return getInstanceData(this.entity).data[this.#fieldName] as V;\n }\n\n [PropertyT] = undefined as any as T;\n}\n\n/** Type guard utility for determining if an entity field is a LazyField. */\nexport function isLazyField(maybe: any): maybe is LazyField<any, any> {\n return maybe instanceof LazyFieldImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded LazyField. */\nexport function isLoadedLazyField(maybe: any): maybe is LazyField<any, any> & LoadedProperty<any, any> {\n return isLazyField(maybe) && maybe.isLoaded;\n}\n\n/** Batches `LazyField.load`s for the same column into a single `SELECT id, <column> ... WHERE id IN (...)`. */\nfunction lazyColumnBatchLoader(em: EntityManager, meta: EntityMetadata, fieldName: string): BatchLoader<string> {\n return em.getBatchLoader(lazyColumnLoadOperation, `${meta.tableName}-${fieldName}`, async (taggedIds) => {\n const field = meta.allFields[fieldName] as PrimitiveField;\n const column = field.serde.columns[0];\n const alias = abbreviation(meta.tableName);\n const keys = taggedIds.map((id) => keyToNumber(meta, id));\n const query: ParsedFindQuery = {\n selects: [`${kqDot(alias, \"id\")} as id`, kqDot(alias, column.columnName)],\n tables: [{ alias, join: \"primary\", table: meta.tableName }],\n condition: {\n kind: \"exp\",\n op: \"and\",\n conditions: [{ kind: \"column\", alias, column: \"id\", dbType: meta.idDbType, cond: { kind: \"in\", value: keys } }],\n },\n orderBys: [],\n };\n const rows = await em[\"executeFind\"](meta, lazyColumnLoadOperation, query, {});\n const rowData = new PojoRowData(rows);\n for (let i = 0; i < rows.length; i++) {\n const entity = em.findExistingInstance(tagId(meta, rows[i].id));\n if (entity) getInstanceData(entity).data[fieldName] = field.serde.fromRow(rowData, i);\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAa,0BAA0B;;;;;;;;AASvC,MAAa,iBAAiB,OAAO,gBAAgB;;AAerD,SAAgB,eAAqD;CACnE,OAAOA,kBAAAA,WAAW,QAAW,cAAsB,IAAI,cAAoB,QAAQ,SAAS,CAAC;AAC/F;AAEA,IAAa,gBAAb,cAAwDC,uCAAAA,qBAAmD;CACzG;CACA,UAAU;CACV;CAEA,YAAY,QAAW,WAAmB;EACxC,MAAM,MAAM;EACZ,KAAKC,aAAa;CACpB;;CAGA,KAAK,MAA8C;EACjD,MAAM,EAAE,WAAW;EACnB,IAAI,MAAM,aAAa;GACrB,KAAKC,UAAU;GACf,KAAKC,eAAe,KAAA;EACtB;EACA,IAAI,KAAK,UAAU,OAAO,QAAQ,QAAQ,KAAKC,MAAM;EACrD,MAAM,OAAOC,uBAAAA,YAAY,MAAM;EAC/B,OAAQ,KAAKF,iBAAiB,sBAAsB,OAAO,IAAI,MAAM,KAAKF,UAAU,CAAC,CAClF,KAAK,OAAO,QAAQ,CAAC,CACrB,WAAW;GACV,KAAKC,UAAU;GACf,OAAO,KAAKE;EACd,CAAC;CACL;CAEA,IAAI,MAAS;EACX,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,GAAG,KAAKH,WAAW,iEAAiE;EAEtG,OAAO,KAAKG;CACd;;CAGA,IAAI,OAAgB;EAClB,IAAI,KAAK,UACP,eAAA,SAAS,KAAK,QAAQ,KAAKH,YAAY,KAAK;OACvC;GAIL,MAAM,EAAE,SAASK,mBAAAA,gBAAgB,KAAK,MAAM;GAC5C,KAAK,KAAKL,cAAc;GACxB,IAAI;IACF,eAAA,SAAS,KAAK,QAAQ,KAAKA,YAAY,KAAK;GAC9C,SAAS,GAAG;IAEV,OAAO,KAAK,KAAKA;IACjB,MAAM;GACR;EACF;EACA,KAAKC,UAAU;CACjB;CAEA,IAAI,WAAoB;EAEtB,IAAII,mBAAAA,gBAAgB,KAAK,MAAM,CAAC,CAAC,YAAY,OAAO;EACpD,OAAO,KAAKJ;CACd;;CAGA,kBAAwB;EACtB,KAAKA,UAAU;EACf,KAAKC,eAAe,KAAA;CACtB;;CAGA,IAAIC,SAAY;EACd,OAAOE,mBAAAA,gBAAgB,KAAK,MAAM,CAAC,CAAC,KAAK,KAAKL;CAChD;CAEA,CAACM,kCAAAA,aAAa,KAAA;AAChB;;AAGA,SAAgB,YAAY,OAA0C;CACpE,OAAO,iBAAiB;AAC1B;;AAGA,SAAgB,kBAAkB,OAAqE;CACrG,OAAO,YAAY,KAAK,KAAK,MAAM;AACrC;;AAGA,SAAS,sBAAsB,IAAmB,MAAsB,WAAwC;CAC9G,OAAO,GAAG,eAAe,yBAAyB,GAAG,KAAK,UAAU,GAAG,aAAa,OAAO,cAAc;EACvG,MAAM,QAAQ,KAAK,UAAU;EAC7B,MAAM,SAAS,MAAM,MAAM,QAAQ;EACnC,MAAM,QAAQC,cAAAA,aAAa,KAAK,SAAS;EACzC,MAAM,OAAO,UAAU,KAAK,OAAOC,aAAAA,YAAY,MAAM,EAAE,CAAC;EACxD,MAAM,QAAyB;GAC7B,SAAS,CAAC,GAAGC,6BAAAA,MAAM,OAAO,IAAI,EAAE,SAASA,6BAAAA,MAAM,OAAO,OAAO,UAAU,CAAC;GACxE,QAAQ,CAAC;IAAE;IAAO,MAAM;IAAW,OAAO,KAAK;GAAU,CAAC;GAC1D,WAAW;IACT,MAAM;IACN,IAAI;IACJ,YAAY,CAAC;KAAE,MAAM;KAAU;KAAO,QAAQ;KAAM,QAAQ,KAAK;KAAU,MAAM;MAAE,MAAM;MAAM,OAAO;KAAK;IAAE,CAAC;GAChH;GACA,UAAU,CAAC;EACb;EACA,MAAM,OAAO,MAAM,GAAG,cAAc,CAAC,MAAM,yBAAyB,OAAO,CAAC,CAAC;EAC7E,MAAM,UAAU,IAAIC,gBAAAA,YAAY,IAAI;EACpC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,SAAS,GAAG,qBAAqBC,aAAAA,MAAM,MAAM,KAAK,EAAE,CAAC,EAAE,CAAC;GAC9D,IAAI,QAAQ,mBAAA,gBAAgB,MAAM,CAAC,CAAC,KAAK,aAAa,MAAM,MAAM,QAAQ,SAAS,CAAC;EACtF;CACF,CAAC;AACH"}
@@ -1,13 +1,13 @@
1
1
  import "../batchloaders/BatchLoader.js";
2
- import { setField } from "../fields.js";
3
2
  import { AbstractPropertyImpl } from "./AbstractPropertyImpl.js";
4
- import { kqDot } from "../queries/sql/keywords.js";
5
- import { PojoRowData } from "../RowData.js";
6
3
  import { PropertyT } from "./PropertySymbols.js";
7
4
  import "./hasProperty.js";
5
+ import { setField } from "../fields.js";
6
+ import { keyToNumber, tagId } from "../keys.js";
7
+ import { kqDot } from "../queries/sql/keywords.js";
8
+ import { PojoRowData } from "../RowData.js";
8
9
  import { abbreviation } from "../utils.js";
9
10
  import { lazyField } from "../newEntity.js";
10
- import { keyToNumber, tagId } from "../keys.js";
11
11
  import { getMetadata } from "../EntityMetadata.js";
12
12
  import "../EntityManager.js";
13
13
  import "../Entity.js";