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":"OneToManyCollection.js","names":["#field","#state","#loadPromise","#getSorted","#allSorted","#o2m","#added","#removed","#pendingValues","#percolate","#loaded","#hasBeenSet"],"sources":["../../src/relations/OneToManyCollection.ts"],"sourcesContent":["import { oneToManyBatchLoader } from \"../batchloaders/oneToManyBatchLoader.ts\";\nimport { oneToManyFindDataLoader } from \"../dataloaders/oneToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type OneToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n maybeResolveReferenceToId,\n sameEntity,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { compareValues } from \"../utils.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { type ManyToOneReferenceImpl } from \"./ManyToOneReference.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `OneToManyCollection`s. */\nexport function hasMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as OneToManyField;\n return new OneToManyCollection(entity, field);\n });\n}\n\nexport class OneToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>, IsLoadedCachable\n{\n readonly #field: OneToManyField;\n #state: O2MState<T, U>;\n #loadPromise: any;\n // Constantly filtering+sorting our `.get` values can be surprisingly expensive if called\n // when processing many entities/writing code that calls it repeatedly, so we cache it\n // both the \"without deleted\" default (`getSorted`) and \"all deleted\" (`allSorted`).\n #getSorted: U[] | undefined;\n #allSorted: U[] | undefined;\n\n constructor(entity: T, field: OneToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n } else {\n const { em } = entity;\n // If any m2o.set(ourId) were made before our entity was loaded, pull in those changes\n const pending = getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.get(this.fieldName);\n if (pending) {\n this.#state = new O2MUnloadedAddedRemovedState<T, U>(this, pending.adds as U[], pending.removes as U[]);\n getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.delete(this.fieldName);\n } else {\n this.#state = new O2MUnloadedPristineState<T, U>(this);\n }\n }\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const maybePreloaded = this.getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= oneToManyBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err as Error, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n return opts?.withDeleted ? this.getWithDeleted : this.get;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.getOtherRelation(other).current());\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n }\n\n /** Copy another em's `source` collection into our state. */\n import(source: OneToManyCollection<T, U>, findEntity: (e: U) => U): void {\n this.#state = source.#state.import(this, findEntity);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // todo: this only be a readonly U[]\n get get(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#getSorted !== undefined) return this.#getSorted;\n this.#getSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: false })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#getSorted;\n }\n\n get getWithDeleted(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#allSorted !== undefined) return this.#allSorted;\n this.#allSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: true })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#allSorted;\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n add(other: U): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other);\n this.percolateAdd(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n remove(other: U, opts: { requireLoaded: boolean } = { requireLoaded: true }) {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, opts);\n this.percolateRemove(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // internal impl\n\n /** @internal */\n percolateAdd(other: U): void {\n this.getOtherRelation(other).set(this.entity);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n this.getOtherRelation(other).set(undefined);\n }\n\n /** @internal */\n registerAsMutated(): void {\n getEmInternalApi(this.entity.em).mutatedCollections.add(this);\n }\n\n setFromOpts(others: U[]): void {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n removeIfLoaded(other: U) {\n this.#state = this.#state.removeIfLoaded(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));\n }\n }\n\n // We already unhooked all children in our addedBeforeLoaded list; now load the full list if necessary.\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n current.forEach((other) => {\n const m2o = this.getOtherRelation(other);\n if (maybeResolveReferenceToId(m2o.current({ withDeleted: true })) === this.entity.idMaybe) {\n m2o.set(undefined);\n }\n });\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n public get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n public get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n current(opts?: { withDeleted?: boolean }): U[] {\n return this.filterDeleted(this.#state.current(), opts);\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n public toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Called after `em.flush` to reset our dirty tracking. */\n public resetAddedRemoved(): void {\n this.#state.resetAddedRemoved();\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n const list =\n opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n if (this.#field.orderBy) {\n const { field, direction } = this.#field.orderBy;\n list.sort((a, b) => compareValues((a as any)[field], (b as any)[field], direction));\n }\n return list;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n // Exposed for changes\n added(): U[] {\n return this.#state.added();\n }\n\n removed(): U[] {\n return this.#state.removed();\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for OneToManyCollection state machine.\n *\n * States handle only data tracking — side effects (percolation, mutation registration)\n * are handled by the collection methods that call into these states.\n *\n * State transitions:\n * ```\n * Constructor (new entity) → Loaded (empty [])\n * Constructor (existing entity) → UnloadedPristine\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + load/preload → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + load/preload → Loaded (merges adds/removes)\n *\n * PendingSet + add/remove → PendingSet (self)\n * PendingSet + set → PendingSet (self, replace)\n * PendingSet + load/preload → Loaded (diffs pending vs DB)\n *\n * Loaded + forceReload → Loaded (refreshed, re-merges pending)\n * ```\n */\ninterface O2MState<T extends Entity, U extends Entity> {\n add(other: U): O2MState<T, U>;\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U>;\n removeIfLoaded(other: U): O2MState<T, U>;\n set(values: readonly U[]): O2MState<T, U>;\n doGet(): U[];\n find(id: IdOf<U>): U | undefined;\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U>;\n current(): U[];\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n added(): U[];\n removed(): U[];\n resetAddedRemoved(): void;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass O2MUnloadedPristineState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n\n constructor(o2m: OneToManyCollection<T, U>) {\n this.#o2m = o2m;\n }\n\n add(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [other], []);\n }\n\n remove(_other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [_other]);\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [other]);\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n return new O2MLoadedState<T, U>(this.#o2m, dbEntities, false);\n }\n\n current(): U[] {\n return [];\n }\n\n import(target: OneToManyCollection<T, U>, _findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedPristineState<T, U>(target);\n }\n\n added(): U[] {\n return [];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass O2MUnloadedAddedRemovedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n #added: Set<U>;\n #removed: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#o2m = o2m;\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n return this;\n }\n\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n this.#removed.add(other);\n this.#added.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n // We should do the implicit deletion check?\n // Should we keep #added/#removed?\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#added) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // Push added entities on the end to better match the db order of \"newer things come last\"\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n return new O2MLoadedState<T, U>(this.#o2m, [...loaded], false, [...this.#added], [...this.#removed]);\n }\n\n current(): U[] {\n return [...this.#added];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(\n target,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n // This is called after em.flush, so these changes have been pushed into the db; we don't\n // need to track them anymore b/c any future `o2m.load` will see up.\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass O2MPendingSetState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #o2m: OneToManyCollection<T, U>;\n #pendingValues: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, pendingValues: readonly U[], skipPercolate = false) {\n this.#o2m = o2m;\n this.#pendingValues = new Set(pendingValues);\n // We percolate on normal set() calls to immediately update the other side's m2o references.\n // We skip percolation on import() because those entities already have correct references\n // in the cloned EntityManager.\n if (!skipPercolate) this.#percolate();\n getEmInternalApi(o2m.entity.em).pendingLoads.add(o2m);\n }\n\n add(other: U): O2MState<T, U> {\n this.#pendingValues.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#pendingValues = new Set(values);\n this.#percolate();\n return this;\n }\n\n doGet(): U[] {\n return [...this.#pendingValues];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#pendingValues) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n const o2m = this.#o2m;\n const entity = o2m.entity;\n // Handle cascade delete + immutable: entities removed from the collection that\n // cannot have their FK changed should be deleted instead\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n // Calc our added/removed so that `.changes` in the new loaded state are correct\n const dbSet = new Set(dbEntities);\n const added: U[] = [];\n for (const other of this.#pendingValues) {\n if (!dbSet.has(other)) added.push(other);\n }\n const removed: U[] = [];\n for (const other of dbEntities) {\n if (!this.#pendingValues.has(other)) {\n removed.push(other);\n if (isCascade && otherCannotChange) {\n entity.em.delete(other);\n } else {\n o2m.percolateRemove(other);\n }\n }\n }\n return new O2MLoadedState<T, U>(o2m, [...this.#pendingValues], true, added, removed);\n }\n\n current(): U[] {\n return [...this.#pendingValues];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(target, mapEntities([...this.#pendingValues], findEntity), true);\n }\n\n added(): U[] {\n return [...this.#pendingValues];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n\n #percolate(): void {\n const o2m = this.#o2m;\n // All new values, we immediately tell them we're their new parent\n for (const other of this.#pendingValues) {\n o2m.percolateAdd(other);\n }\n // If we're an existing entity, we can scan for any in-memory entities that were previously\n // pointing to us, but now should not\n if (!o2m.entity.isNewEntity) {\n for (const other of o2m.entity.em.getEntities(o2m.otherMeta.cstr) as Iterable<U>) {\n if (this.#pendingValues.has(other)) continue;\n if (sameEntity((other as any)[o2m.otherFieldName].current(), o2m.entity)) {\n o2m.percolateRemove(other);\n }\n }\n }\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass O2MLoadedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = true;\n #o2m: OneToManyCollection<T, U>;\n #loaded: Set<U>;\n #added: Set<U>;\n #removed: Set<U>;\n #hasBeenSet: boolean;\n\n constructor(o2m: OneToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean, added: U[] = [], removed: U[] = []) {\n this.#o2m = o2m;\n this.#loaded = new Set(loaded);\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n this.#loaded.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#removed.add(other);\n this.#added.delete(other);\n this.#loaded.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n this.#loaded.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#hasBeenSet = true;\n let valuesSet = new Set(values);\n\n const o2m = this.#o2m;\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n if (isCascade && otherCannotChange) {\n const implicitlyDeleted = [...this.#loaded].filter((e) => !valuesSet.has(e));\n implicitlyDeleted.forEach((e) => o2m.entity.em.delete(e));\n // ...we restore the implicitlyDeleted for getWithDeleted\n values = [...values, ...implicitlyDeleted];\n valuesSet = new Set(values);\n }\n\n const loaded = new Set(this.#loaded);\n for (const other of loaded) {\n if (!valuesSet.has(other)) o2m.remove(other);\n }\n for (const other of values) {\n if (!loaded.has(other)) o2m.add(other);\n }\n return this;\n }\n\n doGet(): U[] {\n return [...this.#loaded];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const other of this.#loaded) {\n if (!other.isNewEntity && other.id === id) return other;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // On forceReload, replace loaded but preserve pending adds/removes\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n this.#loaded = loaded;\n return this;\n }\n\n current(): U[] {\n return [...this.#loaded];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MLoadedState<T, U>(\n target,\n mapEntities([...this.#loaded], findEntity),\n this.#hasBeenSet,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\nfunction mapEntities<U extends Entity>(entities: U[], findEntity: (e: U) => U): U[] {\n const result = new Array<U>(entities.length);\n for (let i = 0; i < entities.length; i++) result[i] = findEntity(entities[i]);\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"OneToManyCollection.js","names":["#field","#state","#loadPromise","#getSorted","#allSorted","#o2m","#added","#removed","#pendingValues","#percolate","#loaded","#hasBeenSet"],"sources":["../../src/relations/OneToManyCollection.ts"],"sourcesContent":["import { oneToManyBatchLoader } from \"src/batchloaders/oneToManyBatchLoader.ts\";\nimport { oneToManyFindDataLoader } from \"src/dataloaders/oneToManyFindDataLoader.ts\";\nimport {\n type Collection,\n type Entity,\n type EntityMetadata,\n type IdOf,\n type OneToManyField,\n appendStack,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n getMetadataForField,\n maybeResolveReferenceToId,\n sameEntity,\n} from \"src/index.ts\";\nimport type { IsLoadedCachable } from \"src/loading/IsLoadedCache.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { type ManyToOneReferenceImpl } from \"src/relations/ManyToOneReference.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { compareValues } from \"src/utils.ts\";\n\n/** An alias for creating `OneToManyCollection`s. */\nexport function hasMany<T extends Entity, U extends Entity>(): Collection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const field = getMetadata(entity).allFields[fieldName] as OneToManyField;\n return new OneToManyCollection(entity, field);\n });\n}\n\nexport class OneToManyCollection<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U[]>\n implements Collection<T, U>, IsLoadedCachable\n{\n readonly #field: OneToManyField;\n #state: O2MState<T, U>;\n #loadPromise: any;\n // Constantly filtering+sorting our `.get` values can be surprisingly expensive if called\n // when processing many entities/writing code that calls it repeatedly, so we cache it\n // both the \"without deleted\" default (`getSorted`) and \"all deleted\" (`allSorted`).\n #getSorted: U[] | undefined;\n #allSorted: U[] | undefined;\n\n constructor(entity: T, field: OneToManyField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n } else {\n const { em } = entity;\n // If any m2o.set(ourId) were made before our entity was loaded, pull in those changes\n const pending = getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.get(this.fieldName);\n if (pending) {\n this.#state = new O2MUnloadedAddedRemovedState<T, U>(this, pending.adds as U[], pending.removes as U[]);\n getEmInternalApi(em).pendingPercolate.get(entity.idTagged!)?.delete(this.fieldName);\n } else {\n this.#state = new O2MUnloadedPristineState<T, U>(this);\n }\n }\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<readonly U[]> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.#state.isLoaded || (opts.forceReload && !this.entity.isNewEntity)) {\n const maybePreloaded = this.getPreloaded();\n if (maybePreloaded) {\n this.#state = this.#state.applyLoad(maybePreloaded);\n } else {\n await (this.#loadPromise ??= oneToManyBatchLoader(this.entity.em, this).load(this.entity.idTagged!))\n .then(() => this.preload())\n .catch(function load(err: any) {\n throw appendStack(err as Error, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n });\n }\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n return opts?.withDeleted ? this.getWithDeleted : this.get;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n const inMemory = this.#state.find(id);\n if (inMemory) return inMemory;\n if (this.#state.isLoaded) return undefined;\n const key = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.getOtherRelation(other).current());\n }\n\n get isLoaded(): boolean {\n return this.#state.isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n const preloaded = this.getPreloaded();\n if (preloaded) {\n this.#state = this.#state.applyLoad(preloaded);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n }\n\n /** Copy another em's `source` collection into our state. */\n import(source: OneToManyCollection<T, U>, findEntity: (e: U) => U): void {\n this.#state = source.#state.import(this, findEntity);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // todo: this only be a readonly U[]\n get get(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#getSorted !== undefined) return this.#getSorted;\n this.#getSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: false })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#getSorted;\n }\n\n get getWithDeleted(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (this.#allSorted !== undefined) return this.#allSorted;\n this.#allSorted = Object.freeze(this.filterDeleted(this.#state.doGet(), { withDeleted: true })) as U[];\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#allSorted;\n }\n\n set(values: readonly U[]): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.set(values);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n add(other: U): void {\n ensureNotDeleted(this.entity);\n this.#state = this.#state.add(other);\n this.percolateAdd(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n remove(other: U, opts: { requireLoaded: boolean } = { requireLoaded: true }) {\n ensureNotDeleted(this.entity, \"pending\");\n this.#state = this.#state.remove(other, opts);\n this.percolateRemove(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n removeAll(): void {\n ensureNotDeleted(this.entity);\n if (!this.#state.isLoaded) {\n throw new Error(\"removeAll was called when not loaded\");\n }\n for (const other of [...this.#state.doGet()]) {\n this.remove(other);\n }\n }\n\n // internal impl\n\n /** @internal */\n percolateAdd(other: U): void {\n this.getOtherRelation(other).set(this.entity);\n }\n\n /** @internal */\n percolateRemove(other: U): void {\n this.getOtherRelation(other).set(undefined);\n }\n\n /** @internal */\n registerAsMutated(): void {\n getEmInternalApi(this.entity.em).mutatedCollections.add(this);\n }\n\n setFromOpts(others: U[]): void {\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n others.forEach((o) => this.add(o));\n }\n\n removeIfLoaded(other: U) {\n this.#state = this.#state.removeIfLoaded(other);\n this.registerAsMutated();\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n this.current({ withDeleted: true }).forEach((e) => this.entity.em.delete(e));\n }\n }\n\n // We already unhooked all children in our addedBeforeLoaded list; now load the full list if necessary.\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n current.forEach((other) => {\n const m2o = this.getOtherRelation(other);\n if (maybeResolveReferenceToId(m2o.current({ withDeleted: true })) === this.entity.idMaybe) {\n m2o.set(undefined);\n }\n });\n this.#state = new O2MLoadedState<T, U>(this, [], false);\n this.#getSorted = undefined;\n this.#allSorted = undefined;\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n public get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n public get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n current(opts?: { withDeleted?: boolean }): U[] {\n return this.filterDeleted(this.#state.current(), opts);\n }\n\n public get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n public get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return this.#state.hasBeenSet;\n }\n\n public toString(): string {\n return `OneToManyCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Called after `em.flush` to reset our dirty tracking. */\n public resetAddedRemoved(): void {\n this.#state.resetAddedRemoved();\n }\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n private filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n // Relations configured with `softDeletes: \"include\"` keep soft-deleted entities in `.get`/`.load`.\n const includeSoftDeleted = this.#field.softDeletes === \"include\";\n const list =\n opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && (includeSoftDeleted || !(e as any).isSoftDeletedEntity));\n if (this.#field.orderBy) {\n const { field, direction } = this.#field.orderBy;\n list.sort((a, b) => compareValues((a as any)[field], (b as any)[field], direction));\n }\n return list;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation<U>(this.entity.idTagged, this.fieldName);\n }\n\n // Exposed for changes\n added(): U[] {\n return this.#state.added();\n }\n\n removed(): U[] {\n return this.#state.removed();\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\n/**\n * State interface for OneToManyCollection state machine.\n *\n * States handle only data tracking — side effects (percolation, mutation registration)\n * are handled by the collection methods that call into these states.\n *\n * State transitions:\n * ```\n * Constructor (new entity) → Loaded (empty [])\n * Constructor (existing entity) → UnloadedPristine\n *\n * UnloadedPristine + add/remove → UnloadedAddedRemoved\n * UnloadedPristine + set → PendingSet\n * UnloadedPristine + load/preload → Loaded\n *\n * UnloadedAddedRemoved + set → PendingSet\n * UnloadedAddedRemoved + load/preload → Loaded (merges adds/removes)\n *\n * PendingSet + add/remove → PendingSet (self)\n * PendingSet + set → PendingSet (self, replace)\n * PendingSet + load/preload → Loaded (diffs pending vs DB)\n *\n * Loaded + forceReload → Loaded (refreshed, re-merges pending)\n * ```\n */\ninterface O2MState<T extends Entity, U extends Entity> {\n add(other: U): O2MState<T, U>;\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U>;\n removeIfLoaded(other: U): O2MState<T, U>;\n set(values: readonly U[]): O2MState<T, U>;\n doGet(): U[];\n find(id: IdOf<U>): U | undefined;\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U>;\n current(): U[];\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U>;\n readonly isLoaded: boolean;\n readonly hasBeenSet: boolean;\n added(): U[];\n removed(): U[];\n resetAddedRemoved(): void;\n}\n\n/** Initial state for existing entities - no data loaded yet. */\nclass O2MUnloadedPristineState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n\n constructor(o2m: OneToManyCollection<T, U>) {\n this.#o2m = o2m;\n }\n\n add(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [other], []);\n }\n\n remove(_other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [_other]);\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(this.#o2m, [], [other]);\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(_id: IdOf<U>): U | undefined {\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n return new O2MLoadedState<T, U>(this.#o2m, dbEntities, false);\n }\n\n current(): U[] {\n return [];\n }\n\n import(target: OneToManyCollection<T, U>, _findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedPristineState<T, U>(target);\n }\n\n added(): U[] {\n return [];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n}\n\n/** State when add/remove called before load - tracks changes to merge later. */\nclass O2MUnloadedAddedRemovedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = false;\n #o2m: OneToManyCollection<T, U>;\n #added: Set<U>;\n #removed: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, added: U[], removed: U[]) {\n this.#o2m = o2m;\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n return this;\n }\n\n remove(other: U, opts: { requireLoaded: boolean }): O2MState<T, U> {\n if (opts.requireLoaded) {\n throw new Error(\"remove was called when not loaded\");\n }\n this.#removed.add(other);\n this.#added.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n // We should do the implicit deletion check?\n // Should we keep #added/#removed?\n return new O2MPendingSetState<T, U>(this.#o2m, values);\n }\n\n doGet(): U[] {\n throw new Error(\"get was called when not loaded\");\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#added) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // Push added entities on the end to better match the db order of \"newer things come last\"\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n return new O2MLoadedState<T, U>(this.#o2m, [...loaded], false, [...this.#added], [...this.#removed]);\n }\n\n current(): U[] {\n return [...this.#added];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MUnloadedAddedRemovedState<T, U>(\n target,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n // This is called after em.flush, so these changes have been pushed into the db; we don't\n // need to track them anymore b/c any future `o2m.load` will see up.\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\n/** State when set() called before load - holds pending values to diff on load. */\nclass O2MPendingSetState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = false;\n readonly hasBeenSet = true;\n #o2m: OneToManyCollection<T, U>;\n #pendingValues: Set<U>;\n\n constructor(o2m: OneToManyCollection<T, U>, pendingValues: readonly U[], skipPercolate = false) {\n this.#o2m = o2m;\n this.#pendingValues = new Set(pendingValues);\n // We percolate on normal set() calls to immediately update the other side's m2o references.\n // We skip percolation on import() because those entities already have correct references\n // in the cloned EntityManager.\n if (!skipPercolate) this.#percolate();\n getEmInternalApi(o2m.entity.em).pendingLoads.add(o2m);\n }\n\n add(other: U): O2MState<T, U> {\n this.#pendingValues.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#pendingValues.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#pendingValues = new Set(values);\n this.#percolate();\n return this;\n }\n\n doGet(): U[] {\n return [...this.#pendingValues];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const u of this.#pendingValues) {\n if (!u.isNewEntity && u.id === id) return u;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n const o2m = this.#o2m;\n const entity = o2m.entity;\n // Handle cascade delete + immutable: entities removed from the collection that\n // cannot have their FK changed should be deleted instead\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n // Calc our added/removed so that `.changes` in the new loaded state are correct\n const dbSet = new Set(dbEntities);\n const added: U[] = [];\n for (const other of this.#pendingValues) {\n if (!dbSet.has(other)) added.push(other);\n }\n const removed: U[] = [];\n for (const other of dbEntities) {\n if (!this.#pendingValues.has(other)) {\n removed.push(other);\n if (isCascade && otherCannotChange) {\n entity.em.delete(other);\n } else {\n o2m.percolateRemove(other);\n }\n }\n }\n return new O2MLoadedState<T, U>(o2m, [...this.#pendingValues], true, added, removed);\n }\n\n current(): U[] {\n return [...this.#pendingValues];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MPendingSetState<T, U>(target, mapEntities([...this.#pendingValues], findEntity), true);\n }\n\n added(): U[] {\n return [...this.#pendingValues];\n }\n\n removed(): U[] {\n return [];\n }\n\n resetAddedRemoved(): void {}\n\n #percolate(): void {\n const o2m = this.#o2m;\n // All new values, we immediately tell them we're their new parent\n for (const other of this.#pendingValues) {\n o2m.percolateAdd(other);\n }\n // If we're an existing entity, we can scan for any in-memory entities that were previously\n // pointing to us, but now should not\n if (!o2m.entity.isNewEntity) {\n for (const other of o2m.entity.em.getEntities(o2m.otherMeta.cstr) as Iterable<U>) {\n if (this.#pendingValues.has(other)) continue;\n if (sameEntity((other as any)[o2m.otherFieldName].current(), o2m.entity)) {\n o2m.percolateRemove(other);\n }\n }\n }\n }\n}\n\n/** State when collection is loaded - all operations work directly on loaded array. */\nclass O2MLoadedState<T extends Entity, U extends Entity> implements O2MState<T, U> {\n readonly isLoaded = true;\n #o2m: OneToManyCollection<T, U>;\n #loaded: Set<U>;\n #added: Set<U>;\n #removed: Set<U>;\n #hasBeenSet: boolean;\n\n constructor(o2m: OneToManyCollection<T, U>, loaded: U[], hasBeenSet: boolean, added: U[] = [], removed: U[] = []) {\n this.#o2m = o2m;\n this.#loaded = new Set(loaded);\n this.#added = new Set(added);\n this.#removed = new Set(removed);\n this.#hasBeenSet = hasBeenSet;\n }\n\n get hasBeenSet(): boolean {\n return this.#hasBeenSet;\n }\n\n add(other: U): O2MState<T, U> {\n this.#added.add(other);\n this.#removed.delete(other);\n this.#loaded.add(other);\n return this;\n }\n\n remove(other: U, _opts: { requireLoaded: boolean }): O2MState<T, U> {\n this.#removed.add(other);\n this.#added.delete(other);\n this.#loaded.delete(other);\n return this;\n }\n\n removeIfLoaded(other: U): O2MState<T, U> {\n this.#added.delete(other);\n this.#removed.add(other);\n this.#loaded.delete(other);\n return this;\n }\n\n set(values: readonly U[]): O2MState<T, U> {\n this.#hasBeenSet = true;\n let valuesSet = new Set(values);\n\n const o2m = this.#o2m;\n const otherCannotChange = o2m.otherMeta.allFields[o2m.otherFieldName].immutable;\n const isCascade = isCascadeDelete(o2m, o2m.fieldName);\n if (isCascade && otherCannotChange) {\n const implicitlyDeleted = [...this.#loaded].filter((e) => !valuesSet.has(e));\n implicitlyDeleted.forEach((e) => o2m.entity.em.delete(e));\n // ...we restore the implicitlyDeleted for getWithDeleted\n values = [...values, ...implicitlyDeleted];\n valuesSet = new Set(values);\n }\n\n const loaded = new Set(this.#loaded);\n for (const other of loaded) {\n if (!valuesSet.has(other)) o2m.remove(other);\n }\n for (const other of values) {\n if (!loaded.has(other)) o2m.add(other);\n }\n return this;\n }\n\n doGet(): U[] {\n return [...this.#loaded];\n }\n\n find(id: IdOf<U>): U | undefined {\n for (const other of this.#loaded) {\n if (!other.isNewEntity && other.id === id) return other;\n }\n return undefined;\n }\n\n applyLoad(dbEntities: U[]): O2MLoadedState<T, U> {\n // On forceReload, replace loaded but preserve pending adds/removes\n const loaded = new Set(dbEntities);\n for (const e of this.#added) loaded.add(e);\n for (const e of this.#removed) loaded.delete(e);\n this.#loaded = loaded;\n return this;\n }\n\n current(): U[] {\n return [...this.#loaded];\n }\n\n import(target: OneToManyCollection<T, U>, findEntity: (e: U) => U): O2MState<T, U> {\n return new O2MLoadedState<T, U>(\n target,\n mapEntities([...this.#loaded], findEntity),\n this.#hasBeenSet,\n mapEntities([...this.#added], findEntity),\n mapEntities([...this.#removed], findEntity),\n );\n }\n\n added(): U[] {\n return [...this.#added];\n }\n\n removed(): U[] {\n return [...this.#removed];\n }\n\n resetAddedRemoved(): void {\n this.#added = new Set();\n this.#removed = new Set();\n }\n}\n\nfunction mapEntities<U extends Entity>(entities: U[], findEntity: (e: U) => U): U[] {\n const result = new Array<U>(entities.length);\n for (let i = 0; i < entities.length; i++) result[i] = findEntity(entities[i]);\n return result;\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
3
+ require("./LargeCollection.cjs");
3
4
  const require_dataloaders_oneToManyFindDataLoader = require("../dataloaders/oneToManyFindDataLoader.cjs");
4
5
  const require_utils = require("../utils.cjs");
5
6
  const require_newEntity = require("../newEntity.cjs");
6
- require("./LargeCollection.cjs");
7
7
  const require_EntityMetadata = require("../EntityMetadata.cjs");
8
8
  const require_index = require("../index.cjs");
9
9
  const require_EntityManager = require("../EntityManager.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"OneToManyLargeCollection.cjs","names":["lazyField","getMetadata","#entity","#field","#locallyAdded","#locallyRemoved","oneToManyFindDataLoader","appendStack","sameEntity","#getOtherRelation","getMetadataForField","RelationT","RelationU"],"sources":["../../src/relations/OneToManyLargeCollection.ts"],"sourcesContent":["import { oneToManyFindDataLoader } from \"../dataloaders/oneToManyFindDataLoader.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport { type IdOf, appendStack, sameEntity } from \"../EntityManager.ts\";\nimport { type EntityMetadata, type LargeOneToManyField, getMetadataForField } from \"../EntityMetadata.ts\";\nimport { type ManyToOneReferenceImpl, ensureNotDeleted, getMetadata } from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { remove } from \"../utils.ts\";\nimport { type LargeCollection } from \"./LargeCollection.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `OneToManyLargeCollection`s. */\nexport function hasLargeMany<T extends Entity, U extends Entity>(): LargeCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const lo2m = getMetadata(entity).allFields[fieldName] as LargeOneToManyField;\n return new OneToManyLargeCollection(entity, lo2m);\n });\n}\n\nexport class OneToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {\n readonly #entity: T;\n readonly #field: LargeOneToManyField;\n // Even though a large collection can never be loaded, we do track local\n // mutations so that `find` can be accurate.\n #locallyAdded: U[] = [];\n #locallyRemoved: U[] = [];\n\n constructor(entity: T, field: LargeOneToManyField) {\n this.#entity = entity;\n this.#field = field;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n // locallyAdded is never authoritative b/c we never become fully loaded (unlike OneToManyCollection),\n // so we can probe our local collection, but if we don't find anything, we still have to query\n const localAdd = this.#locallyAdded.find((u) => u.id === id);\n if (localAdd) {\n return localAdd;\n }\n const localRemove = this.#locallyRemoved.find((u) => u.id === id);\n if (localRemove) {\n return undefined;\n }\n if (this.entity.isNewEntity) {\n return undefined;\n }\n // Make a cacheable tuple to look up this specific o2m row\n const key = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.#getOtherRelation(other).current());\n }\n\n add(other: U): void {\n remove(this.#locallyRemoved, other);\n if (!this.#locallyAdded.includes(other)) {\n this.#locallyAdded.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(this.entity);\n }\n\n remove(other: U): void {\n remove(this.#locallyAdded, other);\n if (!this.#locallyRemoved.includes(other)) {\n this.#locallyRemoved.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(undefined);\n }\n\n get hasBeenSet() {\n return false;\n }\n\n get entity(): Entity {\n return this.#entity;\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get otherMeta(): EntityMetadata<U> {\n return this.#field.otherMetadata();\n }\n\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n toString(): string {\n return `OneToManyLargeCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n #getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n isLoaded = false;\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,eAA0E;CACxF,OAAOA,kBAAAA,WAAW,QAAW,cAAc;EACzC,MAAM,OAAOC,uBAAAA,YAAY,MAAM,CAAC,CAAC,UAAU;EAC3C,OAAO,IAAI,yBAAyB,QAAQ,IAAI;CAClD,CAAC;AACH;AAEA,IAAa,2BAAb,MAA2G;CACzG;CACA;CAGA,gBAAqB,CAAC;CACtB,kBAAuB,CAAC;CAExB,YAAY,QAAW,OAA4B;EACjD,KAAKC,UAAU;EACf,KAAKC,SAAS;CAChB;CAEA,MAAM,KAAK,IAAqC;EAC9C,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EAGvC,MAAM,WAAW,KAAKC,cAAc,MAAM,MAAM,EAAE,OAAO,EAAE;EAC3D,IAAI,UACF,OAAO;EAGT,IADoB,KAAKC,gBAAgB,MAAM,MAAM,EAAE,OAAO,EAChD,GACZ;EAEF,IAAI,KAAK,OAAO,aACd;EAGF,MAAM,MAAM,MAAM,GAAG,GAAG,KAAKF,OAAO,gBAAgB,GAAG,KAAK,OAAO;EACnE,OAAOG,4CAAAA,wBAAwB,KAAK,OAAO,IAAI,IAAI,CAAC,CACjD,KAAK,GAAG,CAAC,CACT,MAAM,SAAS,KAAK,KAAK;GACxB,MAAMC,sBAAAA,YAAY,qBAAK,IAAI,MAAM,CAAC;EACpC,CAAC;CACL;CAEA,MAAM,SAAS,OAA4B;EACzC,OAAOC,sBAAAA,WAAW,KAAK,QAAQ,KAAKC,kBAAkB,KAAK,CAAC,CAAC,QAAQ,CAAC;CACxE;CAEA,IAAI,OAAgB;EAClB,cAAA,OAAO,KAAKJ,iBAAiB,KAAK;EAClC,IAAI,CAAC,KAAKD,cAAc,SAAS,KAAK,GACpC,KAAKA,cAAc,KAAK,KAAK;EAG/B,KAAKK,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM;CAC/C;CAEA,OAAO,OAAgB;EACrB,cAAA,OAAO,KAAKL,eAAe,KAAK;EAChC,IAAI,CAAC,KAAKC,gBAAgB,SAAS,KAAK,GACtC,KAAKA,gBAAgB,KAAK,KAAK;EAGjC,KAAKI,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAA,CAAS;CAC7C;CAEA,IAAI,aAAa;EACf,OAAO;CACT;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAKP;CACd;CAEA,IAAI,OAAuB;EACzB,OAAOQ,uBAAAA,oBAAoBT,uBAAAA,YAAY,KAAK,MAAM,GAAG,KAAK,SAAS;CACrE;CAGA,IAAI,YAA+B;EACjC,OAAO,KAAKE,OAAO,cAAc;CACnC;CAEA,IAAI,YAA8B;EAChC,OAAO,KAAKA,OAAO;CACrB;CAEA,IAAI,iBAAmC;EACrC,OAAO,KAAKA,OAAO;CACrB;CAEA,WAAmB;EACjB,OAAO,oCAAoC,KAAK,OAAO,eAAe,KAAK,UAAU,eAAe,KAAK,UAAU,KAAK,oBAAoB,KAAK,eAAe;CAClK;;CAGA,kBAAkB,OAA6C;EAC7D,OAAQ,MAAY,KAAK;CAC3B;CAEA,WAAW;CAEX,CAACQ,kCAAAA,aAAgB;CACjB,CAACC,kCAAAA,aAAgB;AACnB"}
1
+ {"version":3,"file":"OneToManyLargeCollection.cjs","names":["lazyField","getMetadata","#entity","#field","#locallyAdded","#locallyRemoved","oneToManyFindDataLoader","appendStack","sameEntity","#getOtherRelation","getMetadataForField","RelationT","RelationU"],"sources":["../../src/relations/OneToManyLargeCollection.ts"],"sourcesContent":["import { oneToManyFindDataLoader } from \"src/dataloaders/oneToManyFindDataLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, appendStack, sameEntity } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, type LargeOneToManyField, getMetadataForField } from \"src/EntityMetadata.ts\";\nimport { type ManyToOneReferenceImpl, ensureNotDeleted, getMetadata } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { type LargeCollection } from \"src/relations/LargeCollection.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** An alias for creating `OneToManyLargeCollection`s. */\nexport function hasLargeMany<T extends Entity, U extends Entity>(): LargeCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const lo2m = getMetadata(entity).allFields[fieldName] as LargeOneToManyField;\n return new OneToManyLargeCollection(entity, lo2m);\n });\n}\n\nexport class OneToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {\n readonly #entity: T;\n readonly #field: LargeOneToManyField;\n // Even though a large collection can never be loaded, we do track local\n // mutations so that `find` can be accurate.\n #locallyAdded: U[] = [];\n #locallyRemoved: U[] = [];\n\n constructor(entity: T, field: LargeOneToManyField) {\n this.#entity = entity;\n this.#field = field;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n // locallyAdded is never authoritative b/c we never become fully loaded (unlike OneToManyCollection),\n // so we can probe our local collection, but if we don't find anything, we still have to query\n const localAdd = this.#locallyAdded.find((u) => u.id === id);\n if (localAdd) {\n return localAdd;\n }\n const localRemove = this.#locallyRemoved.find((u) => u.id === id);\n if (localRemove) {\n return undefined;\n }\n if (this.entity.isNewEntity) {\n return undefined;\n }\n // Make a cacheable tuple to look up this specific o2m row\n const key = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.#getOtherRelation(other).current());\n }\n\n add(other: U): void {\n remove(this.#locallyRemoved, other);\n if (!this.#locallyAdded.includes(other)) {\n this.#locallyAdded.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(this.entity);\n }\n\n remove(other: U): void {\n remove(this.#locallyAdded, other);\n if (!this.#locallyRemoved.includes(other)) {\n this.#locallyRemoved.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(undefined);\n }\n\n get hasBeenSet() {\n return false;\n }\n\n get entity(): Entity {\n return this.#entity;\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get otherMeta(): EntityMetadata<U> {\n return this.#field.otherMetadata();\n }\n\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n toString(): string {\n return `OneToManyLargeCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n #getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n isLoaded = false;\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,eAA0E;CACxF,OAAOA,kBAAAA,WAAW,QAAW,cAAc;EACzC,MAAM,OAAOC,uBAAAA,YAAY,MAAM,CAAC,CAAC,UAAU;EAC3C,OAAO,IAAI,yBAAyB,QAAQ,IAAI;CAClD,CAAC;AACH;AAEA,IAAa,2BAAb,MAA2G;CACzG;CACA;CAGA,gBAAqB,CAAC;CACtB,kBAAuB,CAAC;CAExB,YAAY,QAAW,OAA4B;EACjD,KAAKC,UAAU;EACf,KAAKC,SAAS;CAChB;CAEA,MAAM,KAAK,IAAqC;EAC9C,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EAGvC,MAAM,WAAW,KAAKC,cAAc,MAAM,MAAM,EAAE,OAAO,EAAE;EAC3D,IAAI,UACF,OAAO;EAGT,IADoB,KAAKC,gBAAgB,MAAM,MAAM,EAAE,OAAO,EAChD,GACZ;EAEF,IAAI,KAAK,OAAO,aACd;EAGF,MAAM,MAAM,MAAM,GAAG,GAAG,KAAKF,OAAO,gBAAgB,GAAG,KAAK,OAAO;EACnE,OAAOG,4CAAAA,wBAAwB,KAAK,OAAO,IAAI,IAAI,CAAC,CACjD,KAAK,GAAG,CAAC,CACT,MAAM,SAAS,KAAK,KAAK;GACxB,MAAMC,sBAAAA,YAAY,qBAAK,IAAI,MAAM,CAAC;EACpC,CAAC;CACL;CAEA,MAAM,SAAS,OAA4B;EACzC,OAAOC,sBAAAA,WAAW,KAAK,QAAQ,KAAKC,kBAAkB,KAAK,CAAC,CAAC,QAAQ,CAAC;CACxE;CAEA,IAAI,OAAgB;EAClB,cAAA,OAAO,KAAKJ,iBAAiB,KAAK;EAClC,IAAI,CAAC,KAAKD,cAAc,SAAS,KAAK,GACpC,KAAKA,cAAc,KAAK,KAAK;EAG/B,KAAKK,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM;CAC/C;CAEA,OAAO,OAAgB;EACrB,cAAA,OAAO,KAAKL,eAAe,KAAK;EAChC,IAAI,CAAC,KAAKC,gBAAgB,SAAS,KAAK,GACtC,KAAKA,gBAAgB,KAAK,KAAK;EAGjC,KAAKI,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAA,CAAS;CAC7C;CAEA,IAAI,aAAa;EACf,OAAO;CACT;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAKP;CACd;CAEA,IAAI,OAAuB;EACzB,OAAOQ,uBAAAA,oBAAoBT,uBAAAA,YAAY,KAAK,MAAM,GAAG,KAAK,SAAS;CACrE;CAGA,IAAI,YAA+B;EACjC,OAAO,KAAKE,OAAO,cAAc;CACnC;CAEA,IAAI,YAA8B;EAChC,OAAO,KAAKA,OAAO;CACrB;CAEA,IAAI,iBAAmC;EACrC,OAAO,KAAKA,OAAO;CACrB;CAEA,WAAmB;EACjB,OAAO,oCAAoC,KAAK,OAAO,eAAe,KAAK,UAAU,eAAe,KAAK,UAAU,KAAK,oBAAoB,KAAK,eAAe;CAClK;;CAGA,kBAAkB,OAA6C;EAC7D,OAAQ,MAAY,KAAK;CAC3B;CAEA,WAAW;CAEX,CAACQ,kCAAAA,aAAgB;CACjB,CAACC,kCAAAA,aAAgB;AACnB"}
@@ -1,8 +1,8 @@
1
1
  import { RelationT, RelationU } from "./RelationSymbols.js";
2
+ import "./LargeCollection.js";
2
3
  import { oneToManyFindDataLoader } from "../dataloaders/oneToManyFindDataLoader.js";
3
4
  import { remove } from "../utils.js";
4
5
  import { lazyField } from "../newEntity.js";
5
- import "./LargeCollection.js";
6
6
  import { getMetadata, getMetadataForField } from "../EntityMetadata.js";
7
7
  import { ensureNotDeleted } from "../index.js";
8
8
  import { appendStack, sameEntity } from "../EntityManager.js";
@@ -1 +1 @@
1
- {"version":3,"file":"OneToManyLargeCollection.js","names":["#entity","#field","#locallyAdded","#locallyRemoved","#getOtherRelation"],"sources":["../../src/relations/OneToManyLargeCollection.ts"],"sourcesContent":["import { oneToManyFindDataLoader } from \"../dataloaders/oneToManyFindDataLoader.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport { type IdOf, appendStack, sameEntity } from \"../EntityManager.ts\";\nimport { type EntityMetadata, type LargeOneToManyField, getMetadataForField } from \"../EntityMetadata.ts\";\nimport { type ManyToOneReferenceImpl, ensureNotDeleted, getMetadata } from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { remove } from \"../utils.ts\";\nimport { type LargeCollection } from \"./LargeCollection.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\n/** An alias for creating `OneToManyLargeCollection`s. */\nexport function hasLargeMany<T extends Entity, U extends Entity>(): LargeCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const lo2m = getMetadata(entity).allFields[fieldName] as LargeOneToManyField;\n return new OneToManyLargeCollection(entity, lo2m);\n });\n}\n\nexport class OneToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {\n readonly #entity: T;\n readonly #field: LargeOneToManyField;\n // Even though a large collection can never be loaded, we do track local\n // mutations so that `find` can be accurate.\n #locallyAdded: U[] = [];\n #locallyRemoved: U[] = [];\n\n constructor(entity: T, field: LargeOneToManyField) {\n this.#entity = entity;\n this.#field = field;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n // locallyAdded is never authoritative b/c we never become fully loaded (unlike OneToManyCollection),\n // so we can probe our local collection, but if we don't find anything, we still have to query\n const localAdd = this.#locallyAdded.find((u) => u.id === id);\n if (localAdd) {\n return localAdd;\n }\n const localRemove = this.#locallyRemoved.find((u) => u.id === id);\n if (localRemove) {\n return undefined;\n }\n if (this.entity.isNewEntity) {\n return undefined;\n }\n // Make a cacheable tuple to look up this specific o2m row\n const key = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.#getOtherRelation(other).current());\n }\n\n add(other: U): void {\n remove(this.#locallyRemoved, other);\n if (!this.#locallyAdded.includes(other)) {\n this.#locallyAdded.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(this.entity);\n }\n\n remove(other: U): void {\n remove(this.#locallyAdded, other);\n if (!this.#locallyRemoved.includes(other)) {\n this.#locallyRemoved.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(undefined);\n }\n\n get hasBeenSet() {\n return false;\n }\n\n get entity(): Entity {\n return this.#entity;\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get otherMeta(): EntityMetadata<U> {\n return this.#field.otherMetadata();\n }\n\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n toString(): string {\n return `OneToManyLargeCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n #getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n isLoaded = false;\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAA0E;CACxF,OAAO,WAAW,QAAW,cAAc;EACzC,MAAM,OAAO,YAAY,MAAM,CAAC,CAAC,UAAU;EAC3C,OAAO,IAAI,yBAAyB,QAAQ,IAAI;CAClD,CAAC;AACH;AAEA,IAAa,2BAAb,MAA2G;CACzG;CACA;CAGA,gBAAqB,CAAC;CACtB,kBAAuB,CAAC;CAExB,YAAY,QAAW,OAA4B;EACjD,KAAKA,UAAU;EACf,KAAKC,SAAS;CAChB;CAEA,MAAM,KAAK,IAAqC;EAC9C,iBAAiB,KAAK,QAAQ,SAAS;EAGvC,MAAM,WAAW,KAAKC,cAAc,MAAM,MAAM,EAAE,OAAO,EAAE;EAC3D,IAAI,UACF,OAAO;EAGT,IADoB,KAAKC,gBAAgB,MAAM,MAAM,EAAE,OAAO,EAChD,GACZ;EAEF,IAAI,KAAK,OAAO,aACd;EAGF,MAAM,MAAM,MAAM,GAAG,GAAG,KAAKF,OAAO,gBAAgB,GAAG,KAAK,OAAO;EACnE,OAAO,wBAAwB,KAAK,OAAO,IAAI,IAAI,CAAC,CACjD,KAAK,GAAG,CAAC,CACT,MAAM,SAAS,KAAK,KAAK;GACxB,MAAM,YAAY,qBAAK,IAAI,MAAM,CAAC;EACpC,CAAC;CACL;CAEA,MAAM,SAAS,OAA4B;EACzC,OAAO,WAAW,KAAK,QAAQ,KAAKG,kBAAkB,KAAK,CAAC,CAAC,QAAQ,CAAC;CACxE;CAEA,IAAI,OAAgB;EAClB,OAAO,KAAKD,iBAAiB,KAAK;EAClC,IAAI,CAAC,KAAKD,cAAc,SAAS,KAAK,GACpC,KAAKA,cAAc,KAAK,KAAK;EAG/B,KAAKE,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM;CAC/C;CAEA,OAAO,OAAgB;EACrB,OAAO,KAAKF,eAAe,KAAK;EAChC,IAAI,CAAC,KAAKC,gBAAgB,SAAS,KAAK,GACtC,KAAKA,gBAAgB,KAAK,KAAK;EAGjC,KAAKC,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAA,CAAS;CAC7C;CAEA,IAAI,aAAa;EACf,OAAO;CACT;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAKJ;CACd;CAEA,IAAI,OAAuB;EACzB,OAAO,oBAAoB,YAAY,KAAK,MAAM,GAAG,KAAK,SAAS;CACrE;CAGA,IAAI,YAA+B;EACjC,OAAO,KAAKC,OAAO,cAAc;CACnC;CAEA,IAAI,YAA8B;EAChC,OAAO,KAAKA,OAAO;CACrB;CAEA,IAAI,iBAAmC;EACrC,OAAO,KAAKA,OAAO;CACrB;CAEA,WAAmB;EACjB,OAAO,oCAAoC,KAAK,OAAO,eAAe,KAAK,UAAU,eAAe,KAAK,UAAU,KAAK,oBAAoB,KAAK,eAAe;CAClK;;CAGA,kBAAkB,OAA6C;EAC7D,OAAQ,MAAY,KAAK;CAC3B;CAEA,WAAW;CAEX,CAAC,aAAgB;CACjB,CAAC,aAAgB;AACnB"}
1
+ {"version":3,"file":"OneToManyLargeCollection.js","names":["#entity","#field","#locallyAdded","#locallyRemoved","#getOtherRelation"],"sources":["../../src/relations/OneToManyLargeCollection.ts"],"sourcesContent":["import { oneToManyFindDataLoader } from \"src/dataloaders/oneToManyFindDataLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type IdOf, appendStack, sameEntity } from \"src/EntityManager.ts\";\nimport { type EntityMetadata, type LargeOneToManyField, getMetadataForField } from \"src/EntityMetadata.ts\";\nimport { type ManyToOneReferenceImpl, ensureNotDeleted, getMetadata } from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { type LargeCollection } from \"src/relations/LargeCollection.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\nimport { remove } from \"src/utils.ts\";\n\n/** An alias for creating `OneToManyLargeCollection`s. */\nexport function hasLargeMany<T extends Entity, U extends Entity>(): LargeCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n const lo2m = getMetadata(entity).allFields[fieldName] as LargeOneToManyField;\n return new OneToManyLargeCollection(entity, lo2m);\n });\n}\n\nexport class OneToManyLargeCollection<T extends Entity, U extends Entity> implements LargeCollection<T, U> {\n readonly #entity: T;\n readonly #field: LargeOneToManyField;\n // Even though a large collection can never be loaded, we do track local\n // mutations so that `find` can be accurate.\n #locallyAdded: U[] = [];\n #locallyRemoved: U[] = [];\n\n constructor(entity: T, field: LargeOneToManyField) {\n this.#entity = entity;\n this.#field = field;\n }\n\n async find(id: IdOf<U>): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n // locallyAdded is never authoritative b/c we never become fully loaded (unlike OneToManyCollection),\n // so we can probe our local collection, but if we don't find anything, we still have to query\n const localAdd = this.#locallyAdded.find((u) => u.id === id);\n if (localAdd) {\n return localAdd;\n }\n const localRemove = this.#locallyRemoved.find((u) => u.id === id);\n if (localRemove) {\n return undefined;\n }\n if (this.entity.isNewEntity) {\n return undefined;\n }\n // Make a cacheable tuple to look up this specific o2m row\n const key = `id=${id},${this.#field.otherColumnName}=${this.entity.id}`;\n return oneToManyFindDataLoader(this.entity.em, this)\n .load(key)\n .catch(function find(err) {\n throw appendStack(err, new Error());\n });\n }\n\n async includes(other: U): Promise<boolean> {\n return sameEntity(this.entity, this.#getOtherRelation(other).current());\n }\n\n add(other: U): void {\n remove(this.#locallyRemoved, other);\n if (!this.#locallyAdded.includes(other)) {\n this.#locallyAdded.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(this.entity);\n }\n\n remove(other: U): void {\n remove(this.#locallyAdded, other);\n if (!this.#locallyRemoved.includes(other)) {\n this.#locallyRemoved.push(other);\n }\n // This will no-op and mark other dirty if necessary\n this.#getOtherRelation(other).set(undefined);\n }\n\n get hasBeenSet() {\n return false;\n }\n\n get entity(): Entity {\n return this.#entity;\n }\n\n get meta(): EntityMetadata {\n return getMetadataForField(getMetadata(this.entity), this.fieldName);\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get otherMeta(): EntityMetadata<U> {\n return this.#field.otherMetadata();\n }\n\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n toString(): string {\n return `OneToManyLargeCollection(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n #getOtherRelation(other: U): ManyToOneReferenceImpl<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n isLoaded = false;\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAA0E;CACxF,OAAO,WAAW,QAAW,cAAc;EACzC,MAAM,OAAO,YAAY,MAAM,CAAC,CAAC,UAAU;EAC3C,OAAO,IAAI,yBAAyB,QAAQ,IAAI;CAClD,CAAC;AACH;AAEA,IAAa,2BAAb,MAA2G;CACzG;CACA;CAGA,gBAAqB,CAAC;CACtB,kBAAuB,CAAC;CAExB,YAAY,QAAW,OAA4B;EACjD,KAAKA,UAAU;EACf,KAAKC,SAAS;CAChB;CAEA,MAAM,KAAK,IAAqC;EAC9C,iBAAiB,KAAK,QAAQ,SAAS;EAGvC,MAAM,WAAW,KAAKC,cAAc,MAAM,MAAM,EAAE,OAAO,EAAE;EAC3D,IAAI,UACF,OAAO;EAGT,IADoB,KAAKC,gBAAgB,MAAM,MAAM,EAAE,OAAO,EAChD,GACZ;EAEF,IAAI,KAAK,OAAO,aACd;EAGF,MAAM,MAAM,MAAM,GAAG,GAAG,KAAKF,OAAO,gBAAgB,GAAG,KAAK,OAAO;EACnE,OAAO,wBAAwB,KAAK,OAAO,IAAI,IAAI,CAAC,CACjD,KAAK,GAAG,CAAC,CACT,MAAM,SAAS,KAAK,KAAK;GACxB,MAAM,YAAY,qBAAK,IAAI,MAAM,CAAC;EACpC,CAAC;CACL;CAEA,MAAM,SAAS,OAA4B;EACzC,OAAO,WAAW,KAAK,QAAQ,KAAKG,kBAAkB,KAAK,CAAC,CAAC,QAAQ,CAAC;CACxE;CAEA,IAAI,OAAgB;EAClB,OAAO,KAAKD,iBAAiB,KAAK;EAClC,IAAI,CAAC,KAAKD,cAAc,SAAS,KAAK,GACpC,KAAKA,cAAc,KAAK,KAAK;EAG/B,KAAKE,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM;CAC/C;CAEA,OAAO,OAAgB;EACrB,OAAO,KAAKF,eAAe,KAAK;EAChC,IAAI,CAAC,KAAKC,gBAAgB,SAAS,KAAK,GACtC,KAAKA,gBAAgB,KAAK,KAAK;EAGjC,KAAKC,kBAAkB,KAAK,CAAC,CAAC,IAAI,KAAA,CAAS;CAC7C;CAEA,IAAI,aAAa;EACf,OAAO;CACT;CAEA,IAAI,SAAiB;EACnB,OAAO,KAAKJ;CACd;CAEA,IAAI,OAAuB;EACzB,OAAO,oBAAoB,YAAY,KAAK,MAAM,GAAG,KAAK,SAAS;CACrE;CAGA,IAAI,YAA+B;EACjC,OAAO,KAAKC,OAAO,cAAc;CACnC;CAEA,IAAI,YAA8B;EAChC,OAAO,KAAKA,OAAO;CACrB;CAEA,IAAI,iBAAmC;EACrC,OAAO,KAAKA,OAAO;CACrB;CAEA,WAAmB;EACjB,OAAO,oCAAoC,KAAK,OAAO,eAAe,KAAK,UAAU,eAAe,KAAK,UAAU,KAAK,oBAAoB,KAAK,eAAe;CAClK;;CAGA,kBAAkB,OAA6C;EAC7D,OAAQ,MAAY,KAAK;CAC3B;CAEA,WAAW;CAEX,CAAC,aAAgB;CACjB,CAAC,aAAgB;AACnB"}
@@ -1,15 +1,15 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_fields = require("../fields.cjs");
3
2
  const require_relations_AbstractRelationImpl = require("./AbstractRelationImpl.cjs");
4
3
  const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
5
- const require_batchloaders_oneToOneBatchLoader = require("../batchloaders/oneToOneBatchLoader.cjs");
6
- const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
7
4
  const require_relations_ReferenceSymbols = require("./ReferenceSymbols.cjs");
8
- const require_relations_ManyToOneReference = require("./ManyToOneReference.cjs");
5
+ const require_fields = require("../fields.cjs");
6
+ const require_keys = require("../keys.cjs");
9
7
  require("./Reference.cjs");
8
+ const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
9
+ const require_relations_ManyToOneReference = require("./ManyToOneReference.cjs");
10
+ const require_batchloaders_oneToOneBatchLoader = require("../batchloaders/oneToOneBatchLoader.cjs");
10
11
  const require_relations_ReactiveReference = require("./ReactiveReference.cjs");
11
12
  const require_newEntity = require("../newEntity.cjs");
12
- const require_keys = require("../keys.cjs");
13
13
  const require_EntityMetadata = require("../EntityMetadata.cjs");
14
14
  const require_index = require("../index.cjs");
15
15
  const require_EntityManager = require("../EntityManager.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"OneToOneReference.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","failNoId","failIfNewEntity","deTagId","oneToOneBatchLoader","appendStack","#hasBeenSet","getEmInternalApi","isReactiveReference","isCascadeDelete","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"..//index.ts\";\nimport { oneToOneBatchLoader } from \"../batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport { type EntityMetadata } from \"../EntityMetadata.ts\";\nimport { setField } from \"../fields.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"./ManyToOneReference.ts\";\nimport { isReactiveReference } from \"./ReactiveReference.ts\";\nimport { type Reference } from \"./Reference.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"OneToOneReference.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#field","getInstanceData","failNoId","failIfNewEntity","deTagId","oneToOneBatchLoader","appendStack","#hasBeenSet","getEmInternalApi","isReactiveReference","isCascadeDelete","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import { oneToOneBatchLoader } from \"src/batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { isReactiveReference } from \"src/relations/ReactiveReference.ts\";\nimport { type Reference } from \"src/relations/Reference.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyBA,MAAM,WAAW,OAAO;;AAGxB,SAAgB,cAA2E;CACzF,OAAOA,kBAAAA,WAAW,QAAW,cAAc;EACzC,MAAM,MAAMC,uBAAAA,YAAY,MAAM,CAAC,CAAC,UAAU;EAC1C,OAAO,IAAI,sBAA4B,QAAQ,GAAG;CACpD,CAAC;AACH;;AA+BA,SAAgB,oBAAoB,gBAAoE;CACtG,OAAO,0BAA0B;AACnC;;AAGA,SAAgB,0BACd,gBACgF;CAChF,OAAO,oBAAoB,cAAc,KAAK,eAAe;AAC/D;;;;;;;;;;;;;;;;;;AAmBA,IAAa,wBAAb,cACUC,uCAAAA,qBAEV;CACE;CACA;CACA,YAA6B;CAC7B,cAAc;CAEd,YAAY,QAAW,OAAsB;EAC3C,MAAM,MAAM;EACZ,KAAKC,SAAS;EACd,IAAIC,mBAAAA,gBAAgB,MAAM,CAAC,CAAC,YAC1B,KAAK,YAAY;CAErB;CAGA,IAAI,YAA8B;EAChC,OAAO,KAAKD,OAAO;CACrB;CAEA,IAAI,iBAAmC;EACrC,OAAO,KAAKA,OAAO;CACrB;CAEA,IAAI,KAAc;EAChB,OAAO,KAAK,WAAWE,qCAAAA,SAAS,KAAK,QAAQ,KAAK,WAAW,KAAK,MAAM;CAC1E;CAEA,IAAI,UAA+B;EACjC,IAAI,KAAK,WACP,OAAO,KAAK,WAAWC,qCAAAA,gBAAgB,KAAK,QAAQ,KAAK,WAAW,KAAK,MAAM;EAEjF,MAAM,IAAI,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,UAAU,gBAAgB;CACnE;CAEA,IAAI,aAAqB;EACvB,OAAO,KAAK,mBAAmBD,qCAAAA,SAAS,KAAK,QAAQ,KAAK,WAAW,KAAK,MAAM;CAClF;CAEA,IAAI,kBAAsC;EACxC,OAAO,KAAK,mBAAmBC,qCAAAA,gBAAgB,KAAK,QAAQ,KAAK,WAAW,KAAK,MAAM;CACzF;CAEA,IAAY,UAA+B;EACzC,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,KAAK,WACP,OAAO,KAAK,QAAQ;EAEtB,MAAM,IAAI,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,UAAU,gBAAgB;CACnE;CAEA,IAAI,gBAAsC;EACxC,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,KAAK,WACP,OAAO,KAAK,QAAQ;EAEtB,MAAM,IAAI,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,UAAU,gBAAgB;CACnE;CAEA,IAAY,kBAAsC;EAChD,OAAOC,aAAAA,QAAQ,KAAK,WAAW,KAAK,OAAO;CAC7C;CAEA,IAAI,QAAiB;EACnB,IAAI,KAAK,WACP,OAAO,KAAK,WAAW,KAAA;EAEzB,MAAM,IAAI,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,UAAU,gBAAgB;CACnE;CAGA,MAAM,KAAK,OAAyD,CAAC,GAA2B;EAC9F,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,aAAa,KAAK,aAAa;GACvC,IAAI,CAAC,KAAK,OAAO,aAAa;IAC5B,MAAM,aAAa,KAAK,aAAa;IACrC,IAAI,YACF,KAAK,SAAS,WAAW;SACpB;KACL,IAAI;MACF,MAAMC,yCAAAA,oBAAoB,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,QAAQ;KAC3E,SAAS,KAAK;MACZ,MAAMC,sBAAAA,YAAY,qBAAc,IAAI,MAAM,CAAC;KAC7C;KACA,KAAK,QAAQ;IACf;GACF;GACA,KAAK,YAAY;EACnB;EACA,OAAO,KAAK,cAAc,KAAK,QAAQ,IAAI;CAC7C;CAEA,IAAI,OAAU,OAAkC,CAAC,GAAS;EACxD,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,KAAKC,cAAc;EACnB,IAAI,UAAU,KAAK,QAAQ;GACzB,KAAK,YAAY;GACjB;EACF;EACA,IAAI,KAAK,WACH;OAAA,KAAK,UAAU,CAAC,KAAK,aACvB,KAAK,iBAAiB,KAAK,MAAM,CAAC,CAAC,IAAI,KAAA,CAAS;EAAA;EAGpD,MAAM,EAAE,gBAAgBC,sBAAAA,iBAAiB,KAAK,OAAO,EAAE;EACvD,YAAY,OAAO,KAAK,QAAQ,KAAK,WAAW,KAAK;EACrD,KAAK,SAAS;EACd,KAAK,YAAY;EAEjB,IAAI,SAAS,CAAC,KAAK,aACjB,KAAK,iBAAiB,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM;CAEhD;CAEA,IAAI,WAAoB;EACtB,OAAO,KAAK;CACd;CAEA,IAAI,cAAuB;EACzB,OAAO,CAAC,CAAC,KAAK,aAAa;CAC7B;CAEA,UAAgB;EACd,KAAK,SAAS,KAAK,aAAa,CAAC,GAAG;EACpC,KAAK,YAAY;CACnB;CAEA,OAAO,OAAoC,YAA+B;EACxE,KAAK,SAAS,MAAM,SAAS,WAAW,MAAM,MAAM,IAAI,KAAA;EACxD,KAAK,YAAY;CACnB;CAEA,IAAI,iBAAgC;EAClC,OAAO,KAAK,cAAc,KAAK,MAAM,GAAG,EAAE,aAAa,KAAK,CAAC;CAC/D;CAEA,IAAI,MAAqB;EACvB,OAAO,KAAK,cAAc,KAAK,MAAM,GAAG,EAAE,aAAa,MAAM,CAAC;CAChE;CAEA,IAAI,YAA4B;EAC9B,OAAO,KAAKR,OAAO,cAAc;CACnC;CAEA,QAA+B;EAC7B,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,IAAI,CAAC,KAAK,WAER,MAAM,IAAI,MAAM,gCAAgC;EAElD,OAAO,KAAK;CACd;CAIA,YAAY,OAAgB;EAC1B,KAAK,IAAI,KAAK;CAChB;CAEA,qBAA2B;EACzB,IAAI,KAAK,mBAAmB,KAAK,QAC/B,KAAK,OAAO,GAAG,OAAO,KAAK,MAAM;CAErC;CAEA,MAAM,yBAAwC;EAE5C,IAAI,KAAK,iBAAiB;EAC1B,MAAM,UAAU,MAAM,KAAK,KAAK,EAAE,aAAa,KAAK,CAAC;EACrD,IAAI,YAAY,KAAA,GAAW;GACzB,MAAM,YAAY,KAAK,iBAAiB,OAAO;GAE/C,IAAI,CAACS,oCAAAA,oBAAoB,SAAS,GAChC,UAAU,IAAI,KAAA,CAAgB;GAEhC,eAAA,SAAS,SAAS,KAAK,gBAAgB,KAAA,CAAS;EAClD;EACA,KAAK,SAAS,KAAA;EACd,KAAK,YAAY;CACnB;CAEA,IAAI,aAAa;EACf,OAAO,KAAKF;CACd;CAEA,WAA0B;EACxB,OAAO,6BAA6B,KAAK,OAAO,eAAe,KAAK,UAAU,eAAe,KAAK,UAAU,KAAK,oBAAoB,KAAK,eAAe;CAC3J;CAEA,cAAsB,QAAuB,MAAiD;EAC5F,OAAO,MAAM,gBAAgB,QAAQ,WAAW,KAAA,KAAa,CAAC,OAAO,kBAAkB,SAAS,KAAA;CAClG;;CAGA,iBAAyB,OAAyC;EAChE,OAAQ,MAAY,KAAK;CAC3B;CAEA,eAAwC;EACtC,IAAI,KAAK,OAAO,aAAa,OAAO,KAAA;EACpC,OAAOC,sBAAAA,iBAAiB,KAAK,OAAO,EAAE,CAAC,CAAC,qBAAqB,KAAK,OAAO,UAAU,KAAK,SAAS;CACnG;CAEA,IAAY,kBAA2B;EACrC,OAAOE,kCAAAA,gBAAgB,MAAM,KAAK,SAAS;CAC7C;CAEA,CAACC,kCAAAA,aAAa;CACd,CAACC,kCAAAA,aAAa;CACd,CAACC,mCAAAA,cAAc;CACf,CAAC,YAAY;AACf"}
@@ -1,14 +1,14 @@
1
- import { setField } from "../fields.js";
2
1
  import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
3
2
  import { RelationT, RelationU } from "./RelationSymbols.js";
4
- import { oneToOneBatchLoader } from "../batchloaders/oneToOneBatchLoader.js";
5
- import { isCascadeDelete } from "./isCascadeDelete.js";
6
3
  import { ReferenceN } from "./ReferenceSymbols.js";
7
- import { failIfNewEntity, failNoId } from "./ManyToOneReference.js";
4
+ import { setField } from "../fields.js";
5
+ import { deTagId } from "../keys.js";
8
6
  import "./Reference.js";
7
+ import { isCascadeDelete } from "./isCascadeDelete.js";
8
+ import { failIfNewEntity, failNoId } from "./ManyToOneReference.js";
9
+ import { oneToOneBatchLoader } from "../batchloaders/oneToOneBatchLoader.js";
9
10
  import { isReactiveReference } from "./ReactiveReference.js";
10
11
  import { lazyField } from "../newEntity.js";
11
- import { deTagId } from "../keys.js";
12
12
  import { getMetadata } from "../EntityMetadata.js";
13
13
  import { ensureNotDeleted } from "../index.js";
14
14
  import { appendStack, getEmInternalApi } from "../EntityManager.js";
@@ -1 +1 @@
1
- {"version":3,"file":"OneToOneReference.js","names":["#field","#hasBeenSet"],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"..//index.ts\";\nimport { oneToOneBatchLoader } from \"../batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"../Entity.ts\";\nimport { type EntityMetadata } from \"../EntityMetadata.ts\";\nimport { setField } from \"../fields.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"./ManyToOneReference.ts\";\nimport { isReactiveReference } from \"./ReactiveReference.ts\";\nimport { type Reference } from \"./Reference.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"OneToOneReference.js","names":["#field","#hasBeenSet"],"sources":["../../src/relations/OneToOneReference.ts"],"sourcesContent":["import { oneToOneBatchLoader } from \"src/batchloaders/oneToOneBatchLoader.ts\";\nimport { type Entity } from \"src/Entity.ts\";\nimport { type EntityMetadata } from \"src/EntityMetadata.ts\";\nimport { setField } from \"src/fields.ts\";\nimport {\n type IdOf,\n type LoadedReference,\n type OneToOneField,\n type TaggedId,\n appendStack,\n deTagId,\n ensureNotDeleted,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { type ManyToOneReference, failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { isReactiveReference } from \"src/relations/ReactiveReference.ts\";\nimport { type Reference } from \"src/relations/Reference.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nconst OneToOne = Symbol();\n\n/** An alias for creating `OneToOneReference`s. */\nexport function hasOneToOne<T extends Entity, U extends Entity>(): OneToOneReference<T, U> {\n return lazyField((entity: T, fieldName) => {\n const o2o = getMetadata(entity).allFields[fieldName] as OneToOneField;\n return new OneToOneReferenceImpl<T, U>(entity, o2o);\n });\n}\n\n/** The lazy-loaded/lookup side of a one-to-one, i.e. the side w/o the unique foreign key column. */\nexport interface OneToOneReference<T extends Entity, U extends Entity> extends Reference<T, U, undefined> {\n // Need to differentiate OneToOneReference from Reference\n [OneToOne]: T;\n}\n\n/** Adds a known-safe `get` accessor. */\nexport interface LoadedOneToOneReference<T extends Entity, U extends Entity> extends LoadedReference<T, U, undefined> {\n get: U | undefined;\n\n getWithDeleted: U | undefined;\n\n // Once OneToOneReference is loaded, it can get a lot of the ManyToOneReference methods that\n // are available even in an unloaded state; below is mostly a copy/paste of those.\n\n /** Returns the id of the current assigned entity or a runtime error if it's either a) unset or b) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n idIfSet: IdOf<U> | undefined;\n\n idUntagged: string;\n\n idUntaggedMaybe: string | undefined;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/** Type guard utility for determining if an entity field is a Reference. */\nexport function isOneToOneReference(maybeReference: any): maybeReference is OneToOneReference<any, any> {\n return maybeReference instanceof OneToOneReferenceImpl;\n}\n\n/** Type guard utility for determining if an entity field is a loaded Reference. */\nexport function isLoadedOneToOneReference(\n maybeReference: any,\n): maybeReference is Reference<any, any, any> & LoadedOneToOneReference<any, any> {\n return isOneToOneReference(maybeReference) && maybeReference.isLoaded;\n}\n\n/**\n * Represents the \"many\" side of a one-to-one relationship.\n *\n * I.e. in a one-to-many from Book -> Reviews, there is a review.book_id that can have many books.\n *\n * This class is for when that `review.book_id` column is itself unique, i.e. like `image.book_id`, and\n * so instead of `Book.images: OneToManyCollection` we have a `Book.image: OneToOneReference`.\n *\n * This class implements `Reference` because it is essentially like \"one entity pointing/refereing to another\",\n * however because we require a `.load` call to lazily know the value of other side (unlike ManyToOneReference\n * which has it's `book_id` column immediately available in the entity `data` hash), there is some wonkiness\n * around methods like `Reference.id` that are usually callable without `load`/`populate`, that for this\n * class can actually only be called post `load`/`populate`.\n *\n * Currently we enforce this with a runtime check, which is not great, but the trade-off of implementing\n * `Reference` seemed worth the downside of a un-type-safe `.id` property.\n */\nexport class OneToOneReferenceImpl<T extends Entity, U extends Entity>\n extends AbstractRelationImpl<T, U>\n implements OneToOneReference<T, U>\n{\n #field: OneToOneField;\n private loaded: U | undefined;\n private _isLoaded: boolean = false;\n #hasBeenSet = false;\n\n constructor(entity: T, field: OneToOneField) {\n super(entity);\n this.#field = field;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n // These are public to our internal implementation but not exposed in the Collection API\n get fieldName(): keyof T & string {\n return this.#field.fieldName as keyof T & string;\n }\n\n get otherFieldName(): keyof U & string {\n return this.#field.otherFieldName as keyof U & string;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idIfSet(): IdOf<U> | undefined {\n if (this._isLoaded) {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.loaded);\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.loaded);\n }\n\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idMaybe as IdOf<U> | undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n get idTaggedMaybe(): TaggedId | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (this._isLoaded) {\n return this.loaded?.idTaggedMaybe;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n get isSet(): boolean {\n if (this._isLoaded) {\n return this.loaded !== undefined;\n }\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n\n // opts is an internal parameter\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | undefined> {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded || opts.forceReload) {\n if (!this.entity.isNewEntity) {\n const joinLoaded = this.getPreloaded();\n if (joinLoaded) {\n this.loaded = joinLoaded[0];\n } else {\n try {\n await oneToOneBatchLoader(this.entity.em, this).load(this.entity.idTagged);\n } catch (err) {\n throw appendStack(err as Error, new Error());\n }\n this.preload();\n }\n }\n this._isLoaded = true;\n }\n return this.filterDeleted(this.loaded, opts);\n }\n\n set(other: U, opts: { percolating?: boolean } = {}): void {\n ensureNotDeleted(this.entity, \"pending\");\n this.#hasBeenSet = true;\n if (other === this.loaded) {\n this._isLoaded = true;\n return;\n }\n if (this._isLoaded) {\n if (this.loaded && !opts.percolating) {\n this.getOtherRelation(this.loaded).set(undefined);\n }\n }\n const { fieldLogger } = getEmInternalApi(this.entity.em);\n fieldLogger.logSet(this.entity, this.fieldName, other);\n this.loaded = other;\n this._isLoaded = true;\n // This will no-op and mark other dirty if necessary\n if (other && !opts.percolating) {\n this.getOtherRelation(other).set(this.entity);\n }\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n get isPreloaded(): boolean {\n return !!this.getPreloaded();\n }\n\n preload(): void {\n this.loaded = this.getPreloaded()?.[0];\n this._isLoaded = true;\n }\n\n import(other: OneToOneReferenceImpl<T, U>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n get getWithDeleted(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n get get(): U | undefined {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get otherMeta(): EntityMetadata {\n return this.#field.otherMetadata();\n }\n\n private doGet(): U | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this._isLoaded) {\n // This should only be callable in the type system if we've already resolved this to an instance\n throw new Error(\"get was called when not loaded\");\n }\n return this.loaded;\n }\n\n // internal impl\n\n setFromOpts(other: U): void {\n this.set(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete && this.loaded) {\n this.entity.em.delete(this.loaded);\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const otherSide = this.getOtherRelation(current);\n // Don't call `ReactiveReference.set` because it'll blow up\n if (!isReactiveReference(otherSide)) {\n otherSide.set(undefined as any);\n }\n setField(current, this.otherFieldName, undefined);\n }\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n public toString(): string {\n return `OneToOneReference(entity: ${this.entity}, fieldName: ${this.fieldName}, otherType: ${this.otherMeta.type}, otherFieldName: ${this.otherFieldName})`;\n }\n\n private filterDeleted(entity: U | undefined, opts?: { withDeleted?: boolean }): U | undefined {\n return opts?.withDeleted === true || entity === undefined || !entity.isDeletedEntity ? entity : undefined;\n }\n\n /** Returns the other relation that points back at us, i.e. we're `Author.image` and this is `Image.author_id`. */\n private getOtherRelation(other: U): ManyToOneReference<U, T, any> {\n return (other as U)[this.otherFieldName] as any;\n }\n\n private getPreloaded(): U[] | undefined {\n if (this.entity.isNewEntity) return undefined;\n return getEmInternalApi(this.entity.em).getPreloadedRelation(this.entity.idTagged, this.fieldName);\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n [RelationT] = null!;\n [RelationU] = null!;\n [ReferenceN] = null!;\n [OneToOne] = null!;\n}\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_fields = require("../fields.cjs");
3
2
  const require_relations_AbstractRelationImpl = require("./AbstractRelationImpl.cjs");
4
3
  const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
4
+ const require_relations_ReferenceSymbols = require("./ReferenceSymbols.cjs");
5
+ const require_fields = require("../fields.cjs");
6
+ const require_keys = require("../keys.cjs");
5
7
  const require_relations_isCascadeDelete = require("./isCascadeDelete.cjs");
6
8
  const require_relations_OneToManyCollection = require("./OneToManyCollection.cjs");
7
- const require_relations_ReferenceSymbols = require("./ReferenceSymbols.cjs");
8
9
  const require_relations_ManyToOneReference = require("./ManyToOneReference.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_configure = require("../configure.cjs");
13
13
  const require_EntityMetadata = require("../EntityMetadata.cjs");
14
14
  const require_index = require("../index.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"PolymorphicReference.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","getInstanceData","maybeGetConstructorFromReference","isCascadeDelete","isEntity","getConstructorFromTaggedId","failNoId","maybeResolveReferenceToId","failIfNewEntity","#hasBeenSet","OneToManyCollection","sameEntity","getField","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/PolymorphicReference.ts"],"sourcesContent":["import { maybeGetConstructorFromReference } from \"../configure.ts\";\nimport { type Entity, isEntity } from \"../Entity.ts\";\nimport { type IdOf, type TaggedId, sameEntity } from \"../EntityManager.ts\";\nimport { type PolymorphicFieldComponent, getMetadata } from \"../EntityMetadata.ts\";\nimport { getField, setField } from \"../fields.ts\";\nimport {\n type OneToOneReference,\n type PolymorphicField,\n type Reference,\n ensureNotDeleted,\n fail,\n getConstructorFromTaggedId,\n getInstanceData,\n maybeResolveReferenceToId,\n} from \"../index.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"./ManyToOneReference.ts\";\nimport { OneToManyCollection } from \"./OneToManyCollection.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport function hasOnePolymorphic<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n>(): PolymorphicReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n return new PolymorphicReferenceImpl<T, U, N>(entity, fieldName as keyof T & string);\n });\n}\n\n/** Type guard utility for determining if an entity field is a PolymorphicReference. */\nexport function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any> {\n return maybeReference instanceof PolymorphicReferenceImpl;\n}\n\n/**\n * A reference that can be assigned to multiple different entity types.\n *\n * I.e. a `Comment.parent` reference that can be an `Author` or `Book`.\n *\n * The `U` generic will be the type union of `Author | Book`.\n */\nexport interface PolymorphicReference<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n> extends Reference<T, U, N> {\n /** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n /** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */\n idIfSet: IdOf<U> | undefined;\n\n /** Returns the id of the current assigned entity, undefined if unset, or undefined if set to a new entity. */\n idMaybe: IdOf<U> | undefined;\n\n idTagged: string;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/**\n * Manages a set of foreign keys from one entity to another, i.e. `Comment.parent --> Book | BookReview`.\n *\n * We keep the current `parent` / `parent.id` value in the `__orm.data` hash, where the\n * current value could be either the `comments.parent_book_id` / `comments.parent_book_review_id` id (as a tagged string)\n * from the database, or an entity `Book` / `BookReview` that the user has set.\n *\n * Note that if any of our columns (eg `comments.parent_book_review_id`) is unique, this `PolymorphicReference` will\n * essentially be half of a one-to-one relationship, but we'll keep using this reference on the \"owning\" side; the other\n * side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.\n */\nexport class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements PolymorphicReference<T, U, N>\n{\n private loaded: U | N | undefined;\n // We need a separate boolean to b/c loaded == undefined can still mean \"_isLoaded\" for nullable fks.\n private _isLoaded = false;\n private field: PolymorphicField;\n #hasBeenSet = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n ) {\n super(entity);\n this.field = getMetadata(entity).allFields[this.fieldName] as PolymorphicField;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n private get currentComponent(): PolymorphicFieldComponent | N {\n const cstr = maybeGetConstructorFromReference(this.current());\n return this.field.components.find((c) => c.otherMetadata().cstr === cstr) as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const current = this.current();\n // Resolve the id to an entity\n if (!this._isLoaded || opts.forceReload) {\n this.loaded =\n isEntity(current) || current === undefined\n ? (current as U | undefined)\n : ((await this.entity.em.load(getConstructorFromTaggedId(current), current)) as U);\n }\n this._isLoaded = true;\n return this.filterDeleted(this.loaded!, opts);\n }\n\n set(other: U | N): void {\n this.setImpl(other);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Looks for an entity in `EntityManager`, b/c we may have it in memory even if\n * our reference is not specifically loaded.\n */\n maybeFindEntity(): U | undefined {\n // Check this.loaded first b/c a new entity won't have an id yet\n const { idTaggedMaybe } = this;\n return this.loaded ?? (idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U) : undefined);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.loaded = this.maybeFindEntity();\n this._isLoaded = true;\n }\n\n private unload(): void {\n this.loaded = undefined;\n this._isLoaded = false;\n }\n\n import(other: PolymorphicReferenceImpl<T, U, N>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n // This should only be callable in the type system if we've already resolved this to an instance,\n // but, just in case we somehow got here in an unloaded state, check to see if we're already in the UoW\n if (!this._isLoaded) {\n const existing = this.maybeFindExisting();\n if (existing === undefined) {\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n this.loaded = existing;\n this._isLoaded = true;\n }\n\n return this.filterDeleted(this.loaded!, opts);\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as IdOf<U> | undefined;\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idTagged(): string {\n return this.idTaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idTaggedMaybe(): string | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current());\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n // private impl\n\n setFromOpts(other: U): void {\n this.setImpl(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n const current = this.current({ withDeleted: true });\n if (current !== undefined && typeof current !== \"string\") {\n this.entity.em.delete(current as U);\n }\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const o2m = this.getOtherRelation(current);\n if (o2m instanceof OneToManyCollection) {\n o2m.remove(this.entity, { requireLoaded: false });\n } else {\n o2m.set(undefined as any);\n }\n }\n setField(this.entity, this.fieldName, undefined);\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n // Internal method used by PolymorphicReference\n setImpl(other: U | N): void {\n this.#hasBeenSet = true;\n\n if (sameEntity(other, this.current({ withDeleted: true }))) {\n return;\n }\n\n if (\n other !== undefined &&\n !this.field.components.some(\n (c) =>\n other instanceof c.otherMetadata().cstr ||\n (typeof other === \"string\" && getConstructorFromTaggedId(other) === c.otherMetadata().cstr),\n )\n ) {\n fail(`${other} cannot be set as '${this.field.fieldName}' on ${this.entity}`);\n }\n\n // we may not be loaded yet, but our previous entity might already be in the UoW\n const previousLoaded = this.loaded ?? this.maybeFindExisting();\n\n ensureNotDeleted(this.entity, \"pending\");\n\n // Keep the entity when its tagged id cannot distinguish between sibling subtypes.\n if (isEntity(other)) {\n const otherMeta = getMetadata(other);\n const hasComponentsWithSameBaseType =\n otherMeta.baseType &&\n this.field.components.some(\n (component) =>\n component.otherMetadata().baseType === otherMeta.baseType &&\n !(other instanceof component.otherMetadata().cstr),\n );\n setField(\n this.entity,\n this.fieldName,\n other.isNewEntity || hasComponentsWithSameBaseType ? other : other.idTagged,\n );\n } else {\n setField(this.entity, this.fieldName, other);\n }\n\n if (typeof other === \"string\") {\n this.loaded = undefined;\n this._isLoaded = false;\n } else {\n this.loaded = other;\n this._isLoaded = true;\n }\n\n // If had an existing value, remove us from its collection\n if (previousLoaded) {\n const prevRelation = this.getOtherRelation(previousLoaded);\n if (prevRelation instanceof OneToManyCollection) {\n prevRelation.removeIfLoaded(this.entity);\n } else {\n prevRelation.set(undefined as any);\n }\n }\n if (other !== undefined && isEntity(other)) {\n const newRelation = this.getOtherRelation(other);\n if (newRelation instanceof OneToManyCollection) {\n newRelation.add(this.entity);\n } else {\n newRelation.set(this.entity);\n }\n }\n }\n\n // We need to keep U in data[fieldName] to handle entities without an id assigned yet.\n current(opts?: { withDeleted?: boolean }): U | TaggedId | N {\n const current = getField(this.entity, this.fieldName);\n if (current !== undefined && isEntity(current)) {\n return this.filterDeleted(current as U, opts);\n }\n return current;\n }\n\n public toString(): string {\n return `PolymorphicReference(entity: ${this.entity}, fieldName: ${\n this.fieldName\n }, otherType: ${this.currentComponent?.otherMetadata().type}, otherFieldName: ${\n this.currentComponent?.otherFieldName\n }, id: ${this.id})`;\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 /** Returns the other relation that points back at us, i.e. we're `comment.parent_book_id` and this is `Book.comments`. */\n private getOtherRelation(other: U): OneToManyCollection<U, T> | OneToOneReference<U, T> {\n const component = this.field.components.find((c) => other instanceof c.otherMetadata().cstr) as any;\n return (other as U)[component?.otherFieldName as keyof U] as any;\n }\n\n private maybeFindExisting(): U | undefined {\n return this.idTaggedMaybe !== undefined ? (this.entity.em.getEntity(this.idTagged) as U) : undefined;\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":"PolymorphicReference.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","getInstanceData","maybeGetConstructorFromReference","isCascadeDelete","isEntity","getConstructorFromTaggedId","failNoId","maybeResolveReferenceToId","failIfNewEntity","#hasBeenSet","OneToManyCollection","sameEntity","getField","RelationT","RelationU","ReferenceN"],"sources":["../../src/relations/PolymorphicReference.ts"],"sourcesContent":["import { maybeGetConstructorFromReference } from \"src/configure.ts\";\nimport { type Entity, isEntity } from \"src/Entity.ts\";\nimport { type IdOf, type TaggedId, sameEntity } from \"src/EntityManager.ts\";\nimport { type PolymorphicFieldComponent, getMetadata } from \"src/EntityMetadata.ts\";\nimport { getField, setField } from \"src/fields.ts\";\nimport {\n type OneToOneReference,\n type PolymorphicField,\n type Reference,\n ensureNotDeleted,\n fail,\n getConstructorFromTaggedId,\n getInstanceData,\n maybeResolveReferenceToId,\n} from \"src/index.ts\";\nimport { lazyField } from \"src/newEntity.ts\";\nimport { AbstractRelationImpl } from \"src/relations/AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"src/relations/isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"src/relations/ManyToOneReference.ts\";\nimport { OneToManyCollection } from \"src/relations/OneToManyCollection.ts\";\nimport { ReferenceN } from \"src/relations/ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"src/relations/RelationSymbols.ts\";\n\nexport function hasOnePolymorphic<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n>(): PolymorphicReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n return new PolymorphicReferenceImpl<T, U, N>(entity, fieldName as keyof T & string);\n });\n}\n\n/** Type guard utility for determining if an entity field is a PolymorphicReference. */\nexport function isPolymorphicReference(maybeReference: any): maybeReference is PolymorphicReference<any, any, any> {\n return maybeReference instanceof PolymorphicReferenceImpl;\n}\n\n/**\n * A reference that can be assigned to multiple different entity types.\n *\n * I.e. a `Comment.parent` reference that can be an `Author` or `Book`.\n *\n * The `U` generic will be the type union of `Author | Book`.\n */\nexport interface PolymorphicReference<\n T extends Entity,\n U extends Entity,\n N extends never | undefined,\n> extends Reference<T, U, N> {\n /** Returns the id of the current assigned entity, or a runtime error if either 1) unset or 2) set to a new entity that doesn't have an `id` yet. */\n id: IdOf<U>;\n\n /** Returns the id of the current assigned entity, undefined if unset, or a runtime error if set to a new entity. */\n idIfSet: IdOf<U> | undefined;\n\n /** Returns the id of the current assigned entity, undefined if unset, or undefined if set to a new entity. */\n idMaybe: IdOf<U> | undefined;\n\n idTagged: string;\n\n /** Returns `true` if this relation is currently set (i.e. regardless of whether it's loaded, or if it is set but the assigned entity doesn't have an id saved. */\n readonly isSet: boolean;\n}\n\n/**\n * Manages a set of foreign keys from one entity to another, i.e. `Comment.parent --> Book | BookReview`.\n *\n * We keep the current `parent` / `parent.id` value in the `__orm.data` hash, where the\n * current value could be either the `comments.parent_book_id` / `comments.parent_book_review_id` id (as a tagged string)\n * from the database, or an entity `Book` / `BookReview` that the user has set.\n *\n * Note that if any of our columns (eg `comments.parent_book_review_id`) is unique, this `PolymorphicReference` will\n * essentially be half of a one-to-one relationship, but we'll keep using this reference on the \"owning\" side; the other\n * side, i.e. `BookReview.comment` will use a `OneToOneReference` to point back to us.\n */\nexport class PolymorphicReferenceImpl<T extends Entity, U extends Entity, N extends never | undefined>\n extends AbstractRelationImpl<T, U>\n implements PolymorphicReference<T, U, N>\n{\n private loaded: U | N | undefined;\n // We need a separate boolean to b/c loaded == undefined can still mean \"_isLoaded\" for nullable fks.\n private _isLoaded = false;\n private field: PolymorphicField;\n #hasBeenSet = false;\n\n constructor(\n entity: T,\n public fieldName: keyof T & string,\n ) {\n super(entity);\n this.field = getMetadata(entity).allFields[this.fieldName] as PolymorphicField;\n if (getInstanceData(entity).isOrWasNew) {\n this._isLoaded = true;\n }\n }\n\n private get currentComponent(): PolymorphicFieldComponent | N {\n const cstr = maybeGetConstructorFromReference(this.current());\n return this.field.components.find((c) => c.otherMetadata().cstr === cstr) as any;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.fieldName);\n }\n\n async load(opts: { withDeleted?: boolean; forceReload?: boolean } = {}): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const current = this.current();\n // Resolve the id to an entity\n if (!this._isLoaded || opts.forceReload) {\n this.loaded =\n isEntity(current) || current === undefined\n ? (current as U | undefined)\n : ((await this.entity.em.load(getConstructorFromTaggedId(current), current)) as U);\n }\n this._isLoaded = true;\n return this.filterDeleted(this.loaded!, opts);\n }\n\n set(other: U | N): void {\n this.setImpl(other);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Looks for an entity in `EntityManager`, b/c we may have it in memory even if\n * our reference is not specifically loaded.\n */\n maybeFindEntity(): U | undefined {\n // Check this.loaded first b/c a new entity won't have an id yet\n const { idTaggedMaybe } = this;\n return this.loaded ?? (idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U) : undefined);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.loaded = this.maybeFindEntity();\n this._isLoaded = true;\n }\n\n private unload(): void {\n this.loaded = undefined;\n this._isLoaded = false;\n }\n\n import(other: PolymorphicReferenceImpl<T, U, N>, findEntity: (e: U) => U): void {\n this.loaded = other.loaded ? findEntity(other.loaded) : undefined;\n this._isLoaded = true;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n ensureNotDeleted(this.entity, \"pending\");\n // This should only be callable in the type system if we've already resolved this to an instance,\n // but, just in case we somehow got here in an unloaded state, check to see if we're already in the UoW\n if (!this._isLoaded) {\n const existing = this.maybeFindExisting();\n if (existing === undefined) {\n throw new Error(`${this.entity}.${this.fieldName} was not loaded`);\n }\n this.loaded = existing;\n this._isLoaded = true;\n }\n\n return this.filterDeleted(this.loaded!, opts);\n }\n\n get getWithDeleted(): U | N {\n return this.doGet({ withDeleted: true });\n }\n\n get get(): U | N {\n return this.doGet({ withDeleted: false });\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as IdOf<U> | undefined;\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idTagged(): string {\n return this.idTaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idTaggedMaybe(): string | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current());\n }\n\n get hasBeenSet() {\n return this.#hasBeenSet;\n }\n\n // private impl\n\n setFromOpts(other: U): void {\n this.setImpl(other);\n }\n\n maybeCascadeDelete(): void {\n if (this.isCascadeDelete) {\n const current = this.current({ withDeleted: true });\n if (current !== undefined && typeof current !== \"string\") {\n this.entity.em.delete(current as U);\n }\n }\n }\n\n async cleanupOnEntityDeleted(): Promise<void> {\n // if we are going to delete this relation as well, then we don't need to clean it up\n if (this.isCascadeDelete) return;\n const current = await this.load({ withDeleted: true });\n if (current !== undefined) {\n const o2m = this.getOtherRelation(current);\n if (o2m instanceof OneToManyCollection) {\n o2m.remove(this.entity, { requireLoaded: false });\n } else {\n o2m.set(undefined as any);\n }\n }\n setField(this.entity, this.fieldName, undefined);\n this.loaded = undefined as any;\n this._isLoaded = true;\n }\n\n // Internal method used by PolymorphicReference\n setImpl(other: U | N): void {\n this.#hasBeenSet = true;\n\n if (sameEntity(other, this.current({ withDeleted: true }))) {\n return;\n }\n\n if (\n other !== undefined &&\n !this.field.components.some(\n (c) =>\n other instanceof c.otherMetadata().cstr ||\n (typeof other === \"string\" && getConstructorFromTaggedId(other) === c.otherMetadata().cstr),\n )\n ) {\n fail(`${other} cannot be set as '${this.field.fieldName}' on ${this.entity}`);\n }\n\n // we may not be loaded yet, but our previous entity might already be in the UoW\n const previousLoaded = this.loaded ?? this.maybeFindExisting();\n\n ensureNotDeleted(this.entity, \"pending\");\n\n // Keep the entity when its tagged id cannot distinguish between sibling subtypes.\n if (isEntity(other)) {\n const otherMeta = getMetadata(other);\n const hasComponentsWithSameBaseType =\n otherMeta.baseType &&\n this.field.components.some(\n (component) =>\n component.otherMetadata().baseType === otherMeta.baseType &&\n !(other instanceof component.otherMetadata().cstr),\n );\n setField(\n this.entity,\n this.fieldName,\n other.isNewEntity || hasComponentsWithSameBaseType ? other : other.idTagged,\n );\n } else {\n setField(this.entity, this.fieldName, other);\n }\n\n if (typeof other === \"string\") {\n this.loaded = undefined;\n this._isLoaded = false;\n } else {\n this.loaded = other;\n this._isLoaded = true;\n }\n\n // If had an existing value, remove us from its collection\n if (previousLoaded) {\n const prevRelation = this.getOtherRelation(previousLoaded);\n if (prevRelation instanceof OneToManyCollection) {\n prevRelation.removeIfLoaded(this.entity);\n } else {\n prevRelation.set(undefined as any);\n }\n }\n if (other !== undefined && isEntity(other)) {\n const newRelation = this.getOtherRelation(other);\n if (newRelation instanceof OneToManyCollection) {\n newRelation.add(this.entity);\n } else {\n newRelation.set(this.entity);\n }\n }\n }\n\n // We need to keep U in data[fieldName] to handle entities without an id assigned yet.\n current(opts?: { withDeleted?: boolean }): U | TaggedId | N {\n const current = getField(this.entity, this.fieldName);\n if (current !== undefined && isEntity(current)) {\n return this.filterDeleted(current as U, opts);\n }\n return current;\n }\n\n public toString(): string {\n return `PolymorphicReference(entity: ${this.entity}, fieldName: ${\n this.fieldName\n }, otherType: ${this.currentComponent?.otherMetadata().type}, otherFieldName: ${\n this.currentComponent?.otherFieldName\n }, id: ${this.id})`;\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 /** Returns the other relation that points back at us, i.e. we're `comment.parent_book_id` and this is `Book.comments`. */\n private getOtherRelation(other: U): OneToManyCollection<U, T> | OneToOneReference<U, T> {\n const component = this.field.components.find((c) => other instanceof c.otherMetadata().cstr) as any;\n return (other as U)[component?.otherFieldName as keyof U] as any;\n }\n\n private maybeFindExisting(): U | undefined {\n return this.idTaggedMaybe !== undefined ? (this.entity.em.getEntity(this.idTagged) as U) : undefined;\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuBA,SAAgB,oBAImB;CACjC,OAAOA,kBAAAA,WAAW,QAAW,cAAc;EACzC,OAAO,IAAI,yBAAkC,QAAQ,SAA6B;CACpF,CAAC;AACH;;AAGA,SAAgB,uBAAuB,gBAA4E;CACjH,OAAO,0BAA0B;AACnC;;;;;;;;;;;;AAwCA,IAAa,2BAAb,cACUC,uCAAAA,qBAEV;CASW;CART;CAEA,YAAoB;CACpB;CACA,cAAc;CAEd,YACE,QACA,WACA;EACA,MAAM,MAAM;EAFL,KAAA,YAAA;EAGP,KAAK,QAAQC,uBAAAA,YAAY,MAAM,CAAC,CAAC,UAAU,KAAK;EAChD,IAAIC,mBAAAA,gBAAgB,MAAM,CAAC,CAAC,YAC1B,KAAK,YAAY;CAErB;CAEA,IAAY,mBAAkD;EAC5D,MAAM,OAAOC,kBAAAA,iCAAiC,KAAK,QAAQ,CAAC;EAC5D,OAAO,KAAK,MAAM,WAAW,MAAM,MAAM,EAAE,cAAc,CAAC,CAAC,SAAS,IAAI;CAC1E;CAEA,IAAY,kBAA2B;EACrC,OAAOC,kCAAAA,gBAAgB,MAAM,KAAK,SAAS;CAC7C;CAEA,MAAM,KAAK,OAAyD,CAAC,GAAmB;EACtF,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,MAAM,UAAU,KAAK,QAAQ;EAE7B,IAAI,CAAC,KAAK,aAAa,KAAK,aAC1B,KAAK,SACHC,eAAAA,SAAS,OAAO,KAAK,YAAY,KAAA,IAC5B,UACC,MAAM,KAAK,OAAO,GAAG,KAAKC,kBAAAA,2BAA2B,OAAO,GAAG,OAAO;EAEhF,KAAK,YAAY;EACjB,OAAO,KAAK,cAAc,KAAK,QAAS,IAAI;CAC9C;CAEA,IAAI,OAAoB;EACtB,KAAK,QAAQ,KAAK;CACpB;CAEA,IAAI,QAAiB;EACnB,OAAO,KAAK,QAAQ,MAAM,KAAA;CAC5B;CAEA,IAAI,WAAoB;EACtB,OAAO,KAAK;CACd;;;;;CAMA,kBAAiC;EAE/B,MAAM,EAAE,kBAAkB;EAC1B,OAAO,KAAK,WAAW,kBAAkB,KAAA,IAAa,KAAK,OAAO,GAAG,UAAU,aAAa,IAAU,KAAA;CACxG;CAEA,IAAI,cAAuB;EACzB,OAAO,CAAC,CAAC,KAAK,gBAAgB;CAChC;CAEA,UAAgB;EACd,KAAK,SAAS,KAAK,gBAAgB;EACnC,KAAK,YAAY;CACnB;CAEA,SAAuB;EACrB,KAAK,SAAS,KAAA;EACd,KAAK,YAAY;CACnB;CAEA,OAAO,OAA0C,YAA+B;EAC9E,KAAK,SAAS,MAAM,SAAS,WAAW,MAAM,MAAM,IAAI,KAAA;EACxD,KAAK,YAAY;CACnB;CAEA,MAAc,MAAyC;EACrD,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EAGvC,IAAI,CAAC,KAAK,WAAW;GACnB,MAAM,WAAW,KAAK,kBAAkB;GACxC,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,UAAU,gBAAgB;GAEnE,KAAK,SAAS;GACd,KAAK,YAAY;EACnB;EAEA,OAAO,KAAK,cAAc,KAAK,QAAS,IAAI;CAC9C;CAEA,IAAI,iBAAwB;EAC1B,OAAO,KAAK,MAAM,EAAE,aAAa,KAAK,CAAC;CACzC;CAEA,IAAI,MAAa;EACf,OAAO,KAAK,MAAM,EAAE,aAAa,MAAM,CAAC;CAC1C;CAEA,IAAI,KAAc;EAChB,OAAO,KAAK,WAAWC,qCAAAA,SAAS,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ,CAAC;CAC7E;CAEA,IAAI,UAA+B;EACjC,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,OAAOC,aAAAA,0BAA0B,KAAK,QAAQ,CAAC;CACjD;CAEA,IAAI,UAAmC;EACrC,OAAO,KAAK,WAAWC,qCAAAA,gBAAgB,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ,CAAC;CACpF;CAEA,IAAI,WAAmB;EACrB,OAAO,KAAK,iBAAiBF,qCAAAA,SAAS,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ,CAAC;CACnF;CAEA,IAAI,gBAAoC;EACtC,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EACvC,OAAOC,aAAAA,0BAA0B,KAAK,QAAQ,CAAC;CACjD;CAEA,IAAI,aAAa;EACf,OAAO,KAAKE;CACd;CAIA,YAAY,OAAgB;EAC1B,KAAK,QAAQ,KAAK;CACpB;CAEA,qBAA2B;EACzB,IAAI,KAAK,iBAAiB;GACxB,MAAM,UAAU,KAAK,QAAQ,EAAE,aAAa,KAAK,CAAC;GAClD,IAAI,YAAY,KAAA,KAAa,OAAO,YAAY,UAC9C,KAAK,OAAO,GAAG,OAAO,OAAY;EAEtC;CACF;CAEA,MAAM,yBAAwC;EAE5C,IAAI,KAAK,iBAAiB;EAC1B,MAAM,UAAU,MAAM,KAAK,KAAK,EAAE,aAAa,KAAK,CAAC;EACrD,IAAI,YAAY,KAAA,GAAW;GACzB,MAAM,MAAM,KAAK,iBAAiB,OAAO;GACzC,IAAI,eAAeC,sCAAAA,qBACjB,IAAI,OAAO,KAAK,QAAQ,EAAE,eAAe,MAAM,CAAC;QAEhD,IAAI,IAAI,KAAA,CAAgB;EAE5B;EACA,eAAA,SAAS,KAAK,QAAQ,KAAK,WAAW,KAAA,CAAS;EAC/C,KAAK,SAAS,KAAA;EACd,KAAK,YAAY;CACnB;CAGA,QAAQ,OAAoB;EAC1B,KAAKD,cAAc;EAEnB,IAAIE,sBAAAA,WAAW,OAAO,KAAK,QAAQ,EAAE,aAAa,KAAK,CAAC,CAAC,GACvD;EAGF,IACE,UAAU,KAAA,KACV,CAAC,KAAK,MAAM,WAAW,MACpB,MACC,iBAAiB,EAAE,cAAc,CAAC,CAAC,QAClC,OAAO,UAAU,YAAYN,kBAAAA,2BAA2B,KAAK,MAAM,EAAE,cAAc,CAAC,CAAC,IAC1F,GAEA,cAAA,KAAK,GAAG,MAAM,qBAAqB,KAAK,MAAM,UAAU,OAAO,KAAK,QAAQ;EAI9E,MAAM,iBAAiB,KAAK,UAAU,KAAK,kBAAkB;EAE7D,cAAA,iBAAiB,KAAK,QAAQ,SAAS;EAGvC,IAAID,eAAAA,SAAS,KAAK,GAAG;GACnB,MAAM,YAAYJ,uBAAAA,YAAY,KAAK;GACnC,MAAM,gCACJ,UAAU,YACV,KAAK,MAAM,WAAW,MACnB,cACC,UAAU,cAAc,CAAC,CAAC,aAAa,UAAU,YACjD,EAAE,iBAAiB,UAAU,cAAc,CAAC,CAAC,KACjD;GACF,eAAA,SACE,KAAK,QACL,KAAK,WACL,MAAM,eAAe,gCAAgC,QAAQ,MAAM,QACrE;EACF,OACE,eAAA,SAAS,KAAK,QAAQ,KAAK,WAAW,KAAK;EAG7C,IAAI,OAAO,UAAU,UAAU;GAC7B,KAAK,SAAS,KAAA;GACd,KAAK,YAAY;EACnB,OAAO;GACL,KAAK,SAAS;GACd,KAAK,YAAY;EACnB;EAGA,IAAI,gBAAgB;GAClB,MAAM,eAAe,KAAK,iBAAiB,cAAc;GACzD,IAAI,wBAAwBU,sCAAAA,qBAC1B,aAAa,eAAe,KAAK,MAAM;QAEvC,aAAa,IAAI,KAAA,CAAgB;EAErC;EACA,IAAI,UAAU,KAAA,KAAaN,eAAAA,SAAS,KAAK,GAAG;GAC1C,MAAM,cAAc,KAAK,iBAAiB,KAAK;GAC/C,IAAI,uBAAuBM,sCAAAA,qBACzB,YAAY,IAAI,KAAK,MAAM;QAE3B,YAAY,IAAI,KAAK,MAAM;EAE/B;CACF;CAGA,QAAQ,MAAoD;EAC1D,MAAM,UAAUE,eAAAA,SAAS,KAAK,QAAQ,KAAK,SAAS;EACpD,IAAI,YAAY,KAAA,KAAaR,eAAAA,SAAS,OAAO,GAC3C,OAAO,KAAK,cAAc,SAAc,IAAI;EAE9C,OAAO;CACT;CAEA,WAA0B;EACxB,OAAO,gCAAgC,KAAK,OAAO,eACjD,KAAK,UACN,eAAe,KAAK,kBAAkB,cAAc,CAAC,CAAC,KAAK,oBAC1D,KAAK,kBAAkB,eACxB,QAAQ,KAAK,GAAG;CACnB;CAEA,cAAsB,QAAe,MAAyC;EAC5E,OAAO,MAAM,gBAAgB,QAAQ,WAAW,KAAA,KAAa,CAAC,OAAO,kBAAkB,SAAU,KAAA;CACnG;;CAGA,iBAAyB,OAA+D;EAEtF,OAAQ,MADU,KAAK,MAAM,WAAW,MAAM,MAAM,iBAAiB,EAAE,cAAc,CAAC,CAAC,IAC3D,CAAC,EAAE;CACjC;CAEA,oBAA2C;EACzC,OAAO,KAAK,kBAAkB,KAAA,IAAa,KAAK,OAAO,GAAG,UAAU,KAAK,QAAQ,IAAU,KAAA;CAC7F;CAEA,CAACS,kCAAAA,aAAgB;CACjB,CAACC,kCAAAA,aAAgB;CACjB,CAACC,mCAAAA,cAAiB;AACpB"}
@@ -1,13 +1,13 @@
1
- import { getField, setField } from "../fields.js";
2
1
  import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
3
2
  import { RelationT, RelationU } from "./RelationSymbols.js";
3
+ import { ReferenceN } from "./ReferenceSymbols.js";
4
+ import { getField, setField } from "../fields.js";
5
+ import { maybeResolveReferenceToId } from "../keys.js";
4
6
  import { isCascadeDelete } from "./isCascadeDelete.js";
5
7
  import { OneToManyCollection } from "./OneToManyCollection.js";
6
- import { ReferenceN } from "./ReferenceSymbols.js";
7
8
  import { failIfNewEntity, failNoId } from "./ManyToOneReference.js";
8
9
  import { fail } from "../utils.js";
9
10
  import { lazyField } from "../newEntity.js";
10
- import { maybeResolveReferenceToId } from "../keys.js";
11
11
  import { getConstructorFromTaggedId, maybeGetConstructorFromReference } from "../configure.js";
12
12
  import { getMetadata } from "../EntityMetadata.js";
13
13
  import { ensureNotDeleted } from "../index.js";