@casekit/orm 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (343) hide show
  1. package/lib/migrate/commands/implode.js +1 -1
  2. package/lib/migrate/commands/implode.js.map +1 -1
  3. package/lib/migrate/sql/createTableSql.test.js +1 -0
  4. package/lib/migrate/sql/createTableSql.test.js.map +1 -1
  5. package/lib/orm.d.ts +2 -2
  6. package/lib/orm.d.ts.map +1 -1
  7. package/lib/orm.js +8 -0
  8. package/lib/orm.js.map +1 -1
  9. package/lib/queries/clauses/IncludeClause.d.ts +3 -3
  10. package/lib/queries/clauses/IncludeClause.d.ts.map +1 -1
  11. package/lib/queries/clauses/ReturningClause.d.ts +2 -3
  12. package/lib/queries/clauses/ReturningClause.d.ts.map +1 -1
  13. package/lib/queries/clauses/SelectClause.d.ts +2 -3
  14. package/lib/queries/clauses/SelectClause.d.ts.map +1 -1
  15. package/lib/queries/clauses/WhereClause.d.ts +1 -1
  16. package/lib/queries/clauses/WhereClause.d.ts.map +1 -1
  17. package/lib/queries/clauses/helpers/OptionalColumn.d.ts +5 -5
  18. package/lib/queries/clauses/helpers/OptionalColumn.d.ts.map +1 -1
  19. package/lib/queries/clauses/helpers/OptionalParams.d.ts +2 -2
  20. package/lib/queries/clauses/helpers/OptionalParams.d.ts.map +1 -1
  21. package/lib/queries/clauses/helpers/RequiredColumn.d.ts +2 -3
  22. package/lib/queries/clauses/helpers/RequiredColumn.d.ts.map +1 -1
  23. package/lib/queries/clauses/helpers/RequiredParams.d.ts +2 -2
  24. package/lib/queries/clauses/helpers/RequiredParams.d.ts.map +1 -1
  25. package/lib/queries/clauses/where/buildWhereClause.js +1 -1
  26. package/lib/queries/clauses/where/buildWhereClause.js.map +1 -1
  27. package/lib/queries/clauses/where/buildWhereClauses.d.ts +1 -1
  28. package/lib/queries/clauses/where/buildWhereClauses.d.ts.map +1 -1
  29. package/lib/queries/clauses/where/buildWhereClauses.js.map +1 -1
  30. package/lib/queries/clauses/where/buildWhereClauses.test.js +1 -1
  31. package/lib/queries/clauses/where/buildWhereClauses.test.js.map +1 -1
  32. package/lib/queries/clauses/where/types/WhereClauseValue.d.ts +1 -1
  33. package/lib/queries/clauses/where/types/WhereClauseValue.d.ts.map +1 -1
  34. package/lib/queries/count/buildCount.d.ts.map +1 -1
  35. package/lib/queries/count/buildCount.js +33 -29
  36. package/lib/queries/count/buildCount.js.map +1 -1
  37. package/lib/queries/count/countToSql.d.ts.map +1 -1
  38. package/lib/queries/count/countToSql.js +12 -17
  39. package/lib/queries/count/countToSql.js.map +1 -1
  40. package/lib/queries/count/types/CountBuilder.d.ts +12 -4
  41. package/lib/queries/count/types/CountBuilder.d.ts.map +1 -1
  42. package/lib/queries/count.d.ts.map +1 -1
  43. package/lib/queries/count.js +3 -1
  44. package/lib/queries/count.js.map +1 -1
  45. package/lib/queries/create/buildCreate.d.ts +4 -1
  46. package/lib/queries/create/buildCreate.d.ts.map +1 -1
  47. package/lib/queries/create/buildCreate.js +5 -2
  48. package/lib/queries/create/buildCreate.js.map +1 -1
  49. package/lib/queries/create/createResultSchema.d.ts.map +1 -1
  50. package/lib/queries/create/createResultSchema.js +3 -1
  51. package/lib/queries/create/createResultSchema.js.map +1 -1
  52. package/lib/queries/create/createToSql.d.ts.map +1 -1
  53. package/lib/queries/create/createToSql.js +5 -2
  54. package/lib/queries/create/createToSql.js.map +1 -1
  55. package/lib/queries/create/tests/createMany.varied-keys.test.d.ts +2 -0
  56. package/lib/queries/create/tests/createMany.varied-keys.test.d.ts.map +1 -0
  57. package/lib/queries/create/tests/createMany.varied-keys.test.js +24 -0
  58. package/lib/queries/create/tests/createMany.varied-keys.test.js.map +1 -0
  59. package/lib/queries/create/tests/createOne.test.js +53 -0
  60. package/lib/queries/create/tests/createOne.test.js.map +1 -1
  61. package/lib/queries/create/types/BaseCreateManyParams.d.ts +3 -0
  62. package/lib/queries/create/types/BaseCreateManyParams.d.ts.map +1 -1
  63. package/lib/queries/create/types/BaseCreateOneParams.d.ts +3 -0
  64. package/lib/queries/create/types/BaseCreateOneParams.d.ts.map +1 -1
  65. package/lib/queries/create/types/CreateManyParams.d.ts +4 -1
  66. package/lib/queries/create/types/CreateManyParams.d.ts.map +1 -1
  67. package/lib/queries/create/types/CreateManyResult.d.ts +1 -1
  68. package/lib/queries/create/types/CreateManyResult.d.ts.map +1 -1
  69. package/lib/queries/create/types/CreateOneParams.d.ts +4 -1
  70. package/lib/queries/create/types/CreateOneParams.d.ts.map +1 -1
  71. package/lib/queries/create/types/CreateOneResult.d.ts +1 -1
  72. package/lib/queries/create/types/CreateOneResult.d.ts.map +1 -1
  73. package/lib/queries/createMany.d.ts.map +1 -1
  74. package/lib/queries/createMany.js +3 -1
  75. package/lib/queries/createMany.js.map +1 -1
  76. package/lib/queries/createOne.d.ts.map +1 -1
  77. package/lib/queries/createOne.js +6 -0
  78. package/lib/queries/createOne.js.map +1 -1
  79. package/lib/queries/delete/buildDelete.d.ts +1 -1
  80. package/lib/queries/delete/buildDelete.d.ts.map +1 -1
  81. package/lib/queries/delete/buildDelete.js +1 -1
  82. package/lib/queries/delete/buildDelete.js.map +1 -1
  83. package/lib/queries/delete/deleteResultSchema.d.ts.map +1 -1
  84. package/lib/queries/delete/deleteResultSchema.js +3 -1
  85. package/lib/queries/delete/deleteResultSchema.js.map +1 -1
  86. package/lib/queries/delete/deleteToSql.js +1 -1
  87. package/lib/queries/delete/deleteToSql.js.map +1 -1
  88. package/lib/queries/delete/types/DeleteManyResult.d.ts +1 -1
  89. package/lib/queries/delete/types/DeleteManyResult.d.ts.map +1 -1
  90. package/lib/queries/delete/types/DeleteOneResult.d.ts +1 -1
  91. package/lib/queries/delete/types/DeleteOneResult.d.ts.map +1 -1
  92. package/lib/queries/delete/types/DeleteParams.d.ts +1 -1
  93. package/lib/queries/delete/types/DeleteParams.d.ts.map +1 -1
  94. package/lib/queries/deleteMany.d.ts.map +1 -1
  95. package/lib/queries/deleteMany.js +3 -1
  96. package/lib/queries/deleteMany.js.map +1 -1
  97. package/lib/queries/find/buildFind.d.ts.map +1 -1
  98. package/lib/queries/find/buildFind.js +39 -31
  99. package/lib/queries/find/buildFind.js.map +1 -1
  100. package/lib/queries/find/findResultSchema.d.ts.map +1 -1
  101. package/lib/queries/find/findResultSchema.js +9 -2
  102. package/lib/queries/find/findResultSchema.js.map +1 -1
  103. package/lib/queries/find/findToSql.d.ts.map +1 -1
  104. package/lib/queries/find/findToSql.js +15 -17
  105. package/lib/queries/find/findToSql.js.map +1 -1
  106. package/lib/queries/find/getIncludedManyToManyRelations.d.ts +17 -0
  107. package/lib/queries/find/getIncludedManyToManyRelations.d.ts.map +1 -0
  108. package/lib/queries/find/getIncludedManyToManyRelations.js +20 -0
  109. package/lib/queries/find/getIncludedManyToManyRelations.js.map +1 -0
  110. package/lib/queries/find/getIncludedOneToManyRelations.d.ts +12 -0
  111. package/lib/queries/find/getIncludedOneToManyRelations.d.ts.map +1 -0
  112. package/lib/queries/find/getIncludedOneToManyRelations.js +20 -0
  113. package/lib/queries/find/getIncludedOneToManyRelations.js.map +1 -0
  114. package/lib/queries/find/tests/findMany.include.test.d.ts +2 -0
  115. package/lib/queries/find/tests/findMany.include.test.d.ts.map +1 -0
  116. package/lib/queries/find/tests/findMany.include.test.js +93 -0
  117. package/lib/queries/find/tests/findMany.include.test.js.map +1 -0
  118. package/lib/queries/find/tests/findMany.lateral.test.d.ts +2 -0
  119. package/lib/queries/find/tests/findMany.lateral.test.d.ts.map +1 -0
  120. package/lib/queries/find/tests/findMany.lateral.test.js +86 -0
  121. package/lib/queries/find/tests/findMany.lateral.test.js.map +1 -0
  122. package/lib/queries/find/tests/findMany.nullable-relations.test.d.ts +2 -0
  123. package/lib/queries/find/tests/findMany.nullable-relations.test.d.ts.map +1 -0
  124. package/lib/queries/find/tests/findMany.nullable-relations.test.js +118 -0
  125. package/lib/queries/find/tests/findMany.nullable-relations.test.js.map +1 -0
  126. package/lib/queries/find/tests/middleware.find.where.test.js +12 -12
  127. package/lib/queries/find/tests/middleware.find.where.test.js.map +1 -1
  128. package/lib/queries/find/types/BaseFindParams.d.ts +2 -1
  129. package/lib/queries/find/types/BaseFindParams.d.ts.map +1 -1
  130. package/lib/queries/find/types/FindBuilder.d.ts +13 -4
  131. package/lib/queries/find/types/FindBuilder.d.ts.map +1 -1
  132. package/lib/queries/find/types/FindManyParams.d.ts +3 -2
  133. package/lib/queries/find/types/FindManyParams.d.ts.map +1 -1
  134. package/lib/queries/find/types/FindManyResult.d.ts +2 -1
  135. package/lib/queries/find/types/FindManyResult.d.ts.map +1 -1
  136. package/lib/queries/find/types/FindOneParams.d.ts +2 -1
  137. package/lib/queries/find/types/FindOneParams.d.ts.map +1 -1
  138. package/lib/queries/find/types/FindOneResult.d.ts +6 -0
  139. package/lib/queries/find/types/FindOneResult.d.ts.map +1 -1
  140. package/lib/queries/findMany.d.ts.map +1 -1
  141. package/lib/queries/findMany.js +71 -36
  142. package/lib/queries/findMany.js.map +1 -1
  143. package/lib/queries/middleware/Middleware.d.ts +1 -1
  144. package/lib/queries/middleware/Middleware.d.ts.map +1 -1
  145. package/lib/queries/update/buildUpdate.d.ts +2 -2
  146. package/lib/queries/update/buildUpdate.d.ts.map +1 -1
  147. package/lib/queries/update/buildUpdate.js +8 -8
  148. package/lib/queries/update/buildUpdate.js.map +1 -1
  149. package/lib/queries/update/tests/updateOne.test.js +3 -3
  150. package/lib/queries/update/tests/updateOne.test.js.map +1 -1
  151. package/lib/queries/update/types/BaseUpdateParams.d.ts +1 -1
  152. package/lib/queries/update/types/BaseUpdateParams.d.ts.map +1 -1
  153. package/lib/queries/update/types/UpdateManyResult.d.ts +1 -1
  154. package/lib/queries/update/types/UpdateManyResult.d.ts.map +1 -1
  155. package/lib/queries/update/types/UpdateOneResult.d.ts +1 -1
  156. package/lib/queries/update/types/UpdateOneResult.d.ts.map +1 -1
  157. package/lib/queries/update/types/UpdateParams.d.ts +2 -2
  158. package/lib/queries/update/types/UpdateParams.d.ts.map +1 -1
  159. package/lib/queries/update/types/UpdateValues.d.ts +1 -1
  160. package/lib/queries/update/types/UpdateValues.d.ts.map +1 -1
  161. package/lib/queries/update/updateResultSchema.d.ts.map +1 -1
  162. package/lib/queries/update/updateResultSchema.js +3 -1
  163. package/lib/queries/update/updateResultSchema.js.map +1 -1
  164. package/lib/queries/update/updateToSql.js +3 -3
  165. package/lib/queries/update/updateToSql.js.map +1 -1
  166. package/lib/queries/updateMany.d.ts.map +1 -1
  167. package/lib/queries/updateMany.js +3 -1
  168. package/lib/queries/updateMany.js.map +1 -1
  169. package/lib/queries/util/rowToObject.d.ts.map +1 -1
  170. package/lib/queries/util/rowToObject.js +1 -1
  171. package/lib/queries/util/rowToObject.js.map +1 -1
  172. package/lib/schema/populate/composeMiddleware.js +1 -1
  173. package/lib/schema/populate/composeMiddleware.js.map +1 -1
  174. package/lib/schema/populate/populateModel.d.ts.map +1 -1
  175. package/lib/schema/populate/populateModel.js +1 -0
  176. package/lib/schema/populate/populateModel.js.map +1 -1
  177. package/lib/schema/types/base/BaseColumn.d.ts +1 -0
  178. package/lib/schema/types/base/BaseColumn.d.ts.map +1 -1
  179. package/lib/schema/types/base/BaseRelation.d.ts +1 -0
  180. package/lib/schema/types/base/BaseRelation.d.ts.map +1 -1
  181. package/lib/schema/types/helpers/ColumnName.d.ts +2 -3
  182. package/lib/schema/types/helpers/ColumnName.d.ts.map +1 -1
  183. package/lib/schema/types/helpers/ColumnType.d.ts +2 -2
  184. package/lib/schema/types/helpers/ColumnType.d.ts.map +1 -1
  185. package/lib/schema/types/helpers/Columns.d.ts +2 -3
  186. package/lib/schema/types/helpers/Columns.d.ts.map +1 -1
  187. package/lib/schema/types/helpers/HasDefault.d.ts +2 -3
  188. package/lib/schema/types/helpers/HasDefault.d.ts.map +1 -1
  189. package/lib/schema/types/helpers/IsNullable.d.ts +2 -3
  190. package/lib/schema/types/helpers/IsNullable.d.ts.map +1 -1
  191. package/lib/schema/types/helpers/IsProvided.d.ts +5 -0
  192. package/lib/schema/types/helpers/IsProvided.d.ts.map +1 -0
  193. package/lib/schema/types/helpers/IsProvided.js +2 -0
  194. package/lib/schema/types/helpers/IsProvided.js.map +1 -0
  195. package/lib/schema/types/helpers/IsSerial.d.ts +2 -3
  196. package/lib/schema/types/helpers/IsSerial.d.ts.map +1 -1
  197. package/lib/schema/types/loose/LooseColumnDefinition.d.ts +5 -0
  198. package/lib/schema/types/loose/LooseColumnDefinition.d.ts.map +1 -1
  199. package/lib/schema/types/loose/LooseRelationDefinition.d.ts +1 -0
  200. package/lib/schema/types/loose/LooseRelationDefinition.d.ts.map +1 -1
  201. package/lib/schema/types/relations/ManyToManyRelation.d.ts +2 -2
  202. package/lib/schema/types/relations/ManyToManyRelation.d.ts.map +1 -1
  203. package/lib/schema/types/relations/ManyToOneRelation.d.ts +1 -1
  204. package/lib/schema/types/relations/ManyToOneRelation.d.ts.map +1 -1
  205. package/lib/schema/types/relations/OneToManyRelation.d.ts +2 -1
  206. package/lib/schema/types/relations/OneToManyRelation.d.ts.map +1 -1
  207. package/lib/schema/types/strict/ColumnDefinition.d.ts +5 -0
  208. package/lib/schema/types/strict/ColumnDefinition.d.ts.map +1 -1
  209. package/lib/test/db/index.d.ts +40 -0
  210. package/lib/test/db/index.d.ts.map +1 -1
  211. package/lib/test/db/models/post.model.d.ts +9 -0
  212. package/lib/test/db/models/post.model.d.ts.map +1 -1
  213. package/lib/test/db/models/post.model.js +6 -0
  214. package/lib/test/db/models/post.model.js.map +1 -1
  215. package/lib/test/db/models/post.relations.d.ts +6 -0
  216. package/lib/test/db/models/post.relations.d.ts.map +1 -1
  217. package/lib/test/db/models/post.relations.js +6 -0
  218. package/lib/test/db/models/post.relations.js.map +1 -1
  219. package/lib/test/db/models/user.model.d.ts +9 -0
  220. package/lib/test/db/models/user.model.d.ts.map +1 -1
  221. package/lib/test/db/models/user.model.js +6 -0
  222. package/lib/test/db/models/user.model.js.map +1 -1
  223. package/lib/test/db/models/user.relations.d.ts +16 -0
  224. package/lib/test/db/models/user.relations.d.ts.map +1 -1
  225. package/lib/test/db/models/user.relations.js +16 -0
  226. package/lib/test/db/models/user.relations.js.map +1 -1
  227. package/lib/test/db/models.d.ts +18 -0
  228. package/lib/test/db/models.d.ts.map +1 -1
  229. package/lib/test/db/relations.d.ts +22 -0
  230. package/lib/test/db/relations.d.ts.map +1 -1
  231. package/lib/test/gen/column.d.ts +1 -0
  232. package/lib/test/gen/column.d.ts.map +1 -1
  233. package/lib/test/seed/index.d.ts +40 -0
  234. package/lib/test/seed/index.d.ts.map +1 -1
  235. package/lib/types/ModelType.d.ts +10 -3
  236. package/lib/types/ModelType.d.ts.map +1 -1
  237. package/package.json +11 -4
  238. package/src/migrate/commands/implode.ts +1 -1
  239. package/src/migrate/sql/createTableSql.test.ts +1 -0
  240. package/src/orm.ts +10 -2
  241. package/src/queries/clauses/IncludeClause.ts +19 -3
  242. package/src/queries/clauses/ReturningClause.ts +4 -6
  243. package/src/queries/clauses/SelectClause.ts +4 -6
  244. package/src/queries/clauses/WhereClause.ts +1 -1
  245. package/src/queries/clauses/helpers/OptionalColumn.ts +10 -11
  246. package/src/queries/clauses/helpers/OptionalParams.ts +2 -2
  247. package/src/queries/clauses/helpers/RequiredColumn.ts +5 -6
  248. package/src/queries/clauses/helpers/RequiredParams.ts +2 -2
  249. package/src/queries/clauses/where/buildWhereClause.ts +1 -1
  250. package/src/queries/clauses/where/buildWhereClauses.test.ts +1 -1
  251. package/src/queries/clauses/where/buildWhereClauses.ts +1 -1
  252. package/src/queries/clauses/where/types/WhereClauseValue.ts +1 -1
  253. package/src/queries/count/buildCount.ts +39 -33
  254. package/src/queries/count/countToSql.ts +27 -32
  255. package/src/queries/count/types/CountBuilder.ts +23 -6
  256. package/src/queries/count.ts +3 -1
  257. package/src/queries/create/buildCreate.ts +8 -3
  258. package/src/queries/create/createResultSchema.ts +3 -1
  259. package/src/queries/create/createToSql.ts +10 -2
  260. package/src/queries/create/tests/createMany.varied-keys.test.ts +28 -0
  261. package/src/queries/create/tests/createOne.test.ts +70 -0
  262. package/src/queries/create/types/BaseCreateManyParams.ts +1 -0
  263. package/src/queries/create/types/BaseCreateOneParams.ts +1 -0
  264. package/src/queries/create/types/CreateManyParams.ts +4 -1
  265. package/src/queries/create/types/CreateManyResult.ts +1 -1
  266. package/src/queries/create/types/CreateOneParams.ts +4 -1
  267. package/src/queries/create/types/CreateOneResult.ts +1 -1
  268. package/src/queries/createMany.ts +3 -1
  269. package/src/queries/createOne.ts +9 -0
  270. package/src/queries/delete/buildDelete.ts +2 -2
  271. package/src/queries/delete/deleteResultSchema.ts +3 -1
  272. package/src/queries/delete/deleteToSql.ts +1 -1
  273. package/src/queries/delete/types/DeleteManyResult.ts +1 -1
  274. package/src/queries/delete/types/DeleteOneResult.ts +1 -1
  275. package/src/queries/delete/types/DeleteParams.ts +1 -1
  276. package/src/queries/deleteMany.ts +3 -1
  277. package/src/queries/find/buildFind.ts +46 -35
  278. package/src/queries/find/findResultSchema.ts +9 -2
  279. package/src/queries/find/findToSql.ts +31 -32
  280. package/src/queries/find/getIncludedManyToManyRelations.ts +49 -0
  281. package/src/queries/find/getIncludedOneToManyRelations.ts +44 -0
  282. package/src/queries/find/tests/findMany.include.test.ts +107 -0
  283. package/src/queries/find/tests/findMany.lateral.test.ts +90 -0
  284. package/src/queries/find/tests/findMany.nullable-relations.test.ts +127 -0
  285. package/src/queries/find/tests/middleware.find.where.test.ts +12 -12
  286. package/src/queries/find/types/BaseFindParams.ts +2 -1
  287. package/src/queries/find/types/FindBuilder.ts +25 -6
  288. package/src/queries/find/types/FindManyParams.ts +3 -2
  289. package/src/queries/find/types/FindManyResult.ts +2 -1
  290. package/src/queries/find/types/FindOneParams.ts +2 -1
  291. package/src/queries/find/types/FindOneResult.ts +48 -13
  292. package/src/queries/findMany.ts +127 -67
  293. package/src/queries/middleware/Middleware.ts +1 -1
  294. package/src/queries/update/buildUpdate.ts +10 -10
  295. package/src/queries/update/tests/updateOne.test.ts +3 -3
  296. package/src/queries/update/types/BaseUpdateParams.ts +1 -1
  297. package/src/queries/update/types/UpdateManyResult.ts +1 -1
  298. package/src/queries/update/types/UpdateOneResult.ts +1 -1
  299. package/src/queries/update/types/UpdateParams.ts +2 -2
  300. package/src/queries/update/types/UpdateValues.ts +1 -1
  301. package/src/queries/update/updateResultSchema.ts +3 -1
  302. package/src/queries/update/updateToSql.ts +3 -3
  303. package/src/queries/updateMany.ts +3 -1
  304. package/src/queries/util/rowToObject.ts +5 -1
  305. package/src/schema/populate/composeMiddleware.ts +1 -1
  306. package/src/schema/populate/populateModel.ts +1 -0
  307. package/src/schema/types/base/BaseColumn.ts +1 -0
  308. package/src/schema/types/base/BaseRelation.ts +1 -0
  309. package/src/schema/types/helpers/ColumnName.ts +5 -6
  310. package/src/schema/types/helpers/ColumnType.ts +2 -2
  311. package/src/schema/types/helpers/Columns.ts +2 -6
  312. package/src/schema/types/helpers/HasDefault.ts +5 -7
  313. package/src/schema/types/helpers/IsNullable.ts +4 -6
  314. package/src/schema/types/helpers/IsProvided.ts +8 -0
  315. package/src/schema/types/helpers/IsSerial.ts +4 -6
  316. package/src/schema/types/loose/LooseColumnDefinition.ts +6 -0
  317. package/src/schema/types/loose/LooseRelationDefinition.ts +1 -1
  318. package/src/schema/types/relations/ManyToManyRelation.ts +2 -2
  319. package/src/schema/types/relations/ManyToOneRelation.ts +1 -1
  320. package/src/schema/types/relations/OneToManyRelation.ts +2 -1
  321. package/src/schema/types/strict/ColumnDefinition.ts +6 -0
  322. package/src/test/db/models/post.model.ts +6 -0
  323. package/src/test/db/models/post.relations.ts +6 -0
  324. package/src/test/db/models/user.model.ts +6 -0
  325. package/src/test/db/models/user.relations.ts +16 -0
  326. package/src/types/ModelType.ts +16 -3
  327. package/.env +0 -2
  328. package/.eslintrc.cjs +0 -69
  329. package/.github/actions/ci-setup/action.yml +0 -19
  330. package/.github/dependabot.yml +0 -12
  331. package/.github/workflows/ci.yml +0 -119
  332. package/.github/workflows/dependabot.yml +0 -26
  333. package/.github/workflows/semgrep.yml +0 -24
  334. package/.prettierrc.cjs +0 -11
  335. package/.vscode/tasks.json +0 -28
  336. package/codecov.yml +0 -7
  337. package/lib/queries/clauses/helpers/ModelValues.d.ts +0 -8
  338. package/lib/queries/clauses/helpers/ModelValues.d.ts.map +0 -1
  339. package/lib/queries/clauses/helpers/ModelValues.js +0 -2
  340. package/lib/queries/clauses/helpers/ModelValues.js.map +0 -1
  341. package/src/queries/clauses/helpers/ModelValues.ts +0 -9
  342. package/tsconfig.json +0 -18
  343. package/vitest.config.ts +0 -15
@@ -0,0 +1,127 @@
1
+ import { describe, expect, test } from "vitest";
2
+
3
+ import { db } from "../../../test/db";
4
+ import { seed } from "../../../test/seed";
5
+
6
+ describe("findMany", () => {
7
+ test("optional N:1 relations don't prevent records being returned", async () => {
8
+ await db.transact(
9
+ async (db) => {
10
+ await seed(db, {
11
+ users: [
12
+ {
13
+ username: "Russell",
14
+ tenants: [
15
+ { name: "WFMA", posts: 1 },
16
+ { name: "Popova Park", posts: 0 },
17
+ ],
18
+ },
19
+ {
20
+ username: "Dan",
21
+ tenants: [{ name: "WFMA", posts: 2 }],
22
+ },
23
+ {
24
+ username: "Fairooz",
25
+ tenants: [{ name: "WFMA", posts: 0 }],
26
+ },
27
+ ],
28
+ });
29
+ const results = await db.findMany("post", {
30
+ select: ["id", "title"],
31
+ include: {
32
+ reviewedBy: {
33
+ select: ["id", "username"],
34
+ include: {
35
+ posts: { select: ["id", "title"] },
36
+ invitedBy: { select: ["id", "username"] },
37
+ },
38
+ },
39
+ },
40
+ orderBy: ["title"],
41
+ limit: 2,
42
+ });
43
+
44
+ expect(results.map((p) => [p.title, p.reviewedBy])).toEqual([
45
+ ["Post a", null],
46
+ ["Post b", null],
47
+ ]);
48
+ },
49
+ { rollback: true },
50
+ );
51
+ });
52
+
53
+ test("optional N:1 relations are returned if they exist", async () => {
54
+ await db.transact(
55
+ async (db) => {
56
+ const { users } = await seed(db, {
57
+ users: [
58
+ {
59
+ username: "Russell",
60
+ tenants: [
61
+ { name: "WFMA", posts: 1 },
62
+ { name: "Popova Park", posts: 0 },
63
+ ],
64
+ },
65
+ {
66
+ username: "Dan",
67
+ tenants: [{ name: "WFMA", posts: 2 }],
68
+ },
69
+ {
70
+ username: "Fairooz",
71
+ tenants: [{ name: "WFMA", posts: 0 }],
72
+ },
73
+ ],
74
+ });
75
+ await db.updateOne("user", {
76
+ where: { id: users["Dan"].id },
77
+ set: {
78
+ invitedById: users["Russell"].id,
79
+ },
80
+ });
81
+ const results = await db.findMany("user", {
82
+ select: ["username"],
83
+ include: {
84
+ invitedBy: {
85
+ select: ["username"],
86
+ },
87
+ tenants: {
88
+ select: ["name"],
89
+ orderBy: ["name"],
90
+ },
91
+ reviewedPosts: {
92
+ select: ["title"],
93
+ },
94
+ invitedUsers: {
95
+ select: ["username"],
96
+ },
97
+ },
98
+ orderBy: ["username"],
99
+ });
100
+ expect(results).toEqual([
101
+ {
102
+ username: "Dan",
103
+ invitedBy: { username: "Russell" },
104
+ tenants: [{ name: "WFMA" }],
105
+ reviewedPosts: [],
106
+ invitedUsers: [],
107
+ },
108
+ {
109
+ username: "Fairooz",
110
+ invitedBy: null,
111
+ tenants: [{ name: "WFMA" }],
112
+ reviewedPosts: [],
113
+ invitedUsers: [],
114
+ },
115
+ {
116
+ username: "Russell",
117
+ invitedBy: null,
118
+ tenants: [{ name: "Popova Park" }, { name: "WFMA" }],
119
+ reviewedPosts: [],
120
+ invitedUsers: [{ username: "Dan" }],
121
+ },
122
+ ]);
123
+ },
124
+ { rollback: true },
125
+ );
126
+ });
127
+ });
@@ -21,14 +21,14 @@ export const timestamps: Middleware = {
21
21
  },
22
22
  },
23
23
  update: {
24
- values: (values, { model, config }) => {
24
+ set: (set, { model, config }) => {
25
25
  if ("updatedAt" in config.models[model].columns) {
26
26
  return {
27
27
  updatedAt: new Date(),
28
- ...values,
28
+ ...set,
29
29
  };
30
30
  } else {
31
- return values;
31
+ return set;
32
32
  }
33
33
  },
34
34
  },
@@ -50,7 +50,7 @@ export const softdelete: Middleware = {
50
50
  if ("deletedAt" in config.models[model].columns) {
51
51
  return updateOne({
52
52
  ...params,
53
- values: {
53
+ set: {
54
54
  deletedAt: new Date(),
55
55
  },
56
56
  });
@@ -60,7 +60,7 @@ export const softdelete: Middleware = {
60
60
  if ("deletedAt" in config.models[model].columns) {
61
61
  return updateMany({
62
62
  ...params,
63
- values: {
63
+ set: {
64
64
  deletedAt: new Date(),
65
65
  },
66
66
  });
@@ -110,7 +110,7 @@ describe("middleware.find.where", () => {
110
110
  ).toEqual([{ title: "Post a" }, { title: "Post b" }]);
111
111
 
112
112
  await db.updateMany("post", {
113
- values: { deletedAt: new Date() },
113
+ set: { deletedAt: new Date() },
114
114
  where: { authorId: lynne.id },
115
115
  });
116
116
 
@@ -158,7 +158,7 @@ describe("middleware.find.where", () => {
158
158
  ).toEqual([{ title: "Post a" }, { title: "Post b" }]);
159
159
 
160
160
  await db.updateOne("user", {
161
- values: { deletedAt: new Date() },
161
+ set: { deletedAt: new Date() },
162
162
  where: { id: lynne.id },
163
163
  });
164
164
 
@@ -206,7 +206,7 @@ describe("middleware.find.where", () => {
206
206
  ).toEqual([{ title: "Post a" }, { title: "Post b" }]);
207
207
 
208
208
  await db.updateOne("post", {
209
- values: { deletedAt: new Date() },
209
+ set: { deletedAt: new Date() },
210
210
  where: { title: "Post a" },
211
211
  });
212
212
 
@@ -260,7 +260,7 @@ describe("middleware.find.where", () => {
260
260
  ]);
261
261
 
262
262
  await db.updateOne("user", {
263
- values: { deletedAt: new Date() },
263
+ set: { deletedAt: new Date() },
264
264
  where: { username: "Lynne Tillman" },
265
265
  });
266
266
 
@@ -311,7 +311,7 @@ describe("middleware.find.where", () => {
311
311
  ).toEqual([{ title: "Post a" }, { title: "Post b" }]);
312
312
 
313
313
  await db.updateMany("post", {
314
- values: { deletedAt: new Date() },
314
+ set: { deletedAt: new Date() },
315
315
  where: { authorId: lynne.id },
316
316
  });
317
317
 
@@ -360,11 +360,11 @@ describe("middleware.find.where", () => {
360
360
  ]);
361
361
 
362
362
  await db.updateMany("post", {
363
- values: { title: "Post AAAAAA" },
363
+ set: { title: "Post AAAAAA" },
364
364
  where: { authorId: lynne.id, title: "Post a" },
365
365
  });
366
366
  await db.updateMany("post", {
367
- values: { deletedAt: new Date() },
367
+ set: { deletedAt: new Date() },
368
368
  where: { authorId: lynne.id, title: "Post b" },
369
369
  });
370
370
 
@@ -5,7 +5,7 @@ import { WhereClause } from "../../clauses/WhereClause";
5
5
 
6
6
  export type BaseFindParams = {
7
7
  select: string[];
8
- include?: Partial<Record<string, BaseFindParams>>;
8
+ include?: Partial<Record<string, Omit<BaseFindParams, "for">>>;
9
9
  where?: WhereClause<
10
10
  LooseModelDefinitions,
11
11
  ModelName<LooseModelDefinitions>
@@ -13,5 +13,6 @@ export type BaseFindParams = {
13
13
  limit?: number;
14
14
  offset?: number;
15
15
  lateralBy?: LateralByClause;
16
+ for?: "update" | "no key update" | "share" | "key share";
16
17
  orderBy?: (string | [string, "asc" | "desc"])[];
17
18
  };
@@ -12,12 +12,12 @@ export type FindBuilder = {
12
12
  path: string[];
13
13
  }[];
14
14
 
15
- tables: {
16
- name: string;
15
+ table: {
16
+ table: string;
17
17
  model: string;
18
18
  schema: string;
19
19
  alias: string;
20
- joins?: Join[];
20
+ joins: Join[];
21
21
  conditions?: WhereClause<
22
22
  LooseModelDefinitions,
23
23
  ModelName<LooseModelDefinitions>
@@ -26,7 +26,7 @@ export type FindBuilder = {
26
26
  LooseModelDefinitions,
27
27
  ModelName<LooseModelDefinitions>
28
28
  >;
29
- }[];
29
+ };
30
30
 
31
31
  lateralBy?: {
32
32
  groupTable: string;
@@ -38,6 +38,8 @@ export type FindBuilder = {
38
38
  }[];
39
39
  };
40
40
 
41
+ for?: "update" | "no key update" | "share" | "key share";
42
+
41
43
  orderBy: {
42
44
  table: string;
43
45
  column: string;
@@ -49,6 +51,23 @@ export type FindBuilder = {
49
51
  offset?: number;
50
52
  };
51
53
  export type Join = {
52
- from: { table: string; columns: string[] };
53
- to: { table: string; columns: string[] };
54
+ from: {
55
+ schema: string;
56
+ table: string;
57
+ alias: string;
58
+ model: string;
59
+ columns: string[];
60
+ };
61
+ to: {
62
+ schema: string;
63
+ table: string;
64
+ alias: string;
65
+ model: string;
66
+ columns: string[];
67
+ };
68
+ where?: WhereClause<
69
+ LooseModelDefinitions,
70
+ ModelName<LooseModelDefinitions>
71
+ >;
72
+ type?: "inner" | "left";
54
73
  };
@@ -12,12 +12,13 @@ export type FindManyParams<
12
12
  Relations extends LooseRelationsDefinitions<Models>,
13
13
  M extends ModelName<Models>,
14
14
  > = {
15
- select: SelectClause<Models, M>;
15
+ select: SelectClause<Models[M]>;
16
16
  include?: IncludeClause<Models, Relations, M>;
17
17
  where?: WhereClause<Models, M>;
18
18
  limit?: number;
19
19
  offset?: number;
20
20
  orderBy?: NonEmptyArray<
21
- ColumnName<Models, M> | [ColumnName<Models, M>, "asc" | "desc"]
21
+ ColumnName<Models[M]> | [ColumnName<Models[M]>, "asc" | "desc"]
22
22
  >;
23
+ for?: "update" | "no key update" | "share" | "key share";
23
24
  };
@@ -1,6 +1,7 @@
1
1
  import { ModelName } from "../../../schema/types/helpers/ModelName";
2
2
  import { LooseModelDefinitions } from "../../../schema/types/loose/LooseModelDefinitions";
3
3
  import { LooseRelationsDefinitions } from "../../../schema/types/loose/LooseRelationsDefinitions";
4
+ import { Simplify } from "../../../types/util/Simplify";
4
5
  import { FindManyParams } from "./FindManyParams";
5
6
  import { FindOneResult } from "./FindOneResult";
6
7
 
@@ -9,4 +10,4 @@ export type FindManyResult<
9
10
  Relations extends LooseRelationsDefinitions<Models>,
10
11
  M extends ModelName<Models>,
11
12
  Q extends FindManyParams<Models, Relations, M>,
12
- > = FindOneResult<Models, Relations, M, Q>[];
13
+ > = Simplify<FindOneResult<Models, Relations, M, Q>[]>;
@@ -10,7 +10,8 @@ export type FindOneParams<
10
10
  Relations extends LooseRelationsDefinitions<Models>,
11
11
  M extends ModelName<Models>,
12
12
  > = {
13
- select: SelectClause<Models, M>;
13
+ select: SelectClause<Models[M]>;
14
14
  where?: WhereClause<Models, M>;
15
15
  include?: IncludeClause<Models, Relations, M>;
16
+ for?: "update" | "no key update" | "share" | "key share";
16
17
  };
@@ -9,6 +9,9 @@ import { IncludedRelationQuery } from "../../clauses/include/IncludedRelationQue
9
9
  import { FindManyParams } from "./FindManyParams";
10
10
  import { FindOneParams } from "./FindOneParams";
11
11
 
12
+ /**
13
+ * this is a mess and needs refactoring
14
+ */
12
15
  export type FindOneResult<
13
16
  Models extends LooseModelDefinitions,
14
17
  Relations extends LooseRelationsDefinitions<Models>,
@@ -32,19 +35,51 @@ export type FindOneResult<
32
35
  Relations,
33
36
  M,
34
37
  Q
35
- >]: Relations[M][R] extends { type: "N:1" }
36
- ? FindOneResult<
37
- Models,
38
- Relations,
39
- IncludedRelationModel<Models, Relations, M, R>,
40
- IncludedRelationQuery<Models, Relations, M, R, Q>
41
- >
42
- : FindOneResult<
43
- Models,
44
- Relations,
45
- IncludedRelationModel<Models, Relations, M, R>,
46
- IncludedRelationQuery<Models, Relations, M, R, Q>
47
- >[];
38
+ // for each optional N:1 relation
39
+ >]: Relations[M][R] extends {
40
+ type: "N:1";
41
+ optional: true;
42
+ }
43
+ ? // if its foreign key is optional, the included relation
44
+ // needs to be optional too
45
+ // TODO this currently doesn't work for compound primary keys
46
+ // need to figure out a way to make it work,
47
+ // and also to refactor this mess to be more readable
48
+ | FindOneResult<
49
+ Models,
50
+ Relations,
51
+ IncludedRelationModel<
52
+ Models,
53
+ Relations,
54
+ M,
55
+ R
56
+ >,
57
+ IncludedRelationQuery<
58
+ Models,
59
+ Relations,
60
+ M,
61
+ R,
62
+ Q
63
+ >
64
+ >
65
+ | undefined
66
+ : Relations[M][R] extends {
67
+ type: "N:1";
68
+ }
69
+ ? // otherwise the included relation is required
70
+ FindOneResult<
71
+ Models,
72
+ Relations,
73
+ IncludedRelationModel<Models, Relations, M, R>,
74
+ IncludedRelationQuery<Models, Relations, M, R, Q>
75
+ >
76
+ : // for other types of relation, the included relation is an array
77
+ FindOneResult<
78
+ Models,
79
+ Relations,
80
+ IncludedRelationModel<Models, Relations, M, R>,
81
+ IncludedRelationQuery<Models, Relations, M, R, Q>
82
+ >[];
48
83
  })
49
84
  >
50
85
  >;
@@ -1,4 +1,12 @@
1
- import { groupBy } from "lodash-es";
1
+ import {
2
+ dropRight,
3
+ get,
4
+ groupBy,
5
+ isEqual,
6
+ mergeWith,
7
+ set,
8
+ uniqWith,
9
+ } from "lodash-es";
2
10
  import hash from "object-hash";
3
11
  import { BaseConfiguration } from "src/schema/types/base/BaseConfiguration";
4
12
 
@@ -8,6 +16,8 @@ import { logger } from "../logger";
8
16
  import { ensureArray } from "../util/ensureArray";
9
17
  import { buildFind } from "./find/buildFind";
10
18
  import { findToSql } from "./find/findToSql";
19
+ import { getIncludedManyToManyRelations } from "./find/getIncludedManyToManyRelations";
20
+ import { getIncludedOneToManyRelations } from "./find/getIncludedOneToManyRelations";
11
21
  import { BaseFindParams } from "./find/types/BaseFindParams";
12
22
  import { rowToObject } from "./util/rowToObject";
13
23
 
@@ -25,89 +35,139 @@ export const findMany = async (
25
35
  values: statement.values,
26
36
  });
27
37
 
28
- if (process.env.NODE_ENV === "test" && !process.env.CI)
38
+ if (process.env.ORM_VERBOSE_LOGGING) {
29
39
  console.log(statement.text);
40
+ console.log(statement.values);
41
+ }
30
42
 
31
43
  const results = await conn
32
44
  .query(statement)
33
45
  .then((result) => result.rows.map(rowToObject(builder.columns)));
34
46
 
35
- for (const [r, subquery] of Object.entries(query.include ?? {})) {
36
- const relation = config.relations[m]![r];
37
- if (relation.type === "1:N") {
38
- const relation = config.relations[m][r];
39
-
40
- const pk = config.models[m].primaryKey;
41
- const fk = ensureArray(relation.foreignKey);
42
-
43
- const lateralBy = fk.map((c, index) => ({
44
- column: c,
45
- values: results.map((result) => result[pk[index]]),
46
- }));
47
-
48
- const subqueryResults = await findMany(
49
- conn,
50
- config,
51
- relation.model,
52
- { ...subquery!, lateralBy },
53
- );
54
-
47
+ const fetchIncludedOneToManyRelations = getIncludedOneToManyRelations(
48
+ config,
49
+ m,
50
+ query,
51
+ ).map(({ model, relation, query, path }) => {
52
+ const pk = config.models[model].primaryKey;
53
+ const fk = ensureArray(relation.foreignKey);
54
+
55
+ const lateralValues = mergeWith(
56
+ Object.fromEntries(fk.map((c) => [c, []])),
57
+ ...uniqWith(
58
+ results.map((result) => {
59
+ return Object.fromEntries(
60
+ fk.map((c, index) => [
61
+ c,
62
+ [get(result, [...dropRight(path, 1), pk[index]])],
63
+ ]),
64
+ );
65
+ }),
66
+ isEqual,
67
+ ),
68
+ (a: unknown[], b: unknown[]) => a.concat(b),
69
+ );
70
+
71
+ const lateralBy = fk.map((c) => ({
72
+ column: c,
73
+ values: lateralValues[c],
74
+ }));
75
+
76
+ return findMany(conn, config, relation.model, {
77
+ ...query,
78
+ for: builder.for,
79
+ lateralBy,
80
+ }).then((subqueryResults) => {
55
81
  const lookup = groupBy(subqueryResults, (result) => {
56
82
  return hash(fk.map((c) => result[c]));
57
83
  });
58
-
59
84
  for (const result of results) {
60
- const key = hash(pk.map((c) => result[c]));
61
- result[r] = lookup[key] ?? [];
62
- }
63
- } else if (relation.type === "N:N") {
64
- const joinFrom = Object.entries(config.relations[m]).find(
65
- ([, rel]) =>
66
- rel.type === "1:N" && rel.model === relation.through,
67
- )?.[0];
68
-
69
- const joinTo = Object.entries(
70
- config.relations[relation.through],
71
- ).find(
72
- ([, rel]) => rel.type === "N:1" && rel.model === relation.model,
73
- )?.[0];
74
-
75
- if (joinFrom === undefined || joinTo === undefined) {
76
- throw new OrmError(
77
- "Both sides of a N:N relation must be defined",
78
- { data: { joinFrom, joinTo, query } },
79
- );
85
+ const parent =
86
+ path.length === 1
87
+ ? result
88
+ : get(result, dropRight(path, 1));
89
+ if (parent !== undefined) {
90
+ const key = hash(pk.map((c) => get(parent, c)));
91
+ set(result, path, lookup[key] ?? []);
92
+ }
80
93
  }
94
+ });
95
+ });
81
96
 
82
- const pk = config.models[m].primaryKey;
83
- const fk = ensureArray(relation.foreignKey);
84
- const lateralBy = fk.map((c, index) => ({
85
- column: c,
86
- values: results.map((result) => result[pk[index]]),
87
- }));
88
-
89
- const subqueryResults = await findMany(
90
- conn,
91
- config,
92
- relation.through,
93
- {
94
- select: ensureArray(relation.foreignKey),
95
- include: { [joinTo]: subquery! },
96
- lateralBy,
97
- },
98
- );
97
+ const fetchIncludedManyToManyRelations = getIncludedManyToManyRelations(
98
+ config,
99
+ m,
100
+ query,
101
+ ).map(({ model, relation, query, path }) => {
102
+ const joinFrom = Object.entries(config.relations[model]).find(
103
+ ([, rel]) => rel.type === "1:N" && rel.model === relation.through,
104
+ )?.[0];
105
+
106
+ const joinTo = Object.entries(config.relations[relation.through]).find(
107
+ ([, rel]) => rel.type === "N:1" && rel.model === relation.model,
108
+ )?.[0];
109
+
110
+ if (joinFrom === undefined || joinTo === undefined) {
111
+ throw new OrmError("Both sides of a N:N relation must be defined", {
112
+ data: { joinFrom, joinTo, query },
113
+ });
114
+ }
115
+
116
+ const pk = config.models[model].primaryKey;
117
+ const fk = ensureArray(relation.foreignKey);
118
+
119
+ const lateralValues = mergeWith(
120
+ Object.fromEntries(fk.map((c) => [c, []])),
121
+ ...uniqWith(
122
+ results.map((result) => {
123
+ return Object.fromEntries(
124
+ fk.map((c, index) => [
125
+ c,
126
+ [get(result, [...dropRight(path, 1), pk[index]])],
127
+ ]),
128
+ );
129
+ }),
130
+ isEqual,
131
+ ),
132
+ (a: unknown[], b: unknown[]) => a.concat(b),
133
+ );
134
+
135
+ const lateralBy = fk.map((c) => ({
136
+ column: c,
137
+ values: lateralValues[c],
138
+ }));
139
+
140
+ return findMany(conn, config, relation.through, {
141
+ select: ensureArray(relation.foreignKey),
142
+ include: { [joinTo]: query },
143
+ for: builder.for,
144
+ lateralBy,
145
+ }).then((subqueryResults) => {
99
146
  const lookup = groupBy(subqueryResults, (result) => {
100
147
  return hash(fk.map((c) => result[c]));
101
148
  });
102
-
103
149
  for (const result of results) {
104
- const key = hash(pk.map((c) => result[c]));
105
- result[r] = (lookup[key] ?? []).map(
106
- (relation) => relation[joinTo] ?? [],
107
- );
150
+ const parent =
151
+ path.length === 1
152
+ ? result
153
+ : get(result, dropRight(path, 1));
154
+
155
+ if (parent !== undefined) {
156
+ const key = hash(pk.map((c) => get(parent, c)));
157
+ set(
158
+ result,
159
+ path,
160
+ (lookup[key] ?? []).map((r) => r[joinTo] ?? []),
161
+ );
162
+ }
108
163
  }
109
- }
110
- }
164
+ });
165
+ });
166
+
167
+ await Promise.all([
168
+ ...fetchIncludedOneToManyRelations,
169
+ ...fetchIncludedManyToManyRelations,
170
+ ]);
111
171
 
112
172
  return results;
113
173
  };
@@ -15,7 +15,7 @@ export type Middleware = {
15
15
  values?: ValuesMiddleware;
16
16
  };
17
17
  update?: {
18
- values?: ValuesMiddleware;
18
+ set?: ValuesMiddleware;
19
19
  where?: WhereMiddleware;
20
20
  };
21
21
  count?: {