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

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 (687) hide show
  1. package/build/EntityManager.cjs +36 -39
  2. package/build/EntityManager.cjs.map +1 -1
  3. package/build/EntityManager.d.cts +4 -4
  4. package/build/EntityManager.d.mts +4 -4
  5. package/build/EntityManager.js +29 -32
  6. package/build/EntityManager.js.map +1 -1
  7. package/build/EntityMetadata.cjs +3 -3
  8. package/build/EntityMetadata.js +3 -3
  9. package/build/IndexManager.cjs +1 -1
  10. package/build/IndexManager.js +1 -1
  11. package/build/InstanceData.cjs +1 -1
  12. package/build/InstanceData.js +1 -1
  13. package/build/JoinRows.cjs +1 -1
  14. package/build/JoinRows.js +1 -1
  15. package/build/PluginManager.cjs +0 -1
  16. package/build/PluginManager.cjs.map +1 -1
  17. package/build/PluginManager.d.cts +1 -1
  18. package/build/PluginManager.d.mts +1 -1
  19. package/build/PluginManager.js +0 -1
  20. package/build/PluginManager.js.map +1 -1
  21. package/build/ReactionsManager.cjs +2 -2
  22. package/build/ReactionsManager.js +2 -2
  23. package/build/Todo.cjs +1 -1
  24. package/build/Todo.js +1 -1
  25. package/build/batchloaders/enumCollectionBatchLoader.cjs +1 -1
  26. package/build/batchloaders/enumCollectionBatchLoader.js +1 -1
  27. package/build/batchloaders/loadBatchLoader.cjs +6 -5
  28. package/build/batchloaders/loadBatchLoader.cjs.map +1 -1
  29. package/build/batchloaders/loadBatchLoader.d.cts.map +1 -1
  30. package/build/batchloaders/loadBatchLoader.d.mts.map +1 -1
  31. package/build/batchloaders/loadBatchLoader.js +4 -3
  32. package/build/batchloaders/loadBatchLoader.js.map +1 -1
  33. package/build/batchloaders/manyToManyBatchLoader.cjs +1 -1
  34. package/build/batchloaders/manyToManyBatchLoader.js +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 +4 -4
  39. package/build/batchloaders/oneToOneBatchLoader.cjs.map +1 -1
  40. package/build/batchloaders/oneToOneBatchLoader.js +3 -3
  41. package/build/batchloaders/populateBatchLoader.cjs +11 -11
  42. package/build/batchloaders/populateBatchLoader.cjs.map +1 -1
  43. package/build/batchloaders/populateBatchLoader.js +8 -8
  44. package/build/batchloaders/recursiveChildrenBatchLoader.cjs +8 -8
  45. package/build/batchloaders/recursiveChildrenBatchLoader.cjs.map +1 -1
  46. package/build/batchloaders/recursiveChildrenBatchLoader.js +5 -5
  47. package/build/batchloaders/recursiveM2mBatchLoader.cjs +5 -5
  48. package/build/batchloaders/recursiveM2mBatchLoader.cjs.map +1 -1
  49. package/build/batchloaders/recursiveM2mBatchLoader.js +2 -2
  50. package/build/batchloaders/recursiveParentsBatchLoader.cjs +8 -8
  51. package/build/batchloaders/recursiveParentsBatchLoader.cjs.map +1 -1
  52. package/build/batchloaders/recursiveParentsBatchLoader.js +5 -5
  53. package/build/changes.cjs +4 -4
  54. package/build/changes.js +4 -4
  55. package/build/config.cjs +3 -3
  56. package/build/config.js +3 -3
  57. package/build/configure.cjs +6 -6
  58. package/build/configure.js +6 -6
  59. package/build/dataloaders/fastWhereFilterHash.cjs +3 -3
  60. package/build/dataloaders/fastWhereFilterHash.cjs.map +1 -1
  61. package/build/dataloaders/fastWhereFilterHash.js +2 -2
  62. package/build/dataloaders/fastWhereFilterHash.js.map +1 -1
  63. package/build/dataloaders/findByUniqueDataLoader.cjs +5 -6
  64. package/build/dataloaders/findByUniqueDataLoader.cjs.map +1 -1
  65. package/build/dataloaders/findByUniqueDataLoader.d.cts.map +1 -1
  66. package/build/dataloaders/findByUniqueDataLoader.d.mts.map +1 -1
  67. package/build/dataloaders/findByUniqueDataLoader.js +3 -4
  68. package/build/dataloaders/findByUniqueDataLoader.js.map +1 -1
  69. package/build/dataloaders/findCountDataLoader.cjs +10 -13
  70. package/build/dataloaders/findCountDataLoader.cjs.map +1 -1
  71. package/build/dataloaders/findCountDataLoader.d.cts +2 -2
  72. package/build/dataloaders/findCountDataLoader.d.mts +2 -2
  73. package/build/dataloaders/findCountDataLoader.js +4 -7
  74. package/build/dataloaders/findCountDataLoader.js.map +1 -1
  75. package/build/dataloaders/findDataLoader.cjs +15 -19
  76. package/build/dataloaders/findDataLoader.cjs.map +1 -1
  77. package/build/dataloaders/findDataLoader.d.cts +2 -2
  78. package/build/dataloaders/findDataLoader.d.cts.map +1 -1
  79. package/build/dataloaders/findDataLoader.d.mts +2 -2
  80. package/build/dataloaders/findDataLoader.d.mts.map +1 -1
  81. package/build/dataloaders/findDataLoader.js +5 -9
  82. package/build/dataloaders/findDataLoader.js.map +1 -1
  83. package/build/dataloaders/findIdsDataLoader.cjs +6 -9
  84. package/build/dataloaders/findIdsDataLoader.cjs.map +1 -1
  85. package/build/dataloaders/findIdsDataLoader.d.cts +1 -1
  86. package/build/dataloaders/findIdsDataLoader.d.mts +1 -1
  87. package/build/dataloaders/findIdsDataLoader.js +3 -6
  88. package/build/dataloaders/findIdsDataLoader.js.map +1 -1
  89. package/build/dataloaders/findOrCreateDataLoader.cjs +1 -2
  90. package/build/dataloaders/findOrCreateDataLoader.cjs.map +1 -1
  91. package/build/dataloaders/findOrCreateDataLoader.js +1 -2
  92. package/build/dataloaders/findOrCreateDataLoader.js.map +1 -1
  93. package/build/dataloaders/findPaginatedDataLoader.cjs +3 -6
  94. package/build/dataloaders/findPaginatedDataLoader.cjs.map +1 -1
  95. package/build/dataloaders/findPaginatedDataLoader.d.cts +1 -1
  96. package/build/dataloaders/findPaginatedDataLoader.d.mts +1 -1
  97. package/build/dataloaders/findPaginatedDataLoader.js +2 -5
  98. package/build/dataloaders/findPaginatedDataLoader.js.map +1 -1
  99. package/build/dataloaders/lensDataLoader.cjs +4 -4
  100. package/build/dataloaders/lensDataLoader.cjs.map +1 -1
  101. package/build/dataloaders/lensDataLoader.js +2 -2
  102. package/build/dataloaders/lensDataLoader.js.map +1 -1
  103. package/build/dataloaders/manyToManyFindDataLoader.cjs +1 -4
  104. package/build/dataloaders/manyToManyFindDataLoader.cjs.map +1 -1
  105. package/build/dataloaders/manyToManyFindDataLoader.d.cts +0 -1
  106. package/build/dataloaders/manyToManyFindDataLoader.d.cts.map +1 -1
  107. package/build/dataloaders/manyToManyFindDataLoader.d.mts +0 -1
  108. package/build/dataloaders/manyToManyFindDataLoader.d.mts.map +1 -1
  109. package/build/dataloaders/manyToManyFindDataLoader.js +1 -4
  110. package/build/dataloaders/manyToManyFindDataLoader.js.map +1 -1
  111. package/build/dataloaders/oneToManyFindDataLoader.cjs +3 -6
  112. package/build/dataloaders/oneToManyFindDataLoader.cjs.map +1 -1
  113. package/build/dataloaders/oneToManyFindDataLoader.d.cts +0 -1
  114. package/build/dataloaders/oneToManyFindDataLoader.d.cts.map +1 -1
  115. package/build/dataloaders/oneToManyFindDataLoader.d.mts +0 -1
  116. package/build/dataloaders/oneToManyFindDataLoader.d.mts.map +1 -1
  117. package/build/dataloaders/oneToManyFindDataLoader.js +2 -5
  118. package/build/dataloaders/oneToManyFindDataLoader.js.map +1 -1
  119. package/build/defaults.cjs +4 -4
  120. package/build/defaults.js +4 -4
  121. package/build/driverApi.cjs +4 -5
  122. package/build/driverApi.cjs.map +1 -1
  123. package/build/driverApi.d.cts +1 -1
  124. package/build/driverApi.d.mts +1 -1
  125. package/build/driverApi.js +2 -2
  126. package/build/driverApi.js.map +1 -1
  127. package/build/drivers/Driver.cjs +0 -1
  128. package/build/drivers/Driver.d.cts +1 -1
  129. package/build/drivers/Driver.d.mts +1 -1
  130. package/build/drivers/Driver.js +0 -1
  131. package/build/drivers/EntityWriter.cjs +2 -2
  132. package/build/drivers/EntityWriter.js +2 -2
  133. package/build/drivers/index.cjs +0 -6
  134. package/build/drivers/index.d.cts +1 -3
  135. package/build/drivers/index.d.mts +1 -3
  136. package/build/drivers/index.js +1 -3
  137. package/build/fieldSerde.cjs +2 -2
  138. package/build/fieldSerde.js +2 -2
  139. package/build/fields.cjs +2 -2
  140. package/build/fields.js +2 -2
  141. package/build/getProperties.cjs +1 -1
  142. package/build/getProperties.js +1 -1
  143. package/build/index.cjs +109 -107
  144. package/build/index.cjs.map +1 -1
  145. package/build/index.d.cts +27 -24
  146. package/build/index.d.cts.map +1 -1
  147. package/build/index.d.mts +27 -24
  148. package/build/index.d.mts.map +1 -1
  149. package/build/index.js +51 -49
  150. package/build/index.js.map +1 -1
  151. package/build/json.cjs +3 -3
  152. package/build/json.js +3 -3
  153. package/build/keys.cjs +1 -1
  154. package/build/keys.js +1 -1
  155. package/build/loadHints.cjs +1 -1
  156. package/build/loadHints.js +1 -1
  157. package/build/loadLens.cjs +1 -1
  158. package/build/loadLens.js +1 -1
  159. package/build/logging/FactoryLogger.cjs +1 -1
  160. package/build/logging/FactoryLogger.js +1 -1
  161. package/build/logging/FieldLogger.cjs +1 -1
  162. package/build/logging/FieldLogger.js +1 -1
  163. package/build/logging/ReactionLogger.cjs +1 -1
  164. package/build/logging/ReactionLogger.js +1 -1
  165. package/build/newEntity.cjs +1 -1
  166. package/build/newEntity.js +1 -1
  167. package/build/newTestInstance.cjs +3 -3
  168. package/build/newTestInstance.js +3 -3
  169. package/build/plugins/PreloadPlugin.cjs +1 -2
  170. package/build/plugins/PreloadPlugin.d.cts +1 -1
  171. package/build/plugins/PreloadPlugin.d.mts +1 -1
  172. package/build/plugins/PreloadPlugin.js +1 -2
  173. package/build/preloading/JsonAggregatePreloader.cjs +31 -31
  174. package/build/preloading/JsonAggregatePreloader.cjs.map +1 -1
  175. package/build/preloading/JsonAggregatePreloader.d.cts +1 -1
  176. package/build/preloading/JsonAggregatePreloader.d.mts +1 -1
  177. package/build/preloading/JsonAggregatePreloader.js +6 -6
  178. package/build/preloading/JsonAggregatePreloader.js.map +1 -1
  179. package/build/preloading/partitionHint.cjs +3 -3
  180. package/build/preloading/partitionHint.js +3 -3
  181. package/build/{ConditionBuilder.cjs → queries/ConditionBuilder.cjs} +7 -8
  182. package/build/queries/ConditionBuilder.cjs.map +1 -0
  183. package/build/{ConditionBuilder.d.cts → queries/ConditionBuilder.d.cts} +3 -3
  184. package/build/queries/ConditionBuilder.d.cts.map +1 -0
  185. package/build/{ConditionBuilder.d.mts → queries/ConditionBuilder.d.mts} +3 -3
  186. package/build/queries/ConditionBuilder.d.mts.map +1 -0
  187. package/build/{ConditionBuilder.js → queries/ConditionBuilder.js} +4 -5
  188. package/build/queries/ConditionBuilder.js.map +1 -0
  189. package/build/{conditions.cjs → queries/conditions.cjs} +1 -2
  190. package/build/queries/conditions.cjs.map +1 -0
  191. package/build/{conditions.d.cts → queries/conditions.d.cts} +2 -2
  192. package/build/queries/conditions.d.cts.map +1 -0
  193. package/build/{conditions.d.mts → queries/conditions.d.mts} +2 -2
  194. package/build/queries/conditions.d.mts.map +1 -0
  195. package/build/{conditions.js → queries/conditions.js} +1 -2
  196. package/build/queries/conditions.js.map +1 -0
  197. package/build/queries/entityQueryUtils.cjs +60 -0
  198. package/build/queries/entityQueryUtils.cjs.map +1 -0
  199. package/build/queries/entityQueryUtils.d.cts +19 -0
  200. package/build/queries/entityQueryUtils.d.cts.map +1 -0
  201. package/build/queries/entityQueryUtils.d.mts +19 -0
  202. package/build/queries/entityQueryUtils.d.mts.map +1 -0
  203. package/build/queries/entityQueryUtils.js +56 -0
  204. package/build/queries/entityQueryUtils.js.map +1 -0
  205. package/build/{Aliases.cjs → queries/find/Aliases.cjs} +23 -28
  206. package/build/queries/find/Aliases.cjs.map +1 -0
  207. package/build/{Aliases.d.cts → queries/find/Aliases.d.cts} +7 -7
  208. package/build/queries/find/Aliases.d.cts.map +1 -0
  209. package/build/{Aliases.d.mts → queries/find/Aliases.d.mts} +7 -7
  210. package/build/queries/find/Aliases.d.mts.map +1 -0
  211. package/build/{Aliases.js → queries/find/Aliases.js} +7 -12
  212. package/build/queries/find/Aliases.js.map +1 -0
  213. package/build/{DeferredAlias.cjs → queries/find/DeferredAlias.cjs} +3 -6
  214. package/build/queries/find/DeferredAlias.cjs.map +1 -0
  215. package/build/{DeferredAlias.d.cts → queries/find/DeferredAlias.d.cts} +4 -4
  216. package/build/queries/find/DeferredAlias.d.cts.map +1 -0
  217. package/build/{DeferredAlias.d.mts → queries/find/DeferredAlias.d.mts} +4 -4
  218. package/build/queries/find/DeferredAlias.d.mts.map +1 -0
  219. package/build/{DeferredAlias.js → queries/find/DeferredAlias.js} +2 -5
  220. package/build/queries/find/DeferredAlias.js.map +1 -0
  221. package/build/{EntityFilter.cjs → queries/find/EntityFilter.cjs} +4 -9
  222. package/build/queries/find/EntityFilter.cjs.map +1 -0
  223. package/build/{EntityFilter.d.cts → queries/find/EntityFilter.d.cts} +6 -6
  224. package/build/queries/find/EntityFilter.d.cts.map +1 -0
  225. package/build/{EntityFilter.d.mts → queries/find/EntityFilter.d.mts} +6 -6
  226. package/build/queries/find/EntityFilter.d.mts.map +1 -0
  227. package/build/{EntityFilter.js → queries/find/EntityFilter.js} +1 -6
  228. package/build/queries/find/EntityFilter.js.map +1 -0
  229. package/build/{EntityGraphQLFilter.cjs → queries/find/EntityGraphQLFilter.cjs} +1 -5
  230. package/build/queries/find/EntityGraphQLFilter.cjs.map +1 -0
  231. package/build/{EntityGraphQLFilter.d.cts → queries/find/EntityGraphQLFilter.d.cts} +3 -3
  232. package/build/queries/find/EntityGraphQLFilter.d.cts.map +1 -0
  233. package/build/{EntityGraphQLFilter.d.mts → queries/find/EntityGraphQLFilter.d.mts} +3 -3
  234. package/build/queries/find/EntityGraphQLFilter.d.mts.map +1 -0
  235. package/build/{EntityGraphQLFilter.js → queries/find/EntityGraphQLFilter.js} +1 -5
  236. package/build/queries/find/EntityGraphQLFilter.js.map +1 -0
  237. package/build/{QueryParser.cjs → queries/find/QueryParser.cjs} +68 -356
  238. package/build/queries/find/QueryParser.cjs.map +1 -0
  239. package/build/{QueryParser.collectionJoins.cjs → queries/find/QueryParser.collectionJoins.cjs} +8 -8
  240. package/build/queries/find/QueryParser.collectionJoins.cjs.map +1 -0
  241. package/build/{QueryParser.collectionJoins.d.cts → queries/find/QueryParser.collectionJoins.d.cts} +1 -1
  242. package/build/queries/find/QueryParser.collectionJoins.d.cts.map +1 -0
  243. package/build/{QueryParser.collectionJoins.d.mts → queries/find/QueryParser.collectionJoins.d.mts} +1 -1
  244. package/build/queries/find/QueryParser.collectionJoins.d.mts.map +1 -0
  245. package/build/{QueryParser.collectionJoins.js → queries/find/QueryParser.collectionJoins.js} +2 -2
  246. package/build/queries/find/QueryParser.collectionJoins.js.map +1 -0
  247. package/build/{QueryParser.d.cts → queries/find/QueryParser.d.cts} +5 -159
  248. package/build/queries/find/QueryParser.d.cts.map +1 -0
  249. package/build/{QueryParser.d.mts → queries/find/QueryParser.d.mts} +5 -159
  250. package/build/queries/find/QueryParser.d.mts.map +1 -0
  251. package/build/{QueryParser.js → queries/find/QueryParser.js} +15 -295
  252. package/build/queries/find/QueryParser.js.map +1 -0
  253. package/build/{QueryParser.pruning.cjs → queries/find/QueryParser.pruning.cjs} +6 -20
  254. package/build/queries/find/QueryParser.pruning.cjs.map +1 -0
  255. package/build/queries/find/QueryParser.pruning.d.cts +8 -0
  256. package/build/queries/find/QueryParser.pruning.d.cts.map +1 -0
  257. package/build/queries/find/QueryParser.pruning.d.mts +8 -0
  258. package/build/queries/find/QueryParser.pruning.d.mts.map +1 -0
  259. package/build/{QueryParser.pruning.js → queries/find/QueryParser.pruning.js} +4 -17
  260. package/build/queries/find/QueryParser.pruning.js.map +1 -0
  261. package/build/{QueryVisitor.cjs → queries/find/QueryVisitor.cjs} +2 -3
  262. package/build/queries/find/QueryVisitor.cjs.map +1 -0
  263. package/build/{QueryVisitor.d.cts → queries/find/QueryVisitor.d.cts} +3 -2
  264. package/build/queries/find/QueryVisitor.d.cts.map +1 -0
  265. package/build/{QueryVisitor.d.mts → queries/find/QueryVisitor.d.mts} +3 -2
  266. package/build/queries/find/QueryVisitor.d.mts.map +1 -0
  267. package/build/{QueryVisitor.js → queries/find/QueryVisitor.js} +2 -3
  268. package/build/queries/find/QueryVisitor.js.map +1 -0
  269. package/build/{drivers/buildRawQuery.cjs → queries/find/buildFindQuery.cjs} +14 -15
  270. package/build/queries/find/buildFindQuery.cjs.map +1 -0
  271. package/build/{drivers/buildRawQuery.d.cts → queries/find/buildFindQuery.d.cts} +3 -3
  272. package/build/queries/find/buildFindQuery.d.cts.map +1 -0
  273. package/build/{drivers/buildRawQuery.d.mts → queries/find/buildFindQuery.d.mts} +3 -3
  274. package/build/queries/find/buildFindQuery.d.mts.map +1 -0
  275. package/build/{drivers/buildRawQuery.js → queries/find/buildFindQuery.js} +5 -6
  276. package/build/queries/find/buildFindQuery.js.map +1 -0
  277. package/build/{scopes.cjs → queries/find/scopes.cjs} +2 -3
  278. package/build/queries/find/scopes.cjs.map +1 -0
  279. package/build/{scopes.d.cts → queries/find/scopes.d.cts} +6 -6
  280. package/build/queries/find/scopes.d.cts.map +1 -0
  281. package/build/{scopes.d.mts → queries/find/scopes.d.mts} +6 -6
  282. package/build/queries/find/scopes.d.mts.map +1 -0
  283. package/build/{scopes.js → queries/find/scopes.js} +2 -3
  284. package/build/queries/find/scopes.js.map +1 -0
  285. package/build/queries/parsedConditions.cjs +21 -0
  286. package/build/queries/parsedConditions.cjs.map +1 -0
  287. package/build/queries/parsedConditions.d.cts +127 -0
  288. package/build/queries/parsedConditions.d.cts.map +1 -0
  289. package/build/queries/parsedConditions.d.mts +127 -0
  290. package/build/queries/parsedConditions.d.mts.map +1 -0
  291. package/build/queries/parsedConditions.js +20 -0
  292. package/build/queries/parsedConditions.js.map +1 -0
  293. package/build/{drivers/buildUtils.cjs → queries/renderConditions.cjs} +7 -8
  294. package/build/queries/renderConditions.cjs.map +1 -0
  295. package/build/{drivers/buildUtils.d.mts → queries/renderConditions.d.cts} +5 -4
  296. package/build/queries/renderConditions.d.cts.map +1 -0
  297. package/build/{drivers/buildUtils.d.cts → queries/renderConditions.d.mts} +5 -4
  298. package/build/queries/renderConditions.d.mts.map +1 -0
  299. package/build/{drivers/buildUtils.js → queries/renderConditions.js} +4 -5
  300. package/build/queries/renderConditions.js.map +1 -0
  301. package/build/{skipCondition.cjs → queries/skipCondition.cjs} +1 -2
  302. package/build/queries/skipCondition.cjs.map +1 -0
  303. package/build/{skipCondition.d.cts → queries/skipCondition.d.cts} +2 -2
  304. package/build/{skipCondition.d.cts.map → queries/skipCondition.d.cts.map} +1 -1
  305. package/build/{skipCondition.d.mts → queries/skipCondition.d.mts} +2 -2
  306. package/build/{skipCondition.d.mts.map → queries/skipCondition.d.mts.map} +1 -1
  307. package/build/{skipCondition.js → queries/skipCondition.js} +1 -2
  308. package/build/queries/skipCondition.js.map +1 -0
  309. package/build/{AliasAssigner.cjs → queries/sql/AliasAssigner.cjs} +2 -3
  310. package/build/queries/sql/AliasAssigner.cjs.map +1 -0
  311. package/build/{AliasAssigner.d.cts → queries/sql/AliasAssigner.d.cts} +2 -2
  312. package/build/queries/sql/AliasAssigner.d.cts.map +1 -0
  313. package/build/{AliasAssigner.d.mts → queries/sql/AliasAssigner.d.mts} +2 -2
  314. package/build/queries/sql/AliasAssigner.d.mts.map +1 -0
  315. package/build/{AliasAssigner.js → queries/sql/AliasAssigner.js} +2 -3
  316. package/build/queries/sql/AliasAssigner.js.map +1 -0
  317. package/build/{Expr.cjs → queries/sql/Expr.cjs} +9 -9
  318. package/build/queries/sql/Expr.cjs.map +1 -0
  319. package/build/{Expr.d.cts → queries/sql/Expr.d.cts} +4 -4
  320. package/build/queries/sql/Expr.d.cts.map +1 -0
  321. package/build/{Expr.d.mts → queries/sql/Expr.d.mts} +4 -4
  322. package/build/queries/sql/Expr.d.mts.map +1 -0
  323. package/build/{Expr.js → queries/sql/Expr.js} +4 -4
  324. package/build/queries/sql/Expr.js.map +1 -0
  325. package/build/{Tables.cjs → queries/sql/Tables.cjs} +63 -67
  326. package/build/queries/sql/Tables.cjs.map +1 -0
  327. package/build/{Tables.d.cts → queries/sql/Tables.d.cts} +6 -7
  328. package/build/queries/sql/Tables.d.cts.map +1 -0
  329. package/build/{Tables.d.mts → queries/sql/Tables.d.mts} +6 -7
  330. package/build/queries/sql/Tables.d.mts.map +1 -0
  331. package/build/{Tables.js → queries/sql/Tables.js} +9 -13
  332. package/build/queries/sql/Tables.js.map +1 -0
  333. package/build/{execute.cjs → queries/sql/execute.cjs} +32 -37
  334. package/build/queries/sql/execute.cjs.map +1 -0
  335. package/build/{execute.d.cts → queries/sql/execute.d.cts} +6 -6
  336. package/build/queries/sql/execute.d.cts.map +1 -0
  337. package/build/{execute.d.mts → queries/sql/execute.d.mts} +6 -6
  338. package/build/queries/sql/execute.d.mts.map +1 -0
  339. package/build/{execute.js → queries/sql/execute.js} +5 -10
  340. package/build/queries/sql/execute.js.map +1 -0
  341. package/build/{expressions → queries/sql/expressions}/arrayAgg.cjs +12 -12
  342. package/build/queries/sql/expressions/arrayAgg.cjs.map +1 -0
  343. package/build/{expressions → queries/sql/expressions}/arrayAgg.d.cts +1 -1
  344. package/build/queries/sql/expressions/arrayAgg.d.cts.map +1 -0
  345. package/build/{expressions → queries/sql/expressions}/arrayAgg.d.mts +1 -1
  346. package/build/queries/sql/expressions/arrayAgg.d.mts.map +1 -0
  347. package/build/{expressions → queries/sql/expressions}/arrayAgg.js +1 -1
  348. package/build/queries/sql/expressions/arrayAgg.js.map +1 -0
  349. package/build/{expressions → queries/sql/expressions}/case.cjs +14 -14
  350. package/build/queries/sql/expressions/case.cjs.map +1 -0
  351. package/build/{expressions → queries/sql/expressions}/case.d.cts +1 -1
  352. package/build/queries/sql/expressions/case.d.cts.map +1 -0
  353. package/build/{expressions → queries/sql/expressions}/case.d.mts +1 -1
  354. package/build/queries/sql/expressions/case.d.mts.map +1 -0
  355. package/build/{expressions → queries/sql/expressions}/case.js +1 -1
  356. package/build/queries/sql/expressions/case.js.map +1 -0
  357. package/build/queries/sql/expressions/coalesce.cjs +25 -0
  358. package/build/queries/sql/expressions/coalesce.cjs.map +1 -0
  359. package/build/{expressions → queries/sql/expressions}/coalesce.d.cts +1 -1
  360. package/build/queries/sql/expressions/coalesce.d.cts.map +1 -0
  361. package/build/{expressions → queries/sql/expressions}/coalesce.d.mts +1 -1
  362. package/build/queries/sql/expressions/coalesce.d.mts.map +1 -0
  363. package/build/{expressions → queries/sql/expressions}/coalesce.js +1 -1
  364. package/build/queries/sql/expressions/coalesce.js.map +1 -0
  365. package/build/{expressions → queries/sql/expressions}/codecs.cjs +5 -5
  366. package/build/queries/sql/expressions/codecs.cjs.map +1 -0
  367. package/build/{expressions → queries/sql/expressions}/codecs.d.cts +1 -1
  368. package/build/queries/sql/expressions/codecs.d.cts.map +1 -0
  369. package/build/{expressions → queries/sql/expressions}/codecs.d.mts +1 -1
  370. package/build/queries/sql/expressions/codecs.d.mts.map +1 -0
  371. package/build/{expressions → queries/sql/expressions}/codecs.js +3 -3
  372. package/build/queries/sql/expressions/codecs.js.map +1 -0
  373. package/build/queries/sql/expressions/expression.cjs +102 -0
  374. package/build/queries/sql/expressions/expression.cjs.map +1 -0
  375. package/build/{expressions → queries/sql/expressions}/expression.d.cts +1 -1
  376. package/build/queries/sql/expressions/expression.d.cts.map +1 -0
  377. package/build/{expressions → queries/sql/expressions}/expression.d.mts +1 -1
  378. package/build/queries/sql/expressions/expression.d.mts.map +1 -0
  379. package/build/{expressions → queries/sql/expressions}/expression.js +2 -2
  380. package/build/queries/sql/expressions/expression.js.map +1 -0
  381. package/build/queries/sql/expressions/greatest.cjs +25 -0
  382. package/build/queries/sql/expressions/greatest.cjs.map +1 -0
  383. package/build/{expressions → queries/sql/expressions}/greatest.d.cts +1 -1
  384. package/build/queries/sql/expressions/greatest.d.cts.map +1 -0
  385. package/build/{expressions → queries/sql/expressions}/greatest.d.mts +1 -1
  386. package/build/queries/sql/expressions/greatest.d.mts.map +1 -0
  387. package/build/{expressions → queries/sql/expressions}/greatest.js +1 -1
  388. package/build/queries/sql/expressions/greatest.js.map +1 -0
  389. package/build/queries/sql/expressions/least.cjs +25 -0
  390. package/build/queries/sql/expressions/least.cjs.map +1 -0
  391. package/build/{expressions → queries/sql/expressions}/least.d.cts +1 -1
  392. package/build/queries/sql/expressions/least.d.cts.map +1 -0
  393. package/build/{expressions → queries/sql/expressions}/least.d.mts +1 -1
  394. package/build/queries/sql/expressions/least.d.mts.map +1 -0
  395. package/build/{expressions → queries/sql/expressions}/least.js +1 -1
  396. package/build/queries/sql/expressions/least.js.map +1 -0
  397. package/build/{expressions → queries/sql/expressions}/nullIf.cjs +6 -6
  398. package/build/queries/sql/expressions/nullIf.cjs.map +1 -0
  399. package/build/{expressions → queries/sql/expressions}/nullIf.d.cts +1 -1
  400. package/build/queries/sql/expressions/nullIf.d.cts.map +1 -0
  401. package/build/{expressions → queries/sql/expressions}/nullIf.d.mts +1 -1
  402. package/build/queries/sql/expressions/nullIf.d.mts.map +1 -0
  403. package/build/{expressions → queries/sql/expressions}/nullIf.js +1 -1
  404. package/build/queries/sql/expressions/nullIf.js.map +1 -0
  405. package/build/{expressions → queries/sql/expressions}/parseExpression.cjs +16 -16
  406. package/build/queries/sql/expressions/parseExpression.cjs.map +1 -0
  407. package/build/{expressions → queries/sql/expressions}/parseExpression.d.cts +1 -1
  408. package/build/queries/sql/expressions/parseExpression.d.cts.map +1 -0
  409. package/build/{expressions → queries/sql/expressions}/parseExpression.d.mts +1 -1
  410. package/build/queries/sql/expressions/parseExpression.d.mts.map +1 -0
  411. package/build/{expressions → queries/sql/expressions}/parseExpression.js +2 -2
  412. package/build/queries/sql/expressions/parseExpression.js.map +1 -0
  413. package/build/{expressions → queries/sql/expressions}/types.d.cts +1 -1
  414. package/build/queries/sql/expressions/types.d.cts.map +1 -0
  415. package/build/{expressions → queries/sql/expressions}/types.d.mts +1 -1
  416. package/build/queries/sql/expressions/types.d.mts.map +1 -0
  417. package/build/{keywords.cjs → queries/sql/keywords.cjs} +1 -1
  418. package/build/queries/sql/keywords.cjs.map +1 -0
  419. package/build/{keywords.d.cts → queries/sql/keywords.d.cts} +1 -1
  420. package/build/queries/sql/keywords.d.cts.map +1 -0
  421. package/build/{keywords.d.mts → queries/sql/keywords.d.mts} +1 -1
  422. package/build/queries/sql/keywords.d.mts.map +1 -0
  423. package/build/{keywords.js → queries/sql/keywords.js} +1 -1
  424. package/build/queries/sql/keywords.js.map +1 -0
  425. package/build/{query.cjs → queries/sql/query.cjs} +83 -84
  426. package/build/queries/sql/query.cjs.map +1 -0
  427. package/build/{query.d.cts → queries/sql/query.d.cts} +7 -7
  428. package/build/queries/sql/query.d.cts.map +1 -0
  429. package/build/{query.d.mts → queries/sql/query.d.mts} +7 -7
  430. package/build/queries/sql/query.d.mts.map +1 -0
  431. package/build/{query.js → queries/sql/query.js} +11 -12
  432. package/build/queries/sql/query.js.map +1 -0
  433. package/build/queries/valueFilters.cjs +248 -0
  434. package/build/queries/valueFilters.cjs.map +1 -0
  435. package/build/queries/valueFilters.d.cts +28 -0
  436. package/build/queries/valueFilters.d.cts.map +1 -0
  437. package/build/queries/valueFilters.d.mts +28 -0
  438. package/build/queries/valueFilters.d.mts.map +1 -0
  439. package/build/queries/valueFilters.js +243 -0
  440. package/build/queries/valueFilters.js.map +1 -0
  441. package/build/reactiveHints.cjs +5 -5
  442. package/build/reactiveHints.js +5 -5
  443. package/build/relations/AbstractRelationImpl.cjs +0 -5
  444. package/build/relations/AbstractRelationImpl.cjs.map +1 -1
  445. package/build/relations/AbstractRelationImpl.d.cts +1 -2
  446. package/build/relations/AbstractRelationImpl.d.cts.map +1 -1
  447. package/build/relations/AbstractRelationImpl.d.mts +1 -2
  448. package/build/relations/AbstractRelationImpl.d.mts.map +1 -1
  449. package/build/relations/AbstractRelationImpl.js +1 -5
  450. package/build/relations/AbstractRelationImpl.js.map +1 -1
  451. package/build/relations/AsyncProperty.cjs +1 -1
  452. package/build/relations/AsyncProperty.js +1 -1
  453. package/build/relations/AsyncReactiveField.cjs +3 -3
  454. package/build/relations/AsyncReactiveField.js +3 -3
  455. package/build/relations/Collection.cjs +1 -1
  456. package/build/relations/Collection.js +1 -1
  457. package/build/relations/CustomCollection.cjs +1 -1
  458. package/build/relations/CustomCollection.js +1 -1
  459. package/build/relations/CustomReference.cjs +3 -3
  460. package/build/relations/CustomReference.js +3 -3
  461. package/build/relations/EnumCollection.cjs +2 -2
  462. package/build/relations/EnumCollection.js +2 -2
  463. package/build/relations/LazyField.cjs +6 -7
  464. package/build/relations/LazyField.cjs.map +1 -1
  465. package/build/relations/LazyField.js +5 -6
  466. package/build/relations/LazyField.js.map +1 -1
  467. package/build/relations/ManyToManyCollection.cjs +4 -3
  468. package/build/relations/ManyToManyCollection.cjs.map +1 -1
  469. package/build/relations/ManyToManyCollection.d.cts.map +1 -1
  470. package/build/relations/ManyToManyCollection.d.mts.map +1 -1
  471. package/build/relations/ManyToManyCollection.js +4 -3
  472. package/build/relations/ManyToManyCollection.js.map +1 -1
  473. package/build/relations/ManyToManyLargeCollection.cjs +2 -2
  474. package/build/relations/ManyToManyLargeCollection.js +2 -2
  475. package/build/relations/ManyToOneReference.cjs +7 -6
  476. package/build/relations/ManyToOneReference.cjs.map +1 -1
  477. package/build/relations/ManyToOneReference.d.cts.map +1 -1
  478. package/build/relations/ManyToOneReference.d.mts.map +1 -1
  479. package/build/relations/ManyToOneReference.js +7 -6
  480. package/build/relations/ManyToOneReference.js.map +1 -1
  481. package/build/relations/OneToManyCollection.cjs +6 -5
  482. package/build/relations/OneToManyCollection.cjs.map +1 -1
  483. package/build/relations/OneToManyCollection.d.cts.map +1 -1
  484. package/build/relations/OneToManyCollection.d.mts.map +1 -1
  485. package/build/relations/OneToManyCollection.js +4 -3
  486. package/build/relations/OneToManyCollection.js.map +1 -1
  487. package/build/relations/OneToManyLargeCollection.cjs +3 -3
  488. package/build/relations/OneToManyLargeCollection.js +3 -3
  489. package/build/relations/OneToOneReference.cjs +6 -5
  490. package/build/relations/OneToOneReference.cjs.map +1 -1
  491. package/build/relations/OneToOneReference.d.cts.map +1 -1
  492. package/build/relations/OneToOneReference.d.mts.map +1 -1
  493. package/build/relations/OneToOneReference.js +6 -5
  494. package/build/relations/OneToOneReference.js.map +1 -1
  495. package/build/relations/PolymorphicReference.cjs +7 -6
  496. package/build/relations/PolymorphicReference.cjs.map +1 -1
  497. package/build/relations/PolymorphicReference.d.cts.map +1 -1
  498. package/build/relations/PolymorphicReference.d.mts.map +1 -1
  499. package/build/relations/PolymorphicReference.js +7 -6
  500. package/build/relations/PolymorphicReference.js.map +1 -1
  501. package/build/relations/ReactiveField.cjs +3 -3
  502. package/build/relations/ReactiveField.js +3 -3
  503. package/build/relations/ReactiveGetter.cjs +1 -1
  504. package/build/relations/ReactiveGetter.js +1 -1
  505. package/build/relations/ReactiveManyToMany.cjs +5 -4
  506. package/build/relations/ReactiveManyToMany.cjs.map +1 -1
  507. package/build/relations/ReactiveManyToMany.d.cts.map +1 -1
  508. package/build/relations/ReactiveManyToMany.d.mts.map +1 -1
  509. package/build/relations/ReactiveManyToMany.js +5 -4
  510. package/build/relations/ReactiveManyToMany.js.map +1 -1
  511. package/build/relations/ReactiveManyToManyOtherSide.cjs +3 -3
  512. package/build/relations/ReactiveManyToManyOtherSide.js +3 -3
  513. package/build/relations/ReactiveReference.cjs +8 -7
  514. package/build/relations/ReactiveReference.cjs.map +1 -1
  515. package/build/relations/ReactiveReference.d.cts.map +1 -1
  516. package/build/relations/ReactiveReference.d.mts.map +1 -1
  517. package/build/relations/ReactiveReference.js +8 -7
  518. package/build/relations/ReactiveReference.js.map +1 -1
  519. package/build/relations/RecursiveCollection.cjs +3 -3
  520. package/build/relations/RecursiveCollection.js +3 -3
  521. package/build/relations/Reference.cjs +1 -1
  522. package/build/relations/Reference.js +1 -1
  523. package/build/relations/hasAsyncMethod.cjs +1 -1
  524. package/build/relations/hasAsyncMethod.js +1 -1
  525. package/build/relations/hasManyDerived.cjs +1 -1
  526. package/build/relations/hasManyDerived.js +1 -1
  527. package/build/relations/hasOneDerived.cjs +2 -2
  528. package/build/relations/hasOneDerived.js +2 -2
  529. package/build/relations/hasProperty.cjs +2 -2
  530. package/build/relations/hasProperty.js +2 -2
  531. package/build/relations/index.cjs +13 -13
  532. package/build/relations/index.js +13 -13
  533. package/build/relations/isCascadeDelete.cjs +11 -0
  534. package/build/relations/isCascadeDelete.cjs.map +1 -0
  535. package/build/relations/isCascadeDelete.d.cts +7 -0
  536. package/build/relations/isCascadeDelete.d.cts.map +1 -0
  537. package/build/relations/isCascadeDelete.d.mts +7 -0
  538. package/build/relations/isCascadeDelete.d.mts.map +1 -0
  539. package/build/relations/isCascadeDelete.js +10 -0
  540. package/build/relations/isCascadeDelete.js.map +1 -0
  541. package/build/resurrection.cjs +1 -1
  542. package/build/resurrection.js +1 -1
  543. package/build/rules.cjs +4 -4
  544. package/build/rules.js +4 -4
  545. package/build/serde.cjs +1 -1
  546. package/build/serde.js +1 -1
  547. package/build/unnest.cjs +0 -1
  548. package/build/unnest.cjs.map +1 -1
  549. package/build/unnest.d.cts +1 -1
  550. package/build/unnest.d.mts +1 -1
  551. package/build/unnest.js +0 -1
  552. package/build/unnest.js.map +1 -1
  553. package/build/upsert.cjs +3 -3
  554. package/build/upsert.js +3 -3
  555. package/build/utils.cjs +1 -2
  556. package/build/utils.cjs.map +1 -1
  557. package/build/utils.d.cts +1 -1
  558. package/build/utils.d.mts +1 -1
  559. package/build/utils.js +1 -2
  560. package/build/utils.js.map +1 -1
  561. package/build/withLoaded.cjs +3 -3
  562. package/build/withLoaded.js +3 -3
  563. package/package.json +2 -2
  564. package/build/AliasAssigner.cjs.map +0 -1
  565. package/build/AliasAssigner.d.cts.map +0 -1
  566. package/build/AliasAssigner.d.mts.map +0 -1
  567. package/build/AliasAssigner.js.map +0 -1
  568. package/build/Aliases.cjs.map +0 -1
  569. package/build/Aliases.d.cts.map +0 -1
  570. package/build/Aliases.d.mts.map +0 -1
  571. package/build/Aliases.js.map +0 -1
  572. package/build/ConditionBuilder.cjs.map +0 -1
  573. package/build/ConditionBuilder.d.cts.map +0 -1
  574. package/build/ConditionBuilder.d.mts.map +0 -1
  575. package/build/ConditionBuilder.js.map +0 -1
  576. package/build/DeferredAlias.cjs.map +0 -1
  577. package/build/DeferredAlias.d.cts.map +0 -1
  578. package/build/DeferredAlias.d.mts.map +0 -1
  579. package/build/DeferredAlias.js.map +0 -1
  580. package/build/EntityFilter.cjs.map +0 -1
  581. package/build/EntityFilter.d.cts.map +0 -1
  582. package/build/EntityFilter.d.mts.map +0 -1
  583. package/build/EntityFilter.js.map +0 -1
  584. package/build/EntityGraphQLFilter.cjs.map +0 -1
  585. package/build/EntityGraphQLFilter.d.cts.map +0 -1
  586. package/build/EntityGraphQLFilter.d.mts.map +0 -1
  587. package/build/EntityGraphQLFilter.js.map +0 -1
  588. package/build/Expr.cjs.map +0 -1
  589. package/build/Expr.d.cts.map +0 -1
  590. package/build/Expr.d.mts.map +0 -1
  591. package/build/Expr.js.map +0 -1
  592. package/build/QueryParser.cjs.map +0 -1
  593. package/build/QueryParser.collectionJoins.cjs.map +0 -1
  594. package/build/QueryParser.collectionJoins.d.cts.map +0 -1
  595. package/build/QueryParser.collectionJoins.d.mts.map +0 -1
  596. package/build/QueryParser.collectionJoins.js.map +0 -1
  597. package/build/QueryParser.d.cts.map +0 -1
  598. package/build/QueryParser.d.mts.map +0 -1
  599. package/build/QueryParser.js.map +0 -1
  600. package/build/QueryParser.pruning.cjs.map +0 -1
  601. package/build/QueryParser.pruning.d.cts +0 -10
  602. package/build/QueryParser.pruning.d.cts.map +0 -1
  603. package/build/QueryParser.pruning.d.mts +0 -10
  604. package/build/QueryParser.pruning.d.mts.map +0 -1
  605. package/build/QueryParser.pruning.js.map +0 -1
  606. package/build/QueryVisitor.cjs.map +0 -1
  607. package/build/QueryVisitor.d.cts.map +0 -1
  608. package/build/QueryVisitor.d.mts.map +0 -1
  609. package/build/QueryVisitor.js.map +0 -1
  610. package/build/Tables.cjs.map +0 -1
  611. package/build/Tables.d.cts.map +0 -1
  612. package/build/Tables.d.mts.map +0 -1
  613. package/build/Tables.js.map +0 -1
  614. package/build/conditions.cjs.map +0 -1
  615. package/build/conditions.d.cts.map +0 -1
  616. package/build/conditions.d.mts.map +0 -1
  617. package/build/conditions.js.map +0 -1
  618. package/build/drivers/buildRawQuery.cjs.map +0 -1
  619. package/build/drivers/buildRawQuery.d.cts.map +0 -1
  620. package/build/drivers/buildRawQuery.d.mts.map +0 -1
  621. package/build/drivers/buildRawQuery.js.map +0 -1
  622. package/build/drivers/buildUtils.cjs.map +0 -1
  623. package/build/drivers/buildUtils.d.cts.map +0 -1
  624. package/build/drivers/buildUtils.d.mts.map +0 -1
  625. package/build/drivers/buildUtils.js.map +0 -1
  626. package/build/execute.cjs.map +0 -1
  627. package/build/execute.d.cts.map +0 -1
  628. package/build/execute.d.mts.map +0 -1
  629. package/build/execute.js.map +0 -1
  630. package/build/expressions/arrayAgg.cjs.map +0 -1
  631. package/build/expressions/arrayAgg.d.cts.map +0 -1
  632. package/build/expressions/arrayAgg.d.mts.map +0 -1
  633. package/build/expressions/arrayAgg.js.map +0 -1
  634. package/build/expressions/case.cjs.map +0 -1
  635. package/build/expressions/case.d.cts.map +0 -1
  636. package/build/expressions/case.d.mts.map +0 -1
  637. package/build/expressions/case.js.map +0 -1
  638. package/build/expressions/coalesce.cjs +0 -25
  639. package/build/expressions/coalesce.cjs.map +0 -1
  640. package/build/expressions/coalesce.d.cts.map +0 -1
  641. package/build/expressions/coalesce.d.mts.map +0 -1
  642. package/build/expressions/coalesce.js.map +0 -1
  643. package/build/expressions/codecs.cjs.map +0 -1
  644. package/build/expressions/codecs.d.cts.map +0 -1
  645. package/build/expressions/codecs.d.mts.map +0 -1
  646. package/build/expressions/codecs.js.map +0 -1
  647. package/build/expressions/expression.cjs +0 -102
  648. package/build/expressions/expression.cjs.map +0 -1
  649. package/build/expressions/expression.d.cts.map +0 -1
  650. package/build/expressions/expression.d.mts.map +0 -1
  651. package/build/expressions/expression.js.map +0 -1
  652. package/build/expressions/greatest.cjs +0 -25
  653. package/build/expressions/greatest.cjs.map +0 -1
  654. package/build/expressions/greatest.d.cts.map +0 -1
  655. package/build/expressions/greatest.d.mts.map +0 -1
  656. package/build/expressions/greatest.js.map +0 -1
  657. package/build/expressions/least.cjs +0 -25
  658. package/build/expressions/least.cjs.map +0 -1
  659. package/build/expressions/least.d.cts.map +0 -1
  660. package/build/expressions/least.d.mts.map +0 -1
  661. package/build/expressions/least.js.map +0 -1
  662. package/build/expressions/nullIf.cjs.map +0 -1
  663. package/build/expressions/nullIf.d.cts.map +0 -1
  664. package/build/expressions/nullIf.d.mts.map +0 -1
  665. package/build/expressions/nullIf.js.map +0 -1
  666. package/build/expressions/parseExpression.cjs.map +0 -1
  667. package/build/expressions/parseExpression.d.cts.map +0 -1
  668. package/build/expressions/parseExpression.d.mts.map +0 -1
  669. package/build/expressions/parseExpression.js.map +0 -1
  670. package/build/expressions/types.d.cts.map +0 -1
  671. package/build/expressions/types.d.mts.map +0 -1
  672. package/build/keywords.cjs.map +0 -1
  673. package/build/keywords.d.cts.map +0 -1
  674. package/build/keywords.d.mts.map +0 -1
  675. package/build/keywords.js.map +0 -1
  676. package/build/query.cjs.map +0 -1
  677. package/build/query.d.cts.map +0 -1
  678. package/build/query.d.mts.map +0 -1
  679. package/build/query.js.map +0 -1
  680. package/build/scopes.cjs.map +0 -1
  681. package/build/scopes.d.cts.map +0 -1
  682. package/build/scopes.d.mts.map +0 -1
  683. package/build/scopes.js.map +0 -1
  684. package/build/skipCondition.cjs.map +0 -1
  685. package/build/skipCondition.js.map +0 -1
  686. /package/build/{expressions → queries/sql/expressions}/types.cjs +0 -0
  687. /package/build/{expressions → queries/sql/expressions}/types.js +0 -0
@@ -1,5 +1,5 @@
1
+ import { ParsedCteClause } from "./queries/find/QueryParser.cjs";
1
2
  import { OpColumn } from "./drivers/EntityWriter.cjs";
2
- import { ParsedCteClause } from "./QueryParser.cjs";
3
3
  //#region src/unnest.d.ts
4
4
  /**
5
5
  * Creates a CTE named `alias` that bulk-injects the `columnValues` into a SQL query.
@@ -1,5 +1,5 @@
1
+ import { ParsedCteClause } from "./queries/find/QueryParser.mjs";
1
2
  import { OpColumn } from "./drivers/EntityWriter.mjs";
2
- import { ParsedCteClause } from "./QueryParser.mjs";
3
3
  //#region src/unnest.d.ts
4
4
  /**
5
5
  * Creates a CTE named `alias` that bulk-injects the `columnValues` into a SQL query.
package/build/unnest.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import "./drivers/EntityWriter.js";
2
- import "./QueryParser.js";
3
2
  //#region src/unnest.ts
4
3
  /**
5
4
  * Creates a CTE named `alias` that bulk-injects the `columnValues` into a SQL query.
@@ -1 +1 @@
1
- {"version":3,"file":"unnest.js","names":[],"sources":["../src/unnest.ts"],"sourcesContent":["import { type OpColumn } from \"./drivers/EntityWriter.ts\";\nimport { type ParsedCteClause } from \"./QueryParser.ts\";\n\n/**\n * Creates a CTE named `alias` that bulk-injects the `columnValues` into a SQL query.\n *\n * I.e. `columns = [first_name, last_name]` means columnValues would be all first names,\n * then all last names, i.e.`[[\"f1\",\"f2\"], [\"l1\",\"l2\"]]`.\n *\n * Note that `columnValues` will be mutated if any array columns need to be made rectangular.\n */\nexport function buildUnnestCte(alias: string, columns: OpColumn[], columnValues: any[][]): ParsedCteClause {\n // Make any arrays-of-arrays rectangular by filling them with nulls\n ensureRectangularArraySizes(columns, columnValues);\n // Use unnest or unnest_arrays depending on whether the column is an array column\n const selects = columns.map((c) => {\n if (c.dbType.endsWith(\"[]\")) {\n if (c.isNullableArray) {\n return `unnest_arrays(?::${c.dbType}[], true)`;\n } else {\n return `unnest_arrays(?::${c.dbType}[])`;\n }\n } else {\n return `unnest(?::${c.dbType}[])`;\n }\n });\n return {\n alias,\n columns,\n query: { kind: \"raw\", sql: `SELECT ${selects.join(\", \")}`, bindings: columnValues },\n };\n}\n\nexport function ensureRectangularArraySizes(columns: OpColumn[], columnValues: any[][]): void {\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n if (column.dbType.endsWith(\"[]\")) {\n const values = columnValues[i];\n const fillTo = findArrayMaxSize(values);\n for (let j = 0; j < values.length; j++) {\n values[j] = fillArrayWithNulls(column, values[j], fillTo);\n }\n }\n }\n}\n\nfunction findArrayMaxSize(columnValues: readonly any[][]): number {\n let max = 1; // postgres really doesn't like `{{}}` so always send at least 1 element\n for (let i = 0; i < columnValues.length; i++) max = Math.max(max, columnValues[i]?.length ?? 0);\n return max;\n}\n\n// Because postgres array-of-arrays must be rectangular, we fill all arrays up the same max size\n// to put on the wire, and then later strip the padded nulls during the unnest_arrays call.\nfunction fillArrayWithNulls(c: OpColumn, array: any[] | null, maxSize: number): any[] {\n const wasNull = array === null;\n const result = array ? [...array] : [];\n const nullsToAdd = Math.max(0, maxSize - (array?.length ?? 0));\n for (let i = 0; i < nullsToAdd; i++) result.push(null);\n // Add our unset marker\n if (c.isNullableArray) result.unshift(wasNull ? null : notNullMarker(c));\n return result;\n}\n\nfunction notNullMarker(c: OpColumn): any {\n // Should probably push this into an OpColumn.notNullMarker value\n if (c.dbType.startsWith(\"varchar\") || c.dbType.startsWith(\"character\") || c.dbType.startsWith(\"text\")) {\n return \"\";\n } else if (c.dbType.startsWith(\"int\")) {\n return 1;\n } else if (c.dbType.startsWith(\"date\")) {\n return new Date(); // maybe something temporal?\n } else if (c.dbType.startsWith(\"timestamp\")) {\n return new Date(); // maybe something temporal?\n } else {\n throw new Error(\"Unhandled nullable array column type \" + c.dbType);\n }\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,eAAe,OAAe,SAAqB,cAAwC;CAEzG,4BAA4B,SAAS,YAAY;CAajD,OAAO;EACL;EACA;EACA,OAAO;GAAE,MAAM;GAAO,KAAK,UAdb,QAAQ,KAAK,MAAM;IACjC,IAAI,EAAE,OAAO,SAAS,IAAI,GAAG;KAC3B,IAAI,EAAE,iBACJ,OAAO,oBAAoB,EAAE,OAAO;UAEpC,OAAO,oBAAoB,EAAE,OAAO;IAExC,OACE,OAAO,aAAa,EAAE,OAAO;GAEjC,CAI6C,CAAC,CAAC,KAAK,IAAI;GAAK,UAAU;EAAa;CACpF;AACF;AAEA,SAAgB,4BAA4B,SAAqB,cAA6B;CAC5F,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,SAAS,QAAQ;EACvB,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG;GAChC,MAAM,SAAS,aAAa;GAC5B,MAAM,SAAS,iBAAiB,MAAM;GACtC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,OAAO,KAAK,mBAAmB,QAAQ,OAAO,IAAI,MAAM;EAE5D;CACF;AACF;AAEA,SAAS,iBAAiB,cAAwC;CAChE,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,aAAa,EAAE,EAAE,UAAU,CAAC;CAC9F,OAAO;AACT;AAIA,SAAS,mBAAmB,GAAa,OAAqB,SAAwB;CACpF,MAAM,UAAU,UAAU;CAC1B,MAAM,SAAS,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;CACrC,MAAM,aAAa,KAAK,IAAI,GAAG,WAAW,OAAO,UAAU,EAAE;CAC7D,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK,OAAO,KAAK,IAAI;CAErD,IAAI,EAAE,iBAAiB,OAAO,QAAQ,UAAU,OAAO,cAAc,CAAC,CAAC;CACvE,OAAO;AACT;AAEA,SAAS,cAAc,GAAkB;CAEvC,IAAI,EAAE,OAAO,WAAW,SAAS,KAAK,EAAE,OAAO,WAAW,WAAW,KAAK,EAAE,OAAO,WAAW,MAAM,GAClG,OAAO;MACF,IAAI,EAAE,OAAO,WAAW,KAAK,GAClC,OAAO;MACF,IAAI,EAAE,OAAO,WAAW,MAAM,GACnC,uBAAO,IAAI,KAAK;MACX,IAAI,EAAE,OAAO,WAAW,WAAW,GACxC,uBAAO,IAAI,KAAK;MAEhB,MAAM,IAAI,MAAM,0CAA0C,EAAE,MAAM;AAEtE"}
1
+ {"version":3,"file":"unnest.js","names":[],"sources":["../src/unnest.ts"],"sourcesContent":["import { type OpColumn } from \"./drivers/EntityWriter.ts\";\nimport type { ParsedCteClause } from \"./queries/find/QueryParser.ts\";\n\n/**\n * Creates a CTE named `alias` that bulk-injects the `columnValues` into a SQL query.\n *\n * I.e. `columns = [first_name, last_name]` means columnValues would be all first names,\n * then all last names, i.e.`[[\"f1\",\"f2\"], [\"l1\",\"l2\"]]`.\n *\n * Note that `columnValues` will be mutated if any array columns need to be made rectangular.\n */\nexport function buildUnnestCte(alias: string, columns: OpColumn[], columnValues: any[][]): ParsedCteClause {\n // Make any arrays-of-arrays rectangular by filling them with nulls\n ensureRectangularArraySizes(columns, columnValues);\n // Use unnest or unnest_arrays depending on whether the column is an array column\n const selects = columns.map((c) => {\n if (c.dbType.endsWith(\"[]\")) {\n if (c.isNullableArray) {\n return `unnest_arrays(?::${c.dbType}[], true)`;\n } else {\n return `unnest_arrays(?::${c.dbType}[])`;\n }\n } else {\n return `unnest(?::${c.dbType}[])`;\n }\n });\n return {\n alias,\n columns,\n query: { kind: \"raw\", sql: `SELECT ${selects.join(\", \")}`, bindings: columnValues },\n };\n}\n\nexport function ensureRectangularArraySizes(columns: OpColumn[], columnValues: any[][]): void {\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n if (column.dbType.endsWith(\"[]\")) {\n const values = columnValues[i];\n const fillTo = findArrayMaxSize(values);\n for (let j = 0; j < values.length; j++) {\n values[j] = fillArrayWithNulls(column, values[j], fillTo);\n }\n }\n }\n}\n\nfunction findArrayMaxSize(columnValues: readonly any[][]): number {\n let max = 1; // postgres really doesn't like `{{}}` so always send at least 1 element\n for (let i = 0; i < columnValues.length; i++) max = Math.max(max, columnValues[i]?.length ?? 0);\n return max;\n}\n\n// Because postgres array-of-arrays must be rectangular, we fill all arrays up the same max size\n// to put on the wire, and then later strip the padded nulls during the unnest_arrays call.\nfunction fillArrayWithNulls(c: OpColumn, array: any[] | null, maxSize: number): any[] {\n const wasNull = array === null;\n const result = array ? [...array] : [];\n const nullsToAdd = Math.max(0, maxSize - (array?.length ?? 0));\n for (let i = 0; i < nullsToAdd; i++) result.push(null);\n // Add our unset marker\n if (c.isNullableArray) result.unshift(wasNull ? null : notNullMarker(c));\n return result;\n}\n\nfunction notNullMarker(c: OpColumn): any {\n // Should probably push this into an OpColumn.notNullMarker value\n if (c.dbType.startsWith(\"varchar\") || c.dbType.startsWith(\"character\") || c.dbType.startsWith(\"text\")) {\n return \"\";\n } else if (c.dbType.startsWith(\"int\")) {\n return 1;\n } else if (c.dbType.startsWith(\"date\")) {\n return new Date(); // maybe something temporal?\n } else if (c.dbType.startsWith(\"timestamp\")) {\n return new Date(); // maybe something temporal?\n } else {\n throw new Error(\"Unhandled nullable array column type \" + c.dbType);\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,eAAe,OAAe,SAAqB,cAAwC;CAEzG,4BAA4B,SAAS,YAAY;CAajD,OAAO;EACL;EACA;EACA,OAAO;GAAE,MAAM;GAAO,KAAK,UAdb,QAAQ,KAAK,MAAM;IACjC,IAAI,EAAE,OAAO,SAAS,IAAI,GAAG;KAC3B,IAAI,EAAE,iBACJ,OAAO,oBAAoB,EAAE,OAAO;UAEpC,OAAO,oBAAoB,EAAE,OAAO;IAExC,OACE,OAAO,aAAa,EAAE,OAAO;GAEjC,CAI6C,CAAC,CAAC,KAAK,IAAI;GAAK,UAAU;EAAa;CACpF;AACF;AAEA,SAAgB,4BAA4B,SAAqB,cAA6B;CAC5F,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,SAAS,QAAQ;EACvB,IAAI,OAAO,OAAO,SAAS,IAAI,GAAG;GAChC,MAAM,SAAS,aAAa;GAC5B,MAAM,SAAS,iBAAiB,MAAM;GACtC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,OAAO,KAAK,mBAAmB,QAAQ,OAAO,IAAI,MAAM;EAE5D;CACF;AACF;AAEA,SAAS,iBAAiB,cAAwC;CAChE,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,aAAa,EAAE,EAAE,UAAU,CAAC;CAC9F,OAAO;AACT;AAIA,SAAS,mBAAmB,GAAa,OAAqB,SAAwB;CACpF,MAAM,UAAU,UAAU;CAC1B,MAAM,SAAS,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;CACrC,MAAM,aAAa,KAAK,IAAI,GAAG,WAAW,OAAO,UAAU,EAAE;CAC7D,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK,OAAO,KAAK,IAAI;CAErD,IAAI,EAAE,iBAAiB,OAAO,QAAQ,UAAU,OAAO,cAAc,CAAC,CAAC;CACvE,OAAO;AACT;AAEA,SAAS,cAAc,GAAkB;CAEvC,IAAI,EAAE,OAAO,WAAW,SAAS,KAAK,EAAE,OAAO,WAAW,WAAW,KAAK,EAAE,OAAO,WAAW,MAAM,GAClG,OAAO;MACF,IAAI,EAAE,OAAO,WAAW,KAAK,GAClC,OAAO;MACF,IAAI,EAAE,OAAO,WAAW,MAAM,GACnC,uBAAO,IAAI,KAAK;MACX,IAAI,EAAE,OAAO,WAAW,WAAW,GACxC,uBAAO,IAAI,KAAK;MAEhB,MAAM,IAAI,MAAM,0CAA0C,EAAE,MAAM;AAEtE"}
package/build/upsert.cjs CHANGED
@@ -1,14 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("./typeMap.cjs");
3
+ const require_utils = require("./utils.cjs");
3
4
  const require_getProperties = require("./getProperties.cjs");
5
+ const require_configure = require("./configure.cjs");
4
6
  const require_EntityMetadata = require("./EntityMetadata.cjs");
5
- const require_utils = require("./utils.cjs");
7
+ const require_defaults = require("./defaults.cjs");
6
8
  const require_resurrection = require("./resurrection.cjs");
7
9
  const require_index = require("./index.cjs");
8
10
  const require_EntityManager = require("./EntityManager.cjs");
9
11
  const require_Entity = require("./Entity.cjs");
10
- const require_defaults = require("./defaults.cjs");
11
- const require_configure = require("./configure.cjs");
12
12
  let joist_utils = require("joist-utils");
13
13
  //#region src/upsert.ts
14
14
  /**
package/build/upsert.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import "./typeMap.js";
2
+ import { toArray } from "./utils.js";
2
3
  import { getProperties } from "./getProperties.js";
4
+ import { getConstructorFromTaggedId } from "./configure.js";
3
5
  import { getMetadata } from "./EntityMetadata.js";
4
- import { toArray } from "./utils.js";
6
+ import { setSyncDefaults } from "./defaults.js";
5
7
  import { findExistingIfUniqueBy } from "./resurrection.js";
6
8
  import { asConcreteCstr, setOpt } from "./index.js";
7
9
  import { isKey } from "./EntityManager.js";
8
10
  import { isEntity } from "./Entity.js";
9
- import { setSyncDefaults } from "./defaults.js";
10
- import { getConstructorFromTaggedId } from "./configure.js";
11
11
  import { isPlainObject } from "joist-utils";
12
12
  //#region src/upsert.ts
13
13
  /**
package/build/utils.cjs CHANGED
@@ -1,9 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./EntityFilter.cjs");
3
2
  const require_relations_Reference = require("./relations/Reference.cjs");
3
+ require("./loadHints.cjs");
4
4
  const require_relations_ReactiveField = require("./relations/ReactiveField.cjs");
5
5
  require("./relations/index.cjs");
6
- require("./loadHints.cjs");
7
6
  const require_EntityManager = require("./EntityManager.cjs");
8
7
  require("./Entity.cjs");
9
8
  //#region src/utils.ts
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["isReactiveField","isReference","isDefined"],"sources":["../src/utils.ts"],"sourcesContent":["import { type Entity } from \"./Entity.ts\";\nimport { type OrderBy } from \"./EntityFilter.ts\";\nimport { isDefined } from \"./EntityManager.ts\";\nimport { type New } from \"./loadHints.ts\";\nimport { isReactiveField, isReference } from \"./relations/index.ts\";\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * Given a `MaybePromise` of T, invoke `callback` against `T` either immediately or via `then`.\n *\n * This is the same as:\n *\n * ```\n * const r = await maybePromise;\n * return callback(r;;\n * ```\n *\n * But saves an `await` if `maybePromise` is not actually a promise.\n */\nexport function maybePromiseThen<T, U>(promiseOrObj: MaybePromise<T>, callback: (obj: T) => U): MaybePromise<U> {\n return promiseOrObj instanceof Promise ? promiseOrObj.then(callback) : callback(promiseOrObj);\n}\n\nexport function failIfAnyRejected<T>(results: PromiseSettledResult<T>[]): T[] {\n const rejects = results.filter((r) => r.status === \"rejected\");\n // For now just throw the 1st rejection; this should be pretty rare\n if (rejects.length > 0 && rejects[0].status === \"rejected\") {\n throw rejects[0].reason;\n }\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n}\n\nexport function getOrSet<T extends Record<keyof unknown, unknown>>(\n record: T,\n key: keyof T,\n defaultValue: T[keyof T] | (() => T[keyof T]),\n): T[keyof T] {\n if (record[key] === undefined) {\n record[key] = defaultValue instanceof Function ? defaultValue() : defaultValue;\n }\n return record[key];\n}\n\n/** Defines a getter that replaces itself with its computed value on first access. */\nexport function defineLazyGetter<T extends object, K extends keyof T>(obj: T, key: K, build: () => T[K]): void {\n Object.defineProperty(obj, key, {\n configurable: true,\n get: function getLazyProperty() {\n const value = build();\n Object.defineProperty(obj, key, { configurable: true, value });\n return value;\n },\n });\n}\n\n/**\n * A utility to ensure a Promise-returning method actually returns a promise and doesn't\n * early exit. Using `async function` guarantees these semantics, but sometimes we avoid\n * `async` as a likely-premature optimization to avoid the overhead.\n */\nexport function tryResolve<T>(fn: () => T): Promise<T> {\n try {\n return Promise.resolve(fn());\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\n/** Returns whether `obj` has at least one key, without allocating a keys array. */\nexport function hasAnyKey(obj: Record<any, any> | undefined): boolean {\n for (const _ in obj) return true;\n return false;\n}\n\nexport function fail(message?: string): never {\n throw new Error(message || \"Failed\");\n}\n\nexport function remove<T>(array: T[], t: T): void {\n const index = array.indexOf(t);\n if (index > -1) {\n array.splice(index, 1);\n }\n}\n\nexport function maybeRemove<T>(array: T[] | undefined, t: T): void {\n if (array) remove(array, t);\n}\n\nexport function maybeAdd<T>(array: T[], t: T): void {\n if (!array.includes(t)) {\n array.push(t);\n }\n}\n\nexport function clear<T>(array: T[]): void {\n array.splice(0, array.length);\n}\n\n/** Returns 0 inclusive to n exclusive. */\nexport function zeroTo(n: number): number[] {\n return [...Array(n).keys()];\n}\n\nexport function groupBy<T, Y = T, K = string>(list: readonly T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y[]> {\n const result = new Map<K, Y[]>();\n list.forEach((o) => {\n const group = fn(o);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group)!.push(valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function indexBy<T, Y = T, K = string>(list: T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y> {\n const result = new Map<K, Y>();\n list.forEach((o) => {\n const group = fn(o);\n result.set(group, valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function batched<T>(list: Array<T>, n: number): T[][] {\n const result = [] as T[][];\n for (let i = 0; i < list.length; i += n) {\n result.push(list.slice(i, i + n));\n }\n return result;\n}\n\nexport function partition<T>(array: ReadonlyArray<T>, f: (el: T) => boolean): [T[], T[]] {\n const trueElements: T[] = [];\n const falseElements: T[] = [];\n array.forEach((el) => {\n if (f(el)) {\n trueElements.push(el);\n } else {\n falseElements.push(el);\n }\n });\n return [trueElements, falseElements];\n}\n\n// Utility function to wrap an object or value in an array, unless it's already an array\nexport function toArray<T>(maybeArray: T | T[] | undefined | null): T[] {\n return Array.isArray(maybeArray) ? maybeArray : maybeArray === undefined || maybeArray === null ? [] : [maybeArray];\n}\n\n// Utility type to strip off null and defined and infer only T.\nexport type NullOrDefinedOr<T> = T | null | undefined;\n\nexport function assertNever(x: never): never {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function abbreviation(tableName: string): string {\n return tableName\n .split(\"_\")\n .map((w) => w[0])\n .join(\"\");\n}\n\n/**\n * Utility method for casting `entity` to a `New` entity.\n *\n * Note that we don't actually do any runtime checks; a very simple one would be if the id is undefined,\n * but we want this method to be used in tests that are post-`flush` but still \"know\" the entity is\n * effectively new / fully loaded.\n *\n * Granted, we could do a runtime check that all relations are loaded.\n */\nexport function asNew<T extends Entity>(entity: T): New<T> {\n return entity as New<T>;\n}\n\nexport function compareValues(av: any, bv: any, direction: OrderBy): number {\n const d = direction === \"ASC\" ? 1 : -1;\n if (isReactiveField(av)) {\n av = !av.isSet ? -1 : av.get;\n }\n if (isReactiveField(bv)) {\n bv = !bv.isSet ? -1 : bv.get;\n }\n if (isReference(av) && isReference(bv)) {\n const aIsNew = av.isLoaded && (av as any).get?.isNewEntity;\n const bIsNew = bv.isLoaded && (bv as any).get?.isNewEntity;\n const bothSame = (aIsNew && bIsNew) || (!aIsNew && !bIsNew);\n if (!bothSame) {\n if (aIsNew) return 1 * d; // New entities are always \"greater than\" loaded entities\n if (bIsNew) return -1 * d; // Loaded entities are always \"less than\" new entities\n }\n av = av.idTaggedMaybe ?? (av.isLoaded && (av as any).get?.toString()) ?? undefined;\n bv = bv.idTaggedMaybe ?? (bv.isLoaded && (bv as any).get?.toString()) ?? undefined;\n }\n if (!isDefined(av) || !isDefined(bv)) {\n return !av && !bv ? 0 : (!av ? 1 : -1) * d;\n } else if (typeof av === \"number\" && typeof bv === \"number\") {\n return (av - bv) * d;\n } else if (typeof av === \"string\" && typeof bv === \"string\") {\n return av.localeCompare(bv) * d;\n } else if (av instanceof Date && bv instanceof Date) {\n return ((av as Date).getTime() - (bv as Date).getTime()) * d;\n } else {\n throw new Error(`Unsupported sortBy values ${av}, ${bv}`);\n }\n}\n\n/** A ~naive deep merge that requires already-normalized hints and will mutate `source`. */\n// https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6\nexport function mergeNormalizedHints(target: any, source: any): void {\n for (const key of Object.keys(source)) {\n // We assume both target & source are already normalized, i.e. we won't have\n // source=\"books\" and target={books: \"title\"}. They will both be {books: ...}.\n if (target[key]) {\n mergeNormalizedHints(source[key], target[key]);\n }\n }\n Object.assign(target, source);\n}\n\nconst newLine = /\\n/g;\nconst doubleSpace = / +/g;\n\nexport function cleanStringValue(value: unknown): string | undefined {\n // If this is not a string, coerce it -- or maybe fail?\n let s = typeof value !== \"string\" && value !== undefined && value !== null ? String(value) : value;\n // We always trim to remove leading/trailing spaces\n s = typeof s === \"string\" ? s.trim() : s;\n // And if it's empty string, we swap to undefined (null in the db)\n return s === \"\" || s === null ? undefined : s;\n}\n\n/** Strips new lines/indentation from our `UPDATE` string; doesn't do any actual SQL param escaping/etc. */\nexport function cleanSql(sql: string): string {\n return sql.trim().replace(newLine, \"\").replace(doubleSpace, \" \");\n}\n\n// Collections return an array, so do a hot-path `.flat()`\nexport function flatAndUnique<T extends unknown>(list: (T | T[] | undefined)[]): Set<T> {\n const result = new Set<T>();\n for (const c of list) {\n if (Array.isArray(c)) {\n for (const e of c) result.add(e);\n } else if (c) {\n result.add(c);\n }\n }\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":["isReactiveField","isReference","isDefined"],"sources":["../src/utils.ts"],"sourcesContent":["import { type Entity } from \"./Entity.ts\";\nimport { isDefined } from \"./EntityManager.ts\";\nimport { type New } from \"./loadHints.ts\";\nimport type { OrderBy } from \"./queries/find/EntityFilter.ts\";\nimport { isReactiveField, isReference } from \"./relations/index.ts\";\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * Given a `MaybePromise` of T, invoke `callback` against `T` either immediately or via `then`.\n *\n * This is the same as:\n *\n * ```\n * const r = await maybePromise;\n * return callback(r;;\n * ```\n *\n * But saves an `await` if `maybePromise` is not actually a promise.\n */\nexport function maybePromiseThen<T, U>(promiseOrObj: MaybePromise<T>, callback: (obj: T) => U): MaybePromise<U> {\n return promiseOrObj instanceof Promise ? promiseOrObj.then(callback) : callback(promiseOrObj);\n}\n\nexport function failIfAnyRejected<T>(results: PromiseSettledResult<T>[]): T[] {\n const rejects = results.filter((r) => r.status === \"rejected\");\n // For now just throw the 1st rejection; this should be pretty rare\n if (rejects.length > 0 && rejects[0].status === \"rejected\") {\n throw rejects[0].reason;\n }\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n}\n\nexport function getOrSet<T extends Record<keyof unknown, unknown>>(\n record: T,\n key: keyof T,\n defaultValue: T[keyof T] | (() => T[keyof T]),\n): T[keyof T] {\n if (record[key] === undefined) {\n record[key] = defaultValue instanceof Function ? defaultValue() : defaultValue;\n }\n return record[key];\n}\n\n/** Defines a getter that replaces itself with its computed value on first access. */\nexport function defineLazyGetter<T extends object, K extends keyof T>(obj: T, key: K, build: () => T[K]): void {\n Object.defineProperty(obj, key, {\n configurable: true,\n get: function getLazyProperty() {\n const value = build();\n Object.defineProperty(obj, key, { configurable: true, value });\n return value;\n },\n });\n}\n\n/**\n * A utility to ensure a Promise-returning method actually returns a promise and doesn't\n * early exit. Using `async function` guarantees these semantics, but sometimes we avoid\n * `async` as a likely-premature optimization to avoid the overhead.\n */\nexport function tryResolve<T>(fn: () => T): Promise<T> {\n try {\n return Promise.resolve(fn());\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\n/** Returns whether `obj` has at least one key, without allocating a keys array. */\nexport function hasAnyKey(obj: Record<any, any> | undefined): boolean {\n for (const _ in obj) return true;\n return false;\n}\n\nexport function fail(message?: string): never {\n throw new Error(message || \"Failed\");\n}\n\nexport function remove<T>(array: T[], t: T): void {\n const index = array.indexOf(t);\n if (index > -1) {\n array.splice(index, 1);\n }\n}\n\nexport function maybeRemove<T>(array: T[] | undefined, t: T): void {\n if (array) remove(array, t);\n}\n\nexport function maybeAdd<T>(array: T[], t: T): void {\n if (!array.includes(t)) {\n array.push(t);\n }\n}\n\nexport function clear<T>(array: T[]): void {\n array.splice(0, array.length);\n}\n\n/** Returns 0 inclusive to n exclusive. */\nexport function zeroTo(n: number): number[] {\n return [...Array(n).keys()];\n}\n\nexport function groupBy<T, Y = T, K = string>(list: readonly T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y[]> {\n const result = new Map<K, Y[]>();\n list.forEach((o) => {\n const group = fn(o);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group)!.push(valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function indexBy<T, Y = T, K = string>(list: T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y> {\n const result = new Map<K, Y>();\n list.forEach((o) => {\n const group = fn(o);\n result.set(group, valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function batched<T>(list: Array<T>, n: number): T[][] {\n const result = [] as T[][];\n for (let i = 0; i < list.length; i += n) {\n result.push(list.slice(i, i + n));\n }\n return result;\n}\n\nexport function partition<T>(array: ReadonlyArray<T>, f: (el: T) => boolean): [T[], T[]] {\n const trueElements: T[] = [];\n const falseElements: T[] = [];\n array.forEach((el) => {\n if (f(el)) {\n trueElements.push(el);\n } else {\n falseElements.push(el);\n }\n });\n return [trueElements, falseElements];\n}\n\n// Utility function to wrap an object or value in an array, unless it's already an array\nexport function toArray<T>(maybeArray: T | T[] | undefined | null): T[] {\n return Array.isArray(maybeArray) ? maybeArray : maybeArray === undefined || maybeArray === null ? [] : [maybeArray];\n}\n\n// Utility type to strip off null and defined and infer only T.\nexport type NullOrDefinedOr<T> = T | null | undefined;\n\nexport function assertNever(x: never): never {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function abbreviation(tableName: string): string {\n return tableName\n .split(\"_\")\n .map((w) => w[0])\n .join(\"\");\n}\n\n/**\n * Utility method for casting `entity` to a `New` entity.\n *\n * Note that we don't actually do any runtime checks; a very simple one would be if the id is undefined,\n * but we want this method to be used in tests that are post-`flush` but still \"know\" the entity is\n * effectively new / fully loaded.\n *\n * Granted, we could do a runtime check that all relations are loaded.\n */\nexport function asNew<T extends Entity>(entity: T): New<T> {\n return entity as New<T>;\n}\n\nexport function compareValues(av: any, bv: any, direction: OrderBy): number {\n const d = direction === \"ASC\" ? 1 : -1;\n if (isReactiveField(av)) {\n av = !av.isSet ? -1 : av.get;\n }\n if (isReactiveField(bv)) {\n bv = !bv.isSet ? -1 : bv.get;\n }\n if (isReference(av) && isReference(bv)) {\n const aIsNew = av.isLoaded && (av as any).get?.isNewEntity;\n const bIsNew = bv.isLoaded && (bv as any).get?.isNewEntity;\n const bothSame = (aIsNew && bIsNew) || (!aIsNew && !bIsNew);\n if (!bothSame) {\n if (aIsNew) return 1 * d; // New entities are always \"greater than\" loaded entities\n if (bIsNew) return -1 * d; // Loaded entities are always \"less than\" new entities\n }\n av = av.idTaggedMaybe ?? (av.isLoaded && (av as any).get?.toString()) ?? undefined;\n bv = bv.idTaggedMaybe ?? (bv.isLoaded && (bv as any).get?.toString()) ?? undefined;\n }\n if (!isDefined(av) || !isDefined(bv)) {\n return !av && !bv ? 0 : (!av ? 1 : -1) * d;\n } else if (typeof av === \"number\" && typeof bv === \"number\") {\n return (av - bv) * d;\n } else if (typeof av === \"string\" && typeof bv === \"string\") {\n return av.localeCompare(bv) * d;\n } else if (av instanceof Date && bv instanceof Date) {\n return ((av as Date).getTime() - (bv as Date).getTime()) * d;\n } else {\n throw new Error(`Unsupported sortBy values ${av}, ${bv}`);\n }\n}\n\n/** A ~naive deep merge that requires already-normalized hints and will mutate `source`. */\n// https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6\nexport function mergeNormalizedHints(target: any, source: any): void {\n for (const key of Object.keys(source)) {\n // We assume both target & source are already normalized, i.e. we won't have\n // source=\"books\" and target={books: \"title\"}. They will both be {books: ...}.\n if (target[key]) {\n mergeNormalizedHints(source[key], target[key]);\n }\n }\n Object.assign(target, source);\n}\n\nconst newLine = /\\n/g;\nconst doubleSpace = / +/g;\n\nexport function cleanStringValue(value: unknown): string | undefined {\n // If this is not a string, coerce it -- or maybe fail?\n let s = typeof value !== \"string\" && value !== undefined && value !== null ? String(value) : value;\n // We always trim to remove leading/trailing spaces\n s = typeof s === \"string\" ? s.trim() : s;\n // And if it's empty string, we swap to undefined (null in the db)\n return s === \"\" || s === null ? undefined : s;\n}\n\n/** Strips new lines/indentation from our `UPDATE` string; doesn't do any actual SQL param escaping/etc. */\nexport function cleanSql(sql: string): string {\n return sql.trim().replace(newLine, \"\").replace(doubleSpace, \" \");\n}\n\n// Collections return an array, so do a hot-path `.flat()`\nexport function flatAndUnique<T extends unknown>(list: (T | T[] | undefined)[]): Set<T> {\n const result = new Set<T>();\n for (const c of list) {\n if (Array.isArray(c)) {\n for (const e of c) result.add(e);\n } else if (c) {\n result.add(c);\n }\n }\n return result;\n}\n"],"mappings":"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"}
package/build/utils.d.cts CHANGED
@@ -1,6 +1,6 @@
1
+ import { OrderBy } from "./queries/find/EntityFilter.cjs";
1
2
  import { New } from "./loadHints.cjs";
2
3
  import { Entity } from "./Entity.cjs";
3
- import { OrderBy } from "./EntityFilter.cjs";
4
4
  //#region src/utils.d.ts
5
5
  type MaybePromise<T> = T | Promise<T>;
6
6
  /**
package/build/utils.d.mts CHANGED
@@ -1,6 +1,6 @@
1
+ import { OrderBy } from "./queries/find/EntityFilter.mjs";
1
2
  import { New } from "./loadHints.mjs";
2
3
  import { Entity } from "./Entity.mjs";
3
- import { OrderBy } from "./EntityFilter.mjs";
4
4
  //#region src/utils.d.ts
5
5
  type MaybePromise<T> = T | Promise<T>;
6
6
  /**
package/build/utils.js CHANGED
@@ -1,8 +1,7 @@
1
- import "./EntityFilter.js";
2
1
  import { isReference } from "./relations/Reference.js";
2
+ import "./loadHints.js";
3
3
  import { isReactiveField } from "./relations/ReactiveField.js";
4
4
  import "./relations/index.js";
5
- import "./loadHints.js";
6
5
  import { isDefined } from "./EntityManager.js";
7
6
  import "./Entity.js";
8
7
  //#region src/utils.ts
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { type Entity } from \"./Entity.ts\";\nimport { type OrderBy } from \"./EntityFilter.ts\";\nimport { isDefined } from \"./EntityManager.ts\";\nimport { type New } from \"./loadHints.ts\";\nimport { isReactiveField, isReference } from \"./relations/index.ts\";\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * Given a `MaybePromise` of T, invoke `callback` against `T` either immediately or via `then`.\n *\n * This is the same as:\n *\n * ```\n * const r = await maybePromise;\n * return callback(r;;\n * ```\n *\n * But saves an `await` if `maybePromise` is not actually a promise.\n */\nexport function maybePromiseThen<T, U>(promiseOrObj: MaybePromise<T>, callback: (obj: T) => U): MaybePromise<U> {\n return promiseOrObj instanceof Promise ? promiseOrObj.then(callback) : callback(promiseOrObj);\n}\n\nexport function failIfAnyRejected<T>(results: PromiseSettledResult<T>[]): T[] {\n const rejects = results.filter((r) => r.status === \"rejected\");\n // For now just throw the 1st rejection; this should be pretty rare\n if (rejects.length > 0 && rejects[0].status === \"rejected\") {\n throw rejects[0].reason;\n }\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n}\n\nexport function getOrSet<T extends Record<keyof unknown, unknown>>(\n record: T,\n key: keyof T,\n defaultValue: T[keyof T] | (() => T[keyof T]),\n): T[keyof T] {\n if (record[key] === undefined) {\n record[key] = defaultValue instanceof Function ? defaultValue() : defaultValue;\n }\n return record[key];\n}\n\n/** Defines a getter that replaces itself with its computed value on first access. */\nexport function defineLazyGetter<T extends object, K extends keyof T>(obj: T, key: K, build: () => T[K]): void {\n Object.defineProperty(obj, key, {\n configurable: true,\n get: function getLazyProperty() {\n const value = build();\n Object.defineProperty(obj, key, { configurable: true, value });\n return value;\n },\n });\n}\n\n/**\n * A utility to ensure a Promise-returning method actually returns a promise and doesn't\n * early exit. Using `async function` guarantees these semantics, but sometimes we avoid\n * `async` as a likely-premature optimization to avoid the overhead.\n */\nexport function tryResolve<T>(fn: () => T): Promise<T> {\n try {\n return Promise.resolve(fn());\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\n/** Returns whether `obj` has at least one key, without allocating a keys array. */\nexport function hasAnyKey(obj: Record<any, any> | undefined): boolean {\n for (const _ in obj) return true;\n return false;\n}\n\nexport function fail(message?: string): never {\n throw new Error(message || \"Failed\");\n}\n\nexport function remove<T>(array: T[], t: T): void {\n const index = array.indexOf(t);\n if (index > -1) {\n array.splice(index, 1);\n }\n}\n\nexport function maybeRemove<T>(array: T[] | undefined, t: T): void {\n if (array) remove(array, t);\n}\n\nexport function maybeAdd<T>(array: T[], t: T): void {\n if (!array.includes(t)) {\n array.push(t);\n }\n}\n\nexport function clear<T>(array: T[]): void {\n array.splice(0, array.length);\n}\n\n/** Returns 0 inclusive to n exclusive. */\nexport function zeroTo(n: number): number[] {\n return [...Array(n).keys()];\n}\n\nexport function groupBy<T, Y = T, K = string>(list: readonly T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y[]> {\n const result = new Map<K, Y[]>();\n list.forEach((o) => {\n const group = fn(o);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group)!.push(valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function indexBy<T, Y = T, K = string>(list: T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y> {\n const result = new Map<K, Y>();\n list.forEach((o) => {\n const group = fn(o);\n result.set(group, valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function batched<T>(list: Array<T>, n: number): T[][] {\n const result = [] as T[][];\n for (let i = 0; i < list.length; i += n) {\n result.push(list.slice(i, i + n));\n }\n return result;\n}\n\nexport function partition<T>(array: ReadonlyArray<T>, f: (el: T) => boolean): [T[], T[]] {\n const trueElements: T[] = [];\n const falseElements: T[] = [];\n array.forEach((el) => {\n if (f(el)) {\n trueElements.push(el);\n } else {\n falseElements.push(el);\n }\n });\n return [trueElements, falseElements];\n}\n\n// Utility function to wrap an object or value in an array, unless it's already an array\nexport function toArray<T>(maybeArray: T | T[] | undefined | null): T[] {\n return Array.isArray(maybeArray) ? maybeArray : maybeArray === undefined || maybeArray === null ? [] : [maybeArray];\n}\n\n// Utility type to strip off null and defined and infer only T.\nexport type NullOrDefinedOr<T> = T | null | undefined;\n\nexport function assertNever(x: never): never {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function abbreviation(tableName: string): string {\n return tableName\n .split(\"_\")\n .map((w) => w[0])\n .join(\"\");\n}\n\n/**\n * Utility method for casting `entity` to a `New` entity.\n *\n * Note that we don't actually do any runtime checks; a very simple one would be if the id is undefined,\n * but we want this method to be used in tests that are post-`flush` but still \"know\" the entity is\n * effectively new / fully loaded.\n *\n * Granted, we could do a runtime check that all relations are loaded.\n */\nexport function asNew<T extends Entity>(entity: T): New<T> {\n return entity as New<T>;\n}\n\nexport function compareValues(av: any, bv: any, direction: OrderBy): number {\n const d = direction === \"ASC\" ? 1 : -1;\n if (isReactiveField(av)) {\n av = !av.isSet ? -1 : av.get;\n }\n if (isReactiveField(bv)) {\n bv = !bv.isSet ? -1 : bv.get;\n }\n if (isReference(av) && isReference(bv)) {\n const aIsNew = av.isLoaded && (av as any).get?.isNewEntity;\n const bIsNew = bv.isLoaded && (bv as any).get?.isNewEntity;\n const bothSame = (aIsNew && bIsNew) || (!aIsNew && !bIsNew);\n if (!bothSame) {\n if (aIsNew) return 1 * d; // New entities are always \"greater than\" loaded entities\n if (bIsNew) return -1 * d; // Loaded entities are always \"less than\" new entities\n }\n av = av.idTaggedMaybe ?? (av.isLoaded && (av as any).get?.toString()) ?? undefined;\n bv = bv.idTaggedMaybe ?? (bv.isLoaded && (bv as any).get?.toString()) ?? undefined;\n }\n if (!isDefined(av) || !isDefined(bv)) {\n return !av && !bv ? 0 : (!av ? 1 : -1) * d;\n } else if (typeof av === \"number\" && typeof bv === \"number\") {\n return (av - bv) * d;\n } else if (typeof av === \"string\" && typeof bv === \"string\") {\n return av.localeCompare(bv) * d;\n } else if (av instanceof Date && bv instanceof Date) {\n return ((av as Date).getTime() - (bv as Date).getTime()) * d;\n } else {\n throw new Error(`Unsupported sortBy values ${av}, ${bv}`);\n }\n}\n\n/** A ~naive deep merge that requires already-normalized hints and will mutate `source`. */\n// https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6\nexport function mergeNormalizedHints(target: any, source: any): void {\n for (const key of Object.keys(source)) {\n // We assume both target & source are already normalized, i.e. we won't have\n // source=\"books\" and target={books: \"title\"}. They will both be {books: ...}.\n if (target[key]) {\n mergeNormalizedHints(source[key], target[key]);\n }\n }\n Object.assign(target, source);\n}\n\nconst newLine = /\\n/g;\nconst doubleSpace = / +/g;\n\nexport function cleanStringValue(value: unknown): string | undefined {\n // If this is not a string, coerce it -- or maybe fail?\n let s = typeof value !== \"string\" && value !== undefined && value !== null ? String(value) : value;\n // We always trim to remove leading/trailing spaces\n s = typeof s === \"string\" ? s.trim() : s;\n // And if it's empty string, we swap to undefined (null in the db)\n return s === \"\" || s === null ? undefined : s;\n}\n\n/** Strips new lines/indentation from our `UPDATE` string; doesn't do any actual SQL param escaping/etc. */\nexport function cleanSql(sql: string): string {\n return sql.trim().replace(newLine, \"\").replace(doubleSpace, \" \");\n}\n\n// Collections return an array, so do a hot-path `.flat()`\nexport function flatAndUnique<T extends unknown>(list: (T | T[] | undefined)[]): Set<T> {\n const result = new Set<T>();\n for (const c of list) {\n if (Array.isArray(c)) {\n for (const e of c) result.add(e);\n } else if (c) {\n result.add(c);\n }\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,iBAAuB,cAA+B,UAA0C;CAC9G,OAAO,wBAAwB,UAAU,aAAa,KAAK,QAAQ,IAAI,SAAS,YAAY;AAC9F;AAEA,SAAgB,kBAAqB,SAAyC;CAC5E,MAAM,UAAU,QAAQ,QAAQ,MAAM,EAAE,WAAW,UAAU;CAE7D,IAAI,QAAQ,SAAS,KAAK,QAAQ,EAAE,CAAC,WAAW,YAC9C,MAAM,QAAQ,EAAE,CAAC;CAEnB,OAAO,QAAQ,KAAK,MAAO,EAAgC,KAAK;AAClE;AAEA,SAAgB,SACd,QACA,KACA,cACY;CACZ,IAAI,OAAO,SAAS,KAAA,GAClB,OAAO,OAAO,wBAAwB,WAAW,aAAa,IAAI;CAEpE,OAAO,OAAO;AAChB;;AAGA,SAAgB,iBAAsD,KAAQ,KAAQ,OAAyB;CAC7G,OAAO,eAAe,KAAK,KAAK;EAC9B,cAAc;EACd,KAAK,SAAS,kBAAkB;GAC9B,MAAM,QAAQ,MAAM;GACpB,OAAO,eAAe,KAAK,KAAK;IAAE,cAAc;IAAM;GAAM,CAAC;GAC7D,OAAO;EACT;CACF,CAAC;AACH;;;;;;AAOA,SAAgB,WAAc,IAAyB;CACrD,IAAI;EACF,OAAO,QAAQ,QAAQ,GAAG,CAAC;CAC7B,SAAS,GAAG;EACV,OAAO,QAAQ,OAAO,CAAC;CACzB;AACF;;AAGA,SAAgB,UAAU,KAA4C;CACpE,KAAK,MAAM,KAAK,KAAK,OAAO;CAC5B,OAAO;AACT;AAEA,SAAgB,KAAK,SAAyB;CAC5C,MAAM,IAAI,MAAM,WAAW,QAAQ;AACrC;AAEA,SAAgB,OAAU,OAAY,GAAY;CAChD,MAAM,QAAQ,MAAM,QAAQ,CAAC;CAC7B,IAAI,QAAQ,IACV,MAAM,OAAO,OAAO,CAAC;AAEzB;AAEA,SAAgB,YAAe,OAAwB,GAAY;CACjE,IAAI,OAAO,OAAO,OAAO,CAAC;AAC5B;AAEA,SAAgB,SAAY,OAAY,GAAY;CAClD,IAAI,CAAC,MAAM,SAAS,CAAC,GACnB,MAAM,KAAK,CAAC;AAEhB;AAEA,SAAgB,MAAS,OAAkB;CACzC,MAAM,OAAO,GAAG,MAAM,MAAM;AAC9B;;AAGA,SAAgB,OAAO,GAAqB;CAC1C,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5B;AAEA,SAAgB,QAA8B,MAAoB,IAAiB,SAAoC;CACrH,MAAM,yBAAS,IAAI,IAAY;CAC/B,KAAK,SAAS,MAAM;EAClB,MAAM,QAAQ,GAAG,CAAC;EAClB,IAAI,CAAC,OAAO,IAAI,KAAK,GACnB,OAAO,IAAI,OAAO,CAAC,CAAC;EAEtB,OAAO,IAAI,KAAK,CAAC,CAAE,KAAK,YAAY,KAAA,IAAa,IAAiB,QAAQ,CAAC,CAAC;CAC9E,CAAC;CACD,OAAO;AACT;AAEA,SAAgB,QAA8B,MAAW,IAAiB,SAAkC;CAC1G,MAAM,yBAAS,IAAI,IAAU;CAC7B,KAAK,SAAS,MAAM;EAClB,MAAM,QAAQ,GAAG,CAAC;EAClB,OAAO,IAAI,OAAO,YAAY,KAAA,IAAa,IAAiB,QAAQ,CAAC,CAAC;CACxE,CAAC;CACD,OAAO;AACT;AAEA,SAAgB,QAAW,MAAgB,GAAkB;CAC3D,MAAM,SAAS,CAAC;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GACpC,OAAO,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;CAElC,OAAO;AACT;AAEA,SAAgB,UAAa,OAAyB,GAAmC;CACvF,MAAM,eAAoB,CAAC;CAC3B,MAAM,gBAAqB,CAAC;CAC5B,MAAM,SAAS,OAAO;EACpB,IAAI,EAAE,EAAE,GACN,aAAa,KAAK,EAAE;OAEpB,cAAc,KAAK,EAAE;CAEzB,CAAC;CACD,OAAO,CAAC,cAAc,aAAa;AACrC;AAGA,SAAgB,QAAW,YAA6C;CACtE,OAAO,MAAM,QAAQ,UAAU,IAAI,aAAa,eAAe,KAAA,KAAa,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU;AACpH;AAKA,SAAgB,YAAY,GAAiB;CAC3C,MAAM,IAAI,MAAM,wBAAwB,CAAC;AAC3C;AAEA,SAAgB,aAAa,WAA2B;CACtD,OAAO,UACJ,MAAM,GAAG,CAAC,CACV,KAAK,MAAM,EAAE,EAAE,CAAC,CAChB,KAAK,EAAE;AACZ;;;;;;;;;;AAWA,SAAgB,MAAwB,QAAmB;CACzD,OAAO;AACT;AAEA,SAAgB,cAAc,IAAS,IAAS,WAA4B;CAC1E,MAAM,IAAI,cAAc,QAAQ,IAAI;CACpC,IAAI,gBAAgB,EAAE,GACpB,KAAK,CAAC,GAAG,QAAQ,KAAK,GAAG;CAE3B,IAAI,gBAAgB,EAAE,GACpB,KAAK,CAAC,GAAG,QAAQ,KAAK,GAAG;CAE3B,IAAI,YAAY,EAAE,KAAK,YAAY,EAAE,GAAG;EACtC,MAAM,SAAS,GAAG,YAAa,GAAW,KAAK;EAC/C,MAAM,SAAS,GAAG,YAAa,GAAW,KAAK;EAE/C,IAAI,EADc,UAAU,UAAY,CAAC,UAAU,CAAC,SACrC;GACb,IAAI,QAAQ,OAAO,IAAI;GACvB,IAAI,QAAQ,OAAO,KAAK;EAC1B;EACA,KAAK,GAAG,kBAAkB,GAAG,YAAa,GAAW,KAAK,SAAS,MAAM,KAAA;EACzE,KAAK,GAAG,kBAAkB,GAAG,YAAa,GAAW,KAAK,SAAS,MAAM,KAAA;CAC3E;CACA,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,GACjC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,MAAM;MACpC,IAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UACjD,QAAQ,KAAK,MAAM;MACd,IAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UACjD,OAAO,GAAG,cAAc,EAAE,IAAI;MACzB,IAAI,cAAc,QAAQ,cAAc,MAC7C,QAAS,GAAY,QAAQ,IAAK,GAAY,QAAQ,KAAK;MAE3D,MAAM,IAAI,MAAM,6BAA6B,GAAG,IAAI,IAAI;AAE5D;;AAIA,SAAgB,qBAAqB,QAAa,QAAmB;CACnE,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAGlC,IAAI,OAAO,MACT,qBAAqB,OAAO,MAAM,OAAO,IAAI;CAGjD,OAAO,OAAO,QAAQ,MAAM;AAC9B;AAEA,MAAM,UAAU;AAChB,MAAM,cAAc;AAEpB,SAAgB,iBAAiB,OAAoC;CAEnE,IAAI,IAAI,OAAO,UAAU,YAAY,UAAU,KAAA,KAAa,UAAU,OAAO,OAAO,KAAK,IAAI;CAE7F,IAAI,OAAO,MAAM,WAAW,EAAE,KAAK,IAAI;CAEvC,OAAO,MAAM,MAAM,MAAM,OAAO,KAAA,IAAY;AAC9C;;AAGA,SAAgB,SAAS,KAAqB;CAC5C,OAAO,IAAI,KAAK,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,aAAa,GAAG;AACjE;AAGA,SAAgB,cAAiC,MAAuC;CACtF,MAAM,yBAAS,IAAI,IAAO;CAC1B,KAAK,MAAM,KAAK,MACd,IAAI,MAAM,QAAQ,CAAC,GACjB,KAAK,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC;MAC1B,IAAI,GACT,OAAO,IAAI,CAAC;CAGhB,OAAO;AACT"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { type Entity } from \"./Entity.ts\";\nimport { isDefined } from \"./EntityManager.ts\";\nimport { type New } from \"./loadHints.ts\";\nimport type { OrderBy } from \"./queries/find/EntityFilter.ts\";\nimport { isReactiveField, isReference } from \"./relations/index.ts\";\n\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * Given a `MaybePromise` of T, invoke `callback` against `T` either immediately or via `then`.\n *\n * This is the same as:\n *\n * ```\n * const r = await maybePromise;\n * return callback(r;;\n * ```\n *\n * But saves an `await` if `maybePromise` is not actually a promise.\n */\nexport function maybePromiseThen<T, U>(promiseOrObj: MaybePromise<T>, callback: (obj: T) => U): MaybePromise<U> {\n return promiseOrObj instanceof Promise ? promiseOrObj.then(callback) : callback(promiseOrObj);\n}\n\nexport function failIfAnyRejected<T>(results: PromiseSettledResult<T>[]): T[] {\n const rejects = results.filter((r) => r.status === \"rejected\");\n // For now just throw the 1st rejection; this should be pretty rare\n if (rejects.length > 0 && rejects[0].status === \"rejected\") {\n throw rejects[0].reason;\n }\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n}\n\nexport function getOrSet<T extends Record<keyof unknown, unknown>>(\n record: T,\n key: keyof T,\n defaultValue: T[keyof T] | (() => T[keyof T]),\n): T[keyof T] {\n if (record[key] === undefined) {\n record[key] = defaultValue instanceof Function ? defaultValue() : defaultValue;\n }\n return record[key];\n}\n\n/** Defines a getter that replaces itself with its computed value on first access. */\nexport function defineLazyGetter<T extends object, K extends keyof T>(obj: T, key: K, build: () => T[K]): void {\n Object.defineProperty(obj, key, {\n configurable: true,\n get: function getLazyProperty() {\n const value = build();\n Object.defineProperty(obj, key, { configurable: true, value });\n return value;\n },\n });\n}\n\n/**\n * A utility to ensure a Promise-returning method actually returns a promise and doesn't\n * early exit. Using `async function` guarantees these semantics, but sometimes we avoid\n * `async` as a likely-premature optimization to avoid the overhead.\n */\nexport function tryResolve<T>(fn: () => T): Promise<T> {\n try {\n return Promise.resolve(fn());\n } catch (e) {\n return Promise.reject(e);\n }\n}\n\n/** Returns whether `obj` has at least one key, without allocating a keys array. */\nexport function hasAnyKey(obj: Record<any, any> | undefined): boolean {\n for (const _ in obj) return true;\n return false;\n}\n\nexport function fail(message?: string): never {\n throw new Error(message || \"Failed\");\n}\n\nexport function remove<T>(array: T[], t: T): void {\n const index = array.indexOf(t);\n if (index > -1) {\n array.splice(index, 1);\n }\n}\n\nexport function maybeRemove<T>(array: T[] | undefined, t: T): void {\n if (array) remove(array, t);\n}\n\nexport function maybeAdd<T>(array: T[], t: T): void {\n if (!array.includes(t)) {\n array.push(t);\n }\n}\n\nexport function clear<T>(array: T[]): void {\n array.splice(0, array.length);\n}\n\n/** Returns 0 inclusive to n exclusive. */\nexport function zeroTo(n: number): number[] {\n return [...Array(n).keys()];\n}\n\nexport function groupBy<T, Y = T, K = string>(list: readonly T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y[]> {\n const result = new Map<K, Y[]>();\n list.forEach((o) => {\n const group = fn(o);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group)!.push(valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function indexBy<T, Y = T, K = string>(list: T[], fn: (x: T) => K, valueFn?: (x: T) => Y): Map<K, Y> {\n const result = new Map<K, Y>();\n list.forEach((o) => {\n const group = fn(o);\n result.set(group, valueFn === undefined ? (o as any as Y) : valueFn(o));\n });\n return result;\n}\n\nexport function batched<T>(list: Array<T>, n: number): T[][] {\n const result = [] as T[][];\n for (let i = 0; i < list.length; i += n) {\n result.push(list.slice(i, i + n));\n }\n return result;\n}\n\nexport function partition<T>(array: ReadonlyArray<T>, f: (el: T) => boolean): [T[], T[]] {\n const trueElements: T[] = [];\n const falseElements: T[] = [];\n array.forEach((el) => {\n if (f(el)) {\n trueElements.push(el);\n } else {\n falseElements.push(el);\n }\n });\n return [trueElements, falseElements];\n}\n\n// Utility function to wrap an object or value in an array, unless it's already an array\nexport function toArray<T>(maybeArray: T | T[] | undefined | null): T[] {\n return Array.isArray(maybeArray) ? maybeArray : maybeArray === undefined || maybeArray === null ? [] : [maybeArray];\n}\n\n// Utility type to strip off null and defined and infer only T.\nexport type NullOrDefinedOr<T> = T | null | undefined;\n\nexport function assertNever(x: never): never {\n throw new Error(\"Unexpected object: \" + x);\n}\n\nexport function abbreviation(tableName: string): string {\n return tableName\n .split(\"_\")\n .map((w) => w[0])\n .join(\"\");\n}\n\n/**\n * Utility method for casting `entity` to a `New` entity.\n *\n * Note that we don't actually do any runtime checks; a very simple one would be if the id is undefined,\n * but we want this method to be used in tests that are post-`flush` but still \"know\" the entity is\n * effectively new / fully loaded.\n *\n * Granted, we could do a runtime check that all relations are loaded.\n */\nexport function asNew<T extends Entity>(entity: T): New<T> {\n return entity as New<T>;\n}\n\nexport function compareValues(av: any, bv: any, direction: OrderBy): number {\n const d = direction === \"ASC\" ? 1 : -1;\n if (isReactiveField(av)) {\n av = !av.isSet ? -1 : av.get;\n }\n if (isReactiveField(bv)) {\n bv = !bv.isSet ? -1 : bv.get;\n }\n if (isReference(av) && isReference(bv)) {\n const aIsNew = av.isLoaded && (av as any).get?.isNewEntity;\n const bIsNew = bv.isLoaded && (bv as any).get?.isNewEntity;\n const bothSame = (aIsNew && bIsNew) || (!aIsNew && !bIsNew);\n if (!bothSame) {\n if (aIsNew) return 1 * d; // New entities are always \"greater than\" loaded entities\n if (bIsNew) return -1 * d; // Loaded entities are always \"less than\" new entities\n }\n av = av.idTaggedMaybe ?? (av.isLoaded && (av as any).get?.toString()) ?? undefined;\n bv = bv.idTaggedMaybe ?? (bv.isLoaded && (bv as any).get?.toString()) ?? undefined;\n }\n if (!isDefined(av) || !isDefined(bv)) {\n return !av && !bv ? 0 : (!av ? 1 : -1) * d;\n } else if (typeof av === \"number\" && typeof bv === \"number\") {\n return (av - bv) * d;\n } else if (typeof av === \"string\" && typeof bv === \"string\") {\n return av.localeCompare(bv) * d;\n } else if (av instanceof Date && bv instanceof Date) {\n return ((av as Date).getTime() - (bv as Date).getTime()) * d;\n } else {\n throw new Error(`Unsupported sortBy values ${av}, ${bv}`);\n }\n}\n\n/** A ~naive deep merge that requires already-normalized hints and will mutate `source`. */\n// https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6\nexport function mergeNormalizedHints(target: any, source: any): void {\n for (const key of Object.keys(source)) {\n // We assume both target & source are already normalized, i.e. we won't have\n // source=\"books\" and target={books: \"title\"}. They will both be {books: ...}.\n if (target[key]) {\n mergeNormalizedHints(source[key], target[key]);\n }\n }\n Object.assign(target, source);\n}\n\nconst newLine = /\\n/g;\nconst doubleSpace = / +/g;\n\nexport function cleanStringValue(value: unknown): string | undefined {\n // If this is not a string, coerce it -- or maybe fail?\n let s = typeof value !== \"string\" && value !== undefined && value !== null ? String(value) : value;\n // We always trim to remove leading/trailing spaces\n s = typeof s === \"string\" ? s.trim() : s;\n // And if it's empty string, we swap to undefined (null in the db)\n return s === \"\" || s === null ? undefined : s;\n}\n\n/** Strips new lines/indentation from our `UPDATE` string; doesn't do any actual SQL param escaping/etc. */\nexport function cleanSql(sql: string): string {\n return sql.trim().replace(newLine, \"\").replace(doubleSpace, \" \");\n}\n\n// Collections return an array, so do a hot-path `.flat()`\nexport function flatAndUnique<T extends unknown>(list: (T | T[] | undefined)[]): Set<T> {\n const result = new Set<T>();\n for (const c of list) {\n if (Array.isArray(c)) {\n for (const e of c) result.add(e);\n } else if (c) {\n result.add(c);\n }\n }\n return result;\n}\n"],"mappings":"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"}
@@ -2,13 +2,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_relations_Collection = require("./relations/Collection.cjs");
3
3
  const require_relations_hasProperty = require("./relations/hasProperty.cjs");
4
4
  const require_relations_Reference = require("./relations/Reference.cjs");
5
+ const require_relations_ReactiveGetter = require("./relations/ReactiveGetter.cjs");
5
6
  const require_relations_Relation = require("./relations/Relation.cjs");
7
+ const require_loadHints = require("./loadHints.cjs");
8
+ const require_utils = require("./utils.cjs");
6
9
  const require_relations_ReactiveField = require("./relations/ReactiveField.cjs");
7
- const require_relations_ReactiveGetter = require("./relations/ReactiveGetter.cjs");
8
10
  const require_relations_AsyncReactiveField = require("./relations/AsyncReactiveField.cjs");
9
11
  require("./relations/index.cjs");
10
- const require_loadHints = require("./loadHints.cjs");
11
- const require_utils = require("./utils.cjs");
12
12
  require("./Entity.cjs");
13
13
  //#region src/withLoaded.ts
14
14
  function withLoaded(loadedOrPromise) {
@@ -1,13 +1,13 @@
1
1
  import { isLoadedCollection } from "./relations/Collection.js";
2
2
  import { isLoadedProperty, isProperty } from "./relations/hasProperty.js";
3
3
  import { isLoadedReference } from "./relations/Reference.js";
4
+ import { isReactiveGetter } from "./relations/ReactiveGetter.js";
4
5
  import { isRelation } from "./relations/Relation.js";
6
+ import { assertLoaded } from "./loadHints.js";
7
+ import { fail, maybePromiseThen } from "./utils.js";
5
8
  import { isReactiveField } from "./relations/ReactiveField.js";
6
- import { isReactiveGetter } from "./relations/ReactiveGetter.js";
7
9
  import { isAsyncReactiveField, isLoadedAsyncReactiveField } from "./relations/AsyncReactiveField.js";
8
10
  import "./relations/index.js";
9
- import { assertLoaded } from "./loadHints.js";
10
- import { fail, maybePromiseThen } from "./utils.js";
11
11
  import "./Entity.js";
12
12
  //#region src/withLoaded.ts
13
13
  function withLoaded(loadedOrPromise) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "joist-core",
3
- "version": "2.3.0-next.96",
3
+ "version": "2.3.0-next.97",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "repository": {
@@ -42,7 +42,7 @@
42
42
  "build"
43
43
  ],
44
44
  "peerDependencies": {
45
- "joist-utils": "2.3.0-next.96"
45
+ "joist-utils": "2.3.0-next.97"
46
46
  },
47
47
  "dependencies": {
48
48
  "ansis": "^4.3.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"AliasAssigner.cjs","names":["abbreviation","#aliases","#nextAlias"],"sources":["../src/AliasAssigner.ts"],"sourcesContent":["import { type ParsedFindQuery } from \"./QueryParser.ts\";\nimport { abbreviation } from \"./utils.ts\";\n\nexport class AliasAssigner {\n #aliases: Record<string, number> = {};\n\n constructor(query?: ParsedFindQuery) {\n this.getAlias = this.getAlias.bind(this);\n this.getLiteralAlias = this.getLiteralAlias.bind(this);\n // If we're assigning aliases into an existing query, get the current assignments\n if (query) {\n for (const table of query.tables) {\n // Ignore CTI base/sub aliases\n if (table.alias.includes(\"_\")) continue;\n const abbrev = abbreviation(table.table);\n const i = this.#aliases[abbrev] || 0;\n const j = Number(table.alias.replace(abbrev, \"\")) + 1;\n this.#aliases[abbrev] = Math.max(i, j);\n }\n }\n }\n\n /** Returns an abbreviated alias for a table name, e.g. `\"books\"` → `\"b\"`, `\"book_reviews\"` → `\"br\"`. */\n getAlias(tableName: string): string {\n const abbrev = abbreviation(tableName);\n return this.#nextAlias(abbrev);\n }\n\n /** Returns an alias using the name as-is (no abbreviation), e.g. `\"prequel\"` → `\"prequel\"`. */\n getLiteralAlias(name: string): string {\n return this.#nextAlias(name);\n }\n\n #nextAlias(key: string): string {\n const i = this.#aliases[key] || 0;\n this.#aliases[key] = i + 1;\n return i === 0 ? key : `${key}${i}`;\n }\n}\n"],"mappings":";;;;AAGA,IAAa,gBAAb,MAA2B;CACzB,WAAmC,CAAC;CAEpC,YAAY,OAAyB;EACnC,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;EAErD,IAAI,OACF,KAAK,MAAM,SAAS,MAAM,QAAQ;GAEhC,IAAI,MAAM,MAAM,SAAS,GAAG,GAAG;GAC/B,MAAM,SAASA,cAAAA,aAAa,MAAM,KAAK;GACvC,MAAM,IAAI,KAAKC,SAAS,WAAW;GACnC,MAAM,IAAI,OAAO,MAAM,MAAM,QAAQ,QAAQ,EAAE,CAAC,IAAI;GACpD,KAAKA,SAAS,UAAU,KAAK,IAAI,GAAG,CAAC;EACvC;CAEJ;;CAGA,SAAS,WAA2B;EAClC,MAAM,SAASD,cAAAA,aAAa,SAAS;EACrC,OAAO,KAAKE,WAAW,MAAM;CAC/B;;CAGA,gBAAgB,MAAsB;EACpC,OAAO,KAAKA,WAAW,IAAI;CAC7B;CAEA,WAAW,KAAqB;EAC9B,MAAM,IAAI,KAAKD,SAAS,QAAQ;EAChC,KAAKA,SAAS,OAAO,IAAI;EACzB,OAAO,MAAM,IAAI,MAAM,GAAG,MAAM;CAClC;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AliasAssigner.d.cts","names":[],"sources":["../src/AliasAssigner.ts"],"mappings":";;cAGa;;EAGX,YAAY,QAAQ;;EAiBpB,SAAS;;EAMT,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AliasAssigner.d.mts","names":[],"sources":["../src/AliasAssigner.ts"],"mappings":";;cAGa;;EAGX,YAAY,QAAQ;;EAiBpB,SAAS;;EAMT,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AliasAssigner.js","names":["#aliases","#nextAlias"],"sources":["../src/AliasAssigner.ts"],"sourcesContent":["import { type ParsedFindQuery } from \"./QueryParser.ts\";\nimport { abbreviation } from \"./utils.ts\";\n\nexport class AliasAssigner {\n #aliases: Record<string, number> = {};\n\n constructor(query?: ParsedFindQuery) {\n this.getAlias = this.getAlias.bind(this);\n this.getLiteralAlias = this.getLiteralAlias.bind(this);\n // If we're assigning aliases into an existing query, get the current assignments\n if (query) {\n for (const table of query.tables) {\n // Ignore CTI base/sub aliases\n if (table.alias.includes(\"_\")) continue;\n const abbrev = abbreviation(table.table);\n const i = this.#aliases[abbrev] || 0;\n const j = Number(table.alias.replace(abbrev, \"\")) + 1;\n this.#aliases[abbrev] = Math.max(i, j);\n }\n }\n }\n\n /** Returns an abbreviated alias for a table name, e.g. `\"books\"` → `\"b\"`, `\"book_reviews\"` → `\"br\"`. */\n getAlias(tableName: string): string {\n const abbrev = abbreviation(tableName);\n return this.#nextAlias(abbrev);\n }\n\n /** Returns an alias using the name as-is (no abbreviation), e.g. `\"prequel\"` → `\"prequel\"`. */\n getLiteralAlias(name: string): string {\n return this.#nextAlias(name);\n }\n\n #nextAlias(key: string): string {\n const i = this.#aliases[key] || 0;\n this.#aliases[key] = i + 1;\n return i === 0 ? key : `${key}${i}`;\n }\n}\n"],"mappings":";;;AAGA,IAAa,gBAAb,MAA2B;CACzB,WAAmC,CAAC;CAEpC,YAAY,OAAyB;EACnC,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;EAErD,IAAI,OACF,KAAK,MAAM,SAAS,MAAM,QAAQ;GAEhC,IAAI,MAAM,MAAM,SAAS,GAAG,GAAG;GAC/B,MAAM,SAAS,aAAa,MAAM,KAAK;GACvC,MAAM,IAAI,KAAKA,SAAS,WAAW;GACnC,MAAM,IAAI,OAAO,MAAM,MAAM,QAAQ,QAAQ,EAAE,CAAC,IAAI;GACpD,KAAKA,SAAS,UAAU,KAAK,IAAI,GAAG,CAAC;EACvC;CAEJ;;CAGA,SAAS,WAA2B;EAClC,MAAM,SAAS,aAAa,SAAS;EACrC,OAAO,KAAKC,WAAW,MAAM;CAC/B;;CAGA,gBAAgB,MAAsB;EACpC,OAAO,KAAKA,WAAW,IAAI;CAC7B;CAEA,WAAW,KAAqB;EAC9B,MAAM,IAAI,KAAKD,SAAS,QAAQ;EAChC,KAAKA,SAAS,OAAO,IAAI;EACzB,OAAO,MAAM,IAAI,MAAM,GAAG,MAAM;CAClC;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Aliases.cjs","names":["getMetadata","withDeferredAlias","fail","skipCondition","makeLike","mapToDb","groupBy","getConstructorFromTaggedId","maybeResolveReferenceToId","getBaseAndSelfMetas"],"sources":["../src/Aliases.ts"],"sourcesContent":["import { groupBy } from \"joist-utils\";\n\nimport { type Column } from \"./columns.ts\";\nimport { type PredicateBrand } from \"./conditions.ts\";\n// Load configure first: relations must not evaluate before their base classes exist.\nimport { getConstructorFromTaggedId } from \"./configure.ts\";\nimport { withDeferredAlias } from \"./DeferredAlias.ts\";\nimport { type Entity } from \"./Entity.ts\";\nimport { type ExpressionCondition } from \"./EntityFilter.ts\";\nimport { type IdOf, type MaybeAbstractEntityConstructor, type TaggedId } from \"./EntityManager.ts\";\nimport {\n type EntityMetadata,\n type Field,\n type PolymorphicField,\n type PolymorphicFieldComponent,\n getBaseAndSelfMetas,\n getMetadata,\n} from \"./EntityMetadata.ts\";\nimport { maybeResolveReferenceToId } from \"./keys.ts\";\nimport { type ColumnCondition, type ParsedValueFilter, type RawCondition, makeLike, mapToDb } from \"./QueryParser.ts\";\nimport { skipCondition } from \"./skipCondition.ts\";\nimport { type FieldsOf } from \"./typeMap.ts\";\nimport { fail } from \"./utils.ts\";\n\n/** Creates an alias for complex domain filtering in `em.find`. */\nexport function alias<T extends Entity>(cstr: MaybeAbstractEntityConstructor<T>): Alias<T> {\n return newAliasProxy(cstr);\n}\n\n/** Creates multiple aliases for complex filtering. */\nexport function aliases<T extends readonly MaybeAbstractEntityConstructor<any>[]>(\n ...types: T\n): { [P in keyof T]: T[P] extends MaybeAbstractEntityConstructor<infer E extends Entity> ? Alias<E> : never } {\n return types.map((t) => newAliasProxy(t)) as any;\n}\n\nexport const aliasMgmt = Symbol(\"aliasMgmt\");\nconst aliasColumn = Symbol(\"aliasColumn\");\n\n/** The identity and original entity metadata of an `em.find` alias. */\nexport interface AliasMgmt {\n tableName: string;\n meta: EntityMetadata;\n /**\n * Builds a raw condition using each query's bound metadata and SQL alias, before join pruning.\n * Return a fresh condition instead of mutating shared state; the callback runs only when used.\n */\n condition(build: (meta: EntityMetadata, alias: string) => RawCondition): RawCondition & PredicateBrand<\"domain\">;\n}\n\n/** Keeps domain aliases covariant in their entity type. */\nexport interface AliasBrand<T> extends AliasMgmt {\n readonly __entity: T;\n}\n\n/**\n * Domain field predicates, deliberately separate from SQL table expressions.\n *\n * An Alias names a place in an em.find relationship tree, not a fixed SQL table occurrence.\n * I.e. with `a = alias(Author)`, `{ author: { as: a } }` binds `a` to the Book's Author;\n * binding it under `{ author: { mentor: { as: a } } }` instead makes it the Author's mentor.\n * The find parser builds those joins and knows which entity metadata and SQL name apply there,\n * including any inheritance joins. The Alias cannot know that when `a.firstName.eq(name)` is created.\n *\n * DeferredAlias therefore resolves each predicate to a fresh column/raw condition using that parse's\n * binding. The resolved condition records the SQL aliases it reads, including both sides of a\n * cross-alias comparison. Join pruning uses those references to retain the joins the filter needs.\n * An undefined predicate is skipped, so it does not keep an otherwise-unused join alive; explicit\n * keepAliases and other query dependencies can still retain that join.\n *\n * Table expressions solve a different problem: their sources are supplied directly in from/join,\n * so they render through ExprContext rather than asking the find parser to bind a relationship path.\n * Neither path stores a resolved SQL name on the reusable handle or predicate.\n */\nexport type Alias<T extends Entity> = { readonly [aliasMgmt]: AliasBrand<T> } & {\n [P in keyof FieldsOf<T>]: P extends \"id\"\n ? EntityAlias<T>\n : FieldsOf<T>[P] extends { kind: \"primitive\" | \"enum\"; type: infer V; nullable: infer N }\n ? PrimitiveAlias<V, N extends undefined ? null : never>\n : FieldsOf<T>[P] extends { kind: \"m2o\"; type: infer U extends Entity; nullable: infer N }\n ? EntityAlias<U, N extends undefined ? null : never>\n : FieldsOf<T>[P] extends { kind: \"poly\"; type: infer U extends Entity }\n ? PolyAlias<U>\n : never;\n};\n\n/** A domain column accepted on the other side of a cross-alias comparison. */\nexport interface AliasColumn<V> {\n readonly [aliasColumn]: V;\n}\n\nexport interface PrimitiveAlias<V, N extends null | never = never> extends AliasColumn<V | N> {\n eq(value: V | N | AliasColumn<V | null> | undefined): ExpressionCondition;\n ne(value: V | N | AliasColumn<V | null> | undefined): ExpressionCondition;\n in(values: readonly (V | null)[] | undefined): ExpressionCondition;\n nin(values: readonly (V | null)[] | undefined): ExpressionCondition;\n gt(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n gte(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n lt(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n lte(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n like(value: V | undefined): ExpressionCondition;\n ilike(value: V | undefined): ExpressionCondition;\n search(value: V | undefined): ExpressionCondition;\n between(v1: V | undefined, v2: V | undefined): ExpressionCondition;\n // V is already an array; strings also support jsonb contains.\n contains(value: string | V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n ncontains(value: string | V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n overlaps(value: V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n noverlaps(value: V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n /** Adds a parameterized JSON path existence condition using `@?`. */\n pathExists(jsonPath: string | undefined): ExpressionCondition;\n /** Adds a parameterized JSON path predicate condition using `@@`. */\n pathIsTrue(jsonPath: string | undefined): ExpressionCondition;\n /** Adds an operator and expression with knex-style placeholders, without the column name. */\n raw(exp: string, bindings: readonly unknown[] | undefined): ExpressionCondition;\n}\n\nexport interface EntityAlias<T, N extends null | never = never> extends AliasColumn<IdOf<T> | N> {\n eq(value: T | IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n ne(value: T | IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n // Adding `| null` for GraphQL support\n in(values: readonly (T | IdOf<T> | null)[] | null | undefined): ExpressionCondition;\n nin(values: readonly (T | IdOf<T> | null)[] | null | undefined): ExpressionCondition;\n gt(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n gte(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n lt(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n lte(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n raw(exp: string, bindings: readonly unknown[] | undefined): ExpressionCondition;\n}\n\nexport interface PolyAlias<T extends Entity> {\n eq(value: T | TaggedId | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n ne(value: T | TaggedId | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n in(values: readonly (T | TaggedId)[] | undefined): ExpressionCondition;\n}\n\n/** Returns the runtime identity bound by the find parser. */\nexport function getAliasMgmt(alias: { readonly [aliasMgmt]: AliasMgmt }): AliasMgmt {\n return alias[aliasMgmt];\n}\n\n/** Returns the original metadata, preserving STI subtype identity. */\nexport function getAliasMetadata<T extends Entity>(alias: Alias<T>): EntityMetadata<T> {\n return alias[aliasMgmt].meta as EntityMetadata<T>;\n}\n\n/** Creates domain predicates lazily from entity field metadata. */\nexport function newAliasProxy<T extends Entity>(cstr: MaybeAbstractEntityConstructor<T>): Alias<T> {\n const meta = getMetadata(cstr);\n const mgmt: AliasMgmt = {\n tableName: meta.tableName,\n meta,\n condition(build) {\n const cond: RawCondition = { kind: \"raw\", aliases: [], condition: \"unset\", bindings: [], pruneable: false };\n return withDeferredAlias(cond, (resolve, copy) => {\n const bound = resolve(mgmt);\n Object.assign(copy, build(bound.meta, bound.alias));\n });\n },\n };\n return new Proxy(cstr, {\n get(_, key) {\n if (key === aliasMgmt) return mgmt;\n if (typeof key !== \"string\") return undefined;\n const field = meta.allFields[key] ?? fail(`No field ${key} on ${cstr.name}`);\n if (field.kind === \"poly\") return new PolyReferenceAlias(meta, mgmt, field);\n if ([\"primaryKey\", \"primitive\", \"enum\", \"m2o\"].includes(field.kind)) {\n return new AliasColumnImpl(meta, field, field.serde!.columns[0], mgmt);\n }\n return fail(`Unsupported alias field kind ${field.kind}`);\n },\n has(_, key) {\n return key === aliasMgmt || key in meta.allFields;\n },\n }) as unknown as Alias<T>;\n}\n\n/** Recognizes only domain aliases, not physical tables. */\nexport function isAlias(value: unknown): value is Alias<Entity> {\n return typeof value === \"function\" && aliasMgmt in value;\n}\n\n/** Builds field conditions without implementing the SQL expression protocol. */\nclass AliasColumnImpl {\n declare readonly [aliasColumn]: unknown;\n\n constructor(\n readonly meta: EntityMetadata,\n readonly field: Field & { aliasSuffix: string },\n readonly column: Column,\n readonly mgmt: AliasMgmt,\n ) {}\n\n eq(value: unknown): ExpressionCondition {\n return this.compare(\"eq\", \"=\", value);\n }\n ne(value: unknown): ExpressionCondition {\n return this.compare(\"ne\", \"!=\", value);\n }\n gt(value: unknown): ExpressionCondition {\n return this.compare(\"gt\", \">\", value);\n }\n gte(value: unknown): ExpressionCondition {\n return this.compare(\"gte\", \">=\", value);\n }\n lt(value: unknown): ExpressionCondition {\n return this.compare(\"lt\", \"<\", value);\n }\n lte(value: unknown): ExpressionCondition {\n return this.compare(\"lte\", \"<=\", value);\n }\n contains(value: unknown): ExpressionCondition {\n return this.compare(\"contains\", \"@>\", value);\n }\n ncontains(value: unknown): ExpressionCondition {\n if (value instanceof AliasColumnImpl) return crossColumnCondition(this, value, \"@>\", true);\n return this.addCondition({ kind: \"ncontains\", value: value as readonly unknown[] });\n }\n overlaps(value: unknown): ExpressionCondition {\n return this.compare(\"overlaps\", \"&&\", value);\n }\n noverlaps(value: unknown): ExpressionCondition {\n if (value instanceof AliasColumnImpl) return crossColumnCondition(this, value, \"&&\", true);\n return this.addCondition({ kind: \"noverlaps\", value: value as readonly unknown[] });\n }\n\n in(values: readonly unknown[] | null | undefined): ExpressionCondition {\n if (values === undefined) return skipCondition;\n if (values === null) return fail(\"Unsupported\");\n if (values.includes(null)) {\n return {\n or: [\n this.addCondition({ kind: \"is-null\" }),\n this.addCondition({ kind: \"in\", value: values.filter((v) => v !== null) }),\n ],\n };\n }\n return this.addCondition({ kind: \"in\", value: [...values] });\n }\n\n nin(values: readonly unknown[] | null | undefined): ExpressionCondition {\n if (values === undefined) return skipCondition;\n if (values === null) return fail(\"Unsupported\");\n return this.addCondition({ kind: \"nin\", value: values.filter((v) => v !== null) });\n }\n\n between(v1: unknown, v2: unknown): ExpressionCondition {\n if (v1 === undefined || v2 === undefined) return skipCondition;\n return this.addCondition({ kind: \"between\", value: [v1, v2] });\n }\n\n like(value: unknown): ExpressionCondition {\n return this.addCondition({ kind: \"like\", value });\n }\n ilike(value: unknown): ExpressionCondition {\n return this.addCondition({ kind: \"ilike\", value });\n }\n search(value: unknown): ExpressionCondition {\n // Check !value so that empty strings are pruned\n return !value ? skipCondition : this.addCondition({ kind: \"ilike\", value: makeLike(value) });\n }\n pathExists(value: string | undefined): ExpressionCondition {\n return this.addCondition({ kind: \"jsonPathExists\", value: value! });\n }\n pathIsTrue(value: string | undefined): ExpressionCondition {\n return this.addCondition({ kind: \"jsonPathPredicate\", value: value! });\n }\n\n raw(exp: string, bindings: readonly unknown[] | undefined): ExpressionCondition {\n if (bindings === undefined) return skipCondition;\n const cond: RawCondition = { kind: \"raw\", aliases: [], condition: \"unset\", pruneable: false, bindings };\n return withDeferredAlias(cond, (resolve, copy) => {\n const r = resolve(this.mgmt);\n const alias = getMaybeCtiAlias(this.meta, this.field, r.meta, r.alias);\n copy.aliases = [alias];\n copy.condition = `${alias}.${this.column.columnName} ${exp}`;\n });\n }\n\n /** Maps literal values through the field serde and binds aliases only when parsing. */\n addCondition(value: ParsedValueFilter<unknown>): ExpressionCondition {\n if (\"value\" in value && value.value === undefined) return skipCondition;\n const cond: ColumnCondition = {\n kind: \"column\",\n alias: \"unset\",\n column: this.column.columnName,\n dbType: this.column.dbType,\n cond: mapToDb(this.column, value),\n };\n return withDeferredAlias(cond, (resolve, copy) => {\n const r = resolve(this.mgmt);\n copy.alias = getMaybeCtiAlias(this.meta, this.field, r.meta, r.alias);\n });\n }\n\n /** Handles literal values, NULL, and domain cross-alias comparisons. */\n private compare(\n kind: \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"contains\" | \"ncontains\" | \"overlaps\",\n op: string,\n value: unknown,\n ): ExpressionCondition {\n if (value === undefined) return skipCondition;\n if (value instanceof AliasColumnImpl) return crossColumnCondition(this, value, op);\n if (value === null && (kind === \"eq\" || kind === \"ne\"))\n return this.addCondition({ kind: kind === \"eq\" ? \"is-null\" : \"not-null\" });\n if (value === null && [\"gt\", \"gte\", \"lt\", \"lte\"].includes(kind)) return fail(\"Unsupported\");\n return this.addCondition({ kind, value } as ParsedValueFilter<unknown>);\n }\n}\n\n/** Resolves polymorphic predicates to their physical component columns. */\nclass PolyReferenceAlias {\n constructor(\n private meta: EntityMetadata,\n private mgmt: AliasMgmt,\n private field: PolymorphicField & { aliasSuffix: string },\n ) {}\n\n eq(value: unknown): ExpressionCondition {\n return this.addEqOrNe(\"eq\", value);\n }\n ne(value: unknown): ExpressionCondition {\n return this.addEqOrNe(\"ne\", value);\n }\n\n in(values: readonly (Entity | TaggedId)[] | undefined): ExpressionCondition {\n if (values === undefined) return skipCondition;\n // Split up the ids by constructor\n const groups = groupBy(values, (id) => getConstructorFromTaggedId(maybeResolveReferenceToId(id)!).name);\n // Or together `parent_book_id in (1,2,3) OR parent_author_id IN (4,5,6)`\n return {\n or: Object.entries(groups).map(([name, ids]) => {\n const comp =\n this.field.components.find((c) => c.otherMetadata().cstr.name === name) ?? fail(`No component for ${name}`);\n return this.component(comp).addCondition({ kind: \"in\", value: ids });\n }),\n };\n }\n\n /** Picks the component from an entity, tagged id, or another domain alias column. */\n private addEqOrNe(kind: \"eq\" | \"ne\", value: unknown): ExpressionCondition {\n if (value === undefined) return skipCondition;\n if (value === null) {\n // We can AND each of the components as many conditions\n return {\n and: this.field.components.map((c) =>\n this.component(c).addCondition({ kind: kind === \"eq\" ? \"is-null\" : \"not-null\" }),\n ),\n };\n }\n const otherMeta =\n value instanceof AliasColumnImpl\n ? value.field.kind === \"m2o\"\n ? value.field.otherMetadata()\n : value.meta\n : getMetadata(getConstructorFromTaggedId(maybeResolveReferenceToId(value as Entity | TaggedId)!));\n const comp =\n this.field.components.find((c) => getBaseAndSelfMetas(otherMeta).includes(c.otherMetadata())) ??\n fail(`${this.field.fieldName} has no component for ${otherMeta.type}`);\n const column = this.component(comp);\n return kind === \"eq\" ? column.eq(value) : column.ne(value);\n }\n\n /** Uses the component serde, not the first component's codec. */\n private component(comp: PolymorphicFieldComponent): AliasColumnImpl {\n const column = this.field.serde.columns.find((c) => c.columnName === comp.columnName) ?? fail(\"Missing column\");\n return new AliasColumnImpl(this.meta, this.field, column, this.mgmt);\n }\n}\n\n/** Adjusts a field's SQL alias when a base alias is bound to a CTI subtype in the join tree. */\nexport function getMaybeCtiAlias(\n meta: EntityMetadata,\n field: Field & { aliasSuffix: string },\n newMeta: EntityMetadata,\n newAlias: string,\n): string {\n // Do we have mismatched `em.find(ChildMeta)` with a `alias(BaseMeta)`? If so, the\n // usual `${field.aliasSuffix}` won't know it should have a suffix, so we need to calc it.\n if (newMeta !== meta && newMeta.inheritanceType === \"cti\") {\n const bases = getBaseAndSelfMetas(newMeta);\n const fieldIsFromBase = bases.includes(newMeta);\n if (fieldIsFromBase) return `${newAlias}_b0`;\n }\n return `${newAlias}${field.aliasSuffix}`;\n}\n\n/** Compares domain columns with per-parse aliases, preserving condition reuse across find calls. */\nfunction crossColumnCondition(\n left: AliasColumnImpl,\n right: AliasColumnImpl,\n op: string,\n negate = false,\n): RawCondition & PredicateBrand<\"domain\"> {\n const cond: RawCondition = { kind: \"raw\", aliases: [], condition: \"unset\", bindings: [], pruneable: false };\n return withDeferredAlias(cond, (resolve, copy) => {\n const l = resolve(left.mgmt);\n const r = resolve(right.mgmt);\n const a1 = getMaybeCtiAlias(left.meta, left.field, l.meta, l.alias);\n const a2 = getMaybeCtiAlias(right.meta, right.field, r.meta, r.alias);\n copy.aliases = [a1, a2];\n const sql = `${a1}.${left.column.columnName} ${op} ${a2}.${right.column.columnName}`;\n copy.condition = negate ? `NOT (${sql})` : sql;\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Aliases.d.cts","names":[],"sources":["../src/Aliases.ts"],"mappings":";;;;;;;;;iBAyBgB,MAAM,UAAU,QAAQ,MAAM,+BAA+B,KAAK,MAAM;;iBAKxE,QAAQ,mBAAmB,0CACtC,OAAO,OACN,WAAW,IAAI,EAAE,WAAW,qCAAqC,UAAU,UAAU,MAAM;cAIpF;cACP;;UAGW;EACf;EACA,MAAM;;;;;EAKN,UAAU,QAAQ,MAAM,gBAAgB,kBAAkB,eAAe,eAAe;;;UAIzE,WAAW,WAAW;WAC5B,UAAU;;;;;;;;;;;;;;;;;;;;;KAsBT,MAAM,UAAU;YAAsB,YAAY,WAAW;OACtE,WAAW,SAAS,KAAK,iBACtB,YAAY,KACZ,SAAS,GAAG;EAAa;EAA4B,YAAY;EAAG,gBAAgB;IAClF,eAAe,GAAG,sCAClB,SAAS,GAAG;EAAa;EAAa,YAAY,UAAU;EAAQ,gBAAgB;IAClF,YAAY,GAAG,sCACf,SAAS,GAAG;EAAa;EAAc,YAAY,UAAU;IAC3D,UAAU;;UAKL,YAAY;YACjB,cAAc;;UAGT,eAAe,GAAG,wCAAwC,YAAY,IAAI;EACzF,GAAG,OAAO,IAAI,IAAI,YAAY,wBAAwB;EACtD,GAAG,OAAO,IAAI,IAAI,YAAY,wBAAwB;EACtD,GAAG,kBAAkB,0BAA0B;EAC/C,IAAI,kBAAkB,0BAA0B;EAChD,GAAG,OAAO,IAAI,YAAY,wBAAwB;EAClD,IAAI,OAAO,IAAI,YAAY,wBAAwB;EACnD,GAAG,OAAO,IAAI,YAAY,wBAAwB;EAClD,IAAI,OAAO,IAAI,YAAY,wBAAwB;EACnD,KAAK,OAAO,gBAAgB;EAC5B,MAAM,OAAO,gBAAgB;EAC7B,OAAO,OAAO,gBAAgB;EAC9B,QAAQ,IAAI,eAAe,IAAI,gBAAgB;EAE/C,SAAS,gBAAgB,IAAI,YAAY,YAAY,gBAAgB;EACrE,UAAU,gBAAgB,IAAI,YAAY,YAAY,gBAAgB;EACtE,SAAS,OAAO,IAAI,YAAY,YAAY,gBAAgB;EAC5D,UAAU,OAAO,IAAI,YAAY,YAAY,gBAAgB;;EAE7D,WAAW,+BAA+B;;EAE1C,WAAW,+BAA+B;;EAE1C,IAAI,aAAa,2CAA2C;;UAG7C,YAAY,GAAG,wCAAwC,YAAY,KAAK,KAAK;EAC5F,GAAG,OAAO,IAAI,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACzE,GAAG,OAAO,IAAI,KAAK,KAAK,YAAY,KAAK,gCAAgC;EAEzE,GAAG,kBAAkB,IAAI,KAAK,kCAAkC;EAChE,IAAI,kBAAkB,IAAI,KAAK,kCAAkC;EACjE,GAAG,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACrE,IAAI,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACtE,GAAG,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACrE,IAAI,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACtE,IAAI,aAAa,2CAA2C;;UAG7C,UAAU,UAAU;EACnC,GAAG,OAAO,IAAI,WAAW,YAAY,KAAK,gCAAgC;EAC1E,GAAG,OAAO,IAAI,WAAW,YAAY,KAAK,gCAAgC;EAC1E,GAAG,kBAAkB,IAAI,0BAA0B;;;iBAIrC,aAAa;YAAmB,YAAY;IAAc;;iBAK1D,iBAAiB,UAAU,QAAQ,OAAO,MAAM,KAAK,eAAe;;iBAKpE,cAAc,UAAU,QAAQ,MAAM,+BAA+B,KAAK,MAAM;;iBA+BhF,QAAQ,iBAAiB,SAAS,MAAM;;iBAiMxC,iBACd,MAAM,gBACN,OAAO;EAAU;GACjB,SAAS,gBACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Aliases.d.mts","names":[],"sources":["../src/Aliases.ts"],"mappings":";;;;;;;;;iBAyBgB,MAAM,UAAU,QAAQ,MAAM,+BAA+B,KAAK,MAAM;;iBAKxE,QAAQ,mBAAmB,0CACtC,OAAO,OACN,WAAW,IAAI,EAAE,WAAW,qCAAqC,UAAU,UAAU,MAAM;cAIpF;cACP;;UAGW;EACf;EACA,MAAM;;;;;EAKN,UAAU,QAAQ,MAAM,gBAAgB,kBAAkB,eAAe,eAAe;;;UAIzE,WAAW,WAAW;WAC5B,UAAU;;;;;;;;;;;;;;;;;;;;;KAsBT,MAAM,UAAU;YAAsB,YAAY,WAAW;OACtE,WAAW,SAAS,KAAK,iBACtB,YAAY,KACZ,SAAS,GAAG;EAAa;EAA4B,YAAY;EAAG,gBAAgB;IAClF,eAAe,GAAG,sCAClB,SAAS,GAAG;EAAa;EAAa,YAAY,UAAU;EAAQ,gBAAgB;IAClF,YAAY,GAAG,sCACf,SAAS,GAAG;EAAa;EAAc,YAAY,UAAU;IAC3D,UAAU;;UAKL,YAAY;YACjB,cAAc;;UAGT,eAAe,GAAG,wCAAwC,YAAY,IAAI;EACzF,GAAG,OAAO,IAAI,IAAI,YAAY,wBAAwB;EACtD,GAAG,OAAO,IAAI,IAAI,YAAY,wBAAwB;EACtD,GAAG,kBAAkB,0BAA0B;EAC/C,IAAI,kBAAkB,0BAA0B;EAChD,GAAG,OAAO,IAAI,YAAY,wBAAwB;EAClD,IAAI,OAAO,IAAI,YAAY,wBAAwB;EACnD,GAAG,OAAO,IAAI,YAAY,wBAAwB;EAClD,IAAI,OAAO,IAAI,YAAY,wBAAwB;EACnD,KAAK,OAAO,gBAAgB;EAC5B,MAAM,OAAO,gBAAgB;EAC7B,OAAO,OAAO,gBAAgB;EAC9B,QAAQ,IAAI,eAAe,IAAI,gBAAgB;EAE/C,SAAS,gBAAgB,IAAI,YAAY,YAAY,gBAAgB;EACrE,UAAU,gBAAgB,IAAI,YAAY,YAAY,gBAAgB;EACtE,SAAS,OAAO,IAAI,YAAY,YAAY,gBAAgB;EAC5D,UAAU,OAAO,IAAI,YAAY,YAAY,gBAAgB;;EAE7D,WAAW,+BAA+B;;EAE1C,WAAW,+BAA+B;;EAE1C,IAAI,aAAa,2CAA2C;;UAG7C,YAAY,GAAG,wCAAwC,YAAY,KAAK,KAAK;EAC5F,GAAG,OAAO,IAAI,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACzE,GAAG,OAAO,IAAI,KAAK,KAAK,YAAY,KAAK,gCAAgC;EAEzE,GAAG,kBAAkB,IAAI,KAAK,kCAAkC;EAChE,IAAI,kBAAkB,IAAI,KAAK,kCAAkC;EACjE,GAAG,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACrE,IAAI,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACtE,GAAG,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACrE,IAAI,OAAO,KAAK,KAAK,YAAY,KAAK,gCAAgC;EACtE,IAAI,aAAa,2CAA2C;;UAG7C,UAAU,UAAU;EACnC,GAAG,OAAO,IAAI,WAAW,YAAY,KAAK,gCAAgC;EAC1E,GAAG,OAAO,IAAI,WAAW,YAAY,KAAK,gCAAgC;EAC1E,GAAG,kBAAkB,IAAI,0BAA0B;;;iBAIrC,aAAa;YAAmB,YAAY;IAAc;;iBAK1D,iBAAiB,UAAU,QAAQ,OAAO,MAAM,KAAK,eAAe;;iBAKpE,cAAc,UAAU,QAAQ,MAAM,+BAA+B,KAAK,MAAM;;iBA+BhF,QAAQ,iBAAiB,SAAS,MAAM;;iBAiMxC,iBACd,MAAM,gBACN,OAAO;EAAU;GACjB,SAAS,gBACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Aliases.js","names":[],"sources":["../src/Aliases.ts"],"sourcesContent":["import { groupBy } from \"joist-utils\";\n\nimport { type Column } from \"./columns.ts\";\nimport { type PredicateBrand } from \"./conditions.ts\";\n// Load configure first: relations must not evaluate before their base classes exist.\nimport { getConstructorFromTaggedId } from \"./configure.ts\";\nimport { withDeferredAlias } from \"./DeferredAlias.ts\";\nimport { type Entity } from \"./Entity.ts\";\nimport { type ExpressionCondition } from \"./EntityFilter.ts\";\nimport { type IdOf, type MaybeAbstractEntityConstructor, type TaggedId } from \"./EntityManager.ts\";\nimport {\n type EntityMetadata,\n type Field,\n type PolymorphicField,\n type PolymorphicFieldComponent,\n getBaseAndSelfMetas,\n getMetadata,\n} from \"./EntityMetadata.ts\";\nimport { maybeResolveReferenceToId } from \"./keys.ts\";\nimport { type ColumnCondition, type ParsedValueFilter, type RawCondition, makeLike, mapToDb } from \"./QueryParser.ts\";\nimport { skipCondition } from \"./skipCondition.ts\";\nimport { type FieldsOf } from \"./typeMap.ts\";\nimport { fail } from \"./utils.ts\";\n\n/** Creates an alias for complex domain filtering in `em.find`. */\nexport function alias<T extends Entity>(cstr: MaybeAbstractEntityConstructor<T>): Alias<T> {\n return newAliasProxy(cstr);\n}\n\n/** Creates multiple aliases for complex filtering. */\nexport function aliases<T extends readonly MaybeAbstractEntityConstructor<any>[]>(\n ...types: T\n): { [P in keyof T]: T[P] extends MaybeAbstractEntityConstructor<infer E extends Entity> ? Alias<E> : never } {\n return types.map((t) => newAliasProxy(t)) as any;\n}\n\nexport const aliasMgmt = Symbol(\"aliasMgmt\");\nconst aliasColumn = Symbol(\"aliasColumn\");\n\n/** The identity and original entity metadata of an `em.find` alias. */\nexport interface AliasMgmt {\n tableName: string;\n meta: EntityMetadata;\n /**\n * Builds a raw condition using each query's bound metadata and SQL alias, before join pruning.\n * Return a fresh condition instead of mutating shared state; the callback runs only when used.\n */\n condition(build: (meta: EntityMetadata, alias: string) => RawCondition): RawCondition & PredicateBrand<\"domain\">;\n}\n\n/** Keeps domain aliases covariant in their entity type. */\nexport interface AliasBrand<T> extends AliasMgmt {\n readonly __entity: T;\n}\n\n/**\n * Domain field predicates, deliberately separate from SQL table expressions.\n *\n * An Alias names a place in an em.find relationship tree, not a fixed SQL table occurrence.\n * I.e. with `a = alias(Author)`, `{ author: { as: a } }` binds `a` to the Book's Author;\n * binding it under `{ author: { mentor: { as: a } } }` instead makes it the Author's mentor.\n * The find parser builds those joins and knows which entity metadata and SQL name apply there,\n * including any inheritance joins. The Alias cannot know that when `a.firstName.eq(name)` is created.\n *\n * DeferredAlias therefore resolves each predicate to a fresh column/raw condition using that parse's\n * binding. The resolved condition records the SQL aliases it reads, including both sides of a\n * cross-alias comparison. Join pruning uses those references to retain the joins the filter needs.\n * An undefined predicate is skipped, so it does not keep an otherwise-unused join alive; explicit\n * keepAliases and other query dependencies can still retain that join.\n *\n * Table expressions solve a different problem: their sources are supplied directly in from/join,\n * so they render through ExprContext rather than asking the find parser to bind a relationship path.\n * Neither path stores a resolved SQL name on the reusable handle or predicate.\n */\nexport type Alias<T extends Entity> = { readonly [aliasMgmt]: AliasBrand<T> } & {\n [P in keyof FieldsOf<T>]: P extends \"id\"\n ? EntityAlias<T>\n : FieldsOf<T>[P] extends { kind: \"primitive\" | \"enum\"; type: infer V; nullable: infer N }\n ? PrimitiveAlias<V, N extends undefined ? null : never>\n : FieldsOf<T>[P] extends { kind: \"m2o\"; type: infer U extends Entity; nullable: infer N }\n ? EntityAlias<U, N extends undefined ? null : never>\n : FieldsOf<T>[P] extends { kind: \"poly\"; type: infer U extends Entity }\n ? PolyAlias<U>\n : never;\n};\n\n/** A domain column accepted on the other side of a cross-alias comparison. */\nexport interface AliasColumn<V> {\n readonly [aliasColumn]: V;\n}\n\nexport interface PrimitiveAlias<V, N extends null | never = never> extends AliasColumn<V | N> {\n eq(value: V | N | AliasColumn<V | null> | undefined): ExpressionCondition;\n ne(value: V | N | AliasColumn<V | null> | undefined): ExpressionCondition;\n in(values: readonly (V | null)[] | undefined): ExpressionCondition;\n nin(values: readonly (V | null)[] | undefined): ExpressionCondition;\n gt(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n gte(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n lt(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n lte(value: V | AliasColumn<V | null> | undefined): ExpressionCondition;\n like(value: V | undefined): ExpressionCondition;\n ilike(value: V | undefined): ExpressionCondition;\n search(value: V | undefined): ExpressionCondition;\n between(v1: V | undefined, v2: V | undefined): ExpressionCondition;\n // V is already an array; strings also support jsonb contains.\n contains(value: string | V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n ncontains(value: string | V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n overlaps(value: V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n noverlaps(value: V | AliasColumn<V | null> | N | undefined): ExpressionCondition;\n /** Adds a parameterized JSON path existence condition using `@?`. */\n pathExists(jsonPath: string | undefined): ExpressionCondition;\n /** Adds a parameterized JSON path predicate condition using `@@`. */\n pathIsTrue(jsonPath: string | undefined): ExpressionCondition;\n /** Adds an operator and expression with knex-style placeholders, without the column name. */\n raw(exp: string, bindings: readonly unknown[] | undefined): ExpressionCondition;\n}\n\nexport interface EntityAlias<T, N extends null | never = never> extends AliasColumn<IdOf<T> | N> {\n eq(value: T | IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n ne(value: T | IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n // Adding `| null` for GraphQL support\n in(values: readonly (T | IdOf<T> | null)[] | null | undefined): ExpressionCondition;\n nin(values: readonly (T | IdOf<T> | null)[] | null | undefined): ExpressionCondition;\n gt(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n gte(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n lt(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n lte(value: IdOf<T> | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n raw(exp: string, bindings: readonly unknown[] | undefined): ExpressionCondition;\n}\n\nexport interface PolyAlias<T extends Entity> {\n eq(value: T | TaggedId | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n ne(value: T | TaggedId | AliasColumn<IdOf<T> | null> | null | undefined): ExpressionCondition;\n in(values: readonly (T | TaggedId)[] | undefined): ExpressionCondition;\n}\n\n/** Returns the runtime identity bound by the find parser. */\nexport function getAliasMgmt(alias: { readonly [aliasMgmt]: AliasMgmt }): AliasMgmt {\n return alias[aliasMgmt];\n}\n\n/** Returns the original metadata, preserving STI subtype identity. */\nexport function getAliasMetadata<T extends Entity>(alias: Alias<T>): EntityMetadata<T> {\n return alias[aliasMgmt].meta as EntityMetadata<T>;\n}\n\n/** Creates domain predicates lazily from entity field metadata. */\nexport function newAliasProxy<T extends Entity>(cstr: MaybeAbstractEntityConstructor<T>): Alias<T> {\n const meta = getMetadata(cstr);\n const mgmt: AliasMgmt = {\n tableName: meta.tableName,\n meta,\n condition(build) {\n const cond: RawCondition = { kind: \"raw\", aliases: [], condition: \"unset\", bindings: [], pruneable: false };\n return withDeferredAlias(cond, (resolve, copy) => {\n const bound = resolve(mgmt);\n Object.assign(copy, build(bound.meta, bound.alias));\n });\n },\n };\n return new Proxy(cstr, {\n get(_, key) {\n if (key === aliasMgmt) return mgmt;\n if (typeof key !== \"string\") return undefined;\n const field = meta.allFields[key] ?? fail(`No field ${key} on ${cstr.name}`);\n if (field.kind === \"poly\") return new PolyReferenceAlias(meta, mgmt, field);\n if ([\"primaryKey\", \"primitive\", \"enum\", \"m2o\"].includes(field.kind)) {\n return new AliasColumnImpl(meta, field, field.serde!.columns[0], mgmt);\n }\n return fail(`Unsupported alias field kind ${field.kind}`);\n },\n has(_, key) {\n return key === aliasMgmt || key in meta.allFields;\n },\n }) as unknown as Alias<T>;\n}\n\n/** Recognizes only domain aliases, not physical tables. */\nexport function isAlias(value: unknown): value is Alias<Entity> {\n return typeof value === \"function\" && aliasMgmt in value;\n}\n\n/** Builds field conditions without implementing the SQL expression protocol. */\nclass AliasColumnImpl {\n declare readonly [aliasColumn]: unknown;\n\n constructor(\n readonly meta: EntityMetadata,\n readonly field: Field & { aliasSuffix: string },\n readonly column: Column,\n readonly mgmt: AliasMgmt,\n ) {}\n\n eq(value: unknown): ExpressionCondition {\n return this.compare(\"eq\", \"=\", value);\n }\n ne(value: unknown): ExpressionCondition {\n return this.compare(\"ne\", \"!=\", value);\n }\n gt(value: unknown): ExpressionCondition {\n return this.compare(\"gt\", \">\", value);\n }\n gte(value: unknown): ExpressionCondition {\n return this.compare(\"gte\", \">=\", value);\n }\n lt(value: unknown): ExpressionCondition {\n return this.compare(\"lt\", \"<\", value);\n }\n lte(value: unknown): ExpressionCondition {\n return this.compare(\"lte\", \"<=\", value);\n }\n contains(value: unknown): ExpressionCondition {\n return this.compare(\"contains\", \"@>\", value);\n }\n ncontains(value: unknown): ExpressionCondition {\n if (value instanceof AliasColumnImpl) return crossColumnCondition(this, value, \"@>\", true);\n return this.addCondition({ kind: \"ncontains\", value: value as readonly unknown[] });\n }\n overlaps(value: unknown): ExpressionCondition {\n return this.compare(\"overlaps\", \"&&\", value);\n }\n noverlaps(value: unknown): ExpressionCondition {\n if (value instanceof AliasColumnImpl) return crossColumnCondition(this, value, \"&&\", true);\n return this.addCondition({ kind: \"noverlaps\", value: value as readonly unknown[] });\n }\n\n in(values: readonly unknown[] | null | undefined): ExpressionCondition {\n if (values === undefined) return skipCondition;\n if (values === null) return fail(\"Unsupported\");\n if (values.includes(null)) {\n return {\n or: [\n this.addCondition({ kind: \"is-null\" }),\n this.addCondition({ kind: \"in\", value: values.filter((v) => v !== null) }),\n ],\n };\n }\n return this.addCondition({ kind: \"in\", value: [...values] });\n }\n\n nin(values: readonly unknown[] | null | undefined): ExpressionCondition {\n if (values === undefined) return skipCondition;\n if (values === null) return fail(\"Unsupported\");\n return this.addCondition({ kind: \"nin\", value: values.filter((v) => v !== null) });\n }\n\n between(v1: unknown, v2: unknown): ExpressionCondition {\n if (v1 === undefined || v2 === undefined) return skipCondition;\n return this.addCondition({ kind: \"between\", value: [v1, v2] });\n }\n\n like(value: unknown): ExpressionCondition {\n return this.addCondition({ kind: \"like\", value });\n }\n ilike(value: unknown): ExpressionCondition {\n return this.addCondition({ kind: \"ilike\", value });\n }\n search(value: unknown): ExpressionCondition {\n // Check !value so that empty strings are pruned\n return !value ? skipCondition : this.addCondition({ kind: \"ilike\", value: makeLike(value) });\n }\n pathExists(value: string | undefined): ExpressionCondition {\n return this.addCondition({ kind: \"jsonPathExists\", value: value! });\n }\n pathIsTrue(value: string | undefined): ExpressionCondition {\n return this.addCondition({ kind: \"jsonPathPredicate\", value: value! });\n }\n\n raw(exp: string, bindings: readonly unknown[] | undefined): ExpressionCondition {\n if (bindings === undefined) return skipCondition;\n const cond: RawCondition = { kind: \"raw\", aliases: [], condition: \"unset\", pruneable: false, bindings };\n return withDeferredAlias(cond, (resolve, copy) => {\n const r = resolve(this.mgmt);\n const alias = getMaybeCtiAlias(this.meta, this.field, r.meta, r.alias);\n copy.aliases = [alias];\n copy.condition = `${alias}.${this.column.columnName} ${exp}`;\n });\n }\n\n /** Maps literal values through the field serde and binds aliases only when parsing. */\n addCondition(value: ParsedValueFilter<unknown>): ExpressionCondition {\n if (\"value\" in value && value.value === undefined) return skipCondition;\n const cond: ColumnCondition = {\n kind: \"column\",\n alias: \"unset\",\n column: this.column.columnName,\n dbType: this.column.dbType,\n cond: mapToDb(this.column, value),\n };\n return withDeferredAlias(cond, (resolve, copy) => {\n const r = resolve(this.mgmt);\n copy.alias = getMaybeCtiAlias(this.meta, this.field, r.meta, r.alias);\n });\n }\n\n /** Handles literal values, NULL, and domain cross-alias comparisons. */\n private compare(\n kind: \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\" | \"contains\" | \"ncontains\" | \"overlaps\",\n op: string,\n value: unknown,\n ): ExpressionCondition {\n if (value === undefined) return skipCondition;\n if (value instanceof AliasColumnImpl) return crossColumnCondition(this, value, op);\n if (value === null && (kind === \"eq\" || kind === \"ne\"))\n return this.addCondition({ kind: kind === \"eq\" ? \"is-null\" : \"not-null\" });\n if (value === null && [\"gt\", \"gte\", \"lt\", \"lte\"].includes(kind)) return fail(\"Unsupported\");\n return this.addCondition({ kind, value } as ParsedValueFilter<unknown>);\n }\n}\n\n/** Resolves polymorphic predicates to their physical component columns. */\nclass PolyReferenceAlias {\n constructor(\n private meta: EntityMetadata,\n private mgmt: AliasMgmt,\n private field: PolymorphicField & { aliasSuffix: string },\n ) {}\n\n eq(value: unknown): ExpressionCondition {\n return this.addEqOrNe(\"eq\", value);\n }\n ne(value: unknown): ExpressionCondition {\n return this.addEqOrNe(\"ne\", value);\n }\n\n in(values: readonly (Entity | TaggedId)[] | undefined): ExpressionCondition {\n if (values === undefined) return skipCondition;\n // Split up the ids by constructor\n const groups = groupBy(values, (id) => getConstructorFromTaggedId(maybeResolveReferenceToId(id)!).name);\n // Or together `parent_book_id in (1,2,3) OR parent_author_id IN (4,5,6)`\n return {\n or: Object.entries(groups).map(([name, ids]) => {\n const comp =\n this.field.components.find((c) => c.otherMetadata().cstr.name === name) ?? fail(`No component for ${name}`);\n return this.component(comp).addCondition({ kind: \"in\", value: ids });\n }),\n };\n }\n\n /** Picks the component from an entity, tagged id, or another domain alias column. */\n private addEqOrNe(kind: \"eq\" | \"ne\", value: unknown): ExpressionCondition {\n if (value === undefined) return skipCondition;\n if (value === null) {\n // We can AND each of the components as many conditions\n return {\n and: this.field.components.map((c) =>\n this.component(c).addCondition({ kind: kind === \"eq\" ? \"is-null\" : \"not-null\" }),\n ),\n };\n }\n const otherMeta =\n value instanceof AliasColumnImpl\n ? value.field.kind === \"m2o\"\n ? value.field.otherMetadata()\n : value.meta\n : getMetadata(getConstructorFromTaggedId(maybeResolveReferenceToId(value as Entity | TaggedId)!));\n const comp =\n this.field.components.find((c) => getBaseAndSelfMetas(otherMeta).includes(c.otherMetadata())) ??\n fail(`${this.field.fieldName} has no component for ${otherMeta.type}`);\n const column = this.component(comp);\n return kind === \"eq\" ? column.eq(value) : column.ne(value);\n }\n\n /** Uses the component serde, not the first component's codec. */\n private component(comp: PolymorphicFieldComponent): AliasColumnImpl {\n const column = this.field.serde.columns.find((c) => c.columnName === comp.columnName) ?? fail(\"Missing column\");\n return new AliasColumnImpl(this.meta, this.field, column, this.mgmt);\n }\n}\n\n/** Adjusts a field's SQL alias when a base alias is bound to a CTI subtype in the join tree. */\nexport function getMaybeCtiAlias(\n meta: EntityMetadata,\n field: Field & { aliasSuffix: string },\n newMeta: EntityMetadata,\n newAlias: string,\n): string {\n // Do we have mismatched `em.find(ChildMeta)` with a `alias(BaseMeta)`? If so, the\n // usual `${field.aliasSuffix}` won't know it should have a suffix, so we need to calc it.\n if (newMeta !== meta && newMeta.inheritanceType === \"cti\") {\n const bases = getBaseAndSelfMetas(newMeta);\n const fieldIsFromBase = bases.includes(newMeta);\n if (fieldIsFromBase) return `${newAlias}_b0`;\n }\n return `${newAlias}${field.aliasSuffix}`;\n}\n\n/** Compares domain columns with per-parse aliases, preserving condition reuse across find calls. */\nfunction crossColumnCondition(\n left: AliasColumnImpl,\n right: AliasColumnImpl,\n op: string,\n negate = false,\n): RawCondition & PredicateBrand<\"domain\"> {\n const cond: RawCondition = { kind: \"raw\", aliases: [], condition: \"unset\", bindings: [], pruneable: false };\n return withDeferredAlias(cond, (resolve, copy) => {\n const l = resolve(left.mgmt);\n const r = resolve(right.mgmt);\n const a1 = getMaybeCtiAlias(left.meta, left.field, l.meta, l.alias);\n const a2 = getMaybeCtiAlias(right.meta, right.field, r.meta, r.alias);\n copy.aliases = [a1, a2];\n const sql = `${a1}.${left.column.columnName} ${op} ${a2}.${right.column.columnName}`;\n copy.condition = negate ? `NOT (${sql})` : sql;\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConditionBuilder.cjs","names":["mapToDb","fail","partition","skipCondition","isDefined"],"sources":["../src/ConditionBuilder.ts"],"sourcesContent":["import { type Column } from \"./columns.ts\";\nimport { type ConditionGroup, type ConditionInput } from \"./conditions.ts\";\nimport { isDefined } from \"./EntityManager.ts\";\nimport {\n type ColumnCondition,\n type ParsedExpressionCondition,\n type ParsedExpressionFilter,\n type ParsedValueFilter,\n type RawCondition,\n mapToDb,\n} from \"./QueryParser.ts\";\nimport { skipCondition } from \"./skipCondition.ts\";\nimport { fail, partition } from \"./utils.ts\";\n\ntype PartialSome<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/** Converts domain-level values like string ids/enums into their db equivalent. */\nexport class ConditionBuilder {\n /** Simple, single-column conditions, which will be AND-d together. */\n private conditions: (ColumnCondition | RawCondition)[] = [];\n /** Complex expressions, which will also be AND-d together with `conditions`. */\n private expressions: ParsedExpressionFilter[] = [];\n\n /** Accepts a raw user-facing DSL filter, and parses it into a `ParsedExpressionFilter`. */\n maybeAddExpression(expression: ConditionGroup<ConditionInput>): void {\n const parsed = parseExpression(expression);\n if (parsed) this.expressions.push(parsed);\n }\n\n /** Adds an already-db-level condition to the simple conditions list. */\n addSimpleCondition(condition: ColumnCondition): void {\n this.conditions.push(condition);\n }\n\n /** Adds an already-db-level condition to the simple conditions list. */\n addRawCondition(condition: PartialSome<RawCondition, \"kind\" | \"bindings\">): void {\n this.conditions.push({\n kind: \"raw\",\n bindings: [],\n ...condition,\n });\n }\n\n /** Adds an already-db-level expression to the expressions list. */\n addParsedExpression(parsed: ParsedExpressionFilter): void {\n this.expressions.push(parsed);\n }\n\n /**\n * Adds a user-facing `ParsedValueFilter` to the inline conditions.\n *\n * Unless it's something like `in: [a1, null]`, in which case we split it into two `is-null` and `in` conditions.\n */\n addValueFilter(alias: string, column: Column, filter: ParsedValueFilter<any>): void {\n if (filter.kind === \"in\" && filter.value.includes(null)) {\n // If the filter contains a null, we need to split it into an `is-null` and `in` condition\n const isNull = {\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"is-null\" },\n } satisfies ColumnCondition;\n const inValues = {\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: {\n kind: \"in\",\n // Filter out the nulls from the in condition\n value: filter.value.filter((v) => v !== null).map((v) => column.mapToDb(v)),\n },\n } satisfies ColumnCondition;\n // Now OR them back together\n this.expressions.push({ kind: \"exp\", op: \"or\", conditions: [isNull, inValues] });\n } else {\n const cond = {\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n // Rewrite the user-facing domain values to db values\n cond: mapToDb(column, filter),\n } satisfies ColumnCondition;\n this.conditions.push(cond);\n }\n }\n\n /** Combines our collected `conditions` and `expressions` into a single `ParsedExpressionFilter`. */\n toExpressionFilter(): ParsedExpressionFilter | undefined {\n const { expressions, conditions } = this;\n const allSimple: ParsedExpressionCondition[] = [...conditions];\n if (allSimple.length === 0 && expressions.length === 1) {\n // If no inline conditions, and just 1 opt expression, just use that\n return expressions[0];\n } else if (expressions.length === 1 && expressions[0].op === \"and\") {\n // Merge the 1 `AND` expression with the other simple conditions\n return { kind: \"exp\", op: \"and\", conditions: [...allSimple, ...expressions[0].conditions] };\n } else if (allSimple.length > 0 || expressions.length > 0) {\n // Combine the conditions within the `em.find` join literal & the `conditions` as ANDs\n return { kind: \"exp\", op: \"and\", conditions: [...allSimple, ...expressions] };\n }\n return undefined;\n }\n}\n\n/** Parses user-facing `{ and: ... }` or `{ or: ... }` into a `ParsedExpressionFilter`. */\nfunction parseExpression(expression: ConditionGroup<ConditionInput>): ParsedExpressionFilter | undefined {\n // Look for `{ and: [...] }` or `{ or: [...] }`\n const [op, expressions] =\n \"and\" in expression && expression.and\n ? [\"and\" as const, expression.and]\n : \"or\" in expression && expression.or\n ? [\"or\" as const, expression.or]\n : fail(`Invalid expression ${expression}`);\n // Potentially recurse into nested expressions\n const conditions = expressions.map((exp) => (exp && (\"and\" in exp || \"or\" in exp) ? parseExpression(exp) : exp));\n const [skip, valid] = partition(conditions, (cond) => cond === undefined || cond === skipCondition);\n if ((skip.length > 0 && expression.pruneIfUndefined === \"any\") || valid.length === 0) {\n return undefined;\n }\n return { kind: \"exp\", op, conditions: valid.filter(isDefined) };\n}\n"],"mappings":";;;;;;;;AAiBA,IAAa,mBAAb,MAA8B;;CAE5B,aAAyD,CAAC;;CAE1D,cAAgD,CAAC;;CAGjD,mBAAmB,YAAkD;EACnE,MAAM,SAAS,gBAAgB,UAAU;EACzC,IAAI,QAAQ,KAAK,YAAY,KAAK,MAAM;CAC1C;;CAGA,mBAAmB,WAAkC;EACnD,KAAK,WAAW,KAAK,SAAS;CAChC;;CAGA,gBAAgB,WAAiE;EAC/E,KAAK,WAAW,KAAK;GACnB,MAAM;GACN,UAAU,CAAC;GACX,GAAG;EACL,CAAC;CACH;;CAGA,oBAAoB,QAAsC;EACxD,KAAK,YAAY,KAAK,MAAM;CAC9B;;;;;;CAOA,eAAe,OAAe,QAAgB,QAAsC;EAClF,IAAI,OAAO,SAAS,QAAQ,OAAO,MAAM,SAAS,IAAI,GAAG;GAEvD,MAAM,SAAS;IACb,MAAM;IACN;IACA,QAAQ,OAAO;IACf,QAAQ,OAAO;IACf,MAAM,EAAE,MAAM,UAAU;GAC1B;GACA,MAAM,WAAW;IACf,MAAM;IACN;IACA,QAAQ,OAAO;IACf,QAAQ,OAAO;IACf,MAAM;KACJ,MAAM;KAEN,OAAO,OAAO,MAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,CAAC,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;IAC5E;GACF;GAEA,KAAK,YAAY,KAAK;IAAE,MAAM;IAAO,IAAI;IAAM,YAAY,CAAC,QAAQ,QAAQ;GAAE,CAAC;EACjF,OAAO;GACL,MAAM,OAAO;IACX,MAAM;IACN;IACA,QAAQ,OAAO;IACf,QAAQ,OAAO;IAEf,MAAMA,oBAAAA,QAAQ,QAAQ,MAAM;GAC9B;GACA,KAAK,WAAW,KAAK,IAAI;EAC3B;CACF;;CAGA,qBAAyD;EACvD,MAAM,EAAE,aAAa,eAAe;EACpC,MAAM,YAAyC,CAAC,GAAG,UAAU;EAC7D,IAAI,UAAU,WAAW,KAAK,YAAY,WAAW,GAEnD,OAAO,YAAY;OACd,IAAI,YAAY,WAAW,KAAK,YAAY,EAAE,CAAC,OAAO,OAE3D,OAAO;GAAE,MAAM;GAAO,IAAI;GAAO,YAAY,CAAC,GAAG,WAAW,GAAG,YAAY,EAAE,CAAC,UAAU;EAAE;OACrF,IAAI,UAAU,SAAS,KAAK,YAAY,SAAS,GAEtD,OAAO;GAAE,MAAM;GAAO,IAAI;GAAO,YAAY,CAAC,GAAG,WAAW,GAAG,WAAW;EAAE;CAGhF;AACF;;AAGA,SAAS,gBAAgB,YAAgF;CAEvG,MAAM,CAAC,IAAI,eACT,SAAS,cAAc,WAAW,MAC9B,CAAC,OAAgB,WAAW,GAAG,IAC/B,QAAQ,cAAc,WAAW,KAC/B,CAAC,MAAe,WAAW,EAAE,IAC7BC,cAAAA,KAAK,sBAAsB,YAAY;CAE/C,MAAM,aAAa,YAAY,KAAK,QAAS,QAAQ,SAAS,OAAO,QAAQ,OAAO,gBAAgB,GAAG,IAAI,GAAI;CAC/G,MAAM,CAAC,MAAM,SAASC,cAAAA,UAAU,aAAa,SAAS,SAAS,KAAA,KAAa,SAASC,sBAAAA,aAAa;CAClG,IAAK,KAAK,SAAS,KAAK,WAAW,qBAAqB,SAAU,MAAM,WAAW,GACjF;CAEF,OAAO;EAAE,MAAM;EAAO;EAAI,YAAY,MAAM,OAAOC,sBAAAA,SAAS;CAAE;AAChE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConditionBuilder.d.cts","names":[],"sources":["../src/ConditionBuilder.ts"],"mappings":";;;;KAcK,YAAY,GAAG,gBAAgB,KAAK,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;;cAGzD;;UAEH;;UAEA;;EAGR,mBAAmB,YAAY,eAAe;;EAM9C,mBAAmB,WAAW;;EAK9B,gBAAgB,WAAW,YAAY;;EASvC,oBAAoB,QAAQ;;;;;;EAS5B,eAAe,eAAe,QAAQ,QAAQ,QAAQ;;EAqCtD,sBAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConditionBuilder.d.mts","names":[],"sources":["../src/ConditionBuilder.ts"],"mappings":";;;;KAcK,YAAY,GAAG,gBAAgB,KAAK,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG;;cAGzD;;UAEH;;UAEA;;EAGR,mBAAmB,YAAY,eAAe;;EAM9C,mBAAmB,WAAW;;EAK9B,gBAAgB,WAAW,YAAY;;EASvC,oBAAoB,QAAQ;;;;;;EAS5B,eAAe,eAAe,QAAQ,QAAQ,QAAQ;;EAqCtD,sBAAsB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConditionBuilder.js","names":[],"sources":["../src/ConditionBuilder.ts"],"sourcesContent":["import { type Column } from \"./columns.ts\";\nimport { type ConditionGroup, type ConditionInput } from \"./conditions.ts\";\nimport { isDefined } from \"./EntityManager.ts\";\nimport {\n type ColumnCondition,\n type ParsedExpressionCondition,\n type ParsedExpressionFilter,\n type ParsedValueFilter,\n type RawCondition,\n mapToDb,\n} from \"./QueryParser.ts\";\nimport { skipCondition } from \"./skipCondition.ts\";\nimport { fail, partition } from \"./utils.ts\";\n\ntype PartialSome<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/** Converts domain-level values like string ids/enums into their db equivalent. */\nexport class ConditionBuilder {\n /** Simple, single-column conditions, which will be AND-d together. */\n private conditions: (ColumnCondition | RawCondition)[] = [];\n /** Complex expressions, which will also be AND-d together with `conditions`. */\n private expressions: ParsedExpressionFilter[] = [];\n\n /** Accepts a raw user-facing DSL filter, and parses it into a `ParsedExpressionFilter`. */\n maybeAddExpression(expression: ConditionGroup<ConditionInput>): void {\n const parsed = parseExpression(expression);\n if (parsed) this.expressions.push(parsed);\n }\n\n /** Adds an already-db-level condition to the simple conditions list. */\n addSimpleCondition(condition: ColumnCondition): void {\n this.conditions.push(condition);\n }\n\n /** Adds an already-db-level condition to the simple conditions list. */\n addRawCondition(condition: PartialSome<RawCondition, \"kind\" | \"bindings\">): void {\n this.conditions.push({\n kind: \"raw\",\n bindings: [],\n ...condition,\n });\n }\n\n /** Adds an already-db-level expression to the expressions list. */\n addParsedExpression(parsed: ParsedExpressionFilter): void {\n this.expressions.push(parsed);\n }\n\n /**\n * Adds a user-facing `ParsedValueFilter` to the inline conditions.\n *\n * Unless it's something like `in: [a1, null]`, in which case we split it into two `is-null` and `in` conditions.\n */\n addValueFilter(alias: string, column: Column, filter: ParsedValueFilter<any>): void {\n if (filter.kind === \"in\" && filter.value.includes(null)) {\n // If the filter contains a null, we need to split it into an `is-null` and `in` condition\n const isNull = {\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: { kind: \"is-null\" },\n } satisfies ColumnCondition;\n const inValues = {\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n cond: {\n kind: \"in\",\n // Filter out the nulls from the in condition\n value: filter.value.filter((v) => v !== null).map((v) => column.mapToDb(v)),\n },\n } satisfies ColumnCondition;\n // Now OR them back together\n this.expressions.push({ kind: \"exp\", op: \"or\", conditions: [isNull, inValues] });\n } else {\n const cond = {\n kind: \"column\",\n alias,\n column: column.columnName,\n dbType: column.dbType,\n // Rewrite the user-facing domain values to db values\n cond: mapToDb(column, filter),\n } satisfies ColumnCondition;\n this.conditions.push(cond);\n }\n }\n\n /** Combines our collected `conditions` and `expressions` into a single `ParsedExpressionFilter`. */\n toExpressionFilter(): ParsedExpressionFilter | undefined {\n const { expressions, conditions } = this;\n const allSimple: ParsedExpressionCondition[] = [...conditions];\n if (allSimple.length === 0 && expressions.length === 1) {\n // If no inline conditions, and just 1 opt expression, just use that\n return expressions[0];\n } else if (expressions.length === 1 && expressions[0].op === \"and\") {\n // Merge the 1 `AND` expression with the other simple conditions\n return { kind: \"exp\", op: \"and\", conditions: [...allSimple, ...expressions[0].conditions] };\n } else if (allSimple.length > 0 || expressions.length > 0) {\n // Combine the conditions within the `em.find` join literal & the `conditions` as ANDs\n return { kind: \"exp\", op: \"and\", conditions: [...allSimple, ...expressions] };\n }\n return undefined;\n }\n}\n\n/** Parses user-facing `{ and: ... }` or `{ or: ... }` into a `ParsedExpressionFilter`. */\nfunction parseExpression(expression: ConditionGroup<ConditionInput>): ParsedExpressionFilter | undefined {\n // Look for `{ and: [...] }` or `{ or: [...] }`\n const [op, expressions] =\n \"and\" in expression && expression.and\n ? [\"and\" as const, expression.and]\n : \"or\" in expression && expression.or\n ? [\"or\" as const, expression.or]\n : fail(`Invalid expression ${expression}`);\n // Potentially recurse into nested expressions\n const conditions = expressions.map((exp) => (exp && (\"and\" in exp || \"or\" in exp) ? parseExpression(exp) : exp));\n const [skip, valid] = partition(conditions, (cond) => cond === undefined || cond === skipCondition);\n if ((skip.length > 0 && expression.pruneIfUndefined === \"any\") || valid.length === 0) {\n return undefined;\n }\n return { kind: \"exp\", op, conditions: valid.filter(isDefined) };\n}\n"],"mappings":";;;;;;;AAiBA,IAAa,mBAAb,MAA8B;;CAE5B,aAAyD,CAAC;;CAE1D,cAAgD,CAAC;;CAGjD,mBAAmB,YAAkD;EACnE,MAAM,SAAS,gBAAgB,UAAU;EACzC,IAAI,QAAQ,KAAK,YAAY,KAAK,MAAM;CAC1C;;CAGA,mBAAmB,WAAkC;EACnD,KAAK,WAAW,KAAK,SAAS;CAChC;;CAGA,gBAAgB,WAAiE;EAC/E,KAAK,WAAW,KAAK;GACnB,MAAM;GACN,UAAU,CAAC;GACX,GAAG;EACL,CAAC;CACH;;CAGA,oBAAoB,QAAsC;EACxD,KAAK,YAAY,KAAK,MAAM;CAC9B;;;;;;CAOA,eAAe,OAAe,QAAgB,QAAsC;EAClF,IAAI,OAAO,SAAS,QAAQ,OAAO,MAAM,SAAS,IAAI,GAAG;GAEvD,MAAM,SAAS;IACb,MAAM;IACN;IACA,QAAQ,OAAO;IACf,QAAQ,OAAO;IACf,MAAM,EAAE,MAAM,UAAU;GAC1B;GACA,MAAM,WAAW;IACf,MAAM;IACN;IACA,QAAQ,OAAO;IACf,QAAQ,OAAO;IACf,MAAM;KACJ,MAAM;KAEN,OAAO,OAAO,MAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,CAAC,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;IAC5E;GACF;GAEA,KAAK,YAAY,KAAK;IAAE,MAAM;IAAO,IAAI;IAAM,YAAY,CAAC,QAAQ,QAAQ;GAAE,CAAC;EACjF,OAAO;GACL,MAAM,OAAO;IACX,MAAM;IACN;IACA,QAAQ,OAAO;IACf,QAAQ,OAAO;IAEf,MAAM,QAAQ,QAAQ,MAAM;GAC9B;GACA,KAAK,WAAW,KAAK,IAAI;EAC3B;CACF;;CAGA,qBAAyD;EACvD,MAAM,EAAE,aAAa,eAAe;EACpC,MAAM,YAAyC,CAAC,GAAG,UAAU;EAC7D,IAAI,UAAU,WAAW,KAAK,YAAY,WAAW,GAEnD,OAAO,YAAY;OACd,IAAI,YAAY,WAAW,KAAK,YAAY,EAAE,CAAC,OAAO,OAE3D,OAAO;GAAE,MAAM;GAAO,IAAI;GAAO,YAAY,CAAC,GAAG,WAAW,GAAG,YAAY,EAAE,CAAC,UAAU;EAAE;OACrF,IAAI,UAAU,SAAS,KAAK,YAAY,SAAS,GAEtD,OAAO;GAAE,MAAM;GAAO,IAAI;GAAO,YAAY,CAAC,GAAG,WAAW,GAAG,WAAW;EAAE;CAGhF;AACF;;AAGA,SAAS,gBAAgB,YAAgF;CAEvG,MAAM,CAAC,IAAI,eACT,SAAS,cAAc,WAAW,MAC9B,CAAC,OAAgB,WAAW,GAAG,IAC/B,QAAQ,cAAc,WAAW,KAC/B,CAAC,MAAe,WAAW,EAAE,IAC7B,KAAK,sBAAsB,YAAY;CAE/C,MAAM,aAAa,YAAY,KAAK,QAAS,QAAQ,SAAS,OAAO,QAAQ,OAAO,gBAAgB,GAAG,IAAI,GAAI;CAC/G,MAAM,CAAC,MAAM,SAAS,UAAU,aAAa,SAAS,SAAS,KAAA,KAAa,SAAS,aAAa;CAClG,IAAK,KAAK,SAAS,KAAK,WAAW,qBAAqB,SAAU,MAAM,WAAW,GACjF;CAEF,OAAO;EAAE,MAAM;EAAO;EAAI,YAAY,MAAM,OAAO,SAAS;CAAE;AAChE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeferredAlias.cjs","names":["brandPredicate"],"sources":["../src/DeferredAlias.ts"],"sourcesContent":["// Erased imports keep domain predicates independent of the query parser at module load time.\nimport { type AliasMgmt } from \"./Aliases.ts\";\nimport { type PredicateBrand, brandPredicate } from \"./conditions.ts\";\nimport { type EntityMetadata } from \"./EntityMetadata.ts\";\nimport { type ColumnCondition, type RawCondition } from \"./QueryParser.ts\";\n\nexport const deferredAliasSym: unique symbol = Symbol(\"joist.deferredAliasCondition\");\n\n/** Resolves a domain alias to this em.find parse's binding. */\nexport type AliasResolver = (handle: AliasMgmt) => {\n meta: EntityMetadata;\n alias: string;\n};\n\n/** A domain condition whose SQL aliases are resolved afresh for each occurrence in em.find. */\nexport interface DeferredAliasCondition<C = ColumnCondition | RawCondition> extends PredicateBrand<\"domain\"> {\n [deferredAliasSym]: (resolve: AliasResolver) => C;\n}\n\n/** Detects conditions that carry a per-parse alias resolver. */\nexport function isDeferredAliasCondition<C>(cond: C): cond is C & DeferredAliasCondition<C> {\n return typeof cond === \"object\" && cond !== null && deferredAliasSym in cond;\n}\n\n/** Tags a condition without changing its enumerable shape; resolution only mutates a fresh copy. */\nexport function withDeferredAlias<C extends object>(\n cond: C,\n resolve: (r: AliasResolver, copy: C) => void,\n): C & DeferredAliasCondition<C> {\n return Object.defineProperty(brandPredicate(cond, \"domain\"), deferredAliasSym, {\n value: (r: AliasResolver) => {\n const copy = { ...cond };\n resolve(r, copy);\n return copy;\n },\n enumerable: false,\n }) as C & DeferredAliasCondition<C>;\n}\n"],"mappings":";;;;;;AAMA,MAAa,mBAAkC,OAAO,8BAA8B;;AAcpF,SAAgB,yBAA4B,MAAgD;CAC1F,OAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,oBAAoB;AAC1E;;AAGA,SAAgB,kBACd,MACA,SAC+B;CAC/B,OAAO,OAAO,eAAeA,mBAAAA,eAAe,MAAM,QAAQ,GAAG,kBAAkB;EAC7E,QAAQ,MAAqB;GAC3B,MAAM,OAAO,EAAE,GAAG,KAAK;GACvB,QAAQ,GAAG,IAAI;GACf,OAAO;EACT;EACA,YAAY;CACd,CAAC;AACH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeferredAlias.d.cts","names":[],"sources":["../src/DeferredAlias.ts"],"mappings":";;;;;cAMa;;KAGD,iBAAiB,QAAQ;EACnC,MAAM;EACN;;;UAIe,uBAAuB,IAAI,kBAAkB,sBAAsB;GACjF,oBAAoB,SAAS,kBAAkB;;;iBAIlC,yBAAyB,GAAG,MAAM,IAAI,QAAQ,IAAI,uBAAuB;;iBAKzE,kBAAkB,kBAChC,MAAM,GACN,UAAU,GAAG,eAAe,MAAM,aACjC,IAAI,uBAAuB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeferredAlias.d.mts","names":[],"sources":["../src/DeferredAlias.ts"],"mappings":";;;;;cAMa;;KAGD,iBAAiB,QAAQ;EACnC,MAAM;EACN;;;UAIe,uBAAuB,IAAI,kBAAkB,sBAAsB;GACjF,oBAAoB,SAAS,kBAAkB;;;iBAIlC,yBAAyB,GAAG,MAAM,IAAI,QAAQ,IAAI,uBAAuB;;iBAKzE,kBAAkB,kBAChC,MAAM,GACN,UAAU,GAAG,eAAe,MAAM,aACjC,IAAI,uBAAuB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeferredAlias.js","names":[],"sources":["../src/DeferredAlias.ts"],"sourcesContent":["// Erased imports keep domain predicates independent of the query parser at module load time.\nimport { type AliasMgmt } from \"./Aliases.ts\";\nimport { type PredicateBrand, brandPredicate } from \"./conditions.ts\";\nimport { type EntityMetadata } from \"./EntityMetadata.ts\";\nimport { type ColumnCondition, type RawCondition } from \"./QueryParser.ts\";\n\nexport const deferredAliasSym: unique symbol = Symbol(\"joist.deferredAliasCondition\");\n\n/** Resolves a domain alias to this em.find parse's binding. */\nexport type AliasResolver = (handle: AliasMgmt) => {\n meta: EntityMetadata;\n alias: string;\n};\n\n/** A domain condition whose SQL aliases are resolved afresh for each occurrence in em.find. */\nexport interface DeferredAliasCondition<C = ColumnCondition | RawCondition> extends PredicateBrand<\"domain\"> {\n [deferredAliasSym]: (resolve: AliasResolver) => C;\n}\n\n/** Detects conditions that carry a per-parse alias resolver. */\nexport function isDeferredAliasCondition<C>(cond: C): cond is C & DeferredAliasCondition<C> {\n return typeof cond === \"object\" && cond !== null && deferredAliasSym in cond;\n}\n\n/** Tags a condition without changing its enumerable shape; resolution only mutates a fresh copy. */\nexport function withDeferredAlias<C extends object>(\n cond: C,\n resolve: (r: AliasResolver, copy: C) => void,\n): C & DeferredAliasCondition<C> {\n return Object.defineProperty(brandPredicate(cond, \"domain\"), deferredAliasSym, {\n value: (r: AliasResolver) => {\n const copy = { ...cond };\n resolve(r, copy);\n return copy;\n },\n enumerable: false,\n }) as C & DeferredAliasCondition<C>;\n}\n"],"mappings":";;;;;AAMA,MAAa,mBAAkC,OAAO,8BAA8B;;AAcpF,SAAgB,yBAA4B,MAAgD;CAC1F,OAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,oBAAoB;AAC1E;;AAGA,SAAgB,kBACd,MACA,SAC+B;CAC/B,OAAO,OAAO,eAAe,eAAe,MAAM,QAAQ,GAAG,kBAAkB;EAC7E,QAAQ,MAAqB;GAC3B,MAAM,OAAO,EAAE,GAAG,KAAK;GACvB,QAAQ,GAAG,IAAI;GACf,OAAO;EACT;EACA,YAAY;CACd,CAAC;AACH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityFilter.cjs","names":["isScope","resolveScope"],"sources":["../src/EntityFilter.ts"],"sourcesContent":["import { type Alias } from \"./Aliases.ts\";\nimport { type AndCondition, type DomainPredicate, type OrCondition, type UnbrandedPredicate } from \"./conditions.ts\";\nimport { type Entity } from \"./Entity.ts\";\nimport { type FindFilterOptions, type IdOf } from \"./EntityManager.ts\";\nimport { type Scope, isScope, resolveScope } from \"./scopes.ts\";\nimport { type FieldsOf, type FilterOf, type OrderOf } from \"./typeMap.ts\";\n\n/** Combines a `where` filter with optional `orderBy`, `limit`, and `offset` settings. */\nexport type FilterAndSettings<T extends Entity> = {\n // Either a `{ ... }` EntityFilter or a Scope like `Adult.parent`\n where: FindFilter<T>;\n conditions?: ExpressionFilter;\n orderBy?: OrderOf<T> | OrderOf<T>[];\n limit?: number | undefined;\n offset?: number | undefined;\n softDeletes?: \"exclude\" | \"include\";\n allowMultipleLeftJoins?: boolean;\n optimizeJoinsToExists?: boolean;\n};\n\nexport type OrderBy = \"ASC\" | \"DESC\";\n\n/**\n * A filter for an entity of type `T` for `em.find` inline conditions.\n *\n * An entity filter can either filter by \"an exact entity\" (i.e. the book with id 2)\n * or its own set of filters (i.e. all books with a title that starts with \"The\").\n *\n * @typeparam T The entity type, i.e. `Author`\n * @typeparam I The ID type of the entity, i.e. `AuthorId`\n * @typeparam F The filter type for the entity, i.e. `AuthorFilter`\n * @typeparam N Either `null | undefined` if the entity can be null, or `never` if it cannot.\n */\nexport type EntityFilter<T extends Entity, I = IdOf<T>, F = FilterOf<T>, N = never> =\n | T\n | readonly T[]\n | I\n | readonly I[]\n | Scope<T>\n // Note that this is a weak type (all optional keys) but TS still enforces at least one overlap\n | EntityFilterObject<T, I, F, N>\n // Always allow `undefined` for condition pruning\n | undefined\n // But only allow `null` for `nullable` relations\n | N\n | { ne: T | I | N | undefined }\n // Allow setting `true` for `is not null` or `false` for `is null`\n | boolean\n | Alias<T>;\n\n/** A nested object filter, including logical composition at the current entity alias. */\nexport type EntityFilterObject<T extends Entity, I = IdOf<T>, F = FilterOf<T>, N = never> = {\n as?: Alias<T>;\n and?: EntityFilter<T, I, F, N> | readonly EntityFilter<T, I, F, N>[];\n or?: EntityFilter<T, I, F, N> | readonly EntityFilter<T, I, F, N>[];\n} & F;\n\nexport type BooleanFilter<N> = true | false | N;\n\n/**\n * The root `em.find` `where` shape: an `EntityFilterObject` with `I`/`F`/`N` defaulted.\n *\n * Intentionally a thin alias rather than the source of truth: `as`/`and`/`or` are defined once on\n * `EntityFilterObject<T, I, F, N>` so the parameterized nested-relation arm of `EntityFilter` and this\n * root can't drift. That arm needs the `F`/`N` params — GraphQL filter shapes (`F`) and relation\n * nullability (`N`) flow through `and`/`or` recursion — which a `FilterOf<T>`-hardcoded root can't\n * supply, so the shape lives on `EntityFilterObject` and this just specializes it.\n */\nexport type FilterWithAlias<T extends Entity> = EntityFilterObject<T>;\n\n/** Allows `em.find` to accept either a `{ ... }` EntityFilter or a Scope like `Adult.parent` */\nexport type FindFilter<T extends Entity> = FilterWithAlias<T> | Scope<T>;\n\nexport type UniqueFilter<T extends Entity> = {\n [K in keyof FieldsOf<T> & keyof FilterOf<T> as FieldsOf<T>[K] extends { unique: true } ? K : never]?: FilterOf<T>[K];\n};\n\n/**\n * Filters against a specific field's values within `em.find` inline conditions.\n *\n * We always allow `undefined` to support condition pruning, but only conditionally\n * allow `null` if the column is actually nullable.\n */\nexport type ValueFilter<V, N> =\n | V\n | readonly V[]\n | N\n | undefined\n // Both eq and in are redundant with `V` and `V[]` above but are convenient for matching GQL filter APIs\n | { eq: V | N | undefined }\n | { ne: V | N | undefined }\n | { in: readonly (V | N | null)[] | undefined }\n | { nin: readonly (V | N)[] | undefined }\n | { gt: V | undefined }\n | { gte: V | undefined }\n | { lt: V | undefined }\n | { lte: V | undefined }\n | { like: V | undefined }\n | { nlike: V | undefined }\n | { ilike: V | undefined }\n | { nilike: V | undefined }\n | { regex?: V | undefined }\n | { iregex?: V | undefined }\n | { nregex?: V | undefined }\n | { niregex?: V | undefined }\n | { search: V | undefined }\n // should put these in a dedicated ArrayFilter\n | { contains: V | undefined }\n | { overlaps: V | undefined }\n | { containedBy: V | undefined }\n // should put these in a dedicated JsonbFilter\n | { pathExists: string | undefined }\n | { pathIsTrue: string | undefined }\n // this is between\n | { gte: V | undefined; lte: V | undefined }\n | { between: [V, V] | undefined };\n\n/**\n * Filters against complex expressions of filters.\n *\n * This is the user-facing DSL that internally will be converted to `ParsedExpressionFilter.\n */\nexport type ExpressionFilter = AndCondition<ExpressionCondition> | OrCondition<ExpressionCondition>;\n\n/** A domain-alias predicate or nested group for em.find and scopes, not SQL table expressions. */\nexport type ExpressionCondition = ExpressionFilter | DomainPredicate | UnbrandedPredicate;\n\n/** Merges root-scope find settings with caller options, letting caller options win. */\nexport function mergeFindOptions<T extends Entity>(\n where: FindFilter<T>,\n options: FindFilterOptions<T>,\n): { where: FindFilter<T>; options: FindFilterOptions<T> } {\n if (!isScope<T>(where)) return { where, options };\n\n const resolved = resolveScope(where);\n const scopeOptions: FindFilterOptions<T> = {};\n if (resolved.orderBys.length > 0) scopeOptions.orderBy = resolved.orderBys;\n if (resolved.limit !== undefined) scopeOptions.limit = resolved.limit;\n if (resolved.offset !== undefined) scopeOptions.offset = resolved.offset;\n if (resolved.softDeletes !== undefined) scopeOptions.softDeletes = resolved.softDeletes;\n return { where, options: { ...scopeOptions, ...options } };\n}\n"],"mappings":";;;;;;;;;AAgIA,SAAgB,iBACd,OACA,SACyD;CACzD,IAAI,CAACA,eAAAA,QAAW,KAAK,GAAG,OAAO;EAAE;EAAO;CAAQ;CAEhD,MAAM,WAAWC,eAAAA,aAAa,KAAK;CACnC,MAAM,eAAqC,CAAC;CAC5C,IAAI,SAAS,SAAS,SAAS,GAAG,aAAa,UAAU,SAAS;CAClE,IAAI,SAAS,UAAU,KAAA,GAAW,aAAa,QAAQ,SAAS;CAChE,IAAI,SAAS,WAAW,KAAA,GAAW,aAAa,SAAS,SAAS;CAClE,IAAI,SAAS,gBAAgB,KAAA,GAAW,aAAa,cAAc,SAAS;CAC5E,OAAO;EAAE;EAAO,SAAS;GAAE,GAAG;GAAc,GAAG;EAAQ;CAAE;AAC3D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityFilter.d.cts","names":[],"sources":["../src/EntityFilter.ts"],"mappings":";;;;;;;;KAQY,kBAAkB,UAAU;EAEtC,OAAO,WAAW;EAClB,aAAa;EACb,UAAU,QAAQ,KAAK,QAAQ;EAC/B;EACA;EACA;EACA;EACA;;KAGU;;;;;;;;;;;;KAaA,aAAa,UAAU,QAAQ,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,aACrE,aACS,MACT,aACS,MACT,MAAM,KAEN,mBAAmB,GAAG,GAAG,GAAG,iBAI5B;EACE,IAAI,IAAI,IAAI;cAGd,MAAM;;KAGE,mBAAmB,UAAU,QAAQ,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI;EAC7E,KAAK,MAAM;EACX,MAAM,aAAa,GAAG,GAAG,GAAG,cAAc,aAAa,GAAG,GAAG,GAAG;EAChE,KAAK,aAAa,GAAG,GAAG,GAAG,cAAc,aAAa,GAAG,GAAG,GAAG;IAC7D;KAEQ,cAAc,oBAAoB;;;;;;;;;;KAWlC,gBAAgB,UAAU,UAAU,mBAAmB;;KAGvD,WAAW,UAAU,UAAU,gBAAgB,KAAK,MAAM;KAE1D,aAAa,UAAU,aAChC,WAAW,SAAS,WAAW,SAAS,MAAM,SAAS,GAAG;EAAa;IAAiB,aAAa,SAAS,GAAG;;;;;;;KASxG,YAAY,GAAG,KACvB,aACS,MACT;EAGE,IAAI,IAAI;;EACR,IAAI,IAAI;;EACR,cAAc,IAAI;;EAClB,eAAe,IAAI;;EACnB,IAAI;;EACJ,KAAK;;EACL,IAAI;;EACJ,KAAK;;EACL,MAAM;;EACN,OAAO;;EACP,OAAO;;EACP,QAAQ;;EACR,QAAQ;;EACR,SAAS;;EACT,SAAS;;EACT,UAAU;;EACV,QAAQ;;EAER,UAAU;;EACV,UAAU;;EACV,aAAa;;EAEb;;EACA;;EAEA,KAAK;EAAe,KAAK;;EACzB,UAAU,GAAG;;;;;;;KAOP,mBAAmB,aAAa,uBAAuB,YAAY;;KAGnE,sBAAsB,mBAAmB,kBAAkB;;iBAGvD,iBAAiB,UAAU,QACzC,OAAO,WAAW,IAClB,SAAS,kBAAkB;EACxB,OAAO,WAAW;EAAI,SAAS,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityFilter.d.mts","names":[],"sources":["../src/EntityFilter.ts"],"mappings":";;;;;;;;KAQY,kBAAkB,UAAU;EAEtC,OAAO,WAAW;EAClB,aAAa;EACb,UAAU,QAAQ,KAAK,QAAQ;EAC/B;EACA;EACA;EACA;EACA;;KAGU;;;;;;;;;;;;KAaA,aAAa,UAAU,QAAQ,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,aACrE,aACS,MACT,aACS,MACT,MAAM,KAEN,mBAAmB,GAAG,GAAG,GAAG,iBAI5B;EACE,IAAI,IAAI,IAAI;cAGd,MAAM;;KAGE,mBAAmB,UAAU,QAAQ,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI;EAC7E,KAAK,MAAM;EACX,MAAM,aAAa,GAAG,GAAG,GAAG,cAAc,aAAa,GAAG,GAAG,GAAG;EAChE,KAAK,aAAa,GAAG,GAAG,GAAG,cAAc,aAAa,GAAG,GAAG,GAAG;IAC7D;KAEQ,cAAc,oBAAoB;;;;;;;;;;KAWlC,gBAAgB,UAAU,UAAU,mBAAmB;;KAGvD,WAAW,UAAU,UAAU,gBAAgB,KAAK,MAAM;KAE1D,aAAa,UAAU,aAChC,WAAW,SAAS,WAAW,SAAS,MAAM,SAAS,GAAG;EAAa;IAAiB,aAAa,SAAS,GAAG;;;;;;;KASxG,YAAY,GAAG,KACvB,aACS,MACT;EAGE,IAAI,IAAI;;EACR,IAAI,IAAI;;EACR,cAAc,IAAI;;EAClB,eAAe,IAAI;;EACnB,IAAI;;EACJ,KAAK;;EACL,IAAI;;EACJ,KAAK;;EACL,MAAM;;EACN,OAAO;;EACP,OAAO;;EACP,QAAQ;;EACR,QAAQ;;EACR,SAAS;;EACT,SAAS;;EACT,UAAU;;EACV,QAAQ;;EAER,UAAU;;EACV,UAAU;;EACV,aAAa;;EAEb;;EACA;;EAEA,KAAK;EAAe,KAAK;;EACzB,UAAU,GAAG;;;;;;;KAOP,mBAAmB,aAAa,uBAAuB,YAAY;;KAGnE,sBAAsB,mBAAmB,kBAAkB;;iBAGvD,iBAAiB,UAAU,QACzC,OAAO,WAAW,IAClB,SAAS,kBAAkB;EACxB,OAAO,WAAW;EAAI,SAAS,kBAAkB"}