joist-core 2.3.0-next.96 → 2.3.0-next.98

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 (1190) hide show
  1. package/build/EntityManager.cjs +55 -59
  2. package/build/EntityManager.cjs.map +1 -1
  3. package/build/EntityManager.d.cts +11 -11
  4. package/build/EntityManager.d.mts +11 -11
  5. package/build/EntityManager.js +30 -34
  6. package/build/EntityManager.js.map +1 -1
  7. package/build/EntityMetadata.cjs +2 -4
  8. package/build/EntityMetadata.cjs.map +1 -1
  9. package/build/EntityMetadata.d.cts +3 -3
  10. package/build/EntityMetadata.d.mts +3 -3
  11. package/build/EntityMetadata.js +2 -4
  12. package/build/EntityMetadata.js.map +1 -1
  13. package/build/IndexManager.cjs +1 -1
  14. package/build/IndexManager.js +1 -1
  15. package/build/InstanceData.cjs +1 -1
  16. package/build/InstanceData.js +1 -1
  17. package/build/PluginManager.cjs +0 -2
  18. package/build/PluginManager.cjs.map +1 -1
  19. package/build/PluginManager.d.cts +2 -2
  20. package/build/PluginManager.d.mts +2 -2
  21. package/build/PluginManager.js +0 -2
  22. package/build/PluginManager.js.map +1 -1
  23. package/build/batchloaders/enumCollectionBatchLoader.d.cts +1 -1
  24. package/build/batchloaders/enumCollectionBatchLoader.d.mts +1 -1
  25. package/build/batchloaders/loadBatchLoader.cjs +7 -7
  26. package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
  27. package/build/batchloaders/loadBatchLoader.d.cts +1 -1
  28. package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
  29. package/build/batchloaders/loadBatchLoader.d.mts +1 -1
  30. package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
  31. package/build/batchloaders/loadBatchLoader.js +4 -4
  32. package/build/batchloaders/loadBatchLoader.js.map +1 -1
  33. package/build/batchloaders/manyToManyBatchLoader.d.cts +1 -1
  34. package/build/batchloaders/manyToManyBatchLoader.d.mts +1 -1
  35. package/build/batchloaders/oneToManyBatchLoader.cjs +3 -3
  36. package/build/batchloaders/oneToManyBatchLoader.cjs.map +1 -1
  37. package/build/batchloaders/oneToManyBatchLoader.js +2 -2
  38. package/build/batchloaders/oneToOneBatchLoader.cjs +5 -5
  39. package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
  40. package/build/batchloaders/oneToOneBatchLoader.js +4 -4
  41. package/build/batchloaders/populateBatchLoader.cjs +15 -16
  42. package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
  43. package/build/batchloaders/populateBatchLoader.d.cts +1 -1
  44. package/build/batchloaders/populateBatchLoader.d.mts +1 -1
  45. package/build/batchloaders/populateBatchLoader.js +8 -9
  46. package/build/batchloaders/populateBatchLoader.js.map +1 -1
  47. package/build/batchloaders/recursiveChildrenBatchLoader.cjs +8 -8
  48. package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
  49. package/build/batchloaders/recursiveChildrenBatchLoader.js +5 -5
  50. package/build/batchloaders/recursiveM2mBatchLoader.cjs +5 -5
  51. package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
  52. package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
  53. package/build/batchloaders/recursiveParentsBatchLoader.cjs +7 -7
  54. package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
  55. package/build/batchloaders/recursiveParentsBatchLoader.js +4 -4
  56. package/build/changes.cjs +3 -4
  57. package/build/changes.cjs.map +1 -1
  58. package/build/changes.js +3 -4
  59. package/build/changes.js.map +1 -1
  60. package/build/config.cjs +6 -6
  61. package/build/config.cjs.map +1 -1
  62. package/build/config.d.cts +2 -2
  63. package/build/config.d.mts +2 -2
  64. package/build/config.js +4 -4
  65. package/build/config.js.map +1 -1
  66. package/build/configure.cjs +13 -13
  67. package/build/configure.cjs.map +1 -1
  68. package/build/configure.js +8 -8
  69. package/build/configure.js.map +1 -1
  70. package/build/dataloaders/fastWhereFilterHash.cjs +9 -9
  71. package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
  72. package/build/dataloaders/fastWhereFilterHash.d.cts.map +1 -1
  73. package/build/dataloaders/fastWhereFilterHash.d.mts.map +1 -1
  74. package/build/dataloaders/fastWhereFilterHash.js +3 -3
  75. package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
  76. package/build/dataloaders/findByUniqueDataLoader.cjs +5 -6
  77. package/build/dataloaders/findByUniqueDataLoader.cjs.map +1 -1
  78. package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
  79. package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
  80. package/build/dataloaders/findByUniqueDataLoader.js +3 -4
  81. package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
  82. package/build/dataloaders/findCountDataLoader.cjs +12 -15
  83. package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
  84. package/build/dataloaders/findCountDataLoader.d.cts +2 -2
  85. package/build/dataloaders/findCountDataLoader.d.mts +2 -2
  86. package/build/dataloaders/findCountDataLoader.js +5 -8
  87. package/build/dataloaders/findCountDataLoader.js.map +1 -1
  88. package/build/dataloaders/findDataLoader.cjs +21 -25
  89. package/build/dataloaders/findDataLoader.cjs.map +1 -1
  90. package/build/dataloaders/findDataLoader.d.cts +3 -3
  91. package/build/dataloaders/findDataLoader.d.cts.map +1 -1
  92. package/build/dataloaders/findDataLoader.d.mts +3 -3
  93. package/build/dataloaders/findDataLoader.d.mts.map +1 -1
  94. package/build/dataloaders/findDataLoader.js +8 -12
  95. package/build/dataloaders/findDataLoader.js.map +1 -1
  96. package/build/dataloaders/findIdsDataLoader.cjs +8 -11
  97. package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
  98. package/build/dataloaders/findIdsDataLoader.d.cts +1 -1
  99. package/build/dataloaders/findIdsDataLoader.d.mts +1 -1
  100. package/build/dataloaders/findIdsDataLoader.js +4 -7
  101. package/build/dataloaders/findIdsDataLoader.js.map +1 -1
  102. package/build/dataloaders/findOrCreateDataLoader.cjs +1 -2
  103. package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
  104. package/build/dataloaders/findOrCreateDataLoader.js +1 -2
  105. package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
  106. package/build/dataloaders/findPaginatedDataLoader.cjs +8 -11
  107. package/build/dataloaders/findPaginatedDataLoader.cjs.map +1 -1
  108. package/build/dataloaders/findPaginatedDataLoader.d.cts +2 -2
  109. package/build/dataloaders/findPaginatedDataLoader.d.mts +2 -2
  110. package/build/dataloaders/findPaginatedDataLoader.js +4 -7
  111. package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
  112. package/build/dataloaders/lensDataLoader.cjs +6 -6
  113. package/build/dataloaders/lensDataLoader.cjs.map +1 -1
  114. package/build/dataloaders/lensDataLoader.js +3 -3
  115. package/build/dataloaders/lensDataLoader.js.map +1 -1
  116. package/build/dataloaders/manyToManyFindDataLoader.cjs +0 -3
  117. package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
  118. package/build/dataloaders/manyToManyFindDataLoader.d.cts +0 -1
  119. package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
  120. package/build/dataloaders/manyToManyFindDataLoader.d.mts +0 -1
  121. package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
  122. package/build/dataloaders/manyToManyFindDataLoader.js +0 -3
  123. package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
  124. package/build/dataloaders/oneToManyFindDataLoader.cjs +2 -5
  125. package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
  126. package/build/dataloaders/oneToManyFindDataLoader.d.cts +0 -1
  127. package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
  128. package/build/dataloaders/oneToManyFindDataLoader.d.mts +0 -1
  129. package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
  130. package/build/dataloaders/oneToManyFindDataLoader.js +1 -4
  131. package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
  132. package/build/defaults.cjs +6 -6
  133. package/build/defaults.cjs.map +1 -1
  134. package/build/defaults.d.cts +1 -1
  135. package/build/defaults.d.mts +1 -1
  136. package/build/defaults.js +5 -5
  137. package/build/defaults.js.map +1 -1
  138. package/build/drivers/Driver.cjs +0 -2
  139. package/build/drivers/Driver.d.cts +2 -2
  140. package/build/drivers/Driver.d.mts +2 -2
  141. package/build/drivers/Driver.js +0 -2
  142. package/build/drivers/EntityWriter.cjs +7 -8
  143. package/build/drivers/EntityWriter.cjs.map +1 -1
  144. package/build/drivers/EntityWriter.d.cts +1 -1
  145. package/build/drivers/EntityWriter.d.mts +1 -1
  146. package/build/drivers/EntityWriter.js +3 -4
  147. package/build/drivers/EntityWriter.js.map +1 -1
  148. package/build/drivers/IdAssigner.cjs +0 -1
  149. package/build/drivers/IdAssigner.cjs.map +1 -1
  150. package/build/drivers/IdAssigner.d.cts +1 -1
  151. package/build/drivers/IdAssigner.d.mts +1 -1
  152. package/build/drivers/IdAssigner.js +0 -1
  153. package/build/drivers/IdAssigner.js.map +1 -1
  154. package/build/drivers/driverApi.cjs +19 -0
  155. package/build/drivers/driverApi.cjs.map +1 -0
  156. package/build/drivers/driverApi.d.cts +22 -0
  157. package/build/drivers/driverApi.d.cts.map +1 -0
  158. package/build/drivers/driverApi.d.mts +22 -0
  159. package/build/drivers/driverApi.d.mts.map +1 -0
  160. package/build/drivers/driverApi.js +18 -0
  161. package/build/drivers/driverApi.js.map +1 -0
  162. package/build/drivers/index.cjs +0 -6
  163. package/build/drivers/index.d.cts +1 -3
  164. package/build/drivers/index.d.mts +1 -3
  165. package/build/drivers/index.js +1 -3
  166. package/build/fields.cjs +3 -3
  167. package/build/fields.cjs.map +1 -1
  168. package/build/fields.js +2 -2
  169. package/build/fields.js.map +1 -1
  170. package/build/flush/FlushLock.cjs +51 -0
  171. package/build/flush/FlushLock.cjs.map +1 -0
  172. package/build/flush/FlushLock.d.cts +29 -0
  173. package/build/flush/FlushLock.d.cts.map +1 -0
  174. package/build/flush/FlushLock.d.mts +29 -0
  175. package/build/flush/FlushLock.d.mts.map +1 -0
  176. package/build/flush/FlushLock.js +51 -0
  177. package/build/flush/FlushLock.js.map +1 -0
  178. package/build/flush/JoinRows.cjs +263 -0
  179. package/build/flush/JoinRows.cjs.map +1 -0
  180. package/build/flush/JoinRows.d.cts +120 -0
  181. package/build/flush/JoinRows.d.cts.map +1 -0
  182. package/build/flush/JoinRows.d.mts +120 -0
  183. package/build/flush/JoinRows.d.mts.map +1 -0
  184. package/build/flush/JoinRows.js +261 -0
  185. package/build/flush/JoinRows.js.map +1 -0
  186. package/build/flush/PendingChanges.d.cts +29 -0
  187. package/build/flush/PendingChanges.d.cts.map +1 -0
  188. package/build/flush/PendingChanges.d.mts +29 -0
  189. package/build/flush/PendingChanges.d.mts.map +1 -0
  190. package/build/flush/Todo.cjs +71 -0
  191. package/build/flush/Todo.cjs.map +1 -0
  192. package/build/flush/Todo.d.cts +38 -0
  193. package/build/flush/Todo.d.cts.map +1 -0
  194. package/build/flush/Todo.d.mts +38 -0
  195. package/build/flush/Todo.d.mts.map +1 -0
  196. package/build/flush/Todo.js +67 -0
  197. package/build/flush/Todo.js.map +1 -0
  198. package/build/getProperties.cjs +1 -1
  199. package/build/getProperties.js +1 -1
  200. package/build/index.cjs +168 -166
  201. package/build/index.cjs.map +1 -1
  202. package/build/index.d.cts +42 -39
  203. package/build/index.d.cts.map +1 -1
  204. package/build/index.d.mts +42 -39
  205. package/build/index.d.mts.map +1 -1
  206. package/build/index.js +52 -50
  207. package/build/index.js.map +1 -1
  208. package/build/json.cjs +4 -4
  209. package/build/json.cjs.map +1 -1
  210. package/build/json.js +3 -3
  211. package/build/json.js.map +1 -1
  212. package/build/keys.cjs +1 -1
  213. package/build/keys.js +1 -1
  214. package/build/loading/HintTree.cjs +67 -0
  215. package/build/loading/HintTree.cjs.map +1 -0
  216. package/build/loading/HintTree.d.cts +45 -0
  217. package/build/loading/HintTree.d.cts.map +1 -0
  218. package/build/loading/HintTree.d.mts +45 -0
  219. package/build/loading/HintTree.d.mts.map +1 -0
  220. package/build/loading/HintTree.js +66 -0
  221. package/build/loading/HintTree.js.map +1 -0
  222. package/build/loading/IsLoadedCache.cjs +58 -0
  223. package/build/loading/IsLoadedCache.cjs.map +1 -0
  224. package/build/loading/IsLoadedCache.d.cts +35 -0
  225. package/build/loading/IsLoadedCache.d.cts.map +1 -0
  226. package/build/loading/IsLoadedCache.d.mts +35 -0
  227. package/build/loading/IsLoadedCache.d.mts.map +1 -0
  228. package/build/loading/IsLoadedCache.js +57 -0
  229. package/build/loading/IsLoadedCache.js.map +1 -0
  230. package/build/loading/loadHints.cjs +95 -0
  231. package/build/loading/loadHints.cjs.map +1 -0
  232. package/build/loading/loadHints.d.cts +116 -0
  233. package/build/loading/loadHints.d.cts.map +1 -0
  234. package/build/loading/loadHints.d.mts +116 -0
  235. package/build/loading/loadHints.d.mts.map +1 -0
  236. package/build/loading/loadHints.js +88 -0
  237. package/build/loading/loadHints.js.map +1 -0
  238. package/build/loading/loadLens.cjs +212 -0
  239. package/build/loading/loadLens.cjs.map +1 -0
  240. package/build/loading/loadLens.d.cts +77 -0
  241. package/build/loading/loadLens.d.cts.map +1 -0
  242. package/build/loading/loadLens.d.mts +77 -0
  243. package/build/loading/loadLens.d.mts.map +1 -0
  244. package/build/loading/loadLens.js +201 -0
  245. package/build/loading/loadLens.js.map +1 -0
  246. package/build/loading/withLoaded.cjs +64 -0
  247. package/build/loading/withLoaded.cjs.map +1 -0
  248. package/build/loading/withLoaded.d.cts +65 -0
  249. package/build/loading/withLoaded.d.cts.map +1 -0
  250. package/build/loading/withLoaded.d.mts +65 -0
  251. package/build/loading/withLoaded.d.mts.map +1 -0
  252. package/build/loading/withLoaded.js +61 -0
  253. package/build/loading/withLoaded.js.map +1 -0
  254. package/build/logging/FactoryLogger.cjs +1 -1
  255. package/build/logging/FactoryLogger.js +1 -1
  256. package/build/logging/FieldLogger.cjs +1 -1
  257. package/build/logging/FieldLogger.js +1 -1
  258. package/build/logging/ReactionLogger.cjs +1 -3
  259. package/build/logging/ReactionLogger.cjs.map +1 -1
  260. package/build/logging/ReactionLogger.d.cts +2 -2
  261. package/build/logging/ReactionLogger.d.mts +2 -2
  262. package/build/logging/ReactionLogger.js +1 -3
  263. package/build/logging/ReactionLogger.js.map +1 -1
  264. package/build/newEntity.cjs +1 -1
  265. package/build/newEntity.js +1 -1
  266. package/build/newTestInstance.cjs +4 -4
  267. package/build/newTestInstance.cjs.map +1 -1
  268. package/build/newTestInstance.d.cts +1 -1
  269. package/build/newTestInstance.d.mts +1 -1
  270. package/build/newTestInstance.js +3 -3
  271. package/build/newTestInstance.js.map +1 -1
  272. package/build/normalizeHints.cjs +0 -2
  273. package/build/normalizeHints.cjs.map +1 -1
  274. package/build/normalizeHints.d.cts +2 -2
  275. package/build/normalizeHints.d.mts +2 -2
  276. package/build/normalizeHints.js +0 -2
  277. package/build/normalizeHints.js.map +1 -1
  278. package/build/nowUTC.cjs +2 -2
  279. package/build/nowUTC.cjs.map +1 -1
  280. package/build/nowUTC.d.cts +1 -1
  281. package/build/nowUTC.d.mts +1 -1
  282. package/build/nowUTC.js +1 -1
  283. package/build/nowUTC.js.map +1 -1
  284. package/build/plugins/PreloadPlugin.cjs +0 -3
  285. package/build/plugins/PreloadPlugin.d.cts +3 -3
  286. package/build/plugins/PreloadPlugin.d.mts +3 -3
  287. package/build/plugins/PreloadPlugin.js +0 -3
  288. package/build/preloading/JsonAggregatePreloader.cjs +30 -33
  289. package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
  290. package/build/preloading/JsonAggregatePreloader.d.cts +3 -3
  291. package/build/preloading/JsonAggregatePreloader.d.mts +3 -3
  292. package/build/preloading/JsonAggregatePreloader.js +5 -8
  293. package/build/preloading/JsonAggregatePreloader.js.map +1 -1
  294. package/build/preloading/partitionHint.cjs +2 -3
  295. package/build/preloading/partitionHint.cjs.map +1 -1
  296. package/build/preloading/partitionHint.d.cts +1 -1
  297. package/build/preloading/partitionHint.d.mts +1 -1
  298. package/build/preloading/partitionHint.js +2 -3
  299. package/build/preloading/partitionHint.js.map +1 -1
  300. package/build/queries/ConditionBuilder.cjs +106 -0
  301. package/build/queries/ConditionBuilder.cjs.map +1 -0
  302. package/build/queries/ConditionBuilder.d.cts +31 -0
  303. package/build/queries/ConditionBuilder.d.cts.map +1 -0
  304. package/build/queries/ConditionBuilder.d.mts +31 -0
  305. package/build/queries/ConditionBuilder.d.mts.map +1 -0
  306. package/build/queries/ConditionBuilder.js +105 -0
  307. package/build/queries/ConditionBuilder.js.map +1 -0
  308. package/build/queries/conditions.cjs +15 -0
  309. package/build/queries/conditions.cjs.map +1 -0
  310. package/build/queries/conditions.d.cts +38 -0
  311. package/build/queries/conditions.d.cts.map +1 -0
  312. package/build/queries/conditions.d.mts +38 -0
  313. package/build/queries/conditions.d.mts.map +1 -0
  314. package/build/queries/conditions.js +13 -0
  315. package/build/queries/conditions.js.map +1 -0
  316. package/build/queries/entityQueryUtils.cjs +60 -0
  317. package/build/queries/entityQueryUtils.cjs.map +1 -0
  318. package/build/queries/entityQueryUtils.d.cts +19 -0
  319. package/build/queries/entityQueryUtils.d.cts.map +1 -0
  320. package/build/queries/entityQueryUtils.d.mts +19 -0
  321. package/build/queries/entityQueryUtils.d.mts.map +1 -0
  322. package/build/queries/entityQueryUtils.js +56 -0
  323. package/build/queries/entityQueryUtils.js.map +1 -0
  324. package/build/queries/find/Aliases.cjs +301 -0
  325. package/build/queries/find/Aliases.cjs.map +1 -0
  326. package/build/queries/find/Aliases.d.cts +122 -0
  327. package/build/queries/find/Aliases.d.cts.map +1 -0
  328. package/build/queries/find/Aliases.d.mts +122 -0
  329. package/build/queries/find/Aliases.d.mts.map +1 -0
  330. package/build/queries/find/Aliases.js +293 -0
  331. package/build/queries/find/Aliases.js.map +1 -0
  332. package/build/queries/find/DeferredAlias.cjs +25 -0
  333. package/build/queries/find/DeferredAlias.cjs.map +1 -0
  334. package/build/queries/find/DeferredAlias.d.cts +22 -0
  335. package/build/queries/find/DeferredAlias.d.cts.map +1 -0
  336. package/build/queries/find/DeferredAlias.d.mts +22 -0
  337. package/build/queries/find/DeferredAlias.d.mts.map +1 -0
  338. package/build/queries/find/DeferredAlias.js +22 -0
  339. package/build/queries/find/DeferredAlias.js.map +1 -0
  340. package/build/queries/find/EntityFilter.cjs +27 -0
  341. package/build/queries/find/EntityFilter.cjs.map +1 -0
  342. package/build/queries/find/EntityFilter.d.cts +127 -0
  343. package/build/queries/find/EntityFilter.d.cts.map +1 -0
  344. package/build/queries/find/EntityFilter.d.mts +127 -0
  345. package/build/queries/find/EntityFilter.d.mts.map +1 -0
  346. package/build/queries/find/EntityFilter.js +26 -0
  347. package/build/queries/find/EntityFilter.js.map +1 -0
  348. package/build/queries/find/EntityGraphQLFilter.cjs +52 -0
  349. package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -0
  350. package/build/queries/find/EntityGraphQLFilter.d.cts +59 -0
  351. package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -0
  352. package/build/queries/find/EntityGraphQLFilter.d.mts +59 -0
  353. package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -0
  354. package/build/queries/find/EntityGraphQLFilter.js +50 -0
  355. package/build/queries/find/EntityGraphQLFilter.js.map +1 -0
  356. package/build/queries/find/QueryParser.cjs +554 -0
  357. package/build/queries/find/QueryParser.cjs.map +1 -0
  358. package/build/queries/find/QueryParser.collectionJoins.cjs +353 -0
  359. package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -0
  360. package/build/queries/find/QueryParser.collectionJoins.d.cts +30 -0
  361. package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -0
  362. package/build/queries/find/QueryParser.collectionJoins.d.mts +30 -0
  363. package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -0
  364. package/build/queries/find/QueryParser.collectionJoins.js +352 -0
  365. package/build/queries/find/QueryParser.collectionJoins.js.map +1 -0
  366. package/build/queries/find/QueryParser.d.cts +192 -0
  367. package/build/queries/find/QueryParser.d.cts.map +1 -0
  368. package/build/queries/find/QueryParser.d.mts +192 -0
  369. package/build/queries/find/QueryParser.d.mts.map +1 -0
  370. package/build/queries/find/QueryParser.js +547 -0
  371. package/build/queries/find/QueryParser.js.map +1 -0
  372. package/build/queries/find/QueryParser.pruning.cjs +115 -0
  373. package/build/queries/find/QueryParser.pruning.cjs.map +1 -0
  374. package/build/queries/find/QueryParser.pruning.d.cts +8 -0
  375. package/build/queries/find/QueryParser.pruning.d.cts.map +1 -0
  376. package/build/queries/find/QueryParser.pruning.d.mts +8 -0
  377. package/build/queries/find/QueryParser.pruning.d.mts.map +1 -0
  378. package/build/queries/find/QueryParser.pruning.js +113 -0
  379. package/build/queries/find/QueryParser.pruning.js.map +1 -0
  380. package/build/queries/find/QueryVisitor.cjs +60 -0
  381. package/build/queries/find/QueryVisitor.cjs.map +1 -0
  382. package/build/queries/find/QueryVisitor.d.cts +22 -0
  383. package/build/queries/find/QueryVisitor.d.cts.map +1 -0
  384. package/build/queries/find/QueryVisitor.d.mts +22 -0
  385. package/build/queries/find/QueryVisitor.d.mts.map +1 -0
  386. package/build/queries/find/QueryVisitor.js +58 -0
  387. package/build/queries/find/QueryVisitor.js.map +1 -0
  388. package/build/queries/find/buildFindQuery.cjs +112 -0
  389. package/build/queries/find/buildFindQuery.cjs.map +1 -0
  390. package/build/queries/find/buildFindQuery.d.cts +24 -0
  391. package/build/queries/find/buildFindQuery.d.cts.map +1 -0
  392. package/build/queries/find/buildFindQuery.d.mts +24 -0
  393. package/build/queries/find/buildFindQuery.d.mts.map +1 -0
  394. package/build/queries/find/buildFindQuery.js +110 -0
  395. package/build/queries/find/buildFindQuery.js.map +1 -0
  396. package/build/queries/find/scopes.cjs +301 -0
  397. package/build/queries/find/scopes.cjs.map +1 -0
  398. package/build/queries/find/scopes.d.cts +188 -0
  399. package/build/queries/find/scopes.d.cts.map +1 -0
  400. package/build/queries/find/scopes.d.mts +188 -0
  401. package/build/queries/find/scopes.d.mts.map +1 -0
  402. package/build/queries/find/scopes.js +296 -0
  403. package/build/queries/find/scopes.js.map +1 -0
  404. package/build/queries/parsedConditions.cjs +21 -0
  405. package/build/queries/parsedConditions.cjs.map +1 -0
  406. package/build/queries/parsedConditions.d.cts +127 -0
  407. package/build/queries/parsedConditions.d.cts.map +1 -0
  408. package/build/queries/parsedConditions.d.mts +127 -0
  409. package/build/queries/parsedConditions.d.mts.map +1 -0
  410. package/build/queries/parsedConditions.js +20 -0
  411. package/build/queries/parsedConditions.js.map +1 -0
  412. package/build/queries/renderConditions.cjs +66 -0
  413. package/build/queries/renderConditions.cjs.map +1 -0
  414. package/build/queries/renderConditions.d.cts +15 -0
  415. package/build/queries/renderConditions.d.cts.map +1 -0
  416. package/build/queries/renderConditions.d.mts +15 -0
  417. package/build/queries/renderConditions.d.mts.map +1 -0
  418. package/build/queries/renderConditions.js +64 -0
  419. package/build/queries/renderConditions.js.map +1 -0
  420. package/build/queries/skipCondition.cjs +14 -0
  421. package/build/queries/skipCondition.cjs.map +1 -0
  422. package/build/queries/skipCondition.d.cts +7 -0
  423. package/build/queries/skipCondition.d.cts.map +1 -0
  424. package/build/queries/skipCondition.d.mts +7 -0
  425. package/build/queries/skipCondition.d.mts.map +1 -0
  426. package/build/queries/skipCondition.js +13 -0
  427. package/build/queries/skipCondition.js.map +1 -0
  428. package/build/queries/sql/AliasAssigner.cjs +35 -0
  429. package/build/queries/sql/AliasAssigner.cjs.map +1 -0
  430. package/build/queries/sql/AliasAssigner.d.cts +13 -0
  431. package/build/queries/sql/AliasAssigner.d.cts.map +1 -0
  432. package/build/queries/sql/AliasAssigner.d.mts +13 -0
  433. package/build/queries/sql/AliasAssigner.d.mts.map +1 -0
  434. package/build/queries/sql/AliasAssigner.js +34 -0
  435. package/build/queries/sql/AliasAssigner.js.map +1 -0
  436. package/build/queries/sql/Expr.cjs +512 -0
  437. package/build/queries/sql/Expr.cjs.map +1 -0
  438. package/build/queries/sql/Expr.d.cts +274 -0
  439. package/build/queries/sql/Expr.d.cts.map +1 -0
  440. package/build/queries/sql/Expr.d.mts +274 -0
  441. package/build/queries/sql/Expr.d.mts.map +1 -0
  442. package/build/queries/sql/Expr.js +496 -0
  443. package/build/queries/sql/Expr.js.map +1 -0
  444. package/build/queries/sql/Tables.cjs +706 -0
  445. package/build/queries/sql/Tables.cjs.map +1 -0
  446. package/build/queries/sql/Tables.d.cts +263 -0
  447. package/build/queries/sql/Tables.d.cts.map +1 -0
  448. package/build/queries/sql/Tables.d.mts +263 -0
  449. package/build/queries/sql/Tables.d.mts.map +1 -0
  450. package/build/queries/sql/Tables.js +695 -0
  451. package/build/queries/sql/Tables.js.map +1 -0
  452. package/build/queries/sql/execute.cjs +236 -0
  453. package/build/queries/sql/execute.cjs.map +1 -0
  454. package/build/queries/sql/execute.d.cts +195 -0
  455. package/build/queries/sql/execute.d.cts.map +1 -0
  456. package/build/queries/sql/execute.d.mts +195 -0
  457. package/build/queries/sql/execute.d.mts.map +1 -0
  458. package/build/queries/sql/execute.js +233 -0
  459. package/build/queries/sql/execute.js.map +1 -0
  460. package/build/queries/sql/expressions/arrayAgg.cjs +63 -0
  461. package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -0
  462. package/build/queries/sql/expressions/arrayAgg.d.cts +24 -0
  463. package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -0
  464. package/build/queries/sql/expressions/arrayAgg.d.mts +24 -0
  465. package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -0
  466. package/build/queries/sql/expressions/arrayAgg.js +61 -0
  467. package/build/queries/sql/expressions/arrayAgg.js.map +1 -0
  468. package/build/queries/sql/expressions/case.cjs +71 -0
  469. package/build/queries/sql/expressions/case.cjs.map +1 -0
  470. package/build/queries/sql/expressions/case.d.cts +57 -0
  471. package/build/queries/sql/expressions/case.d.cts.map +1 -0
  472. package/build/queries/sql/expressions/case.d.mts +57 -0
  473. package/build/queries/sql/expressions/case.d.mts.map +1 -0
  474. package/build/queries/sql/expressions/case.js +68 -0
  475. package/build/queries/sql/expressions/case.js.map +1 -0
  476. package/build/queries/sql/expressions/coalesce.cjs +25 -0
  477. package/build/queries/sql/expressions/coalesce.cjs.map +1 -0
  478. package/build/queries/sql/expressions/coalesce.d.cts +21 -0
  479. package/build/queries/sql/expressions/coalesce.d.cts.map +1 -0
  480. package/build/queries/sql/expressions/coalesce.d.mts +21 -0
  481. package/build/queries/sql/expressions/coalesce.d.mts.map +1 -0
  482. package/build/queries/sql/expressions/coalesce.js +22 -0
  483. package/build/queries/sql/expressions/coalesce.js.map +1 -0
  484. package/build/queries/sql/expressions/codecs.cjs +126 -0
  485. package/build/queries/sql/expressions/codecs.cjs.map +1 -0
  486. package/build/queries/sql/expressions/codecs.d.cts +11 -0
  487. package/build/queries/sql/expressions/codecs.d.cts.map +1 -0
  488. package/build/queries/sql/expressions/codecs.d.mts +11 -0
  489. package/build/queries/sql/expressions/codecs.d.mts.map +1 -0
  490. package/build/queries/sql/expressions/codecs.js +125 -0
  491. package/build/queries/sql/expressions/codecs.js.map +1 -0
  492. package/build/queries/sql/expressions/expression.cjs +102 -0
  493. package/build/queries/sql/expressions/expression.cjs.map +1 -0
  494. package/build/queries/sql/expressions/expression.d.cts +23 -0
  495. package/build/queries/sql/expressions/expression.d.cts.map +1 -0
  496. package/build/queries/sql/expressions/expression.d.mts +23 -0
  497. package/build/queries/sql/expressions/expression.d.mts.map +1 -0
  498. package/build/queries/sql/expressions/expression.js +97 -0
  499. package/build/queries/sql/expressions/expression.js.map +1 -0
  500. package/build/queries/sql/expressions/greatest.cjs +25 -0
  501. package/build/queries/sql/expressions/greatest.cjs.map +1 -0
  502. package/build/queries/sql/expressions/greatest.d.cts +21 -0
  503. package/build/queries/sql/expressions/greatest.d.cts.map +1 -0
  504. package/build/queries/sql/expressions/greatest.d.mts +21 -0
  505. package/build/queries/sql/expressions/greatest.d.mts.map +1 -0
  506. package/build/queries/sql/expressions/greatest.js +22 -0
  507. package/build/queries/sql/expressions/greatest.js.map +1 -0
  508. package/build/queries/sql/expressions/least.cjs +25 -0
  509. package/build/queries/sql/expressions/least.cjs.map +1 -0
  510. package/build/queries/sql/expressions/least.d.cts +21 -0
  511. package/build/queries/sql/expressions/least.d.cts.map +1 -0
  512. package/build/queries/sql/expressions/least.d.mts +21 -0
  513. package/build/queries/sql/expressions/least.d.mts.map +1 -0
  514. package/build/queries/sql/expressions/least.js +22 -0
  515. package/build/queries/sql/expressions/least.js.map +1 -0
  516. package/build/queries/sql/expressions/nullIf.cjs +27 -0
  517. package/build/queries/sql/expressions/nullIf.cjs.map +1 -0
  518. package/build/queries/sql/expressions/nullIf.d.cts +22 -0
  519. package/build/queries/sql/expressions/nullIf.d.cts.map +1 -0
  520. package/build/queries/sql/expressions/nullIf.d.mts +22 -0
  521. package/build/queries/sql/expressions/nullIf.d.mts.map +1 -0
  522. package/build/queries/sql/expressions/nullIf.js +24 -0
  523. package/build/queries/sql/expressions/nullIf.js.map +1 -0
  524. package/build/queries/sql/expressions/parseExpression.cjs +75 -0
  525. package/build/queries/sql/expressions/parseExpression.cjs.map +1 -0
  526. package/build/queries/sql/expressions/parseExpression.d.cts +19 -0
  527. package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -0
  528. package/build/queries/sql/expressions/parseExpression.d.mts +19 -0
  529. package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -0
  530. package/build/queries/sql/expressions/parseExpression.js +70 -0
  531. package/build/queries/sql/expressions/parseExpression.js.map +1 -0
  532. package/build/queries/sql/expressions/types.cjs +1 -0
  533. package/build/queries/sql/expressions/types.d.cts +114 -0
  534. package/build/queries/sql/expressions/types.d.cts.map +1 -0
  535. package/build/queries/sql/expressions/types.d.mts +114 -0
  536. package/build/queries/sql/expressions/types.d.mts.map +1 -0
  537. package/build/queries/sql/expressions/types.js +1 -0
  538. package/build/queries/sql/keywords.cjs +136 -0
  539. package/build/queries/sql/keywords.cjs.map +1 -0
  540. package/build/queries/sql/keywords.d.cts +18 -0
  541. package/build/queries/sql/keywords.d.cts.map +1 -0
  542. package/build/queries/sql/keywords.d.mts +18 -0
  543. package/build/queries/sql/keywords.d.mts.map +1 -0
  544. package/build/queries/sql/keywords.js +132 -0
  545. package/build/queries/sql/keywords.js.map +1 -0
  546. package/build/queries/sql/query.cjs +1548 -0
  547. package/build/queries/sql/query.cjs.map +1 -0
  548. package/build/queries/sql/query.d.cts +794 -0
  549. package/build/queries/sql/query.d.cts.map +1 -0
  550. package/build/queries/sql/query.d.mts +794 -0
  551. package/build/queries/sql/query.d.mts.map +1 -0
  552. package/build/queries/sql/query.js +1530 -0
  553. package/build/queries/sql/query.js.map +1 -0
  554. package/build/queries/unnest.cjs +62 -0
  555. package/build/queries/unnest.cjs.map +1 -0
  556. package/build/queries/unnest.d.cts +16 -0
  557. package/build/queries/unnest.d.cts.map +1 -0
  558. package/build/queries/unnest.d.mts +16 -0
  559. package/build/queries/unnest.d.mts.map +1 -0
  560. package/build/queries/unnest.js +60 -0
  561. package/build/queries/unnest.js.map +1 -0
  562. package/build/queries/valueFilters.cjs +248 -0
  563. package/build/queries/valueFilters.cjs.map +1 -0
  564. package/build/queries/valueFilters.d.cts +28 -0
  565. package/build/queries/valueFilters.d.cts.map +1 -0
  566. package/build/queries/valueFilters.d.mts +28 -0
  567. package/build/queries/valueFilters.d.mts.map +1 -0
  568. package/build/queries/valueFilters.js +243 -0
  569. package/build/queries/valueFilters.js.map +1 -0
  570. package/build/reactivity/ReactionsManager.cjs +264 -0
  571. package/build/reactivity/ReactionsManager.cjs.map +1 -0
  572. package/build/reactivity/ReactionsManager.d.cts +98 -0
  573. package/build/reactivity/ReactionsManager.d.cts.map +1 -0
  574. package/build/reactivity/ReactionsManager.d.mts +98 -0
  575. package/build/reactivity/ReactionsManager.d.mts.map +1 -0
  576. package/build/reactivity/ReactionsManager.js +263 -0
  577. package/build/reactivity/ReactionsManager.js.map +1 -0
  578. package/build/reactivity/reactiveHints.cjs +328 -0
  579. package/build/reactivity/reactiveHints.cjs.map +1 -0
  580. package/build/reactivity/reactiveHints.d.cts +143 -0
  581. package/build/reactivity/reactiveHints.d.cts.map +1 -0
  582. package/build/reactivity/reactiveHints.d.mts +143 -0
  583. package/build/reactivity/reactiveHints.d.mts.map +1 -0
  584. package/build/reactivity/reactiveHints.js +321 -0
  585. package/build/reactivity/reactiveHints.js.map +1 -0
  586. package/build/relations/AbstractRelationImpl.cjs +0 -5
  587. package/build/relations/AbstractRelationImpl.cjs.map +1 -1
  588. package/build/relations/AbstractRelationImpl.d.cts +1 -2
  589. package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
  590. package/build/relations/AbstractRelationImpl.d.mts +1 -2
  591. package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
  592. package/build/relations/AbstractRelationImpl.js +1 -5
  593. package/build/relations/AbstractRelationImpl.js.map +1 -1
  594. package/build/relations/AsyncProperty.cjs +1 -1
  595. package/build/relations/AsyncProperty.js +1 -1
  596. package/build/relations/AsyncReactiveField.cjs +7 -7
  597. package/build/relations/AsyncReactiveField.cjs.map +1 -1
  598. package/build/relations/AsyncReactiveField.d.cts +1 -1
  599. package/build/relations/AsyncReactiveField.d.mts +1 -1
  600. package/build/relations/AsyncReactiveField.js +5 -5
  601. package/build/relations/AsyncReactiveField.js.map +1 -1
  602. package/build/relations/CustomCollection.cjs +1 -1
  603. package/build/relations/CustomCollection.d.cts +1 -1
  604. package/build/relations/CustomCollection.d.mts +1 -1
  605. package/build/relations/CustomCollection.js +1 -1
  606. package/build/relations/CustomReference.cjs +3 -3
  607. package/build/relations/CustomReference.d.cts +1 -1
  608. package/build/relations/CustomReference.d.mts +1 -1
  609. package/build/relations/CustomReference.js +3 -3
  610. package/build/relations/EnumCollection.cjs +2 -2
  611. package/build/relations/EnumCollection.d.cts +1 -1
  612. package/build/relations/EnumCollection.d.mts +1 -1
  613. package/build/relations/EnumCollection.js +2 -2
  614. package/build/relations/LazyField.cjs +6 -7
  615. package/build/relations/LazyField.cjs.map +1 -1
  616. package/build/relations/LazyField.js +5 -6
  617. package/build/relations/LazyField.js.map +1 -1
  618. package/build/relations/ManyToManyCollection.cjs +5 -4
  619. package/build/relations/ManyToManyCollection.cjs.map +1 -1
  620. package/build/relations/ManyToManyCollection.d.cts.map +1 -1
  621. package/build/relations/ManyToManyCollection.d.mts.map +1 -1
  622. package/build/relations/ManyToManyCollection.js +5 -4
  623. package/build/relations/ManyToManyCollection.js.map +1 -1
  624. package/build/relations/ManyToManyLargeCollection.cjs +3 -3
  625. package/build/relations/ManyToManyLargeCollection.js +3 -3
  626. package/build/relations/ManyToOneReference.cjs +6 -5
  627. package/build/relations/ManyToOneReference.cjs.map +1 -1
  628. package/build/relations/ManyToOneReference.d.cts.map +1 -1
  629. package/build/relations/ManyToOneReference.d.mts.map +1 -1
  630. package/build/relations/ManyToOneReference.js +6 -5
  631. package/build/relations/ManyToOneReference.js.map +1 -1
  632. package/build/relations/OneToManyCollection.cjs +7 -7
  633. package/build/relations/OneToManyCollection.cjs.map +1 -1
  634. package/build/relations/OneToManyCollection.d.cts +1 -1
  635. package/build/relations/OneToManyCollection.d.cts.map +1 -1
  636. package/build/relations/OneToManyCollection.d.mts +1 -1
  637. package/build/relations/OneToManyCollection.d.mts.map +1 -1
  638. package/build/relations/OneToManyCollection.js +5 -5
  639. package/build/relations/OneToManyCollection.js.map +1 -1
  640. package/build/relations/OneToManyLargeCollection.cjs +2 -2
  641. package/build/relations/OneToManyLargeCollection.js +2 -2
  642. package/build/relations/OneToOneReference.cjs +5 -4
  643. package/build/relations/OneToOneReference.cjs.map +1 -1
  644. package/build/relations/OneToOneReference.d.cts.map +1 -1
  645. package/build/relations/OneToOneReference.d.mts.map +1 -1
  646. package/build/relations/OneToOneReference.js +5 -4
  647. package/build/relations/OneToOneReference.js.map +1 -1
  648. package/build/relations/PolymorphicReference.cjs +7 -6
  649. package/build/relations/PolymorphicReference.cjs.map +1 -1
  650. package/build/relations/PolymorphicReference.d.cts.map +1 -1
  651. package/build/relations/PolymorphicReference.d.mts.map +1 -1
  652. package/build/relations/PolymorphicReference.js +7 -6
  653. package/build/relations/PolymorphicReference.js.map +1 -1
  654. package/build/relations/ReactiveField.cjs +6 -7
  655. package/build/relations/ReactiveField.cjs.map +1 -1
  656. package/build/relations/ReactiveField.d.cts +2 -2
  657. package/build/relations/ReactiveField.d.mts +2 -2
  658. package/build/relations/ReactiveField.js +4 -5
  659. package/build/relations/ReactiveField.js.map +1 -1
  660. package/build/relations/ReactiveGetter.cjs +1 -2
  661. package/build/relations/ReactiveGetter.cjs.map +1 -1
  662. package/build/relations/ReactiveGetter.d.cts +1 -1
  663. package/build/relations/ReactiveGetter.d.mts +1 -1
  664. package/build/relations/ReactiveGetter.js +1 -2
  665. package/build/relations/ReactiveGetter.js.map +1 -1
  666. package/build/relations/ReactiveManyToMany.cjs +8 -8
  667. package/build/relations/ReactiveManyToMany.cjs.map +1 -1
  668. package/build/relations/ReactiveManyToMany.d.cts +2 -2
  669. package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
  670. package/build/relations/ReactiveManyToMany.d.mts +2 -2
  671. package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
  672. package/build/relations/ReactiveManyToMany.js +6 -6
  673. package/build/relations/ReactiveManyToMany.js.map +1 -1
  674. package/build/relations/ReactiveManyToManyOtherSide.cjs +1 -3
  675. package/build/relations/ReactiveManyToManyOtherSide.cjs.map +1 -1
  676. package/build/relations/ReactiveManyToManyOtherSide.d.cts +2 -2
  677. package/build/relations/ReactiveManyToManyOtherSide.d.mts +2 -2
  678. package/build/relations/ReactiveManyToManyOtherSide.js +1 -3
  679. package/build/relations/ReactiveManyToManyOtherSide.js.map +1 -1
  680. package/build/relations/ReactiveReference.cjs +10 -10
  681. package/build/relations/ReactiveReference.cjs.map +1 -1
  682. package/build/relations/ReactiveReference.d.cts +2 -2
  683. package/build/relations/ReactiveReference.d.cts.map +1 -1
  684. package/build/relations/ReactiveReference.d.mts +2 -2
  685. package/build/relations/ReactiveReference.d.mts.map +1 -1
  686. package/build/relations/ReactiveReference.js +8 -8
  687. package/build/relations/ReactiveReference.js.map +1 -1
  688. package/build/relations/RecursiveCollection.cjs +5 -6
  689. package/build/relations/RecursiveCollection.cjs.map +1 -1
  690. package/build/relations/RecursiveCollection.d.cts +1 -1
  691. package/build/relations/RecursiveCollection.d.mts +1 -1
  692. package/build/relations/RecursiveCollection.js +5 -6
  693. package/build/relations/RecursiveCollection.js.map +1 -1
  694. package/build/relations/hasAsyncMethod.cjs +2 -2
  695. package/build/relations/hasAsyncMethod.cjs.map +1 -1
  696. package/build/relations/hasAsyncMethod.d.cts +1 -1
  697. package/build/relations/hasAsyncMethod.d.mts +1 -1
  698. package/build/relations/hasAsyncMethod.js +1 -1
  699. package/build/relations/hasAsyncMethod.js.map +1 -1
  700. package/build/relations/hasManyDerived.cjs +3 -3
  701. package/build/relations/hasManyDerived.cjs.map +1 -1
  702. package/build/relations/hasManyDerived.d.cts +1 -1
  703. package/build/relations/hasManyDerived.d.mts +1 -1
  704. package/build/relations/hasManyDerived.js +2 -2
  705. package/build/relations/hasManyDerived.js.map +1 -1
  706. package/build/relations/hasManyThrough.cjs +6 -6
  707. package/build/relations/hasManyThrough.cjs.map +1 -1
  708. package/build/relations/hasManyThrough.d.cts +1 -1
  709. package/build/relations/hasManyThrough.d.mts +1 -1
  710. package/build/relations/hasManyThrough.js +2 -2
  711. package/build/relations/hasOneDerived.cjs +3 -3
  712. package/build/relations/hasOneDerived.cjs.map +1 -1
  713. package/build/relations/hasOneDerived.d.cts +1 -1
  714. package/build/relations/hasOneDerived.d.mts +1 -1
  715. package/build/relations/hasOneDerived.js +2 -2
  716. package/build/relations/hasOneDerived.js.map +1 -1
  717. package/build/relations/hasOneThrough.cjs +7 -7
  718. package/build/relations/hasOneThrough.cjs.map +1 -1
  719. package/build/relations/hasOneThrough.d.cts +1 -1
  720. package/build/relations/hasOneThrough.d.mts +1 -1
  721. package/build/relations/hasOneThrough.js +2 -2
  722. package/build/relations/hasProperty.cjs +6 -6
  723. package/build/relations/hasProperty.cjs.map +1 -1
  724. package/build/relations/hasProperty.d.cts +2 -2
  725. package/build/relations/hasProperty.d.mts +2 -2
  726. package/build/relations/hasProperty.js +4 -4
  727. package/build/relations/hasProperty.js.map +1 -1
  728. package/build/relations/index.cjs +5 -5
  729. package/build/relations/index.js +5 -5
  730. package/build/relations/isCascadeDelete.cjs +11 -0
  731. package/build/relations/isCascadeDelete.cjs.map +1 -0
  732. package/build/relations/isCascadeDelete.d.cts +7 -0
  733. package/build/relations/isCascadeDelete.d.cts.map +1 -0
  734. package/build/relations/isCascadeDelete.d.mts +7 -0
  735. package/build/relations/isCascadeDelete.d.mts.map +1 -0
  736. package/build/relations/isCascadeDelete.js +10 -0
  737. package/build/relations/isCascadeDelete.js.map +1 -0
  738. package/build/resurrection.cjs +1 -1
  739. package/build/resurrection.js +1 -1
  740. package/build/rules.cjs +3 -4
  741. package/build/rules.cjs.map +1 -1
  742. package/build/rules.d.cts +1 -1
  743. package/build/rules.d.mts +1 -1
  744. package/build/rules.js +3 -4
  745. package/build/rules.js.map +1 -1
  746. package/build/serde/TypeInfo.cjs +80 -0
  747. package/build/serde/TypeInfo.cjs.map +1 -0
  748. package/build/serde/TypeInfo.d.cts +57 -0
  749. package/build/serde/TypeInfo.d.cts.map +1 -0
  750. package/build/serde/TypeInfo.d.mts +57 -0
  751. package/build/serde/TypeInfo.d.mts.map +1 -0
  752. package/build/serde/TypeInfo.js +78 -0
  753. package/build/serde/TypeInfo.js.map +1 -0
  754. package/build/serde/columns.cjs +63 -0
  755. package/build/serde/columns.cjs.map +1 -0
  756. package/build/serde/columns.d.cts +38 -0
  757. package/build/serde/columns.d.cts.map +1 -0
  758. package/build/serde/columns.d.mts +38 -0
  759. package/build/serde/columns.d.mts.map +1 -0
  760. package/build/serde/columns.js +62 -0
  761. package/build/serde/columns.js.map +1 -0
  762. package/build/serde/fieldSerde.cjs +188 -0
  763. package/build/serde/fieldSerde.cjs.map +1 -0
  764. package/build/serde/fieldSerde.d.cts +87 -0
  765. package/build/serde/fieldSerde.d.cts.map +1 -0
  766. package/build/serde/fieldSerde.d.mts +87 -0
  767. package/build/serde/fieldSerde.d.mts.map +1 -0
  768. package/build/serde/fieldSerde.js +182 -0
  769. package/build/serde/fieldSerde.js.map +1 -0
  770. package/build/serde/serde.cjs +499 -0
  771. package/build/serde/serde.cjs.map +1 -0
  772. package/build/serde/serde.d.cts +248 -0
  773. package/build/serde/serde.d.cts.map +1 -0
  774. package/build/serde/serde.d.mts +248 -0
  775. package/build/serde/serde.d.mts.map +1 -0
  776. package/build/serde/serde.js +485 -0
  777. package/build/serde/serde.js.map +1 -0
  778. package/build/serde/temporal.cjs +57 -0
  779. package/build/serde/temporal.cjs.map +1 -0
  780. package/build/serde/temporal.d.cts +44 -0
  781. package/build/serde/temporal.d.cts.map +1 -0
  782. package/build/serde/temporal.d.mts +44 -0
  783. package/build/serde/temporal.d.mts.map +1 -0
  784. package/build/serde/temporal.js +55 -0
  785. package/build/serde/temporal.js.map +1 -0
  786. package/build/serde/temporalMappers.cjs +62 -0
  787. package/build/serde/temporalMappers.cjs.map +1 -0
  788. package/build/serde/temporalMappers.d.cts +36 -0
  789. package/build/serde/temporalMappers.d.cts.map +1 -0
  790. package/build/serde/temporalMappers.d.mts +36 -0
  791. package/build/serde/temporalMappers.d.mts.map +1 -0
  792. package/build/serde/temporalMappers.js +58 -0
  793. package/build/serde/temporalMappers.js.map +1 -0
  794. package/build/upsert.cjs +4 -4
  795. package/build/upsert.js +4 -4
  796. package/build/utils.cjs +0 -2
  797. package/build/utils.cjs.map +1 -1
  798. package/build/utils.d.cts +2 -2
  799. package/build/utils.d.mts +2 -2
  800. package/build/utils.js +0 -2
  801. package/build/utils.js.map +1 -1
  802. package/package.json +2 -2
  803. package/build/AliasAssigner.cjs +0 -36
  804. package/build/AliasAssigner.cjs.map +0 -1
  805. package/build/AliasAssigner.d.cts +0 -13
  806. package/build/AliasAssigner.d.cts.map +0 -1
  807. package/build/AliasAssigner.d.mts +0 -13
  808. package/build/AliasAssigner.d.mts.map +0 -1
  809. package/build/AliasAssigner.js +0 -35
  810. package/build/AliasAssigner.js.map +0 -1
  811. package/build/Aliases.cjs +0 -306
  812. package/build/Aliases.cjs.map +0 -1
  813. package/build/Aliases.d.cts +0 -122
  814. package/build/Aliases.d.cts.map +0 -1
  815. package/build/Aliases.d.mts +0 -122
  816. package/build/Aliases.d.mts.map +0 -1
  817. package/build/Aliases.js +0 -298
  818. package/build/Aliases.js.map +0 -1
  819. package/build/ConditionBuilder.cjs +0 -107
  820. package/build/ConditionBuilder.cjs.map +0 -1
  821. package/build/ConditionBuilder.d.cts +0 -31
  822. package/build/ConditionBuilder.d.cts.map +0 -1
  823. package/build/ConditionBuilder.d.mts +0 -31
  824. package/build/ConditionBuilder.d.mts.map +0 -1
  825. package/build/ConditionBuilder.js +0 -106
  826. package/build/ConditionBuilder.js.map +0 -1
  827. package/build/DeferredAlias.cjs +0 -28
  828. package/build/DeferredAlias.cjs.map +0 -1
  829. package/build/DeferredAlias.d.cts +0 -22
  830. package/build/DeferredAlias.d.cts.map +0 -1
  831. package/build/DeferredAlias.d.mts +0 -22
  832. package/build/DeferredAlias.d.mts.map +0 -1
  833. package/build/DeferredAlias.js +0 -25
  834. package/build/DeferredAlias.js.map +0 -1
  835. package/build/EntityFilter.cjs +0 -32
  836. package/build/EntityFilter.cjs.map +0 -1
  837. package/build/EntityFilter.d.cts +0 -127
  838. package/build/EntityFilter.d.cts.map +0 -1
  839. package/build/EntityFilter.d.mts +0 -127
  840. package/build/EntityFilter.d.mts.map +0 -1
  841. package/build/EntityFilter.js +0 -31
  842. package/build/EntityFilter.js.map +0 -1
  843. package/build/EntityGraphQLFilter.cjs +0 -56
  844. package/build/EntityGraphQLFilter.cjs.map +0 -1
  845. package/build/EntityGraphQLFilter.d.cts +0 -59
  846. package/build/EntityGraphQLFilter.d.cts.map +0 -1
  847. package/build/EntityGraphQLFilter.d.mts +0 -59
  848. package/build/EntityGraphQLFilter.d.mts.map +0 -1
  849. package/build/EntityGraphQLFilter.js +0 -54
  850. package/build/EntityGraphQLFilter.js.map +0 -1
  851. package/build/Expr.cjs +0 -512
  852. package/build/Expr.cjs.map +0 -1
  853. package/build/Expr.d.cts +0 -274
  854. package/build/Expr.d.cts.map +0 -1
  855. package/build/Expr.d.mts +0 -274
  856. package/build/Expr.d.mts.map +0 -1
  857. package/build/Expr.js +0 -496
  858. package/build/Expr.js.map +0 -1
  859. package/build/FlushLock.cjs +0 -51
  860. package/build/FlushLock.cjs.map +0 -1
  861. package/build/FlushLock.d.cts +0 -29
  862. package/build/FlushLock.d.cts.map +0 -1
  863. package/build/FlushLock.d.mts +0 -29
  864. package/build/FlushLock.d.mts.map +0 -1
  865. package/build/FlushLock.js +0 -51
  866. package/build/FlushLock.js.map +0 -1
  867. package/build/HintTree.cjs +0 -70
  868. package/build/HintTree.cjs.map +0 -1
  869. package/build/HintTree.d.cts +0 -45
  870. package/build/HintTree.d.cts.map +0 -1
  871. package/build/HintTree.d.mts +0 -45
  872. package/build/HintTree.d.mts.map +0 -1
  873. package/build/HintTree.js +0 -69
  874. package/build/HintTree.js.map +0 -1
  875. package/build/IsLoadedCache.cjs +0 -59
  876. package/build/IsLoadedCache.cjs.map +0 -1
  877. package/build/IsLoadedCache.d.cts +0 -35
  878. package/build/IsLoadedCache.d.cts.map +0 -1
  879. package/build/IsLoadedCache.d.mts +0 -35
  880. package/build/IsLoadedCache.d.mts.map +0 -1
  881. package/build/IsLoadedCache.js +0 -58
  882. package/build/IsLoadedCache.js.map +0 -1
  883. package/build/JoinRows.cjs +0 -266
  884. package/build/JoinRows.cjs.map +0 -1
  885. package/build/JoinRows.d.cts +0 -120
  886. package/build/JoinRows.d.cts.map +0 -1
  887. package/build/JoinRows.d.mts +0 -120
  888. package/build/JoinRows.d.mts.map +0 -1
  889. package/build/JoinRows.js +0 -264
  890. package/build/JoinRows.js.map +0 -1
  891. package/build/PendingChanges.cjs +0 -2
  892. package/build/PendingChanges.d.cts +0 -29
  893. package/build/PendingChanges.d.cts.map +0 -1
  894. package/build/PendingChanges.d.mts +0 -29
  895. package/build/PendingChanges.d.mts.map +0 -1
  896. package/build/PendingChanges.js +0 -2
  897. package/build/QueryParser.cjs +0 -842
  898. package/build/QueryParser.cjs.map +0 -1
  899. package/build/QueryParser.collectionJoins.cjs +0 -353
  900. package/build/QueryParser.collectionJoins.cjs.map +0 -1
  901. package/build/QueryParser.collectionJoins.d.cts +0 -30
  902. package/build/QueryParser.collectionJoins.d.cts.map +0 -1
  903. package/build/QueryParser.collectionJoins.d.mts +0 -30
  904. package/build/QueryParser.collectionJoins.d.mts.map +0 -1
  905. package/build/QueryParser.collectionJoins.js +0 -352
  906. package/build/QueryParser.collectionJoins.js.map +0 -1
  907. package/build/QueryParser.d.cts +0 -346
  908. package/build/QueryParser.d.cts.map +0 -1
  909. package/build/QueryParser.d.mts +0 -346
  910. package/build/QueryParser.d.mts.map +0 -1
  911. package/build/QueryParser.js +0 -827
  912. package/build/QueryParser.js.map +0 -1
  913. package/build/QueryParser.pruning.cjs +0 -129
  914. package/build/QueryParser.pruning.cjs.map +0 -1
  915. package/build/QueryParser.pruning.d.cts +0 -10
  916. package/build/QueryParser.pruning.d.cts.map +0 -1
  917. package/build/QueryParser.pruning.d.mts +0 -10
  918. package/build/QueryParser.pruning.d.mts.map +0 -1
  919. package/build/QueryParser.pruning.js +0 -126
  920. package/build/QueryParser.pruning.js.map +0 -1
  921. package/build/QueryVisitor.cjs +0 -61
  922. package/build/QueryVisitor.cjs.map +0 -1
  923. package/build/QueryVisitor.d.cts +0 -21
  924. package/build/QueryVisitor.d.cts.map +0 -1
  925. package/build/QueryVisitor.d.mts +0 -21
  926. package/build/QueryVisitor.d.mts.map +0 -1
  927. package/build/QueryVisitor.js +0 -59
  928. package/build/QueryVisitor.js.map +0 -1
  929. package/build/ReactionsManager.cjs +0 -266
  930. package/build/ReactionsManager.cjs.map +0 -1
  931. package/build/ReactionsManager.d.cts +0 -99
  932. package/build/ReactionsManager.d.cts.map +0 -1
  933. package/build/ReactionsManager.d.mts +0 -99
  934. package/build/ReactionsManager.d.mts.map +0 -1
  935. package/build/ReactionsManager.js +0 -265
  936. package/build/ReactionsManager.js.map +0 -1
  937. package/build/Tables.cjs +0 -710
  938. package/build/Tables.cjs.map +0 -1
  939. package/build/Tables.d.cts +0 -264
  940. package/build/Tables.d.cts.map +0 -1
  941. package/build/Tables.d.mts +0 -264
  942. package/build/Tables.d.mts.map +0 -1
  943. package/build/Tables.js +0 -699
  944. package/build/Tables.js.map +0 -1
  945. package/build/Todo.cjs +0 -73
  946. package/build/Todo.cjs.map +0 -1
  947. package/build/Todo.d.cts +0 -38
  948. package/build/Todo.d.cts.map +0 -1
  949. package/build/Todo.d.mts +0 -38
  950. package/build/Todo.d.mts.map +0 -1
  951. package/build/Todo.js +0 -69
  952. package/build/Todo.js.map +0 -1
  953. package/build/TypeInfo.cjs +0 -80
  954. package/build/TypeInfo.cjs.map +0 -1
  955. package/build/TypeInfo.d.cts +0 -57
  956. package/build/TypeInfo.d.cts.map +0 -1
  957. package/build/TypeInfo.d.mts +0 -57
  958. package/build/TypeInfo.d.mts.map +0 -1
  959. package/build/TypeInfo.js +0 -78
  960. package/build/TypeInfo.js.map +0 -1
  961. package/build/columns.cjs +0 -63
  962. package/build/columns.cjs.map +0 -1
  963. package/build/columns.d.cts +0 -38
  964. package/build/columns.d.cts.map +0 -1
  965. package/build/columns.d.mts +0 -38
  966. package/build/columns.d.mts.map +0 -1
  967. package/build/columns.js +0 -62
  968. package/build/columns.js.map +0 -1
  969. package/build/conditions.cjs +0 -16
  970. package/build/conditions.cjs.map +0 -1
  971. package/build/conditions.d.cts +0 -38
  972. package/build/conditions.d.cts.map +0 -1
  973. package/build/conditions.d.mts +0 -38
  974. package/build/conditions.d.mts.map +0 -1
  975. package/build/conditions.js +0 -14
  976. package/build/conditions.js.map +0 -1
  977. package/build/driverApi.cjs +0 -19
  978. package/build/driverApi.cjs.map +0 -1
  979. package/build/driverApi.d.cts +0 -22
  980. package/build/driverApi.d.cts.map +0 -1
  981. package/build/driverApi.d.mts +0 -22
  982. package/build/driverApi.d.mts.map +0 -1
  983. package/build/driverApi.js +0 -18
  984. package/build/driverApi.js.map +0 -1
  985. package/build/drivers/buildRawQuery.cjs +0 -113
  986. package/build/drivers/buildRawQuery.cjs.map +0 -1
  987. package/build/drivers/buildRawQuery.d.cts +0 -24
  988. package/build/drivers/buildRawQuery.d.cts.map +0 -1
  989. package/build/drivers/buildRawQuery.d.mts +0 -24
  990. package/build/drivers/buildRawQuery.d.mts.map +0 -1
  991. package/build/drivers/buildRawQuery.js +0 -111
  992. package/build/drivers/buildRawQuery.js.map +0 -1
  993. package/build/drivers/buildUtils.cjs +0 -67
  994. package/build/drivers/buildUtils.cjs.map +0 -1
  995. package/build/drivers/buildUtils.d.cts +0 -14
  996. package/build/drivers/buildUtils.d.cts.map +0 -1
  997. package/build/drivers/buildUtils.d.mts +0 -14
  998. package/build/drivers/buildUtils.d.mts.map +0 -1
  999. package/build/drivers/buildUtils.js +0 -65
  1000. package/build/drivers/buildUtils.js.map +0 -1
  1001. package/build/execute.cjs +0 -241
  1002. package/build/execute.cjs.map +0 -1
  1003. package/build/execute.d.cts +0 -195
  1004. package/build/execute.d.cts.map +0 -1
  1005. package/build/execute.d.mts +0 -195
  1006. package/build/execute.d.mts.map +0 -1
  1007. package/build/execute.js +0 -238
  1008. package/build/execute.js.map +0 -1
  1009. package/build/expressions/arrayAgg.cjs +0 -63
  1010. package/build/expressions/arrayAgg.cjs.map +0 -1
  1011. package/build/expressions/arrayAgg.d.cts +0 -24
  1012. package/build/expressions/arrayAgg.d.cts.map +0 -1
  1013. package/build/expressions/arrayAgg.d.mts +0 -24
  1014. package/build/expressions/arrayAgg.d.mts.map +0 -1
  1015. package/build/expressions/arrayAgg.js +0 -61
  1016. package/build/expressions/arrayAgg.js.map +0 -1
  1017. package/build/expressions/case.cjs +0 -71
  1018. package/build/expressions/case.cjs.map +0 -1
  1019. package/build/expressions/case.d.cts +0 -57
  1020. package/build/expressions/case.d.cts.map +0 -1
  1021. package/build/expressions/case.d.mts +0 -57
  1022. package/build/expressions/case.d.mts.map +0 -1
  1023. package/build/expressions/case.js +0 -68
  1024. package/build/expressions/case.js.map +0 -1
  1025. package/build/expressions/coalesce.cjs +0 -25
  1026. package/build/expressions/coalesce.cjs.map +0 -1
  1027. package/build/expressions/coalesce.d.cts +0 -21
  1028. package/build/expressions/coalesce.d.cts.map +0 -1
  1029. package/build/expressions/coalesce.d.mts +0 -21
  1030. package/build/expressions/coalesce.d.mts.map +0 -1
  1031. package/build/expressions/coalesce.js +0 -22
  1032. package/build/expressions/coalesce.js.map +0 -1
  1033. package/build/expressions/codecs.cjs +0 -126
  1034. package/build/expressions/codecs.cjs.map +0 -1
  1035. package/build/expressions/codecs.d.cts +0 -11
  1036. package/build/expressions/codecs.d.cts.map +0 -1
  1037. package/build/expressions/codecs.d.mts +0 -11
  1038. package/build/expressions/codecs.d.mts.map +0 -1
  1039. package/build/expressions/codecs.js +0 -125
  1040. package/build/expressions/codecs.js.map +0 -1
  1041. package/build/expressions/expression.cjs +0 -102
  1042. package/build/expressions/expression.cjs.map +0 -1
  1043. package/build/expressions/expression.d.cts +0 -23
  1044. package/build/expressions/expression.d.cts.map +0 -1
  1045. package/build/expressions/expression.d.mts +0 -23
  1046. package/build/expressions/expression.d.mts.map +0 -1
  1047. package/build/expressions/expression.js +0 -97
  1048. package/build/expressions/expression.js.map +0 -1
  1049. package/build/expressions/greatest.cjs +0 -25
  1050. package/build/expressions/greatest.cjs.map +0 -1
  1051. package/build/expressions/greatest.d.cts +0 -21
  1052. package/build/expressions/greatest.d.cts.map +0 -1
  1053. package/build/expressions/greatest.d.mts +0 -21
  1054. package/build/expressions/greatest.d.mts.map +0 -1
  1055. package/build/expressions/greatest.js +0 -22
  1056. package/build/expressions/greatest.js.map +0 -1
  1057. package/build/expressions/least.cjs +0 -25
  1058. package/build/expressions/least.cjs.map +0 -1
  1059. package/build/expressions/least.d.cts +0 -21
  1060. package/build/expressions/least.d.cts.map +0 -1
  1061. package/build/expressions/least.d.mts +0 -21
  1062. package/build/expressions/least.d.mts.map +0 -1
  1063. package/build/expressions/least.js +0 -22
  1064. package/build/expressions/least.js.map +0 -1
  1065. package/build/expressions/nullIf.cjs +0 -27
  1066. package/build/expressions/nullIf.cjs.map +0 -1
  1067. package/build/expressions/nullIf.d.cts +0 -22
  1068. package/build/expressions/nullIf.d.cts.map +0 -1
  1069. package/build/expressions/nullIf.d.mts +0 -22
  1070. package/build/expressions/nullIf.d.mts.map +0 -1
  1071. package/build/expressions/nullIf.js +0 -24
  1072. package/build/expressions/nullIf.js.map +0 -1
  1073. package/build/expressions/parseExpression.cjs +0 -75
  1074. package/build/expressions/parseExpression.cjs.map +0 -1
  1075. package/build/expressions/parseExpression.d.cts +0 -19
  1076. package/build/expressions/parseExpression.d.cts.map +0 -1
  1077. package/build/expressions/parseExpression.d.mts +0 -19
  1078. package/build/expressions/parseExpression.d.mts.map +0 -1
  1079. package/build/expressions/parseExpression.js +0 -70
  1080. package/build/expressions/parseExpression.js.map +0 -1
  1081. package/build/expressions/types.d.cts +0 -114
  1082. package/build/expressions/types.d.cts.map +0 -1
  1083. package/build/expressions/types.d.mts +0 -114
  1084. package/build/expressions/types.d.mts.map +0 -1
  1085. package/build/fieldSerde.cjs +0 -188
  1086. package/build/fieldSerde.cjs.map +0 -1
  1087. package/build/fieldSerde.d.cts +0 -87
  1088. package/build/fieldSerde.d.cts.map +0 -1
  1089. package/build/fieldSerde.d.mts +0 -87
  1090. package/build/fieldSerde.d.mts.map +0 -1
  1091. package/build/fieldSerde.js +0 -182
  1092. package/build/fieldSerde.js.map +0 -1
  1093. package/build/keywords.cjs +0 -136
  1094. package/build/keywords.cjs.map +0 -1
  1095. package/build/keywords.d.cts +0 -18
  1096. package/build/keywords.d.cts.map +0 -1
  1097. package/build/keywords.d.mts +0 -18
  1098. package/build/keywords.d.mts.map +0 -1
  1099. package/build/keywords.js +0 -132
  1100. package/build/keywords.js.map +0 -1
  1101. package/build/loadHints.cjs +0 -100
  1102. package/build/loadHints.cjs.map +0 -1
  1103. package/build/loadHints.d.cts +0 -116
  1104. package/build/loadHints.d.cts.map +0 -1
  1105. package/build/loadHints.d.mts +0 -116
  1106. package/build/loadHints.d.mts.map +0 -1
  1107. package/build/loadHints.js +0 -93
  1108. package/build/loadHints.js.map +0 -1
  1109. package/build/loadLens.cjs +0 -213
  1110. package/build/loadLens.cjs.map +0 -1
  1111. package/build/loadLens.d.cts +0 -77
  1112. package/build/loadLens.d.cts.map +0 -1
  1113. package/build/loadLens.d.mts +0 -77
  1114. package/build/loadLens.d.mts.map +0 -1
  1115. package/build/loadLens.js +0 -202
  1116. package/build/loadLens.js.map +0 -1
  1117. package/build/query.cjs +0 -1549
  1118. package/build/query.cjs.map +0 -1
  1119. package/build/query.d.cts +0 -794
  1120. package/build/query.d.cts.map +0 -1
  1121. package/build/query.d.mts +0 -794
  1122. package/build/query.d.mts.map +0 -1
  1123. package/build/query.js +0 -1531
  1124. package/build/query.js.map +0 -1
  1125. package/build/reactiveHints.cjs +0 -332
  1126. package/build/reactiveHints.cjs.map +0 -1
  1127. package/build/reactiveHints.d.cts +0 -143
  1128. package/build/reactiveHints.d.cts.map +0 -1
  1129. package/build/reactiveHints.d.mts +0 -143
  1130. package/build/reactiveHints.d.mts.map +0 -1
  1131. package/build/reactiveHints.js +0 -325
  1132. package/build/reactiveHints.js.map +0 -1
  1133. package/build/scopes.cjs +0 -302
  1134. package/build/scopes.cjs.map +0 -1
  1135. package/build/scopes.d.cts +0 -188
  1136. package/build/scopes.d.cts.map +0 -1
  1137. package/build/scopes.d.mts +0 -188
  1138. package/build/scopes.d.mts.map +0 -1
  1139. package/build/scopes.js +0 -297
  1140. package/build/scopes.js.map +0 -1
  1141. package/build/serde.cjs +0 -500
  1142. package/build/serde.cjs.map +0 -1
  1143. package/build/serde.d.cts +0 -248
  1144. package/build/serde.d.cts.map +0 -1
  1145. package/build/serde.d.mts +0 -248
  1146. package/build/serde.d.mts.map +0 -1
  1147. package/build/serde.js +0 -486
  1148. package/build/serde.js.map +0 -1
  1149. package/build/skipCondition.cjs +0 -15
  1150. package/build/skipCondition.cjs.map +0 -1
  1151. package/build/skipCondition.d.cts +0 -7
  1152. package/build/skipCondition.d.cts.map +0 -1
  1153. package/build/skipCondition.d.mts +0 -7
  1154. package/build/skipCondition.d.mts.map +0 -1
  1155. package/build/skipCondition.js +0 -14
  1156. package/build/skipCondition.js.map +0 -1
  1157. package/build/temporal.cjs +0 -57
  1158. package/build/temporal.cjs.map +0 -1
  1159. package/build/temporal.d.cts +0 -44
  1160. package/build/temporal.d.cts.map +0 -1
  1161. package/build/temporal.d.mts +0 -44
  1162. package/build/temporal.d.mts.map +0 -1
  1163. package/build/temporal.js +0 -55
  1164. package/build/temporal.js.map +0 -1
  1165. package/build/temporalMappers.cjs +0 -63
  1166. package/build/temporalMappers.cjs.map +0 -1
  1167. package/build/temporalMappers.d.cts +0 -36
  1168. package/build/temporalMappers.d.cts.map +0 -1
  1169. package/build/temporalMappers.d.mts +0 -36
  1170. package/build/temporalMappers.d.mts.map +0 -1
  1171. package/build/temporalMappers.js +0 -59
  1172. package/build/temporalMappers.js.map +0 -1
  1173. package/build/unnest.cjs +0 -64
  1174. package/build/unnest.cjs.map +0 -1
  1175. package/build/unnest.d.cts +0 -16
  1176. package/build/unnest.d.cts.map +0 -1
  1177. package/build/unnest.d.mts +0 -16
  1178. package/build/unnest.d.mts.map +0 -1
  1179. package/build/unnest.js +0 -62
  1180. package/build/unnest.js.map +0 -1
  1181. package/build/withLoaded.cjs +0 -65
  1182. package/build/withLoaded.cjs.map +0 -1
  1183. package/build/withLoaded.d.cts +0 -65
  1184. package/build/withLoaded.d.cts.map +0 -1
  1185. package/build/withLoaded.d.mts +0 -65
  1186. package/build/withLoaded.d.mts.map +0 -1
  1187. package/build/withLoaded.js +0 -62
  1188. package/build/withLoaded.js.map +0 -1
  1189. /package/build/{expressions/types.cjs → flush/PendingChanges.cjs} +0 -0
  1190. /package/build/{expressions/types.js → flush/PendingChanges.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveReference.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#fieldName","#otherMeta","#state","getEmInternalApi","#loadPromise","#isLoaded","#isCached","isEntity","isLoaded","getField","sameEntity","maybeResolveReferenceToId","failNoId","failIfNewEntity","convertToLoadHint","toIdOf","deTagId","isCascadeDelete","RelationT","RelationU","ReferenceN","#rr","#loaded"],"sources":["../../src/relations/ReactiveReference.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf } from \"../EntityManager.ts\";\nimport { getField, setField } from \"../fields.ts\";\nimport {\n type EntityMetadata,\n type ManyToOneField,\n type TaggedId,\n deTagId,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n isEntity,\n isLoaded,\n maybeResolveReferenceToId,\n sameEntity,\n toIdOf,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { type MaybeReactedEntity, type Reacted, type ReactiveHint, convertToLoadHint } from \"../reactiveHints.ts\";\nimport { AbstractRelationImpl, isCascadeDelete } from \"./AbstractRelationImpl.ts\";\nimport { failIfNewEntity, failNoId } from \"./ManyToOneReference.ts\";\nimport { type Reference } from \"./Reference.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport interface ReactiveReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<\n T,\n U,\n N\n> {\n isLoaded: boolean;\n isSet: boolean;\n\n load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N>;\n\n /**\n * Returns the as-of-last-flush previously-calculated entity.\n *\n * This is useful if you have to purposefully avoid using the lambda to calc the latest entity,\n * i.e. if you're in a test and want to watch a calculated entity change from some dummy entity\n * to the new derived entity.\n * */\n fieldValue: U | N;\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 idUntagged: string;\n\n idUntaggedIfSet: string | undefined;\n}\n\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U>,\n): ReactiveReference<T, U, never>;\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | undefined,\n): ReactiveReference<T, U, undefined>;\n/** Creates a `ReactiveReference`. */\nexport function hasReactiveReference<\n T extends Entity,\n U extends Entity,\n const H extends ReactiveHint<T>,\n N extends never | undefined,\n>(hint: H, fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N): ReactiveReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n const m2o = getMetadata(entity).allFields[fieldName] as ManyToOneField;\n return new ReactiveReferenceImpl<T, U, H, N>(entity, m2o, hint, fn);\n });\n}\n\n/**\n * Implements ReactiveReferences.\n *\n * This is a bit trickier than ReactiveFields, because we have to differentiate our loaded\n * between:\n *\n * - our load hint is loaded, and we can directly calculate the referenced entity, or\n * - we've fetched the calculated/stored entity from the database, but not purposefully\n * not re-calculating it (which would require fetching the load hint, which might be\n * expensive, and defeat the point of having our field materialized in the database)\n *\n * Further, want to support all of:\n *\n * - When loaded & `.get` has been called, we cache the value\n *\n * - If a WIP mutation happens, we invalidate `.get` *but* if we check `.isLoaded`,\n * we can return the live/updated value, without an `await`.\n *\n * - If a WIP mutation happens, we invalidate `.isLoaded`, and if we're *no longer loaded*,\n * we want to keep returning the stale value (as asserted by the tests), but the next\n * `load` / `populate` should load the graph & recalculate the value.\n */\nexport class ReactiveReferenceImpl<\n T extends Entity,\n U extends Entity,\n H extends ReactiveHint<T>,\n N extends never | undefined,\n>\n extends AbstractRelationImpl<T, U>\n implements ReactiveReference<T, U, N>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #otherMeta: EntityMetadata;\n #state: RRState<U, N>;\n // #isLoaded doesn't necessary care if we're ref-mode or full-mode, it's just\n // whether a caller can call `.get` and not have it blow up.\n #isLoaded: boolean | undefined = undefined;\n #isCached: boolean = false;\n #loadPromise: Promise<U | N> | undefined;\n\n constructor(\n entity: T,\n field: ManyToOneField,\n public reactiveHint: H,\n private fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N,\n ) {\n super(entity);\n // Minimizing changes until the other PR lands...\n this.#fieldName = field.fieldName as keyof T & string;\n this.#otherMeta = field.otherMetadata();\n this.#state = new RRUnloadedState<U, N>(this);\n // We can be initialized with [entity | id | undefined], and if it's entity or id, then setImpl\n // will set loaded appropriately; but if we're initialized undefined, then mark loaded here\n if (entity.isNewEntity) {\n // const isLoaded = isEntity(this.current()) ? true : undefined;\n }\n // If the property transformer is not enabled, then the RR will not be in the relations map because they are\n // defined in the implementation file and not the codegen file. So we should insert ourselves regardless.\n (getInstanceData(entity).relations ??= {})[field.fieldName] = this;\n }\n\n async load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const { loadHint } = this;\n if (!this.isLoaded || opts?.forceReload) {\n const { em } = this.entity;\n // Just because we're not loaded, doesn't mean we necessarily need to load our full hint.\n // We prefer to load only our previously-calculated/materialized value, and only load the\n // full load hint if we need recalculated.\n const maybeDirty = opts?.forceReload || getEmInternalApi(em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n return (this.#loadPromise ??= em\n .populate(this.entity, { hint: loadHint, ...opts })\n .then(() => {\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // Go through `this.get` so that `setField` is called to set our latest value\n this.#isCached = false;\n return this.doGet(opts);\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n } else {\n // If we don't need a full recalc, just make sure we have the entity in memory\n // ...ideally we would check `isSet` and whether the key was in the `instanceData`\n const current = this.current();\n if (isEntity(current) || current === undefined) {\n this.#state = new RRRefState<U, N>(this, current as U | N | undefined);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return current as U | N;\n } else {\n return (this.#loadPromise ??= em\n .load(this.#otherMeta.cstr, current)\n .then((loaded) => {\n this.#state = new RRRefState<U, N>(this, loaded);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return loaded;\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n }\n }\n // The ReactiveField.load() always sets `#isCached = false`, but our assertion is that our\n // IsLoadedCache/resetIsLoaded infra is good enough to \"see all invalidating mutations\",\n // so we don't need this explicit reset.\n // this.#isCached = false;\n return this.doGet(opts);\n }\n\n get isLoaded(): boolean {\n // If we've cached an isLoaded value, just use that, see https://github.com/joist-orm/joist-orm/issues/1166\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // If a WIP mutation has marked our field as potentially dirty, we need to be \"full\" loaded\n const maybeDirty = getEmInternalApi(this.entity.em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n // If we're dirty, only being \"full\" loaded is good enough to recalc\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = isLoaded(this.entity, this.loadHint);\n this.#isCached = false;\n } else {\n // If we've had `.load` called before, assume we're still loaded\n this.#isLoaded = this.#state.canReturnValue;\n }\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n this.#isCached = false;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n const { fn } = this;\n ensureNotDeleted(this.entity, \"pending\");\n // Fast pass if we've already calculated this (cache invalidation will happen on\n // any mutation via #resetIsLoaded)..\n if (this.#isCached) {\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n // Call isLoaded to probe the load hint, and get `#isLoaded` set, but still have\n // our `if` check the raw `#isLoaded` to know if we should eval-latest or return `loaded`.\n if (this.isLoaded && this.#state.kind === \"full\") {\n const newValue = this.filterDeleted(fn(this.entity as any) as any, opts);\n // It's cheap to set this every time we're called, i.e. even if it's not the\n // official \"being called during em.flush\" update (...unless we're accessing it\n // during the validate phase of `em.flush`, then skip it to avoid tripping up\n // the \"cannot change entities during flush\" logic.)\n if (!getEmInternalApi(this.entity.em).isValidating) {\n this.setImpl(newValue);\n }\n this.#state = new RRFullState<U, N>(this, newValue);\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else if (this.#state.canReturnValue) {\n // We're either in ref mode, or in full mode but not actually fully loaded,\n // but in theory those states only get set after `.load()` / `.preload()` / import,\n // so we should have some stored value, even if it's not fully up-to-date.\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else {\n const noun = this.entity.isNewEntity ? \"derived\" : \"loaded\";\n throw new Error(`${this.entity}.${this.fieldName} has not been ${noun} yet`);\n }\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n\n get fieldValue(): U | N {\n return getField(this.entity, this.fieldName);\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 set(_: U | N): void {\n fail(`Cannot set ${this.entity}.${this.fieldName} ReactiveReference directly.`);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n // Internal method used by OneToManyCollection\n setImpl(entity: U | N): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (sameEntity(entity, this.current({ withDeleted: true }))) {\n return;\n }\n // Prefer to keep the id in our data hash, but if this is a new entity w/o an id, use the entity itself\n setField(this.entity, this.fieldName, isEntity(entity) ? (entity.idTaggedMaybe ?? entity) : entity);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.#state = new RRRefState<U, N>(this, this.maybeFindEntity());\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n private unload(): void {\n this.#state = new RRUnloadedState<U, N>(this);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\n }\n\n import(other: ReactiveReferenceImpl<T, U, H, N>, findEntity: (e: U) => U): void {\n this.#state = other.#state.import(this, findEntity);\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n /** Returns the tagged id of the current value. */\n get idTaggedMaybe(): TaggedId | N {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as TaggedId | N;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get loadHint(): any {\n const meta = getMetadata(this.entity);\n return (meta.config.__data.cachedReactiveLoadHints[this.fieldName] ??= convertToLoadHint(meta, this.reactiveHint));\n }\n\n // private impl\n\n /** Returns the id of the current value. */\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return toIdOf(this.otherMeta, this.idTaggedMaybe);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n setFromOpts(_: U | IdOf<U> | N): void {\n throw new Error(`ReactiveReference ${this.entity}.${this.fieldName} cannot be set via opts`);\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 setField(this.entity, this.fieldName, undefined);\n this.#state = new RRRefState<U, N>(this, undefined as N);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\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 | string | 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 get fieldName(): string {\n return this.#fieldName;\n }\n\n public get otherMeta(): EntityMetadata<U> {\n return (getMetadata(this.entity).allFields[this.#fieldName] as ManyToOneField).otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return true;\n }\n\n public toString(): string {\n return `ReactiveReference(entity: ${this.entity}, hint: ${this.loadHint}, fieldName: ${this.fieldName}, otherMeta: {\n this.otherMeta.type\n }, id: ${this.id})`;\n }\n\n /**\n * Removes pending-hard-delete (but not soft-deleted), unless explicitly asked for.\n *\n * Note that we leave soft-deleted entities b/c the call signature of a `book.author.get`\n * very likely does not expect a soft-deleted entity to result in `undefined`.\n *\n * (Contrasted with `author.books.get` which is more intuitive to have soft-deleted\n * entities filtered out, i.e. it doesn't fundamentally change the return type.)\n */\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n if (entity && (!opts || !opts.withDeleted) && entity.isDeletedEntity) {\n return undefined!;\n }\n return entity;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.#fieldName);\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 | N {\n // Check this.loaded first b/c a new entity won't have an id yet\n if (this.#state.canReturnValue) {\n const loaded = this.#state.doGet();\n if (loaded !== undefined) {\n return loaded;\n }\n }\n const { idTaggedMaybe } = this;\n return idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U | N) : (undefined as N);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n\n/** Type guard utility for determining if an entity field is a ReactiveReference. */\nexport function isReactiveReference(maybeReactiveRef: any): maybeReactiveRef is ReactiveReference<any, any, any> {\n return maybeReactiveRef instanceof ReactiveReferenceImpl;\n}\n\ninterface RRState<U extends Entity, N extends never | undefined> {\n readonly kind: \"unloaded\" | \"ref\" | \"full\";\n readonly canReturnValue: boolean;\n doGet(): U | N | undefined;\n /**\n * Switches from \"materialized ref value\" semantics to \"recalc from reactive graph when available\" semantics.\n *\n * This is synchronous because it does not mean the load hint is fully loaded yet. It only means this\n * reference should now behave as recalc-capable: if `isLoaded(loadHint)` later reports true, `doGet`\n * will recalculate from `fn(...)`; otherwise we keep returning the last known/stale value until `load()`\n * populates the graph.\n */\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N>;\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N>;\n}\n\nclass RRUnloadedState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"unloaded\";\n readonly canReturnValue = false;\n #rr: ReactiveReferenceImpl<any, any, any, any>;\n\n constructor(rr: ReactiveReferenceImpl<any, any, any, any>) {\n this.#rr = rr;\n }\n\n doGet(): U | N | undefined {\n throw new Error(`${this.#rr.entity}.${this.#rr.fieldName} was not loaded`);\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, undefined);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, _findEntity: (e: U) => U): RRState<U, N> {\n return new RRUnloadedState<U, N>(target);\n }\n}\n\nclass RRRefState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"ref\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, this.#loaded);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nclass RRFullState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"full\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(_target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return this;\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nfunction mapReactiveReferenceEntity<U extends Entity, N extends never | undefined>(\n entity: U | N | undefined,\n findEntity: (e: U) => U,\n): U | N | undefined {\n return isEntity(entity) ? findEntity(entity) : entity;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ReactiveReference.cjs","names":["lazyField","getMetadata","AbstractRelationImpl","#fieldName","#otherMeta","#state","getEmInternalApi","#loadPromise","#isLoaded","#isCached","isEntity","isLoaded","getField","sameEntity","maybeResolveReferenceToId","failNoId","failIfNewEntity","convertToLoadHint","toIdOf","deTagId","isCascadeDelete","RelationT","RelationU","ReferenceN","#rr","#loaded"],"sources":["../../src/relations/ReactiveReference.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf } from \"../EntityManager.ts\";\nimport { getField, setField } from \"../fields.ts\";\nimport {\n type EntityMetadata,\n type ManyToOneField,\n type TaggedId,\n deTagId,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n isEntity,\n isLoaded,\n maybeResolveReferenceToId,\n sameEntity,\n toIdOf,\n} from \"../index.ts\";\nimport type { IsLoadedCachable } from \"../loading/IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport {\n type MaybeReactedEntity,\n type Reacted,\n type ReactiveHint,\n convertToLoadHint,\n} from \"../reactivity/reactiveHints.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"./ManyToOneReference.ts\";\nimport { type Reference } from \"./Reference.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport interface ReactiveReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<\n T,\n U,\n N\n> {\n isLoaded: boolean;\n isSet: boolean;\n\n load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N>;\n\n /**\n * Returns the as-of-last-flush previously-calculated entity.\n *\n * This is useful if you have to purposefully avoid using the lambda to calc the latest entity,\n * i.e. if you're in a test and want to watch a calculated entity change from some dummy entity\n * to the new derived entity.\n * */\n fieldValue: U | N;\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 idUntagged: string;\n\n idUntaggedIfSet: string | undefined;\n}\n\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U>,\n): ReactiveReference<T, U, never>;\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | undefined,\n): ReactiveReference<T, U, undefined>;\n/** Creates a `ReactiveReference`. */\nexport function hasReactiveReference<\n T extends Entity,\n U extends Entity,\n const H extends ReactiveHint<T>,\n N extends never | undefined,\n>(hint: H, fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N): ReactiveReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n const m2o = getMetadata(entity).allFields[fieldName] as ManyToOneField;\n return new ReactiveReferenceImpl<T, U, H, N>(entity, m2o, hint, fn);\n });\n}\n\n/**\n * Implements ReactiveReferences.\n *\n * This is a bit trickier than ReactiveFields, because we have to differentiate our loaded\n * between:\n *\n * - our load hint is loaded, and we can directly calculate the referenced entity, or\n * - we've fetched the calculated/stored entity from the database, but not purposefully\n * not re-calculating it (which would require fetching the load hint, which might be\n * expensive, and defeat the point of having our field materialized in the database)\n *\n * Further, want to support all of:\n *\n * - When loaded & `.get` has been called, we cache the value\n *\n * - If a WIP mutation happens, we invalidate `.get` *but* if we check `.isLoaded`,\n * we can return the live/updated value, without an `await`.\n *\n * - If a WIP mutation happens, we invalidate `.isLoaded`, and if we're *no longer loaded*,\n * we want to keep returning the stale value (as asserted by the tests), but the next\n * `load` / `populate` should load the graph & recalculate the value.\n */\nexport class ReactiveReferenceImpl<\n T extends Entity,\n U extends Entity,\n H extends ReactiveHint<T>,\n N extends never | undefined,\n>\n extends AbstractRelationImpl<T, U>\n implements ReactiveReference<T, U, N>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #otherMeta: EntityMetadata;\n #state: RRState<U, N>;\n // #isLoaded doesn't necessary care if we're ref-mode or full-mode, it's just\n // whether a caller can call `.get` and not have it blow up.\n #isLoaded: boolean | undefined = undefined;\n #isCached: boolean = false;\n #loadPromise: Promise<U | N> | undefined;\n\n constructor(\n entity: T,\n field: ManyToOneField,\n public reactiveHint: H,\n private fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N,\n ) {\n super(entity);\n // Minimizing changes until the other PR lands...\n this.#fieldName = field.fieldName as keyof T & string;\n this.#otherMeta = field.otherMetadata();\n this.#state = new RRUnloadedState<U, N>(this);\n // We can be initialized with [entity | id | undefined], and if it's entity or id, then setImpl\n // will set loaded appropriately; but if we're initialized undefined, then mark loaded here\n if (entity.isNewEntity) {\n // const isLoaded = isEntity(this.current()) ? true : undefined;\n }\n // If the property transformer is not enabled, then the RR will not be in the relations map because they are\n // defined in the implementation file and not the codegen file. So we should insert ourselves regardless.\n (getInstanceData(entity).relations ??= {})[field.fieldName] = this;\n }\n\n async load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const { loadHint } = this;\n if (!this.isLoaded || opts?.forceReload) {\n const { em } = this.entity;\n // Just because we're not loaded, doesn't mean we necessarily need to load our full hint.\n // We prefer to load only our previously-calculated/materialized value, and only load the\n // full load hint if we need recalculated.\n const maybeDirty = opts?.forceReload || getEmInternalApi(em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n return (this.#loadPromise ??= em\n .populate(this.entity, { hint: loadHint, ...opts })\n .then(() => {\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // Go through `this.get` so that `setField` is called to set our latest value\n this.#isCached = false;\n return this.doGet(opts);\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n } else {\n // If we don't need a full recalc, just make sure we have the entity in memory\n // ...ideally we would check `isSet` and whether the key was in the `instanceData`\n const current = this.current();\n if (isEntity(current) || current === undefined) {\n this.#state = new RRRefState<U, N>(this, current as U | N | undefined);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return current as U | N;\n } else {\n return (this.#loadPromise ??= em\n .load(this.#otherMeta.cstr, current)\n .then((loaded) => {\n this.#state = new RRRefState<U, N>(this, loaded);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return loaded;\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n }\n }\n // The ReactiveField.load() always sets `#isCached = false`, but our assertion is that our\n // IsLoadedCache/resetIsLoaded infra is good enough to \"see all invalidating mutations\",\n // so we don't need this explicit reset.\n // this.#isCached = false;\n return this.doGet(opts);\n }\n\n get isLoaded(): boolean {\n // If we've cached an isLoaded value, just use that, see https://github.com/joist-orm/joist-orm/issues/1166\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // If a WIP mutation has marked our field as potentially dirty, we need to be \"full\" loaded\n const maybeDirty = getEmInternalApi(this.entity.em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n // If we're dirty, only being \"full\" loaded is good enough to recalc\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = isLoaded(this.entity, this.loadHint);\n this.#isCached = false;\n } else {\n // If we've had `.load` called before, assume we're still loaded\n this.#isLoaded = this.#state.canReturnValue;\n }\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n this.#isCached = false;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n const { fn } = this;\n ensureNotDeleted(this.entity, \"pending\");\n // Fast pass if we've already calculated this (cache invalidation will happen on\n // any mutation via #resetIsLoaded)..\n if (this.#isCached) {\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n // Call isLoaded to probe the load hint, and get `#isLoaded` set, but still have\n // our `if` check the raw `#isLoaded` to know if we should eval-latest or return `loaded`.\n if (this.isLoaded && this.#state.kind === \"full\") {\n const newValue = this.filterDeleted(fn(this.entity as any) as any, opts);\n // It's cheap to set this every time we're called, i.e. even if it's not the\n // official \"being called during em.flush\" update (...unless we're accessing it\n // during the validate phase of `em.flush`, then skip it to avoid tripping up\n // the \"cannot change entities during flush\" logic.)\n if (!getEmInternalApi(this.entity.em).isValidating) {\n this.setImpl(newValue);\n }\n this.#state = new RRFullState<U, N>(this, newValue);\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else if (this.#state.canReturnValue) {\n // We're either in ref mode, or in full mode but not actually fully loaded,\n // but in theory those states only get set after `.load()` / `.preload()` / import,\n // so we should have some stored value, even if it's not fully up-to-date.\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else {\n const noun = this.entity.isNewEntity ? \"derived\" : \"loaded\";\n throw new Error(`${this.entity}.${this.fieldName} has not been ${noun} yet`);\n }\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n\n get fieldValue(): U | N {\n return getField(this.entity, this.fieldName);\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 set(_: U | N): void {\n fail(`Cannot set ${this.entity}.${this.fieldName} ReactiveReference directly.`);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n // Internal method used by OneToManyCollection\n setImpl(entity: U | N): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (sameEntity(entity, this.current({ withDeleted: true }))) {\n return;\n }\n // Prefer to keep the id in our data hash, but if this is a new entity w/o an id, use the entity itself\n setField(this.entity, this.fieldName, isEntity(entity) ? (entity.idTaggedMaybe ?? entity) : entity);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.#state = new RRRefState<U, N>(this, this.maybeFindEntity());\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n private unload(): void {\n this.#state = new RRUnloadedState<U, N>(this);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\n }\n\n import(other: ReactiveReferenceImpl<T, U, H, N>, findEntity: (e: U) => U): void {\n this.#state = other.#state.import(this, findEntity);\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n /** Returns the tagged id of the current value. */\n get idTaggedMaybe(): TaggedId | N {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as TaggedId | N;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get loadHint(): any {\n const meta = getMetadata(this.entity);\n return (meta.config.__data.cachedReactiveLoadHints[this.fieldName] ??= convertToLoadHint(meta, this.reactiveHint));\n }\n\n // private impl\n\n /** Returns the id of the current value. */\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return toIdOf(this.otherMeta, this.idTaggedMaybe);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n setFromOpts(_: U | IdOf<U> | N): void {\n throw new Error(`ReactiveReference ${this.entity}.${this.fieldName} cannot be set via opts`);\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 setField(this.entity, this.fieldName, undefined);\n this.#state = new RRRefState<U, N>(this, undefined as N);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\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 | string | 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 get fieldName(): string {\n return this.#fieldName;\n }\n\n public get otherMeta(): EntityMetadata<U> {\n return (getMetadata(this.entity).allFields[this.#fieldName] as ManyToOneField).otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return true;\n }\n\n public toString(): string {\n return `ReactiveReference(entity: ${this.entity}, hint: ${this.loadHint}, fieldName: ${this.fieldName}, otherMeta: {\n this.otherMeta.type\n }, id: ${this.id})`;\n }\n\n /**\n * Removes pending-hard-delete (but not soft-deleted), unless explicitly asked for.\n *\n * Note that we leave soft-deleted entities b/c the call signature of a `book.author.get`\n * very likely does not expect a soft-deleted entity to result in `undefined`.\n *\n * (Contrasted with `author.books.get` which is more intuitive to have soft-deleted\n * entities filtered out, i.e. it doesn't fundamentally change the return type.)\n */\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n if (entity && (!opts || !opts.withDeleted) && entity.isDeletedEntity) {\n return undefined!;\n }\n return entity;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.#fieldName);\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 | N {\n // Check this.loaded first b/c a new entity won't have an id yet\n if (this.#state.canReturnValue) {\n const loaded = this.#state.doGet();\n if (loaded !== undefined) {\n return loaded;\n }\n }\n const { idTaggedMaybe } = this;\n return idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U | N) : (undefined as N);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n\n/** Type guard utility for determining if an entity field is a ReactiveReference. */\nexport function isReactiveReference(maybeReactiveRef: any): maybeReactiveRef is ReactiveReference<any, any, any> {\n return maybeReactiveRef instanceof ReactiveReferenceImpl;\n}\n\ninterface RRState<U extends Entity, N extends never | undefined> {\n readonly kind: \"unloaded\" | \"ref\" | \"full\";\n readonly canReturnValue: boolean;\n doGet(): U | N | undefined;\n /**\n * Switches from \"materialized ref value\" semantics to \"recalc from reactive graph when available\" semantics.\n *\n * This is synchronous because it does not mean the load hint is fully loaded yet. It only means this\n * reference should now behave as recalc-capable: if `isLoaded(loadHint)` later reports true, `doGet`\n * will recalculate from `fn(...)`; otherwise we keep returning the last known/stale value until `load()`\n * populates the graph.\n */\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N>;\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N>;\n}\n\nclass RRUnloadedState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"unloaded\";\n readonly canReturnValue = false;\n #rr: ReactiveReferenceImpl<any, any, any, any>;\n\n constructor(rr: ReactiveReferenceImpl<any, any, any, any>) {\n this.#rr = rr;\n }\n\n doGet(): U | N | undefined {\n throw new Error(`${this.#rr.entity}.${this.#rr.fieldName} was not loaded`);\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, undefined);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, _findEntity: (e: U) => U): RRState<U, N> {\n return new RRUnloadedState<U, N>(target);\n }\n}\n\nclass RRRefState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"ref\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, this.#loaded);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nclass RRFullState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"full\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(_target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return this;\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nfunction mapReactiveReferenceEntity<U extends Entity, N extends never | undefined>(\n entity: U | N | undefined,\n findEntity: (e: U) => U,\n): U | N | undefined {\n return isEntity(entity) ? findEntity(entity) : entity;\n}\n"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { AbstractRelationImpl } from "./AbstractRelationImpl.cjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.cjs";
3
3
  import { ReferenceN } from "./ReferenceSymbols.cjs";
4
4
  import { Reference } from "./Reference.cjs";
5
- import { IsLoadedCachable } from "../IsLoadedCache.cjs";
6
- import { MaybeReactedEntity, Reacted, ReactiveHint } from "../reactiveHints.cjs";
5
+ import { IsLoadedCachable } from "../loading/IsLoadedCache.cjs";
6
+ import { MaybeReactedEntity, Reacted, ReactiveHint } from "../reactivity/reactiveHints.cjs";
7
7
  import { EntityMetadata, ManyToOneField } from "../EntityMetadata.cjs";
8
8
  import "../index.cjs";
9
9
  import { IdOf, TaggedId } from "../EntityManager.cjs";
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveReference.d.cts","names":[],"sources":["../../src/relations/ReactiveReference.ts"],"mappings":";;;;;;;;;;;UA4BiB,kBAAkB,UAAU,QAAQ,UAAU,QAAQ,qCAAqC,UAC1G,GACA,GACA;EAEA;EACA;EAEA,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;;;;;;;;EASxE,YAAY,IAAI;;EAGhB,IAAI,KAAK;;EAGT,SAAS,KAAK;EAEd;EAEA;;iBAGc,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KACjD,kBAAkB,GAAG;iBACR,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,iBACjD,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;cAoCX,sBACX,UAAU,QACV,UAAU,QACV,UAAU,aAAa,IACvB,qCAEQ,qBAAqB,GAAG,cACrB,kBAAkB,GAAG,GAAG,IAAI;;EAc9B,cAAc;UACb;EAJV,YACE,QAAQ,GACR,OAAO,gBACA,cAAc,GACb,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KAAK;EAiB3D,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;MAsD1E;EAkBJ;UAKQ;MAmCJ,cAAc,IAAI;MAIlB,kBAAkB,IAAI;MAItB,OAAO,IAAI;EAIf,IAAI,GAAG,IAAI;MAIP;EAKJ,QAAQ,QAAQ,IAAI;MAShB;EAIJ;UAMQ;EAOR,OAAO,OAAO,sBAAsB,GAAG,GAAG,GAAG,IAAI,aAAa,GAAG,MAAM;;MAOnE,iBAAiB,WAAW;MAK5B,MAAM,KAAK;MAIX;MAIA,WAAW,KAAK,KAAK;MAIrB;MAIA;;cAQQ;cAKA;EAIZ,YAAY,GAAG,IAAI,KAAK,KAAK;EAI7B;EASM,0BAA0B;EAWhC,QAAQ;IAAS;MAA0B,aAAa;MAQpD;MAIO,aAAa,eAAe;MAI5B;EAIJ;;;;;;;;;;UAeC;cAOI;;;;;EAQZ,mBAAmB,IAAI;GAYtB,YAAY;GACZ,YAAY;GACZ,aAAa;;;iBAIA,oBAAoB,wBAAwB,oBAAoB"}
1
+ {"version":3,"file":"ReactiveReference.d.cts","names":[],"sources":["../../src/relations/ReactiveReference.ts"],"mappings":";;;;;;;;;;;UAkCiB,kBAAkB,UAAU,QAAQ,UAAU,QAAQ,qCAAqC,UAC1G,GACA,GACA;EAEA;EACA;EAEA,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;;;;;;;;EASxE,YAAY,IAAI;;EAGhB,IAAI,KAAK;;EAGT,SAAS,KAAK;EAEd;EAEA;;iBAGc,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KACjD,kBAAkB,GAAG;iBACR,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,iBACjD,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;cAoCX,sBACX,UAAU,QACV,UAAU,QACV,UAAU,aAAa,IACvB,qCAEQ,qBAAqB,GAAG,cACrB,kBAAkB,GAAG,GAAG,IAAI;;EAc9B,cAAc;UACb;EAJV,YACE,QAAQ,GACR,OAAO,gBACA,cAAc,GACb,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KAAK;EAiB3D,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;MAsD1E;EAkBJ;UAKQ;MAmCJ,cAAc,IAAI;MAIlB,kBAAkB,IAAI;MAItB,OAAO,IAAI;EAIf,IAAI,GAAG,IAAI;MAIP;EAKJ,QAAQ,QAAQ,IAAI;MAShB;EAIJ;UAMQ;EAOR,OAAO,OAAO,sBAAsB,GAAG,GAAG,GAAG,IAAI,aAAa,GAAG,MAAM;;MAOnE,iBAAiB,WAAW;MAK5B,MAAM,KAAK;MAIX;MAIA,WAAW,KAAK,KAAK;MAIrB;MAIA;;cAQQ;cAKA;EAIZ,YAAY,GAAG,IAAI,KAAK,KAAK;EAI7B;EASM,0BAA0B;EAWhC,QAAQ;IAAS;MAA0B,aAAa;MAQpD;MAIO,aAAa,eAAe;MAI5B;EAIJ;;;;;;;;;;UAeC;cAOI;;;;;EAQZ,mBAAmB,IAAI;GAYtB,YAAY;GACZ,YAAY;GACZ,aAAa;;;iBAIA,oBAAoB,wBAAwB,oBAAoB"}
@@ -2,8 +2,8 @@ import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.mjs";
3
3
  import { ReferenceN } from "./ReferenceSymbols.mjs";
4
4
  import { Reference } from "./Reference.mjs";
5
- import { IsLoadedCachable } from "../IsLoadedCache.mjs";
6
- import { MaybeReactedEntity, Reacted, ReactiveHint } from "../reactiveHints.mjs";
5
+ import { IsLoadedCachable } from "../loading/IsLoadedCache.mjs";
6
+ import { MaybeReactedEntity, Reacted, ReactiveHint } from "../reactivity/reactiveHints.mjs";
7
7
  import { EntityMetadata, ManyToOneField } from "../EntityMetadata.mjs";
8
8
  import "../index.mjs";
9
9
  import { IdOf, TaggedId } from "../EntityManager.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveReference.d.mts","names":[],"sources":["../../src/relations/ReactiveReference.ts"],"mappings":";;;;;;;;;;;UA4BiB,kBAAkB,UAAU,QAAQ,UAAU,QAAQ,qCAAqC,UAC1G,GACA,GACA;EAEA;EACA;EAEA,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;;;;;;;;EASxE,YAAY,IAAI;;EAGhB,IAAI,KAAK;;EAGT,SAAS,KAAK;EAEd;EAEA;;iBAGc,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KACjD,kBAAkB,GAAG;iBACR,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,iBACjD,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;cAoCX,sBACX,UAAU,QACV,UAAU,QACV,UAAU,aAAa,IACvB,qCAEQ,qBAAqB,GAAG,cACrB,kBAAkB,GAAG,GAAG,IAAI;;EAc9B,cAAc;UACb;EAJV,YACE,QAAQ,GACR,OAAO,gBACA,cAAc,GACb,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KAAK;EAiB3D,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;MAsD1E;EAkBJ;UAKQ;MAmCJ,cAAc,IAAI;MAIlB,kBAAkB,IAAI;MAItB,OAAO,IAAI;EAIf,IAAI,GAAG,IAAI;MAIP;EAKJ,QAAQ,QAAQ,IAAI;MAShB;EAIJ;UAMQ;EAOR,OAAO,OAAO,sBAAsB,GAAG,GAAG,GAAG,IAAI,aAAa,GAAG,MAAM;;MAOnE,iBAAiB,WAAW;MAK5B,MAAM,KAAK;MAIX;MAIA,WAAW,KAAK,KAAK;MAIrB;MAIA;;cAQQ;cAKA;EAIZ,YAAY,GAAG,IAAI,KAAK,KAAK;EAI7B;EASM,0BAA0B;EAWhC,QAAQ;IAAS;MAA0B,aAAa;MAQpD;MAIO,aAAa,eAAe;MAI5B;EAIJ;;;;;;;;;;UAeC;cAOI;;;;;EAQZ,mBAAmB,IAAI;GAYtB,YAAY;GACZ,YAAY;GACZ,aAAa;;;iBAIA,oBAAoB,wBAAwB,oBAAoB"}
1
+ {"version":3,"file":"ReactiveReference.d.mts","names":[],"sources":["../../src/relations/ReactiveReference.ts"],"mappings":";;;;;;;;;;;UAkCiB,kBAAkB,UAAU,QAAQ,UAAU,QAAQ,qCAAqC,UAC1G,GACA,GACA;EAEA;EACA;EAEA,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;;;;;;;;EASxE,YAAY,IAAI;;EAGhB,IAAI,KAAK;;EAGT,SAAS,KAAK;EAEd;EAEA;;iBAGc,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KACjD,kBAAkB,GAAG;iBACR,qBAAqB,UAAU,QAAQ,UAAU,cAAc,UAAU,aAAa,IACpG,MAAM,GACN,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,iBACjD,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;cAoCX,sBACX,UAAU,QACV,UAAU,QACV,UAAU,aAAa,IACvB,qCAEQ,qBAAqB,GAAG,cACrB,kBAAkB,GAAG,GAAG,IAAI;;EAc9B,cAAc;UACb;EAJV,YACE,QAAQ,GACR,OAAO,gBACA,cAAc,GACb,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,KAAK;EAiB3D,KAAK;IAAS;IAAuB;MAAuB,QAAQ,IAAI;MAsD1E;EAkBJ;UAKQ;MAmCJ,cAAc,IAAI;MAIlB,kBAAkB,IAAI;MAItB,OAAO,IAAI;EAIf,IAAI,GAAG,IAAI;MAIP;EAKJ,QAAQ,QAAQ,IAAI;MAShB;EAIJ;UAMQ;EAOR,OAAO,OAAO,sBAAsB,GAAG,GAAG,GAAG,IAAI,aAAa,GAAG,MAAM;;MAOnE,iBAAiB,WAAW;MAK5B,MAAM,KAAK;MAIX;MAIA,WAAW,KAAK,KAAK;MAIrB;MAIA;;cAQQ;cAKA;EAIZ,YAAY,GAAG,IAAI,KAAK,KAAK;EAI7B;EASM,0BAA0B;EAWhC,QAAQ;IAAS;MAA0B,aAAa;MAQpD;MAIO,aAAa,eAAe;MAI5B;EAIJ;;;;;;;;;;UAeC;cAOI;;;;;EAQZ,mBAAmB,IAAI;GAYtB,YAAY;GACZ,YAAY;GACZ,aAAa;;;iBAIA,oBAAoB,wBAAwB,oBAAoB"}
@@ -1,16 +1,16 @@
1
- import { lazyField } from "../newEntity.js";
2
- import { AbstractRelationImpl, isCascadeDelete } from "./AbstractRelationImpl.js";
1
+ import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
3
2
  import { RelationT, RelationU } from "./RelationSymbols.js";
4
3
  import { ReferenceN } from "./ReferenceSymbols.js";
4
+ import { convertToLoadHint } from "../reactivity/reactiveHints.js";
5
+ import { isLoaded } from "../loading/loadHints.js";
6
+ import { getField, setField } from "../fields.js";
7
+ import { deTagId, maybeResolveReferenceToId, toIdOf } from "../keys.js";
5
8
  import "./Reference.js";
6
- import "../IsLoadedCache.js";
9
+ import { isCascadeDelete } from "./isCascadeDelete.js";
7
10
  import { failIfNewEntity, failNoId } from "./ManyToOneReference.js";
8
- import { deTagId, maybeResolveReferenceToId, toIdOf } from "../keys.js";
9
- import { getMetadata } from "../EntityMetadata.js";
10
- import { getField, setField } from "../fields.js";
11
- import { convertToLoadHint } from "../reactiveHints.js";
12
- import { isLoaded } from "../loadHints.js";
13
11
  import { fail } from "../utils.js";
12
+ import { lazyField } from "../newEntity.js";
13
+ import { getMetadata } from "../EntityMetadata.js";
14
14
  import { ensureNotDeleted } from "../index.js";
15
15
  import { getEmInternalApi, sameEntity } from "../EntityManager.js";
16
16
  import { isEntity } from "../Entity.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ReactiveReference.js","names":["#fieldName","#otherMeta","#state","#loadPromise","#isLoaded","#isCached","#rr","#loaded"],"sources":["../../src/relations/ReactiveReference.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf } from \"../EntityManager.ts\";\nimport { getField, setField } from \"../fields.ts\";\nimport {\n type EntityMetadata,\n type ManyToOneField,\n type TaggedId,\n deTagId,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n isEntity,\n isLoaded,\n maybeResolveReferenceToId,\n sameEntity,\n toIdOf,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { type MaybeReactedEntity, type Reacted, type ReactiveHint, convertToLoadHint } from \"../reactiveHints.ts\";\nimport { AbstractRelationImpl, isCascadeDelete } from \"./AbstractRelationImpl.ts\";\nimport { failIfNewEntity, failNoId } from \"./ManyToOneReference.ts\";\nimport { type Reference } from \"./Reference.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport interface ReactiveReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<\n T,\n U,\n N\n> {\n isLoaded: boolean;\n isSet: boolean;\n\n load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N>;\n\n /**\n * Returns the as-of-last-flush previously-calculated entity.\n *\n * This is useful if you have to purposefully avoid using the lambda to calc the latest entity,\n * i.e. if you're in a test and want to watch a calculated entity change from some dummy entity\n * to the new derived entity.\n * */\n fieldValue: U | N;\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 idUntagged: string;\n\n idUntaggedIfSet: string | undefined;\n}\n\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U>,\n): ReactiveReference<T, U, never>;\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | undefined,\n): ReactiveReference<T, U, undefined>;\n/** Creates a `ReactiveReference`. */\nexport function hasReactiveReference<\n T extends Entity,\n U extends Entity,\n const H extends ReactiveHint<T>,\n N extends never | undefined,\n>(hint: H, fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N): ReactiveReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n const m2o = getMetadata(entity).allFields[fieldName] as ManyToOneField;\n return new ReactiveReferenceImpl<T, U, H, N>(entity, m2o, hint, fn);\n });\n}\n\n/**\n * Implements ReactiveReferences.\n *\n * This is a bit trickier than ReactiveFields, because we have to differentiate our loaded\n * between:\n *\n * - our load hint is loaded, and we can directly calculate the referenced entity, or\n * - we've fetched the calculated/stored entity from the database, but not purposefully\n * not re-calculating it (which would require fetching the load hint, which might be\n * expensive, and defeat the point of having our field materialized in the database)\n *\n * Further, want to support all of:\n *\n * - When loaded & `.get` has been called, we cache the value\n *\n * - If a WIP mutation happens, we invalidate `.get` *but* if we check `.isLoaded`,\n * we can return the live/updated value, without an `await`.\n *\n * - If a WIP mutation happens, we invalidate `.isLoaded`, and if we're *no longer loaded*,\n * we want to keep returning the stale value (as asserted by the tests), but the next\n * `load` / `populate` should load the graph & recalculate the value.\n */\nexport class ReactiveReferenceImpl<\n T extends Entity,\n U extends Entity,\n H extends ReactiveHint<T>,\n N extends never | undefined,\n>\n extends AbstractRelationImpl<T, U>\n implements ReactiveReference<T, U, N>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #otherMeta: EntityMetadata;\n #state: RRState<U, N>;\n // #isLoaded doesn't necessary care if we're ref-mode or full-mode, it's just\n // whether a caller can call `.get` and not have it blow up.\n #isLoaded: boolean | undefined = undefined;\n #isCached: boolean = false;\n #loadPromise: Promise<U | N> | undefined;\n\n constructor(\n entity: T,\n field: ManyToOneField,\n public reactiveHint: H,\n private fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N,\n ) {\n super(entity);\n // Minimizing changes until the other PR lands...\n this.#fieldName = field.fieldName as keyof T & string;\n this.#otherMeta = field.otherMetadata();\n this.#state = new RRUnloadedState<U, N>(this);\n // We can be initialized with [entity | id | undefined], and if it's entity or id, then setImpl\n // will set loaded appropriately; but if we're initialized undefined, then mark loaded here\n if (entity.isNewEntity) {\n // const isLoaded = isEntity(this.current()) ? true : undefined;\n }\n // If the property transformer is not enabled, then the RR will not be in the relations map because they are\n // defined in the implementation file and not the codegen file. So we should insert ourselves regardless.\n (getInstanceData(entity).relations ??= {})[field.fieldName] = this;\n }\n\n async load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const { loadHint } = this;\n if (!this.isLoaded || opts?.forceReload) {\n const { em } = this.entity;\n // Just because we're not loaded, doesn't mean we necessarily need to load our full hint.\n // We prefer to load only our previously-calculated/materialized value, and only load the\n // full load hint if we need recalculated.\n const maybeDirty = opts?.forceReload || getEmInternalApi(em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n return (this.#loadPromise ??= em\n .populate(this.entity, { hint: loadHint, ...opts })\n .then(() => {\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // Go through `this.get` so that `setField` is called to set our latest value\n this.#isCached = false;\n return this.doGet(opts);\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n } else {\n // If we don't need a full recalc, just make sure we have the entity in memory\n // ...ideally we would check `isSet` and whether the key was in the `instanceData`\n const current = this.current();\n if (isEntity(current) || current === undefined) {\n this.#state = new RRRefState<U, N>(this, current as U | N | undefined);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return current as U | N;\n } else {\n return (this.#loadPromise ??= em\n .load(this.#otherMeta.cstr, current)\n .then((loaded) => {\n this.#state = new RRRefState<U, N>(this, loaded);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return loaded;\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n }\n }\n // The ReactiveField.load() always sets `#isCached = false`, but our assertion is that our\n // IsLoadedCache/resetIsLoaded infra is good enough to \"see all invalidating mutations\",\n // so we don't need this explicit reset.\n // this.#isCached = false;\n return this.doGet(opts);\n }\n\n get isLoaded(): boolean {\n // If we've cached an isLoaded value, just use that, see https://github.com/joist-orm/joist-orm/issues/1166\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // If a WIP mutation has marked our field as potentially dirty, we need to be \"full\" loaded\n const maybeDirty = getEmInternalApi(this.entity.em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n // If we're dirty, only being \"full\" loaded is good enough to recalc\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = isLoaded(this.entity, this.loadHint);\n this.#isCached = false;\n } else {\n // If we've had `.load` called before, assume we're still loaded\n this.#isLoaded = this.#state.canReturnValue;\n }\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n this.#isCached = false;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n const { fn } = this;\n ensureNotDeleted(this.entity, \"pending\");\n // Fast pass if we've already calculated this (cache invalidation will happen on\n // any mutation via #resetIsLoaded)..\n if (this.#isCached) {\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n // Call isLoaded to probe the load hint, and get `#isLoaded` set, but still have\n // our `if` check the raw `#isLoaded` to know if we should eval-latest or return `loaded`.\n if (this.isLoaded && this.#state.kind === \"full\") {\n const newValue = this.filterDeleted(fn(this.entity as any) as any, opts);\n // It's cheap to set this every time we're called, i.e. even if it's not the\n // official \"being called during em.flush\" update (...unless we're accessing it\n // during the validate phase of `em.flush`, then skip it to avoid tripping up\n // the \"cannot change entities during flush\" logic.)\n if (!getEmInternalApi(this.entity.em).isValidating) {\n this.setImpl(newValue);\n }\n this.#state = new RRFullState<U, N>(this, newValue);\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else if (this.#state.canReturnValue) {\n // We're either in ref mode, or in full mode but not actually fully loaded,\n // but in theory those states only get set after `.load()` / `.preload()` / import,\n // so we should have some stored value, even if it's not fully up-to-date.\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else {\n const noun = this.entity.isNewEntity ? \"derived\" : \"loaded\";\n throw new Error(`${this.entity}.${this.fieldName} has not been ${noun} yet`);\n }\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n\n get fieldValue(): U | N {\n return getField(this.entity, this.fieldName);\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 set(_: U | N): void {\n fail(`Cannot set ${this.entity}.${this.fieldName} ReactiveReference directly.`);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n // Internal method used by OneToManyCollection\n setImpl(entity: U | N): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (sameEntity(entity, this.current({ withDeleted: true }))) {\n return;\n }\n // Prefer to keep the id in our data hash, but if this is a new entity w/o an id, use the entity itself\n setField(this.entity, this.fieldName, isEntity(entity) ? (entity.idTaggedMaybe ?? entity) : entity);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.#state = new RRRefState<U, N>(this, this.maybeFindEntity());\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n private unload(): void {\n this.#state = new RRUnloadedState<U, N>(this);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\n }\n\n import(other: ReactiveReferenceImpl<T, U, H, N>, findEntity: (e: U) => U): void {\n this.#state = other.#state.import(this, findEntity);\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n /** Returns the tagged id of the current value. */\n get idTaggedMaybe(): TaggedId | N {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as TaggedId | N;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get loadHint(): any {\n const meta = getMetadata(this.entity);\n return (meta.config.__data.cachedReactiveLoadHints[this.fieldName] ??= convertToLoadHint(meta, this.reactiveHint));\n }\n\n // private impl\n\n /** Returns the id of the current value. */\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return toIdOf(this.otherMeta, this.idTaggedMaybe);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n setFromOpts(_: U | IdOf<U> | N): void {\n throw new Error(`ReactiveReference ${this.entity}.${this.fieldName} cannot be set via opts`);\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 setField(this.entity, this.fieldName, undefined);\n this.#state = new RRRefState<U, N>(this, undefined as N);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\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 | string | 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 get fieldName(): string {\n return this.#fieldName;\n }\n\n public get otherMeta(): EntityMetadata<U> {\n return (getMetadata(this.entity).allFields[this.#fieldName] as ManyToOneField).otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return true;\n }\n\n public toString(): string {\n return `ReactiveReference(entity: ${this.entity}, hint: ${this.loadHint}, fieldName: ${this.fieldName}, otherMeta: {\n this.otherMeta.type\n }, id: ${this.id})`;\n }\n\n /**\n * Removes pending-hard-delete (but not soft-deleted), unless explicitly asked for.\n *\n * Note that we leave soft-deleted entities b/c the call signature of a `book.author.get`\n * very likely does not expect a soft-deleted entity to result in `undefined`.\n *\n * (Contrasted with `author.books.get` which is more intuitive to have soft-deleted\n * entities filtered out, i.e. it doesn't fundamentally change the return type.)\n */\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n if (entity && (!opts || !opts.withDeleted) && entity.isDeletedEntity) {\n return undefined!;\n }\n return entity;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.#fieldName);\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 | N {\n // Check this.loaded first b/c a new entity won't have an id yet\n if (this.#state.canReturnValue) {\n const loaded = this.#state.doGet();\n if (loaded !== undefined) {\n return loaded;\n }\n }\n const { idTaggedMaybe } = this;\n return idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U | N) : (undefined as N);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n\n/** Type guard utility for determining if an entity field is a ReactiveReference. */\nexport function isReactiveReference(maybeReactiveRef: any): maybeReactiveRef is ReactiveReference<any, any, any> {\n return maybeReactiveRef instanceof ReactiveReferenceImpl;\n}\n\ninterface RRState<U extends Entity, N extends never | undefined> {\n readonly kind: \"unloaded\" | \"ref\" | \"full\";\n readonly canReturnValue: boolean;\n doGet(): U | N | undefined;\n /**\n * Switches from \"materialized ref value\" semantics to \"recalc from reactive graph when available\" semantics.\n *\n * This is synchronous because it does not mean the load hint is fully loaded yet. It only means this\n * reference should now behave as recalc-capable: if `isLoaded(loadHint)` later reports true, `doGet`\n * will recalculate from `fn(...)`; otherwise we keep returning the last known/stale value until `load()`\n * populates the graph.\n */\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N>;\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N>;\n}\n\nclass RRUnloadedState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"unloaded\";\n readonly canReturnValue = false;\n #rr: ReactiveReferenceImpl<any, any, any, any>;\n\n constructor(rr: ReactiveReferenceImpl<any, any, any, any>) {\n this.#rr = rr;\n }\n\n doGet(): U | N | undefined {\n throw new Error(`${this.#rr.entity}.${this.#rr.fieldName} was not loaded`);\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, undefined);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, _findEntity: (e: U) => U): RRState<U, N> {\n return new RRUnloadedState<U, N>(target);\n }\n}\n\nclass RRRefState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"ref\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, this.#loaded);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nclass RRFullState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"full\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(_target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return this;\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nfunction mapReactiveReferenceEntity<U extends Entity, N extends never | undefined>(\n entity: U | N | undefined,\n findEntity: (e: U) => U,\n): U | N | undefined {\n return isEntity(entity) ? findEntity(entity) : entity;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ReactiveReference.js","names":["#fieldName","#otherMeta","#state","#loadPromise","#isLoaded","#isCached","#rr","#loaded"],"sources":["../../src/relations/ReactiveReference.ts"],"sourcesContent":["import { type Entity } from \"../Entity.ts\";\nimport { type IdOf } from \"../EntityManager.ts\";\nimport { getField, setField } from \"../fields.ts\";\nimport {\n type EntityMetadata,\n type ManyToOneField,\n type TaggedId,\n deTagId,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getInstanceData,\n getMetadata,\n isEntity,\n isLoaded,\n maybeResolveReferenceToId,\n sameEntity,\n toIdOf,\n} from \"../index.ts\";\nimport type { IsLoadedCachable } from \"../loading/IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport {\n type MaybeReactedEntity,\n type Reacted,\n type ReactiveHint,\n convertToLoadHint,\n} from \"../reactivity/reactiveHints.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { isCascadeDelete } from \"./isCascadeDelete.ts\";\nimport { failIfNewEntity, failNoId } from \"./ManyToOneReference.ts\";\nimport { type Reference } from \"./Reference.ts\";\nimport { ReferenceN } from \"./ReferenceSymbols.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport interface ReactiveReference<T extends Entity, U extends Entity, N extends never | undefined> extends Reference<\n T,\n U,\n N\n> {\n isLoaded: boolean;\n isSet: boolean;\n\n load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N>;\n\n /**\n * Returns the as-of-last-flush previously-calculated entity.\n *\n * This is useful if you have to purposefully avoid using the lambda to calc the latest entity,\n * i.e. if you're in a test and want to watch a calculated entity change from some dummy entity\n * to the new derived entity.\n * */\n fieldValue: U | N;\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 idUntagged: string;\n\n idUntaggedIfSet: string | undefined;\n}\n\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U>,\n): ReactiveReference<T, U, never>;\nexport function hasReactiveReference<T extends Entity, U extends Entity, const H extends ReactiveHint<T>>(\n hint: H,\n fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | undefined,\n): ReactiveReference<T, U, undefined>;\n/** Creates a `ReactiveReference`. */\nexport function hasReactiveReference<\n T extends Entity,\n U extends Entity,\n const H extends ReactiveHint<T>,\n N extends never | undefined,\n>(hint: H, fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N): ReactiveReference<T, U, N> {\n return lazyField((entity: T, fieldName) => {\n const m2o = getMetadata(entity).allFields[fieldName] as ManyToOneField;\n return new ReactiveReferenceImpl<T, U, H, N>(entity, m2o, hint, fn);\n });\n}\n\n/**\n * Implements ReactiveReferences.\n *\n * This is a bit trickier than ReactiveFields, because we have to differentiate our loaded\n * between:\n *\n * - our load hint is loaded, and we can directly calculate the referenced entity, or\n * - we've fetched the calculated/stored entity from the database, but not purposefully\n * not re-calculating it (which would require fetching the load hint, which might be\n * expensive, and defeat the point of having our field materialized in the database)\n *\n * Further, want to support all of:\n *\n * - When loaded & `.get` has been called, we cache the value\n *\n * - If a WIP mutation happens, we invalidate `.get` *but* if we check `.isLoaded`,\n * we can return the live/updated value, without an `await`.\n *\n * - If a WIP mutation happens, we invalidate `.isLoaded`, and if we're *no longer loaded*,\n * we want to keep returning the stale value (as asserted by the tests), but the next\n * `load` / `populate` should load the graph & recalculate the value.\n */\nexport class ReactiveReferenceImpl<\n T extends Entity,\n U extends Entity,\n H extends ReactiveHint<T>,\n N extends never | undefined,\n>\n extends AbstractRelationImpl<T, U>\n implements ReactiveReference<T, U, N>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #otherMeta: EntityMetadata;\n #state: RRState<U, N>;\n // #isLoaded doesn't necessary care if we're ref-mode or full-mode, it's just\n // whether a caller can call `.get` and not have it blow up.\n #isLoaded: boolean | undefined = undefined;\n #isCached: boolean = false;\n #loadPromise: Promise<U | N> | undefined;\n\n constructor(\n entity: T,\n field: ManyToOneField,\n public reactiveHint: H,\n private fn: (entity: Reacted<T, H>) => MaybeReactedEntity<U> | N,\n ) {\n super(entity);\n // Minimizing changes until the other PR lands...\n this.#fieldName = field.fieldName as keyof T & string;\n this.#otherMeta = field.otherMetadata();\n this.#state = new RRUnloadedState<U, N>(this);\n // We can be initialized with [entity | id | undefined], and if it's entity or id, then setImpl\n // will set loaded appropriately; but if we're initialized undefined, then mark loaded here\n if (entity.isNewEntity) {\n // const isLoaded = isEntity(this.current()) ? true : undefined;\n }\n // If the property transformer is not enabled, then the RR will not be in the relations map because they are\n // defined in the implementation file and not the codegen file. So we should insert ourselves regardless.\n (getInstanceData(entity).relations ??= {})[field.fieldName] = this;\n }\n\n async load(opts?: { withDeleted?: boolean; forceReload?: true }): Promise<U | N> {\n ensureNotDeleted(this.entity, \"pending\");\n const { loadHint } = this;\n if (!this.isLoaded || opts?.forceReload) {\n const { em } = this.entity;\n // Just because we're not loaded, doesn't mean we necessarily need to load our full hint.\n // We prefer to load only our previously-calculated/materialized value, and only load the\n // full load hint if we need recalculated.\n const maybeDirty = opts?.forceReload || getEmInternalApi(em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n return (this.#loadPromise ??= em\n .populate(this.entity, { hint: loadHint, ...opts })\n .then(() => {\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // Go through `this.get` so that `setField` is called to set our latest value\n this.#isCached = false;\n return this.doGet(opts);\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n } else {\n // If we don't need a full recalc, just make sure we have the entity in memory\n // ...ideally we would check `isSet` and whether the key was in the `instanceData`\n const current = this.current();\n if (isEntity(current) || current === undefined) {\n this.#state = new RRRefState<U, N>(this, current as U | N | undefined);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return current as U | N;\n } else {\n return (this.#loadPromise ??= em\n .load(this.#otherMeta.cstr, current)\n .then((loaded) => {\n this.#state = new RRRefState<U, N>(this, loaded);\n this.#isLoaded = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n return loaded;\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n }\n }\n // The ReactiveField.load() always sets `#isCached = false`, but our assertion is that our\n // IsLoadedCache/resetIsLoaded infra is good enough to \"see all invalidating mutations\",\n // so we don't need this explicit reset.\n // this.#isCached = false;\n return this.doGet(opts);\n }\n\n get isLoaded(): boolean {\n // If we've cached an isLoaded value, just use that, see https://github.com/joist-orm/joist-orm/issues/1166\n if (this.#isLoaded !== undefined) return this.#isLoaded;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n // If a WIP mutation has marked our field as potentially dirty, we need to be \"full\" loaded\n const maybeDirty = getEmInternalApi(this.entity.em).rm.isMaybePendingRecalc(this.entity, this.fieldName);\n if (maybeDirty) {\n // If we're dirty, only being \"full\" loaded is good enough to recalc\n this.#state = this.#state.enterRecalcMode(this);\n this.#isLoaded = isLoaded(this.entity, this.loadHint);\n this.#isCached = false;\n } else {\n // If we've had `.load` called before, assume we're still loaded\n this.#isLoaded = this.#state.canReturnValue;\n }\n return this.#isLoaded;\n }\n\n resetIsLoaded(): void {\n this.#isLoaded = undefined;\n this.#isCached = false;\n }\n\n private doGet(opts?: { withDeleted?: boolean }): U | N {\n const { fn } = this;\n ensureNotDeleted(this.entity, \"pending\");\n // Fast pass if we've already calculated this (cache invalidation will happen on\n // any mutation via #resetIsLoaded)..\n if (this.#isCached) {\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n // Call isLoaded to probe the load hint, and get `#isLoaded` set, but still have\n // our `if` check the raw `#isLoaded` to know if we should eval-latest or return `loaded`.\n if (this.isLoaded && this.#state.kind === \"full\") {\n const newValue = this.filterDeleted(fn(this.entity as any) as any, opts);\n // It's cheap to set this every time we're called, i.e. even if it's not the\n // official \"being called during em.flush\" update (...unless we're accessing it\n // during the validate phase of `em.flush`, then skip it to avoid tripping up\n // the \"cannot change entities during flush\" logic.)\n if (!getEmInternalApi(this.entity.em).isValidating) {\n this.setImpl(newValue);\n }\n this.#state = new RRFullState<U, N>(this, newValue);\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else if (this.#state.canReturnValue) {\n // We're either in ref mode, or in full mode but not actually fully loaded,\n // but in theory those states only get set after `.load()` / `.preload()` / import,\n // so we should have some stored value, even if it's not fully up-to-date.\n this.#isCached = true;\n getEmInternalApi(this.entity.em).isLoadedCache.add(this);\n } else {\n const noun = this.entity.isNewEntity ? \"derived\" : \"loaded\";\n throw new Error(`${this.entity}.${this.fieldName} has not been ${noun} yet`);\n }\n return this.filterDeleted(this.#state.doGet() as U | N, opts);\n }\n\n get fieldValue(): U | N {\n return getField(this.entity, this.fieldName);\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 set(_: U | N): void {\n fail(`Cannot set ${this.entity}.${this.fieldName} ReactiveReference directly.`);\n }\n\n get isSet(): boolean {\n return this.current() !== undefined;\n }\n\n // Internal method used by OneToManyCollection\n setImpl(entity: U | N): void {\n ensureNotDeleted(this.entity, \"pending\");\n if (sameEntity(entity, this.current({ withDeleted: true }))) {\n return;\n }\n // Prefer to keep the id in our data hash, but if this is a new entity w/o an id, use the entity itself\n setField(this.entity, this.fieldName, isEntity(entity) ? (entity.idTaggedMaybe ?? entity) : entity);\n }\n\n get isPreloaded(): boolean {\n return !!this.maybeFindEntity();\n }\n\n preload(): void {\n this.#state = new RRRefState<U, N>(this, this.maybeFindEntity());\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n private unload(): void {\n this.#state = new RRUnloadedState<U, N>(this);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\n }\n\n import(other: ReactiveReferenceImpl<T, U, H, N>, findEntity: (e: U) => U): void {\n this.#state = other.#state.import(this, findEntity);\n this.#isLoaded = true;\n this.#isCached = true;\n }\n\n /** Returns the tagged id of the current value. */\n get idTaggedMaybe(): TaggedId | N {\n ensureNotDeleted(this.entity, \"pending\");\n return maybeResolveReferenceToId(this.current()) as TaggedId | N;\n }\n\n get id(): IdOf<U> {\n return this.idMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idUntagged(): string {\n return this.idUntaggedMaybe || failNoId(this.entity, this.fieldName, this.current());\n }\n\n get idIfSet(): IdOf<U> | N | undefined {\n return this.idMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get idUntaggedIfSet(): string | undefined {\n return this.idUntaggedMaybe || failIfNewEntity(this.entity, this.fieldName, this.current());\n }\n\n get loadHint(): any {\n const meta = getMetadata(this.entity);\n return (meta.config.__data.cachedReactiveLoadHints[this.fieldName] ??= convertToLoadHint(meta, this.reactiveHint));\n }\n\n // private impl\n\n /** Returns the id of the current value. */\n private get idMaybe(): IdOf<U> | undefined {\n ensureNotDeleted(this.entity, \"pending\");\n return toIdOf(this.otherMeta, this.idTaggedMaybe);\n }\n\n private get idUntaggedMaybe(): string | undefined {\n return deTagId(this.otherMeta, this.idMaybe);\n }\n\n setFromOpts(_: U | IdOf<U> | N): void {\n throw new Error(`ReactiveReference ${this.entity}.${this.fieldName} cannot be set via opts`);\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 setField(this.entity, this.fieldName, undefined);\n this.#state = new RRRefState<U, N>(this, undefined as N);\n this.#isLoaded = false;\n this.#isCached = false;\n this.#loadPromise = undefined;\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 | string | 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 get fieldName(): string {\n return this.#fieldName;\n }\n\n public get otherMeta(): EntityMetadata<U> {\n return (getMetadata(this.entity).allFields[this.#fieldName] as ManyToOneField).otherMetadata();\n }\n\n public get hasBeenSet(): boolean {\n return true;\n }\n\n public toString(): string {\n return `ReactiveReference(entity: ${this.entity}, hint: ${this.loadHint}, fieldName: ${this.fieldName}, otherMeta: {\n this.otherMeta.type\n }, id: ${this.id})`;\n }\n\n /**\n * Removes pending-hard-delete (but not soft-deleted), unless explicitly asked for.\n *\n * Note that we leave soft-deleted entities b/c the call signature of a `book.author.get`\n * very likely does not expect a soft-deleted entity to result in `undefined`.\n *\n * (Contrasted with `author.books.get` which is more intuitive to have soft-deleted\n * entities filtered out, i.e. it doesn't fundamentally change the return type.)\n */\n private filterDeleted(entity: U | N, opts?: { withDeleted?: boolean }): U | N {\n if (entity && (!opts || !opts.withDeleted) && entity.isDeletedEntity) {\n return undefined!;\n }\n return entity;\n }\n\n private get isCascadeDelete(): boolean {\n return isCascadeDelete(this, this.#fieldName);\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 | N {\n // Check this.loaded first b/c a new entity won't have an id yet\n if (this.#state.canReturnValue) {\n const loaded = this.#state.doGet();\n if (loaded !== undefined) {\n return loaded;\n }\n }\n const { idTaggedMaybe } = this;\n return idTaggedMaybe !== undefined ? (this.entity.em.getEntity(idTaggedMaybe) as U | N) : (undefined as N);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n [ReferenceN]: N = null!;\n}\n\n/** Type guard utility for determining if an entity field is a ReactiveReference. */\nexport function isReactiveReference(maybeReactiveRef: any): maybeReactiveRef is ReactiveReference<any, any, any> {\n return maybeReactiveRef instanceof ReactiveReferenceImpl;\n}\n\ninterface RRState<U extends Entity, N extends never | undefined> {\n readonly kind: \"unloaded\" | \"ref\" | \"full\";\n readonly canReturnValue: boolean;\n doGet(): U | N | undefined;\n /**\n * Switches from \"materialized ref value\" semantics to \"recalc from reactive graph when available\" semantics.\n *\n * This is synchronous because it does not mean the load hint is fully loaded yet. It only means this\n * reference should now behave as recalc-capable: if `isLoaded(loadHint)` later reports true, `doGet`\n * will recalculate from `fn(...)`; otherwise we keep returning the last known/stale value until `load()`\n * populates the graph.\n */\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N>;\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N>;\n}\n\nclass RRUnloadedState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"unloaded\";\n readonly canReturnValue = false;\n #rr: ReactiveReferenceImpl<any, any, any, any>;\n\n constructor(rr: ReactiveReferenceImpl<any, any, any, any>) {\n this.#rr = rr;\n }\n\n doGet(): U | N | undefined {\n throw new Error(`${this.#rr.entity}.${this.#rr.fieldName} was not loaded`);\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, undefined);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, _findEntity: (e: U) => U): RRState<U, N> {\n return new RRUnloadedState<U, N>(target);\n }\n}\n\nclass RRRefState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"ref\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return new RRFullState<U, N>(target, this.#loaded);\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nclass RRFullState<U extends Entity, N extends never | undefined> implements RRState<U, N> {\n readonly kind = \"full\";\n readonly canReturnValue = true;\n #loaded: U | N | undefined;\n\n constructor(_rr: ReactiveReferenceImpl<any, any, any, any>, loaded: U | N | undefined) {\n this.#loaded = loaded;\n }\n\n doGet(): U | N | undefined {\n return this.#loaded;\n }\n\n enterRecalcMode(_target: ReactiveReferenceImpl<any, any, any, any>): RRFullState<U, N> {\n return this;\n }\n\n import(target: ReactiveReferenceImpl<any, any, any, any>, findEntity: (e: U) => U): RRState<U, N> {\n return new RRRefState<U, N>(target, mapReactiveReferenceEntity(this.#loaded, findEntity));\n }\n}\n\nfunction mapReactiveReferenceEntity<U extends Entity, N extends never | undefined>(\n entity: U | N | undefined,\n findEntity: (e: U) => U,\n): U | N | undefined {\n return isEntity(entity) ? findEntity(entity) : entity;\n}\n"],"mappings":"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"}
@@ -1,18 +1,17 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_relations_Collection = require("./Collection.cjs");
3
- const require_newEntity = require("../newEntity.cjs");
4
3
  const require_relations_AbstractRelationImpl = require("./AbstractRelationImpl.cjs");
5
4
  const require_relations_RelationSymbols = require("./RelationSymbols.cjs");
6
- const require_relations_RecursiveCycleError = require("./RecursiveCycleError.cjs");
7
- const require_relations_Reference = require("./Reference.cjs");
8
- require("../IsLoadedCache.cjs");
9
- const require_relations_OneToOneReference = require("./OneToOneReference.cjs");
10
5
  const require_batchloaders_recursiveChildrenBatchLoader = require("../batchloaders/recursiveChildrenBatchLoader.cjs");
11
6
  const require_batchloaders_recursiveM2mBatchLoader = require("../batchloaders/recursiveM2mBatchLoader.cjs");
12
7
  const require_batchloaders_recursiveParentsBatchLoader = require("../batchloaders/recursiveParentsBatchLoader.cjs");
13
8
  require("./ReadOnlyCollection.cjs");
14
- const require_EntityMetadata = require("../EntityMetadata.cjs");
9
+ const require_relations_RecursiveCycleError = require("./RecursiveCycleError.cjs");
10
+ const require_relations_Reference = require("./Reference.cjs");
11
+ const require_relations_OneToOneReference = require("./OneToOneReference.cjs");
15
12
  const require_utils = require("../utils.cjs");
13
+ const require_newEntity = require("../newEntity.cjs");
14
+ const require_EntityMetadata = require("../EntityMetadata.cjs");
16
15
  const require_index = require("../index.cjs");
17
16
  const require_EntityManager = require("../EntityManager.cjs");
18
17
  //#region src/relations/RecursiveCollection.ts
@@ -1 +1 @@
1
- {"version":3,"file":"RecursiveCollection.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","RelationT","RelationU","#fieldName","#m2oName","#otherFieldName","#loaded","#loadPromise","recursiveParentsBatchLoader","appendStack","RecursiveCycleError","isReference","isLoadedReference","#o2mName","recursiveChildrenBatchLoader","isCollection","isLoadedCollection","isOneToOneReference","isLoadedOneToOneReference","#m2mName","recursiveM2mBatchLoader","fail"],"sources":["../../src/relations/RecursiveCollection.ts"],"sourcesContent":["import { recursiveChildrenBatchLoader } from \"../batchloaders/recursiveChildrenBatchLoader.ts\";\nimport { recursiveM2mBatchLoader } from \"../batchloaders/recursiveM2mBatchLoader.ts\";\nimport { recursiveParentsBatchLoader } from \"../batchloaders/recursiveParentsBatchLoader.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyField,\n type Reference,\n type Relation,\n appendStack,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getMetadata,\n isCollection,\n isLoadedCollection,\n isLoadedOneToOneReference,\n isLoadedReference,\n isOneToOneReference,\n isReference,\n} from \"../index.ts\";\nimport { type IsLoadedCachable } from \"../IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { type ReadOnlyCollection } from \"./ReadOnlyCollection.ts\";\nimport { RecursiveCycleError } from \"./RecursiveCycleError.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport { RecursiveCycleError };\n\n/**\n * An alias for creating `RecursiveParentsCollectionImpl`s.\n *\n * I.e. for `Author.mentor` (m2o fk), we can return `Author.mentorsRecursive` recursively looking up.\n */\nexport function hasRecursiveParents<T extends Entity, U extends Entity>(\n m2oName: keyof T & string, // i.e. `author.mentor`\n otherFieldName: keyof T & string, // i.e. `author.menteesRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveParentsCollectionImpl(entity, fieldName as keyof T & string, m2oName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveChildrenCollectionImpl`s.\n *\n * I.e. for `Author.mentees` (o2m), we can return `Author.menteesRecursive` recursively looking down.\n */\nexport function hasRecursiveChildren<T extends Entity, U extends Entity>(\n o2mName: keyof T & string, // i.e. `author.mentees`\n otherFieldName: keyof T & string, // i.e. `author.mentorsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveChildrenCollectionImpl(entity, fieldName as keyof T & string, o2mName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveM2mCollectionImpl`s.\n *\n * I.e. for `User.parents` (m2m), we can return `User.parentsRecursive` recursively looking up through the m2m.\n * Or for `User.children` (m2m), we can return `User.childrenRecursive` recursively looking down.\n */\nexport function hasRecursiveM2m<T extends Entity, U extends Entity>(\n m2mName: keyof T & string, // i.e. `user.parents` or `user.children`\n otherFieldName: keyof T & string, // i.e. `user.childrenRecursive` or `user.parentsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveM2mCollectionImpl(entity, fieldName as keyof T & string, m2mName, otherFieldName);\n });\n}\n\n/**\n * A base class for the common methods between the parent & children recursive collections.\n *\n * We could probably move some of this into AbstractRelationImpl?\n */\nabstract class AbstractRecursiveCollectionImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<\n T,\n U[]\n> {\n abstract fieldName: string;\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n setFromOpts(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n set(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n cleanupOnEntityDeleted(): Promise<void> {\n return Promise.resolve();\n }\n\n maybeCascadeDelete(): void {}\n\n get meta(): EntityMetadata {\n return getMetadata(this.entity);\n }\n\n abstract doGet(): U[];\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n protected filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n return opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && !(e as any).isSoftDeletedEntity);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\nexport class RecursiveParentsCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2oName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2oName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2oName = m2oName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n // If we have `[grandchild, newlyCreatedParent, existingGrandparent, ...more...]`, skip up to the\n // `existingGrandparent`, because if we `.load(entity)` (i.e. where we are the `grandchild`) then\n // recursiveParentsBatchLoader will try CTE query up from `grandchild[parent]`, but since that will\n // be `newlyCreatedParent`, it doesn't have an id yet.\n const entityToLoad = opts.forceReload ? this.entity : this.findUnloadedReference()?.entity;\n if (entityToLoad && !entityToLoad.isNewEntity) {\n await (this.#loadPromise ??= recursiveParentsBatchLoader(this.entity.em, this)\n .load(entityToLoad)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n // See if there are any WIP changes, i.e. new parents, that the ^ SQL query didn't know to load.\n // We don't have to `while` loop this, because if parent itself has WIP changes above it, then\n // its own `RecursiveParentsCollectionImpl.load` will load it, before returning to this method.\n const unloadedParent = this.findUnloadedReference();\n if (unloadedParent) {\n await recursiveParentsBatchLoader(this.entity.em, this)\n .load(unloadedParent.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n }\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedReference() === undefined;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2oFieldName(): string {\n return this.#m2oName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveParentsCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n const unloaded = this.findUnloadedReference();\n if (unloaded) {\n throw new Error(this.toString() + `.get was called but ${unloaded} was not loaded`);\n }\n const parents: U[] = [];\n const visited = new Set<U>();\n for (\n let current = getLoadedReference(this.entity[this.#m2oName]);\n current !== undefined;\n current = getLoadedReference(current[this.#m2oName])\n ) {\n parents.push(current);\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return parents;\n }\n\n private findUnloadedReference(): Reference<any, any, any> | undefined {\n const visited = new Set<any>();\n for (let current = this.entity; current !== undefined; current = getLoadedReference(current[this.#m2oName])) {\n const relation = current[this.#m2oName];\n if (isReference(relation) && !isLoadedReference(relation)) return relation;\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return undefined;\n }\n}\n\nexport class RecursiveChildrenCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #o2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, o2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#o2mName = o2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveChildrenBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entities own `fooRecursive` collection so that it's marked as loaded.\n // We don't have to `while` loop this, because if they children themselves have any WIP\n // changes, then their own `RecursiveChildrenCollectionImpl.load` will load them.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get o2mFieldName(): string {\n return this.#o2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveChildrenCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const children: U[] = [];\n const visited = new Set<any>();\n // Use a node+path combo to know which path caused the cycle\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n for (const child of getLoadedCollection(relation)) {\n children.push(child);\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n return children;\n }\n\n /** Finds any children/downstream o2m collections or o2o references. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n const unloaded: Relation<any, any>[] = [];\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else if (isOneToOneReference(relation) && !isLoadedOneToOneReference(relation)) {\n unloaded.push(relation);\n } else {\n for (const child of getLoadedCollection(relation)) {\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n }\n return unloaded;\n }\n}\n\nexport class RecursiveM2mCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2mName = m2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveM2mBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entity's own `fooRecursive` collection so that it's marked as loaded.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2mFieldName(): string {\n return this.#m2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get m2mField(): ManyToManyField {\n return this.meta.allFields[this.#m2mName] as ManyToManyField;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveM2mCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const results: U[] = [];\n // Track by entity to handle diamonds (same entity reachable via multiple paths)\n const visited = new Set<any>();\n visited.add(this.entity);\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n for (const other of getLoadedCollection(current[this.#m2mName])) {\n if (visited.has(other)) {\n // If we're reaching an entity we've already visited, and it's this.entity, that's a cycle\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n // Otherwise it's a diamond (reachable via multiple paths) — skip\n continue;\n }\n visited.add(other);\n results.push(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n return results;\n }\n\n /** Finds any m2m collections that are not yet loaded in the recursive tree. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n visited.add(this.entity);\n const unloaded: Relation<any, any>[] = [];\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n const relation = current[this.#m2mName];\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else {\n for (const other of getLoadedCollection(relation)) {\n if (visited.has(other)) {\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n continue;\n }\n visited.add(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n }\n return unloaded;\n }\n}\n\nfunction getLoadedReference(relation: any): any {\n return isLoadedReference(relation) ? relation.get : fail(`${relation} was not loaded`);\n}\n\nfunction getLoadedCollection(relation: any): any {\n return isLoadedCollection(relation)\n ? relation.get\n : isLoadedOneToOneReference(relation)\n ? relation.get\n ? [relation.get]\n : []\n : fail(`${relation} was not loaded`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RecursiveCollection.cjs","names":["lazyField","AbstractRelationImpl","getMetadata","RelationT","RelationU","#fieldName","#m2oName","#otherFieldName","#loaded","#loadPromise","recursiveParentsBatchLoader","appendStack","RecursiveCycleError","isReference","isLoadedReference","#o2mName","recursiveChildrenBatchLoader","isCollection","isLoadedCollection","isOneToOneReference","isLoadedOneToOneReference","#m2mName","recursiveM2mBatchLoader","fail"],"sources":["../../src/relations/RecursiveCollection.ts"],"sourcesContent":["import { recursiveChildrenBatchLoader } from \"../batchloaders/recursiveChildrenBatchLoader.ts\";\nimport { recursiveM2mBatchLoader } from \"../batchloaders/recursiveM2mBatchLoader.ts\";\nimport { recursiveParentsBatchLoader } from \"../batchloaders/recursiveParentsBatchLoader.ts\";\nimport {\n type Entity,\n type EntityMetadata,\n type ManyToManyField,\n type Reference,\n type Relation,\n appendStack,\n ensureNotDeleted,\n fail,\n getEmInternalApi,\n getMetadata,\n isCollection,\n isLoadedCollection,\n isLoadedOneToOneReference,\n isLoadedReference,\n isOneToOneReference,\n isReference,\n} from \"../index.ts\";\nimport type { IsLoadedCachable } from \"../loading/IsLoadedCache.ts\";\nimport { lazyField } from \"../newEntity.ts\";\nimport { AbstractRelationImpl } from \"./AbstractRelationImpl.ts\";\nimport { type ReadOnlyCollection } from \"./ReadOnlyCollection.ts\";\nimport { RecursiveCycleError } from \"./RecursiveCycleError.ts\";\nimport { RelationT, RelationU } from \"./RelationSymbols.ts\";\n\nexport { RecursiveCycleError };\n\n/**\n * An alias for creating `RecursiveParentsCollectionImpl`s.\n *\n * I.e. for `Author.mentor` (m2o fk), we can return `Author.mentorsRecursive` recursively looking up.\n */\nexport function hasRecursiveParents<T extends Entity, U extends Entity>(\n m2oName: keyof T & string, // i.e. `author.mentor`\n otherFieldName: keyof T & string, // i.e. `author.menteesRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveParentsCollectionImpl(entity, fieldName as keyof T & string, m2oName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveChildrenCollectionImpl`s.\n *\n * I.e. for `Author.mentees` (o2m), we can return `Author.menteesRecursive` recursively looking down.\n */\nexport function hasRecursiveChildren<T extends Entity, U extends Entity>(\n o2mName: keyof T & string, // i.e. `author.mentees`\n otherFieldName: keyof T & string, // i.e. `author.mentorsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveChildrenCollectionImpl(entity, fieldName as keyof T & string, o2mName, otherFieldName);\n });\n}\n\n/**\n * An alias for creating `RecursiveM2mCollectionImpl`s.\n *\n * I.e. for `User.parents` (m2m), we can return `User.parentsRecursive` recursively looking up through the m2m.\n * Or for `User.children` (m2m), we can return `User.childrenRecursive` recursively looking down.\n */\nexport function hasRecursiveM2m<T extends Entity, U extends Entity>(\n m2mName: keyof T & string, // i.e. `user.parents` or `user.children`\n otherFieldName: keyof T & string, // i.e. `user.childrenRecursive` or `user.parentsRecursive`\n): ReadOnlyCollection<T, U> {\n return lazyField((entity: T, fieldName) => {\n return new RecursiveM2mCollectionImpl(entity, fieldName as keyof T & string, m2mName, otherFieldName);\n });\n}\n\n/**\n * A base class for the common methods between the parent & children recursive collections.\n *\n * We could probably move some of this into AbstractRelationImpl?\n */\nabstract class AbstractRecursiveCollectionImpl<T extends Entity, U extends Entity> extends AbstractRelationImpl<\n T,\n U[]\n> {\n abstract fieldName: string;\n\n get get(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: false });\n }\n\n get getWithDeleted(): U[] {\n return this.filterDeleted(this.doGet(), { withDeleted: true });\n }\n\n setFromOpts(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n set(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n get isPreloaded(): boolean {\n return false;\n }\n\n preload(): void {\n throw new Error(\"Method not implemented.\");\n }\n\n cleanupOnEntityDeleted(): Promise<void> {\n return Promise.resolve();\n }\n\n maybeCascadeDelete(): void {}\n\n get meta(): EntityMetadata {\n return getMetadata(this.entity);\n }\n\n abstract doGet(): U[];\n\n /** Removes pending-hard-delete or soft-deleted entities, unless explicitly asked for. */\n protected filterDeleted(entities: U[], opts?: { withDeleted?: boolean }): U[] {\n return opts?.withDeleted === true\n ? [...entities]\n : entities.filter((e) => !e.isDeletedEntity && !(e as any).isSoftDeletedEntity);\n }\n\n [RelationT]: T = null!;\n [RelationU]: U = null!;\n}\n\nexport class RecursiveParentsCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2oName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2oName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2oName = m2oName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n // If we have `[grandchild, newlyCreatedParent, existingGrandparent, ...more...]`, skip up to the\n // `existingGrandparent`, because if we `.load(entity)` (i.e. where we are the `grandchild`) then\n // recursiveParentsBatchLoader will try CTE query up from `grandchild[parent]`, but since that will\n // be `newlyCreatedParent`, it doesn't have an id yet.\n const entityToLoad = opts.forceReload ? this.entity : this.findUnloadedReference()?.entity;\n if (entityToLoad && !entityToLoad.isNewEntity) {\n await (this.#loadPromise ??= recursiveParentsBatchLoader(this.entity.em, this)\n .load(entityToLoad)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n // See if there are any WIP changes, i.e. new parents, that the ^ SQL query didn't know to load.\n // We don't have to `while` loop this, because if parent itself has WIP changes above it, then\n // its own `RecursiveParentsCollectionImpl.load` will load it, before returning to this method.\n const unloadedParent = this.findUnloadedReference();\n if (unloadedParent) {\n await recursiveParentsBatchLoader(this.entity.em, this)\n .load(unloadedParent.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n });\n }\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedReference() === undefined;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2oFieldName(): string {\n return this.#m2oName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveParentsCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n const unloaded = this.findUnloadedReference();\n if (unloaded) {\n throw new Error(this.toString() + `.get was called but ${unloaded} was not loaded`);\n }\n const parents: U[] = [];\n const visited = new Set<U>();\n for (\n let current = getLoadedReference(this.entity[this.#m2oName]);\n current !== undefined;\n current = getLoadedReference(current[this.#m2oName])\n ) {\n parents.push(current);\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return parents;\n }\n\n private findUnloadedReference(): Reference<any, any, any> | undefined {\n const visited = new Set<any>();\n for (let current = this.entity; current !== undefined; current = getLoadedReference(current[this.#m2oName])) {\n const relation = current[this.#m2oName];\n if (isReference(relation) && !isLoadedReference(relation)) return relation;\n if (visited.has(current)) throw new RecursiveCycleError(this, [...visited, current]);\n visited.add(current);\n }\n return undefined;\n }\n}\n\nexport class RecursiveChildrenCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #o2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, o2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#o2mName = o2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveChildrenBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entities own `fooRecursive` collection so that it's marked as loaded.\n // We don't have to `while` loop this, because if they children themselves have any WIP\n // changes, then their own `RecursiveChildrenCollectionImpl.load` will load them.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get o2mFieldName(): string {\n return this.#o2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveChildrenCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const children: U[] = [];\n const visited = new Set<any>();\n // Use a node+path combo to know which path caused the cycle\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n for (const child of getLoadedCollection(relation)) {\n children.push(child);\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n return children;\n }\n\n /** Finds any children/downstream o2m collections or o2o references. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n const unloaded: Relation<any, any>[] = [];\n const todo: { relation: any; path: U[] }[] = [{ relation: this.entity[this.#o2mName], path: [this.entity as any] }];\n while (todo.length > 0) {\n const { relation, path } = todo.pop()!;\n if (visited.has(relation)) throw new RecursiveCycleError(this, path);\n visited.add(relation);\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else if (isOneToOneReference(relation) && !isLoadedOneToOneReference(relation)) {\n unloaded.push(relation);\n } else {\n for (const child of getLoadedCollection(relation)) {\n todo.push({ relation: child[this.#o2mName], path: [...path, child] });\n }\n }\n }\n return unloaded;\n }\n}\n\nexport class RecursiveM2mCollectionImpl<T extends Entity, U extends Entity>\n extends AbstractRecursiveCollectionImpl<T, U>\n implements ReadOnlyCollection<T, U>, IsLoadedCachable\n{\n readonly #fieldName: keyof T & string;\n readonly #m2mName: keyof T & string;\n readonly #otherFieldName: keyof T & string;\n #loaded: boolean | undefined = undefined;\n #loadPromise: Promise<void> | undefined;\n\n constructor(entity: T, fieldName: keyof T & string, m2mName: keyof T & string, otherFieldName: keyof T & string) {\n super(entity);\n this.#fieldName = fieldName;\n this.#m2mName = m2mName;\n this.#otherFieldName = otherFieldName;\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.isLoaded || opts.forceReload) {\n if (opts.forceReload) {\n this.#loaded = undefined;\n }\n if (!this.entity.isNewEntity) {\n await (this.#loadPromise ??= recursiveM2mBatchLoader(this.entity.em, this)\n .load(this.entity)\n .catch(function load(err: any) {\n throw appendStack(err, new Error());\n })\n .finally(() => {\n this.#loadPromise = undefined;\n }));\n }\n const unloaded = this.findUnloadedCollections();\n if (unloaded.length > 0) {\n // Go through the entity's own `fooRecursive` collection so that it's marked as loaded.\n await Promise.all(unloaded.map((r) => (r.entity as any)[this.fieldName].load(opts)));\n }\n this.#loaded = true;\n }\n return this.filterDeleted(this.doGet(), opts);\n }\n\n get isLoaded(): boolean {\n if (this.#loaded !== undefined) return this.#loaded;\n this.#loaded = this.findUnloadedCollections().length === 0;\n getEmInternalApi(this.entity.em).isLoadedCache.addNaive(this);\n return this.#loaded;\n }\n\n resetIsLoaded(): void {\n this.#loaded = undefined;\n }\n\n get fieldName(): string {\n return this.#fieldName;\n }\n\n get m2mFieldName(): string {\n return this.#m2mName;\n }\n\n get otherFieldName(): string {\n return this.#otherFieldName;\n }\n\n get m2mField(): ManyToManyField {\n return this.meta.allFields[this.#m2mName] as ManyToManyField;\n }\n\n get hasBeenSet(): boolean {\n return false;\n }\n\n toString(): string {\n return `RecursiveM2mCollectionImpl(entity: ${this.entity}, fieldName: ${this.fieldName})`;\n }\n\n doGet(): U[] {\n ensureNotDeleted(this.entity, \"pending\");\n if (!this.isLoaded) {\n throw new Error(this.toString() + `.get was called but when not loaded`);\n }\n const results: U[] = [];\n // Track by entity to handle diamonds (same entity reachable via multiple paths)\n const visited = new Set<any>();\n visited.add(this.entity);\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n for (const other of getLoadedCollection(current[this.#m2mName])) {\n if (visited.has(other)) {\n // If we're reaching an entity we've already visited, and it's this.entity, that's a cycle\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n // Otherwise it's a diamond (reachable via multiple paths) — skip\n continue;\n }\n visited.add(other);\n results.push(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n return results;\n }\n\n /** Finds any m2m collections that are not yet loaded in the recursive tree. */\n private findUnloadedCollections(): Relation<any, any>[] {\n const visited = new Set<any>();\n visited.add(this.entity);\n const unloaded: Relation<any, any>[] = [];\n const todo: { entity: any; path: U[] }[] = [{ entity: this.entity, path: [this.entity as any] }];\n while (todo.length > 0) {\n const { entity: current, path } = todo.pop()!;\n const relation = current[this.#m2mName];\n if (isCollection(relation) && !isLoadedCollection(relation)) {\n unloaded.push(relation);\n } else {\n for (const other of getLoadedCollection(relation)) {\n if (visited.has(other)) {\n if (other === this.entity) throw new RecursiveCycleError(this, [...path, other]);\n continue;\n }\n visited.add(other);\n todo.push({ entity: other, path: [...path, other] });\n }\n }\n }\n return unloaded;\n }\n}\n\nfunction getLoadedReference(relation: any): any {\n return isLoadedReference(relation) ? relation.get : fail(`${relation} was not loaded`);\n}\n\nfunction getLoadedCollection(relation: any): any {\n return isLoadedCollection(relation)\n ? relation.get\n : isLoadedOneToOneReference(relation)\n ? relation.get\n ? [relation.get]\n : []\n : fail(`${relation} was not loaded`);\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { AbstractRelationImpl } from "./AbstractRelationImpl.cjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.cjs";
3
- import { IsLoadedCachable } from "../IsLoadedCache.cjs";
3
+ import { IsLoadedCachable } from "../loading/IsLoadedCache.cjs";
4
4
  import { ReadOnlyCollection } from "./ReadOnlyCollection.cjs";
5
5
  import { RecursiveCycleError } from "./RecursiveCycleError.cjs";
6
6
  import { EntityMetadata, ManyToManyField } from "../EntityMetadata.cjs";
@@ -1,6 +1,6 @@
1
1
  import { AbstractRelationImpl } from "./AbstractRelationImpl.mjs";
2
2
  import { RelationT, RelationU } from "./RelationSymbols.mjs";
3
- import { IsLoadedCachable } from "../IsLoadedCache.mjs";
3
+ import { IsLoadedCachable } from "../loading/IsLoadedCache.mjs";
4
4
  import { ReadOnlyCollection } from "./ReadOnlyCollection.mjs";
5
5
  import { RecursiveCycleError } from "./RecursiveCycleError.mjs";
6
6
  import { EntityMetadata, ManyToManyField } from "../EntityMetadata.mjs";
@@ -1,17 +1,16 @@
1
1
  import { isCollection, isLoadedCollection } from "./Collection.js";
2
- import { lazyField } from "../newEntity.js";
3
2
  import { AbstractRelationImpl } from "./AbstractRelationImpl.js";
4
3
  import { RelationT, RelationU } from "./RelationSymbols.js";
5
- import { RecursiveCycleError } from "./RecursiveCycleError.js";
6
- import { isLoadedReference, isReference } from "./Reference.js";
7
- import "../IsLoadedCache.js";
8
- import { isLoadedOneToOneReference, isOneToOneReference } from "./OneToOneReference.js";
9
4
  import { recursiveChildrenBatchLoader } from "../batchloaders/recursiveChildrenBatchLoader.js";
10
5
  import { recursiveM2mBatchLoader } from "../batchloaders/recursiveM2mBatchLoader.js";
11
6
  import { recursiveParentsBatchLoader } from "../batchloaders/recursiveParentsBatchLoader.js";
12
7
  import "./ReadOnlyCollection.js";
13
- import { getMetadata } from "../EntityMetadata.js";
8
+ import { RecursiveCycleError } from "./RecursiveCycleError.js";
9
+ import { isLoadedReference, isReference } from "./Reference.js";
10
+ import { isLoadedOneToOneReference, isOneToOneReference } from "./OneToOneReference.js";
14
11
  import { fail } from "../utils.js";
12
+ import { lazyField } from "../newEntity.js";
13
+ import { getMetadata } from "../EntityMetadata.js";
15
14
  import { ensureNotDeleted } from "../index.js";
16
15
  import { appendStack, getEmInternalApi } from "../EntityManager.js";
17
16
  //#region src/relations/RecursiveCollection.ts