@casekit/orm2 0.0.0-20250322230249

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 (275) hide show
  1. package/build/builders/buildCount.d.ts +23 -0
  2. package/build/builders/buildCount.js +63 -0
  3. package/build/builders/buildCount.test.d.ts +1 -0
  4. package/build/builders/buildCount.test.js +144 -0
  5. package/build/builders/buildCreate.d.ts +5 -0
  6. package/build/builders/buildCreate.js +28 -0
  7. package/build/builders/buildCreate.test.d.ts +1 -0
  8. package/build/builders/buildCreate.test.js +47 -0
  9. package/build/builders/buildDelete.d.ts +5 -0
  10. package/build/builders/buildDelete.js +28 -0
  11. package/build/builders/buildDelete.test.d.ts +1 -0
  12. package/build/builders/buildDelete.test.js +108 -0
  13. package/build/builders/buildFind.d.ts +8 -0
  14. package/build/builders/buildFind.js +185 -0
  15. package/build/builders/buildFind.test.d.ts +1 -0
  16. package/build/builders/buildFind.test.js +263 -0
  17. package/build/builders/buildUpdate.d.ts +5 -0
  18. package/build/builders/buildUpdate.js +34 -0
  19. package/build/builders/buildUpdate.test.d.ts +1 -0
  20. package/build/builders/buildUpdate.test.js +130 -0
  21. package/build/builders/buildWhere.d.ts +6 -0
  22. package/build/builders/buildWhere.js +63 -0
  23. package/build/builders/buildWhere.test.d.ts +1 -0
  24. package/build/builders/buildWhere.test.js +154 -0
  25. package/build/builders/types.d.ts +87 -0
  26. package/build/builders/types.js +1 -0
  27. package/build/connection.d.ts +31 -0
  28. package/build/connection.js +206 -0
  29. package/build/index.d.ts +10 -0
  30. package/build/index.js +5 -0
  31. package/build/operators.d.ts +59 -0
  32. package/build/operators.js +44 -0
  33. package/build/orm.count.d.ts +14 -0
  34. package/build/orm.count.js +22 -0
  35. package/build/orm.createMany.d.ts +5 -0
  36. package/build/orm.createMany.js +26 -0
  37. package/build/orm.createOne.d.ts +5 -0
  38. package/build/orm.createOne.js +34 -0
  39. package/build/orm.d.ts +81 -0
  40. package/build/orm.deleteMany.d.ts +5 -0
  41. package/build/orm.deleteMany.js +26 -0
  42. package/build/orm.deleteOne.d.ts +5 -0
  43. package/build/orm.deleteOne.js +32 -0
  44. package/build/orm.findMany.d.ts +8 -0
  45. package/build/orm.findMany.js +64 -0
  46. package/build/orm.findOne.d.ts +5 -0
  47. package/build/orm.findOne.js +20 -0
  48. package/build/orm.js +243 -0
  49. package/build/orm.restrict.d.ts +6 -0
  50. package/build/orm.restrict.js +52 -0
  51. package/build/orm.updateMany.d.ts +5 -0
  52. package/build/orm.updateMany.js +29 -0
  53. package/build/orm.updateOne.d.ts +5 -0
  54. package/build/orm.updateOne.js +35 -0
  55. package/build/sql/countToSql.d.ts +3 -0
  56. package/build/sql/countToSql.js +11 -0
  57. package/build/sql/countToSql.test.d.ts +1 -0
  58. package/build/sql/countToSql.test.js +218 -0
  59. package/build/sql/createToSql.d.ts +3 -0
  60. package/build/sql/createToSql.js +27 -0
  61. package/build/sql/createToSql.test.d.ts +1 -0
  62. package/build/sql/createToSql.test.js +186 -0
  63. package/build/sql/deleteToSql.d.ts +3 -0
  64. package/build/sql/deleteToSql.js +15 -0
  65. package/build/sql/deleteToSql.test.d.ts +1 -0
  66. package/build/sql/deleteToSql.test.js +93 -0
  67. package/build/sql/findToSql.d.ts +3 -0
  68. package/build/sql/findToSql.js +33 -0
  69. package/build/sql/findToSql.test.d.ts +1 -0
  70. package/build/sql/findToSql.test.js +409 -0
  71. package/build/sql/updateToSql.d.ts +3 -0
  72. package/build/sql/updateToSql.js +16 -0
  73. package/build/sql/updateToSql.test.d.ts +1 -0
  74. package/build/sql/updateToSql.test.js +165 -0
  75. package/build/sql/util.d.ts +11 -0
  76. package/build/sql/util.js +36 -0
  77. package/build/sql/util.test.d.ts +1 -0
  78. package/build/sql/util.test.js +163 -0
  79. package/build/tests/connection.test.d.ts +1 -0
  80. package/build/tests/connection.test.js +304 -0
  81. package/build/tests/datatypes.test.d.ts +1 -0
  82. package/build/tests/datatypes.test.js +239 -0
  83. package/build/tests/operators.test.d.ts +1 -0
  84. package/build/tests/operators.test.js +125 -0
  85. package/build/tests/orm.count.middleware.test.d.ts +1 -0
  86. package/build/tests/orm.count.middleware.test.js +132 -0
  87. package/build/tests/orm.count.test-d.d.ts +1 -0
  88. package/build/tests/orm.count.test-d.js +60 -0
  89. package/build/tests/orm.count.test.d.ts +1 -0
  90. package/build/tests/orm.count.test.js +151 -0
  91. package/build/tests/orm.createMany.middleware.test.d.ts +1 -0
  92. package/build/tests/orm.createMany.middleware.test.js +63 -0
  93. package/build/tests/orm.createMany.test-d.d.ts +1 -0
  94. package/build/tests/orm.createMany.test-d.js +131 -0
  95. package/build/tests/orm.createMany.test.d.ts +1 -0
  96. package/build/tests/orm.createMany.test.js +392 -0
  97. package/build/tests/orm.createOne.middleware.test.d.ts +1 -0
  98. package/build/tests/orm.createOne.middleware.test.js +54 -0
  99. package/build/tests/orm.createOne.test-d.d.ts +1 -0
  100. package/build/tests/orm.createOne.test-d.js +113 -0
  101. package/build/tests/orm.createOne.test.d.ts +1 -0
  102. package/build/tests/orm.createOne.test.js +268 -0
  103. package/build/tests/orm.deleteMany.middleware.test.d.ts +1 -0
  104. package/build/tests/orm.deleteMany.middleware.test.js +77 -0
  105. package/build/tests/orm.deleteMany.test-d.d.ts +1 -0
  106. package/build/tests/orm.deleteMany.test-d.js +179 -0
  107. package/build/tests/orm.deleteMany.test.d.ts +1 -0
  108. package/build/tests/orm.deleteMany.test.js +394 -0
  109. package/build/tests/orm.deleteOne.middleware.test.d.ts +1 -0
  110. package/build/tests/orm.deleteOne.middleware.test.js +61 -0
  111. package/build/tests/orm.deleteOne.test-d.d.ts +1 -0
  112. package/build/tests/orm.deleteOne.test-d.js +179 -0
  113. package/build/tests/orm.deleteOne.test.d.ts +1 -0
  114. package/build/tests/orm.deleteOne.test.js +360 -0
  115. package/build/tests/orm.findMany.includeManyToMany.test.d.ts +1 -0
  116. package/build/tests/orm.findMany.includeManyToMany.test.js +335 -0
  117. package/build/tests/orm.findMany.includeManyToOne.test.d.ts +1 -0
  118. package/build/tests/orm.findMany.includeManyToOne.test.js +286 -0
  119. package/build/tests/orm.findMany.includeOneToMany.test.d.ts +1 -0
  120. package/build/tests/orm.findMany.includeOneToMany.test.js +530 -0
  121. package/build/tests/orm.findMany.middleware.test.d.ts +1 -0
  122. package/build/tests/orm.findMany.middleware.test.js +66 -0
  123. package/build/tests/orm.findMany.offsetLimit.test.d.ts +1 -0
  124. package/build/tests/orm.findMany.offsetLimit.test.js +108 -0
  125. package/build/tests/orm.findMany.orderBy.test.d.ts +1 -0
  126. package/build/tests/orm.findMany.orderBy.test.js +304 -0
  127. package/build/tests/orm.findMany.select.test.d.ts +1 -0
  128. package/build/tests/orm.findMany.select.test.js +278 -0
  129. package/build/tests/orm.findMany.test-d.d.ts +1 -0
  130. package/build/tests/orm.findMany.test-d.js +374 -0
  131. package/build/tests/orm.findMany.where.test.d.ts +1 -0
  132. package/build/tests/orm.findMany.where.test.js +383 -0
  133. package/build/tests/orm.findOne.middleware.test.d.ts +1 -0
  134. package/build/tests/orm.findOne.middleware.test.js +57 -0
  135. package/build/tests/orm.findOne.test-d.d.ts +1 -0
  136. package/build/tests/orm.findOne.test-d.js +377 -0
  137. package/build/tests/orm.findOne.test.d.ts +1 -0
  138. package/build/tests/orm.findOne.test.js +247 -0
  139. package/build/tests/orm.restrict.test-d.d.ts +1 -0
  140. package/build/tests/orm.restrict.test-d.js +105 -0
  141. package/build/tests/orm.restrict.test.d.ts +1 -0
  142. package/build/tests/orm.restrict.test.js +259 -0
  143. package/build/tests/orm.transact.test.d.ts +1 -0
  144. package/build/tests/orm.transact.test.js +48 -0
  145. package/build/tests/orm.updateMany.middleware.test.d.ts +1 -0
  146. package/build/tests/orm.updateMany.middleware.test.js +72 -0
  147. package/build/tests/orm.updateMany.test.d.ts +1 -0
  148. package/build/tests/orm.updateMany.test.js +210 -0
  149. package/build/tests/orm.updateOne.middleware.test.d.ts +1 -0
  150. package/build/tests/orm.updateOne.middleware.test.js +62 -0
  151. package/build/tests/orm.updateOne.test.d.ts +1 -0
  152. package/build/tests/orm.updateOne.test.js +209 -0
  153. package/build/tests/util/db.d.ts +1571 -0
  154. package/build/tests/util/db.js +10 -0
  155. package/build/tests/util/logger.d.ts +19 -0
  156. package/build/tests/util/logger.js +40 -0
  157. package/build/types/BaseFindParams.d.ts +1 -0
  158. package/build/types/BaseFindParams.js +1 -0
  159. package/build/types/CountParams.d.ts +16 -0
  160. package/build/types/CountParams.js +1 -0
  161. package/build/types/CountParams.test-d.d.ts +1 -0
  162. package/build/types/CountParams.test-d.js +89 -0
  163. package/build/types/CreateManyParams.d.ts +11 -0
  164. package/build/types/CreateManyParams.js +1 -0
  165. package/build/types/CreateManyParams.test-d.d.ts +1 -0
  166. package/build/types/CreateManyParams.test-d.js +83 -0
  167. package/build/types/CreateManyResult.d.ts +5 -0
  168. package/build/types/CreateManyResult.js +1 -0
  169. package/build/types/CreateManyResult.test-d.d.ts +1 -0
  170. package/build/types/CreateManyResult.test-d.js +22 -0
  171. package/build/types/CreateOneParams.d.ts +11 -0
  172. package/build/types/CreateOneParams.js +1 -0
  173. package/build/types/CreateOneParams.test-d.d.ts +1 -0
  174. package/build/types/CreateOneParams.test-d.js +56 -0
  175. package/build/types/CreateOneResult.d.ts +5 -0
  176. package/build/types/CreateOneResult.js +1 -0
  177. package/build/types/CreateOneResult.test-d.d.ts +1 -0
  178. package/build/types/CreateOneResult.test-d.js +23 -0
  179. package/build/types/CreateValues.d.ts +6 -0
  180. package/build/types/CreateValues.js +1 -0
  181. package/build/types/CreateValues.test-d.d.ts +1 -0
  182. package/build/types/CreateValues.test-d.js +60 -0
  183. package/build/types/DeleteManyResult.d.ts +5 -0
  184. package/build/types/DeleteManyResult.js +1 -0
  185. package/build/types/DeleteManyResult.test-d.d.ts +1 -0
  186. package/build/types/DeleteManyResult.test-d.js +23 -0
  187. package/build/types/DeleteOneResult.d.ts +5 -0
  188. package/build/types/DeleteOneResult.js +1 -0
  189. package/build/types/DeleteOneResult.test-d.d.ts +1 -0
  190. package/build/types/DeleteOneResult.test-d.js +23 -0
  191. package/build/types/DeleteParams.d.ts +7 -0
  192. package/build/types/DeleteParams.js +1 -0
  193. package/build/types/DeleteParams.test-d.d.ts +1 -0
  194. package/build/types/DeleteParams.test-d.js +46 -0
  195. package/build/types/FindParams.d.ts +22 -0
  196. package/build/types/FindParams.js +1 -0
  197. package/build/types/FindParams.test-d.d.ts +1 -0
  198. package/build/types/FindParams.test-d.js +107 -0
  199. package/build/types/FindResult.d.ts +13 -0
  200. package/build/types/FindResult.js +1 -0
  201. package/build/types/FindResult.test-d.d.ts +1 -0
  202. package/build/types/FindResult.test-d.js +30 -0
  203. package/build/types/IncludeClause.d.ts +5 -0
  204. package/build/types/IncludeClause.js +1 -0
  205. package/build/types/IncludeClause.test-d.d.ts +1 -0
  206. package/build/types/IncludeClause.test-d.js +69 -0
  207. package/build/types/Middleware.d.ts +51 -0
  208. package/build/types/Middleware.js +37 -0
  209. package/build/types/OptionalValues.d.ts +4 -0
  210. package/build/types/OptionalValues.js +1 -0
  211. package/build/types/OptionalValues.test-d.d.ts +1 -0
  212. package/build/types/OptionalValues.test-d.js +12 -0
  213. package/build/types/OrderByClause.d.ts +9 -0
  214. package/build/types/OrderByClause.js +1 -0
  215. package/build/types/OrderByClause.test-d.d.ts +1 -0
  216. package/build/types/OrderByClause.test-d.js +44 -0
  217. package/build/types/RequiredValues.d.ts +4 -0
  218. package/build/types/RequiredValues.js +1 -0
  219. package/build/types/RequiredValues.test-d.d.ts +1 -0
  220. package/build/types/RequiredValues.test-d.js +22 -0
  221. package/build/types/RestrictModels.d.ts +23 -0
  222. package/build/types/RestrictModels.js +1 -0
  223. package/build/types/RestrictModels.test-d.d.ts +1 -0
  224. package/build/types/RestrictModels.test-d.js +44 -0
  225. package/build/types/ReturningClause.d.ts +3 -0
  226. package/build/types/ReturningClause.js +1 -0
  227. package/build/types/ReturningClause.test-d.d.ts +1 -0
  228. package/build/types/ReturningClause.test-d.js +15 -0
  229. package/build/types/SelectClause.d.ts +3 -0
  230. package/build/types/SelectClause.js +1 -0
  231. package/build/types/SelectClause.test-d.d.ts +1 -0
  232. package/build/types/SelectClause.test-d.js +15 -0
  233. package/build/types/UpdateManyResult.d.ts +5 -0
  234. package/build/types/UpdateManyResult.js +1 -0
  235. package/build/types/UpdateManyResult.test-d.d.ts +1 -0
  236. package/build/types/UpdateManyResult.test-d.js +15 -0
  237. package/build/types/UpdateOneResult.d.ts +5 -0
  238. package/build/types/UpdateOneResult.js +1 -0
  239. package/build/types/UpdateOneResult.test-d.d.ts +1 -0
  240. package/build/types/UpdateOneResult.test-d.js +15 -0
  241. package/build/types/UpdateParams.d.ts +9 -0
  242. package/build/types/UpdateParams.js +1 -0
  243. package/build/types/UpdateParams.test-d.d.ts +1 -0
  244. package/build/types/UpdateParams.test-d.js +29 -0
  245. package/build/types/UpdateValues.d.ts +6 -0
  246. package/build/types/UpdateValues.js +1 -0
  247. package/build/types/UpdateValues.test-d.d.ts +1 -0
  248. package/build/types/UpdateValues.test-d.js +33 -0
  249. package/build/types/WhereClause.d.ts +29 -0
  250. package/build/types/WhereClause.js +1 -0
  251. package/build/types/WhereClause.test-d.d.ts +1 -0
  252. package/build/types/WhereClause.test-d.js +137 -0
  253. package/build/util/getIncludedToManySubqueries.d.ts +12 -0
  254. package/build/util/getIncludedToManySubqueries.js +63 -0
  255. package/build/util/getIncludedToManySubqueries.test.d.ts +1 -0
  256. package/build/util/getIncludedToManySubqueries.test.js +121 -0
  257. package/build/util/getLateralJoinValues.d.ts +4 -0
  258. package/build/util/getLateralJoinValues.js +30 -0
  259. package/build/util/getLateralJoinValues.test.d.ts +1 -0
  260. package/build/util/getLateralJoinValues.test.js +99 -0
  261. package/build/util/hasClauses.d.ts +1 -0
  262. package/build/util/hasClauses.js +9 -0
  263. package/build/util/hasClauses.test.d.ts +1 -0
  264. package/build/util/hasClauses.test.js +15 -0
  265. package/build/util/makeTableAlias.d.ts +1 -0
  266. package/build/util/makeTableAlias.js +10 -0
  267. package/build/util/makeTableAlias.test.d.ts +1 -0
  268. package/build/util/makeTableAlias.test.js +18 -0
  269. package/build/util/resultSchema.d.ts +10 -0
  270. package/build/util/resultSchema.js +42 -0
  271. package/build/util/rowToObject.d.ts +8 -0
  272. package/build/util/rowToObject.js +10 -0
  273. package/build/util/rowToObject.test.d.ts +1 -0
  274. package/build/util/rowToObject.test.js +68 -0
  275. package/package.json +67 -0
@@ -0,0 +1,105 @@
1
+ import { assertType, describe, expectTypeOf, test } from "vitest";
2
+ import { models } from "@casekit/orm2-fixtures";
3
+ import { orm } from "../orm.js";
4
+ const db = orm({ models });
5
+ describe("restrict types", () => {
6
+ test("allows querying allowed models", () => {
7
+ const restricted = db.restrict(["user", "post"]);
8
+ // Should allow querying user model
9
+ assertType(restricted.findOne("user", {
10
+ select: ["id", "name"],
11
+ }));
12
+ // Should allow querying post model with relation to allowed model
13
+ assertType(restricted.findOne("post", {
14
+ select: ["id", "title"],
15
+ include: {
16
+ author: { select: ["id", "name"] },
17
+ },
18
+ }));
19
+ });
20
+ test("prevents querying disallowed models", () => {
21
+ const restricted = db.restrict(["user"]);
22
+ assertType(
23
+ // @ts-expect-error - post model is not allowed
24
+ restricted.findOne("post", {
25
+ select: ["id", "title"],
26
+ }));
27
+ });
28
+ test("prevents querying disallowed relations", () => {
29
+ const restricted = db.restrict(["user", "friendship"]);
30
+ assertType(restricted.findOne("user", {
31
+ select: ["id", "name"],
32
+ include: {
33
+ // @ts-expect-error post model is not allowed
34
+ posts: { select: ["id", "title"] },
35
+ },
36
+ }));
37
+ });
38
+ test("allowing through model also allows N:N relations", () => {
39
+ const restricted = db.restrict(["user", "friendship"]);
40
+ assertType(restricted.findOne("user", {
41
+ select: ["id", "name"],
42
+ include: {
43
+ friends: { select: ["id", "name"] },
44
+ },
45
+ }));
46
+ expectTypeOf(restricted.findOne("user", {
47
+ select: ["id", "name"],
48
+ include: {
49
+ friends: { select: ["id", "name"] },
50
+ },
51
+ })).resolves.toEqualTypeOf();
52
+ });
53
+ test("restricting a model such that it has no relations prevents any include clauses on that model", () => {
54
+ const restricted = db.restrict(["user"]);
55
+ assertType(restricted.findOne("user", {
56
+ select: ["id", "name"],
57
+ // @ts-expect-error user has no allowed relations
58
+ include: {
59
+ posts: { select: ["id", "title"] },
60
+ },
61
+ }));
62
+ });
63
+ test("disallowing through model prevents N:N relations", () => {
64
+ const restricted = db.restrict(["user", "post"]);
65
+ assertType(restricted.findOne("user", {
66
+ select: ["id", "name"],
67
+ include: {
68
+ // @ts-expect-error friendship is not allowed
69
+ friends: { select: ["id", "name"] },
70
+ },
71
+ }));
72
+ });
73
+ test("respects return types of queries on restricted orm", () => {
74
+ const restricted = db.restrict(["user"]);
75
+ expectTypeOf(restricted.findOne("user", {
76
+ select: ["id", "name", "role"],
77
+ })).resolves.toEqualTypeOf();
78
+ });
79
+ test("restricting twice maintains most restrictive set", () => {
80
+ const restricted = db.restrict(["user", "post"]).restrict(["user"]);
81
+ // Should allow user queries
82
+ assertType(restricted.findOne("user", {
83
+ select: ["id", "name"],
84
+ }));
85
+ // Should prevent post queries
86
+ assertType(
87
+ // @ts-expect-error - post model is not allowed after second restriction
88
+ restricted.findOne("post", {
89
+ select: ["id", "title"],
90
+ }));
91
+ });
92
+ test("empty restriction set creates unusable orm", () => {
93
+ const restricted = db.restrict([]);
94
+ assertType(
95
+ // @ts-expect-error - no models are allowed
96
+ restricted.findOne("user", {
97
+ select: ["id", "name"],
98
+ }));
99
+ assertType(
100
+ // @ts-expect-error - no models are allowed
101
+ restricted.findOne("post", {
102
+ select: ["id", "title"],
103
+ }));
104
+ });
105
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,259 @@
1
+ import { afterAll, beforeAll, describe, expect, test } from "vitest";
2
+ import { config } from "@casekit/orm2-fixtures";
3
+ import { orm } from "../orm.js";
4
+ import { mockLogger } from "./util/logger.js";
5
+ describe("orm.restrict", () => {
6
+ const logger = mockLogger();
7
+ const db = orm({ ...config, logger });
8
+ beforeAll(async () => {
9
+ await db.connect();
10
+ });
11
+ afterAll(async () => {
12
+ await db.close();
13
+ });
14
+ test("foo", () => {
15
+ let x = {
16
+ foo: 2,
17
+ bar: 4,
18
+ };
19
+ expect(x.foo).toEqual(2);
20
+ x = {
21
+ ...x,
22
+ get foo() {
23
+ throw new Error("haha");
24
+ },
25
+ };
26
+ expect(() => x.foo).toThrow();
27
+ });
28
+ // test("it allows querying permitted models", async () => {
29
+ // await db.restrict(["user", "post"]).transact(
30
+ // async (db) => {
31
+ // // Create a user
32
+ // const user = await db.createOne("user", {
33
+ // values: {
34
+ // name: "Test User",
35
+ // email: "test@example.com",
36
+ // role: "user",
37
+ // },
38
+ // returning: ["id", "name"],
39
+ // });
40
+ // // Create a post for that user
41
+ // await db.createOne("post", {
42
+ // values: {
43
+ // title: "Test Post",
44
+ // content: "Test Content",
45
+ // authorId: user.id,
46
+ // },
47
+ // });
48
+ // // Should be able to query both models
49
+ // const result = await db.findOne("user", {
50
+ // select: ["id", "name"],
51
+ // include: {
52
+ // posts: {
53
+ // select: ["id", "title"],
54
+ // },
55
+ // },
56
+ // where: { id: user.id },
57
+ // });
58
+ // expect(result.name).toBe("Test User");
59
+ // expect(result.posts).toHaveLength(1);
60
+ // expect(result.posts[0]!.title).toBe("Test Post");
61
+ // },
62
+ // { rollback: true },
63
+ // );
64
+ // });
65
+ // test("if an unpermitted model is queried despite the type error, it throws an exception", async () => {
66
+ // await expect(
67
+ // db.restrict(["user"]).transact(
68
+ // async (db) => {
69
+ // // @ts-expect-error - post model should not be accessible
70
+ // await db.findOne("post", {
71
+ // select: ["id"],
72
+ // });
73
+ // },
74
+ // { rollback: true },
75
+ // ),
76
+ // ).rejects.toThrow(
77
+ // 'Model "post" is not permitted in this restricted ORM instance',
78
+ // );
79
+ // });
80
+ // test("if an unpermitted relation is queried despite the type error, it throws an exception", async () => {
81
+ // await expect(
82
+ // db.restrict(["user", "post"]).transact(
83
+ // async (db) => {
84
+ // await db.findOne("user", {
85
+ // select: ["id"],
86
+ // include: {
87
+ // // @ts-expect-error - color relation should not be accessible
88
+ // backgroundColor: {
89
+ // select: ["hex"],
90
+ // },
91
+ // },
92
+ // });
93
+ // },
94
+ // { rollback: true },
95
+ // ),
96
+ // ).rejects.toThrow(
97
+ // 'Relation "backgroundColor" references model "color" which is not permitted in this restricted ORM instance',
98
+ // );
99
+ // });
100
+ // test("it throws if called inside a transaction", async () => {
101
+ // await expect(
102
+ // db.transact(
103
+ // async (db) => {
104
+ // const restrictedDb = db.restrict(["user"]);
105
+ // await restrictedDb.findOne("user", { select: ["id"] });
106
+ // },
107
+ // { rollback: true },
108
+ // ),
109
+ // ).rejects.toThrowError("Cannot create restricted ORM in a transaction");
110
+ // });
111
+ // test("allows querying through permitted N:1 relations", async () => {
112
+ // await db.restrict(["post", "user"]).transact(
113
+ // async (db) => {
114
+ // const user = await db.createOne("user", {
115
+ // values: {
116
+ // name: "Test User",
117
+ // email: "test@example.com",
118
+ // role: "user",
119
+ // },
120
+ // returning: ["id"],
121
+ // });
122
+ // await db.createOne("post", {
123
+ // values: {
124
+ // title: "Test Post",
125
+ // content: "Content",
126
+ // authorId: user.id,
127
+ // },
128
+ // });
129
+ // const result = await db.findOne("post", {
130
+ // select: ["id", "title"],
131
+ // include: {
132
+ // author: {
133
+ // select: ["name"],
134
+ // },
135
+ // },
136
+ // where: { authorId: user.id },
137
+ // });
138
+ // expect(result.author.name).toBe("Test User");
139
+ // },
140
+ // { rollback: true },
141
+ // );
142
+ // });
143
+ // test("allows querying through permitted 1:N relations", async () => {
144
+ // await db.restrict(["user", "post"]).transact(
145
+ // async (db) => {
146
+ // const user = await db.createOne("user", {
147
+ // values: {
148
+ // name: "Test User",
149
+ // email: "test@example.com",
150
+ // role: "user",
151
+ // },
152
+ // returning: ["id"],
153
+ // });
154
+ // await db.createOne("post", {
155
+ // values: {
156
+ // title: "Test Post",
157
+ // content: "Content",
158
+ // authorId: user.id,
159
+ // },
160
+ // });
161
+ // const result = await db.findOne("user", {
162
+ // select: ["id", "name"],
163
+ // include: {
164
+ // posts: {
165
+ // select: ["title"],
166
+ // },
167
+ // },
168
+ // where: { id: user.id },
169
+ // });
170
+ // expect(result.posts[0]!.title).toBe("Test Post");
171
+ // },
172
+ // { rollback: true },
173
+ // );
174
+ // });
175
+ // test("allows querying through permitted N:N relations", async () => {
176
+ // await db.restrict(["user", "post", "friendship"]).transact(
177
+ // async (db) => {
178
+ // const [stewart, lynne] = await db.createMany("user", {
179
+ // values: [
180
+ // {
181
+ // name: "Stewart Home",
182
+ // email: "stewarthome@example.com",
183
+ // role: "user",
184
+ // },
185
+ // {
186
+ // name: "Lynne Tillman",
187
+ // email: "lynnetillman@example.com",
188
+ // role: "admin",
189
+ // },
190
+ // ],
191
+ // returning: ["id", "name"],
192
+ // });
193
+ // await db.createMany("friendship", {
194
+ // values: [
195
+ // {
196
+ // userId: stewart!.id,
197
+ // friendId: lynne!.id,
198
+ // },
199
+ // ],
200
+ // });
201
+ // const result = await db.findOne("user", {
202
+ // select: ["id"],
203
+ // include: {
204
+ // friends: {
205
+ // select: ["id", "name"],
206
+ // },
207
+ // },
208
+ // where: { id: stewart!.id },
209
+ // });
210
+ // expect(result.friends[0]!.name).toBe("Lynne Tillman");
211
+ // },
212
+ // { rollback: true },
213
+ // );
214
+ // });
215
+ // test("restricting to no models results in an unusable ORM", async () => {
216
+ // const restrictedDb = db.restrict([]);
217
+ // // Should have no accessible models
218
+ // await expect(
219
+ // restrictedDb.transact(
220
+ // async (db) => {
221
+ // // @ts-expect-error - no models should be accessible
222
+ // await db.findOne("user", {
223
+ // select: ["id"],
224
+ // });
225
+ // },
226
+ // { rollback: true },
227
+ // ),
228
+ // ).rejects.toThrow(
229
+ // 'Model "user" is not permitted in this restricted ORM instance',
230
+ // );
231
+ // });
232
+ // test("restricting twice maintains the most restrictive set", async () => {
233
+ // await db
234
+ // .restrict(["user", "post", "friendship"])
235
+ // .restrict(["user", "friendship"])
236
+ // .transact(
237
+ // async (db) => {
238
+ // // Should be able to query user
239
+ // await db.findOne("user", {
240
+ // select: ["id"],
241
+ // });
242
+ // // Should not be able to query post or like
243
+ // await expect(
244
+ // // @ts-expect-error - post should not be accessible
245
+ // db.findOne("post", {
246
+ // select: ["id"],
247
+ // }),
248
+ // ).rejects.toThrow('Model "post" is not permitted');
249
+ // await expect(
250
+ // // @ts-expect-error - like should not be accessible
251
+ // db.findOne("like", {
252
+ // select: ["id"],
253
+ // }),
254
+ // ).rejects.toThrow('Model "like" is not permitted');
255
+ // },
256
+ // { rollback: true },
257
+ // );
258
+ // });
259
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,48 @@
1
+ import * as uuid from "uuid";
2
+ import { describe, expect, test } from "vitest";
3
+ import { sql } from "@casekit/sql";
4
+ import { orm } from "../orm.js";
5
+ describe("orm.transact()", () => {
6
+ test("rolling back a transaction on error", async () => {
7
+ // create a unique table name in case this test fails and
8
+ // the table is not dropped
9
+ const table = sql.ident(`test_${uuid.v4()}`);
10
+ const db = orm({ models: {} });
11
+ await db.connect();
12
+ try {
13
+ await db.query `CREATE TABLE ${table} (id SERIAL PRIMARY KEY)`;
14
+ await db.transact(async (db) => {
15
+ await db.query `INSERT INTO ${table} DEFAULT VALUES`;
16
+ throw new Error("rollback");
17
+ });
18
+ }
19
+ catch (e) {
20
+ expect(e.message).toBe("rollback");
21
+ const result = await db.query `SELECT * FROM ${table}`;
22
+ expect(result).toEqual([]);
23
+ await db.query `DROP TABLE ${table}`;
24
+ }
25
+ finally {
26
+ await db.close();
27
+ }
28
+ });
29
+ test("committing a transaction on successful completion of the callback", async () => {
30
+ // create a unique table name in case this test fails and
31
+ // the table is not dropped
32
+ const table = sql.ident(`test_${uuid.v4()}`);
33
+ const db = orm({ models: {} });
34
+ await db.connect();
35
+ try {
36
+ await db.query `CREATE TABLE ${table} (id SERIAL PRIMARY KEY)`;
37
+ await db.transact(async (db) => {
38
+ await db.query `INSERT INTO ${table} DEFAULT VALUES`;
39
+ });
40
+ const result = await db.query `SELECT * FROM ${table}`;
41
+ expect(result).toEqual([{ id: 1 }]);
42
+ await db.query `DROP TABLE ${table}`;
43
+ }
44
+ finally {
45
+ await db.close();
46
+ }
47
+ });
48
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,72 @@
1
+ import { afterAll, beforeAll, beforeEach, describe, expect, test, vi, } from "vitest";
2
+ import { config } from "@casekit/orm2-fixtures";
3
+ import { $in } from "../operators.js";
4
+ import { orm } from "../orm.js";
5
+ import { mockLogger } from "./util/logger.js";
6
+ describe("orm.updateMany: middleware", () => {
7
+ const logger = mockLogger();
8
+ let db;
9
+ beforeEach(() => {
10
+ logger.clear();
11
+ });
12
+ beforeAll(async () => {
13
+ db = orm({ ...config, logger });
14
+ await db.connect();
15
+ });
16
+ afterAll(async () => {
17
+ await db.close();
18
+ });
19
+ describe("updateMany middleware", () => {
20
+ test("it allows overriding the orm's updateMany method", async () => {
21
+ await db.transact(async (db) => {
22
+ // Create test users to update
23
+ await db.createMany("user", {
24
+ values: [
25
+ {
26
+ id: 1,
27
+ name: "Test User 1",
28
+ email: "test1@example.com",
29
+ role: "user",
30
+ },
31
+ {
32
+ id: 2,
33
+ name: "Test User 2",
34
+ email: "test2@example.com",
35
+ role: "user",
36
+ },
37
+ ],
38
+ returning: ["id"],
39
+ });
40
+ const stub = vi.fn();
41
+ const dbWithMiddleware = db.middleware([
42
+ {
43
+ updateMany: (db, table, query) => {
44
+ stub("called stub in middleware 1");
45
+ return db.updateMany(table, query);
46
+ },
47
+ },
48
+ {
49
+ updateMany: (db, table, query) => {
50
+ stub("called stub in middleware 2");
51
+ return db.updateMany(table, query);
52
+ },
53
+ },
54
+ ]);
55
+ const result = await dbWithMiddleware.updateMany("user", {
56
+ where: { id: { [$in]: [1, 2] } },
57
+ set: { role: "admin" },
58
+ returning: ["id", "name", "role"],
59
+ });
60
+ expect(result).toHaveLength(2);
61
+ expect(result).toEqual(expect.arrayContaining([
62
+ expect.objectContaining({ id: 1, role: "admin" }),
63
+ expect.objectContaining({ id: 2, role: "admin" }),
64
+ ]));
65
+ expect(stub.mock.calls).toEqual([
66
+ ["called stub in middleware 1"],
67
+ ["called stub in middleware 2"],
68
+ ]);
69
+ }, { rollback: true });
70
+ });
71
+ });
72
+ });
@@ -0,0 +1 @@
1
+ export {};