@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,392 @@
1
+ import { afterAll, beforeAll, beforeEach, 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("createMany", () => {
6
+ const logger = mockLogger();
7
+ let db;
8
+ beforeEach(() => {
9
+ logger.clear();
10
+ });
11
+ beforeAll(async () => {
12
+ db = orm({ ...config, logger });
13
+ await db.connect();
14
+ });
15
+ afterAll(async () => {
16
+ await db.close();
17
+ });
18
+ test("creates multiple records with full values and returns specified fields", async () => {
19
+ await db.transact(async (db) => {
20
+ const users = await db.createMany("user", {
21
+ values: [
22
+ {
23
+ id: 1,
24
+ name: "Test User 1",
25
+ email: "user1@example.com",
26
+ role: "user",
27
+ },
28
+ {
29
+ id: 2,
30
+ name: "Test User 2",
31
+ email: "user2@example.com",
32
+ role: "admin",
33
+ },
34
+ ],
35
+ returning: ["id", "name", "role"],
36
+ });
37
+ expect(users).toHaveLength(2);
38
+ expect(users[0]).toEqual({
39
+ id: 1,
40
+ name: "Test User 1",
41
+ role: "user",
42
+ });
43
+ expect(users[1]).toEqual({
44
+ id: 2,
45
+ name: "Test User 2",
46
+ role: "admin",
47
+ });
48
+ // Verify records were actually created
49
+ const foundUsers = await db.findMany("user", {
50
+ select: ["id", "name", "role"],
51
+ orderBy: ["name"],
52
+ });
53
+ expect(foundUsers).toEqual(users);
54
+ }, { rollback: true });
55
+ });
56
+ test("creates records with minimal values using defaults", async () => {
57
+ await db.transact(async (db) => {
58
+ const users = await db.createMany("user", {
59
+ values: [
60
+ {
61
+ id: 1,
62
+ name: "Test User 1",
63
+ email: "user1@example.com",
64
+ role: "user",
65
+ },
66
+ {
67
+ id: 2,
68
+ name: "Test User 2",
69
+ email: "user2@example.com",
70
+ role: "user",
71
+ },
72
+ ],
73
+ returning: ["id", "name", "deletedAt"],
74
+ });
75
+ expect(users).toHaveLength(2);
76
+ users.forEach((user) => {
77
+ expect(user.deletedAt).toBeNull();
78
+ });
79
+ }, { rollback: true });
80
+ });
81
+ test("returns row count when no returning clause specified", async () => {
82
+ await db.transact(async (db) => {
83
+ const result = await db.createMany("user", {
84
+ values: [
85
+ {
86
+ id: 1,
87
+ name: "Test User 1",
88
+ email: "user1@example.com",
89
+ role: "user",
90
+ },
91
+ {
92
+ id: 2,
93
+ name: "Test User 2",
94
+ email: "user2@example.com",
95
+ role: "user",
96
+ },
97
+ ],
98
+ });
99
+ expect(result).toBe(2);
100
+ // Verify records were created
101
+ const users = await db.findMany("user", {
102
+ select: ["id"],
103
+ });
104
+ expect(users).toHaveLength(2);
105
+ }, { rollback: true });
106
+ });
107
+ test("handles empty values array", async () => {
108
+ await db.transact(async (db) => {
109
+ const result = await db.createMany("user", {
110
+ values: [],
111
+ returning: ["id", "name"],
112
+ });
113
+ expect(result).toEqual([]);
114
+ }, { rollback: true });
115
+ });
116
+ test("throws error on constraint violation", async () => {
117
+ await db.transact(async (db) => {
118
+ const email = "same@example.com";
119
+ // Create first user
120
+ await db.createOne("user", {
121
+ values: {
122
+ id: 1,
123
+ name: "First User",
124
+ email,
125
+ role: "user",
126
+ },
127
+ });
128
+ // Try to create more users with same email and deletedAt as null (unique constraint)
129
+ await expect(db.createMany("user", {
130
+ values: [
131
+ {
132
+ id: 1,
133
+ name: "Second User",
134
+ email, // Duplicate email with same deletedAt (null)
135
+ role: "user",
136
+ },
137
+ ],
138
+ })).rejects.toThrow(/duplicate key value/);
139
+ }, { rollback: true });
140
+ });
141
+ test("handles onConflict do nothing with returning clause", async () => {
142
+ await db.transact(async (db) => {
143
+ const email = "test@example.com";
144
+ // Create first user
145
+ const user1 = await db.createOne("user", {
146
+ values: {
147
+ id: 1,
148
+ name: "Original User",
149
+ email,
150
+ role: "user",
151
+ },
152
+ returning: ["id", "name"],
153
+ });
154
+ // Try to create users including one with same email
155
+ const users = await db.createMany("user", {
156
+ values: [
157
+ {
158
+ id: 1, // Same ID
159
+ name: "Duplicate User",
160
+ email,
161
+ role: "user",
162
+ },
163
+ {
164
+ id: 2,
165
+ name: "New User",
166
+ email: "new@example.com",
167
+ role: "user",
168
+ },
169
+ ],
170
+ onConflict: { do: "nothing" },
171
+ returning: ["id", "name"],
172
+ });
173
+ // Should only return the non-conflicting user
174
+ expect(users).toHaveLength(1);
175
+ expect(users[0].name).toBe("New User");
176
+ // Original user should be unchanged
177
+ const originalUser = await db.findOne("user", {
178
+ select: ["id", "name"],
179
+ where: { id: user1.id },
180
+ });
181
+ expect(originalUser.name).toBe("Original User");
182
+ }, { rollback: true });
183
+ });
184
+ test("handles onConflict do nothing without returning clause", async () => {
185
+ await db.transact(async (db) => {
186
+ const email = "test@example.com";
187
+ // Create first user
188
+ await db.createOne("user", {
189
+ values: {
190
+ id: 1,
191
+ name: "Original User",
192
+ email,
193
+ role: "user",
194
+ },
195
+ });
196
+ // Try to create users including one with same email
197
+ const result = await db.createMany("user", {
198
+ values: [
199
+ {
200
+ id: 2,
201
+ name: "Duplicate User",
202
+ email,
203
+ role: "user",
204
+ },
205
+ {
206
+ id: 3,
207
+ name: "New User",
208
+ email: "new@example.com",
209
+ role: "user",
210
+ },
211
+ ],
212
+ onConflict: { do: "nothing" },
213
+ });
214
+ // Should return count of only the inserted rows
215
+ expect(result).toBe(1);
216
+ }, { rollback: true });
217
+ });
218
+ test("handles enum fields in values", async () => {
219
+ await db.transact(async (db) => {
220
+ const users = await db.createMany("user", {
221
+ values: [
222
+ {
223
+ id: 1,
224
+ name: "Admin User",
225
+ email: "admin@example.com",
226
+ role: "admin",
227
+ },
228
+ {
229
+ id: 2,
230
+ name: "Regular User",
231
+ email: "user@example.com",
232
+ role: "user",
233
+ },
234
+ ],
235
+ returning: ["id", "name", "role"],
236
+ });
237
+ expect(users).toEqual([
238
+ {
239
+ id: 1,
240
+ name: "Admin User",
241
+ role: "admin",
242
+ },
243
+ {
244
+ id: 2,
245
+ name: "Regular User",
246
+ role: "user",
247
+ },
248
+ ]);
249
+ const foundUsers = await db.findMany("user", {
250
+ select: ["id", "name", "role"],
251
+ orderBy: ["id"],
252
+ });
253
+ expect(foundUsers).toEqual(users);
254
+ }, { rollback: true });
255
+ });
256
+ test("handles array and JSON fields in values", async () => {
257
+ await db.transact(async (db) => {
258
+ const user = await db.createOne("user", {
259
+ values: {
260
+ id: 1,
261
+ name: "Test User",
262
+ email: "test@example.com",
263
+ role: "user",
264
+ },
265
+ returning: ["id"],
266
+ });
267
+ const posts = await db.createMany("post", {
268
+ values: [
269
+ {
270
+ title: "First Post",
271
+ content: "First Content",
272
+ authorId: user.id,
273
+ tags: ["first", "test", "tags"],
274
+ metadata: {
275
+ foo: "a",
276
+ bar: [{ baz: "good", quux: true }],
277
+ },
278
+ },
279
+ {
280
+ title: "Second Post",
281
+ content: "Second Content",
282
+ authorId: user.id,
283
+ tags: ["second", "example", "array"],
284
+ metadata: {
285
+ foo: "b",
286
+ bar: [
287
+ { baz: "bad", quux: false },
288
+ { baz: "good", quux: true },
289
+ ],
290
+ },
291
+ },
292
+ {
293
+ title: "Third Post",
294
+ content: "Third Content",
295
+ authorId: user.id,
296
+ tags: ["third"],
297
+ metadata: {
298
+ foo: "c",
299
+ bar: [{ baz: "indifferent", quux: true }],
300
+ },
301
+ },
302
+ ],
303
+ returning: ["id", "title", "tags", "metadata"],
304
+ });
305
+ expect(posts).toHaveLength(3);
306
+ expect(posts[0]).toEqual({
307
+ id: expect.any(Number),
308
+ title: "First Post",
309
+ tags: ["first", "test", "tags"],
310
+ metadata: {
311
+ foo: "a",
312
+ bar: [{ baz: "good", quux: true }],
313
+ },
314
+ });
315
+ expect(posts[1]).toEqual({
316
+ id: expect.any(Number),
317
+ title: "Second Post",
318
+ tags: ["second", "example", "array"],
319
+ metadata: {
320
+ foo: "b",
321
+ bar: [
322
+ { baz: "bad", quux: false },
323
+ { baz: "good", quux: true },
324
+ ],
325
+ },
326
+ });
327
+ expect(posts[2]).toEqual({
328
+ id: expect.any(Number),
329
+ title: "Third Post",
330
+ tags: ["third"],
331
+ metadata: {
332
+ foo: "c",
333
+ bar: [{ baz: "indifferent", quux: true }],
334
+ },
335
+ });
336
+ // Verify the array and JSON fields were stored correctly
337
+ const foundPosts = await db.findMany("post", {
338
+ select: ["id", "title", "tags", "metadata"],
339
+ orderBy: ["id"],
340
+ });
341
+ expect(foundPosts).toEqual(posts);
342
+ }, { rollback: true });
343
+ });
344
+ // TODO comment back in once relationships are implemented
345
+ test.skip("can create posts with relationship to user", async () => {
346
+ await db.transact(async (db) => {
347
+ // Create a user first
348
+ const user = await db.createOne("user", {
349
+ values: {
350
+ id: 1,
351
+ name: "Test User",
352
+ email: "test@example.com",
353
+ role: "user",
354
+ },
355
+ returning: ["id"],
356
+ });
357
+ // Create multiple posts for the user
358
+ const posts = await db.createMany("post", {
359
+ values: [
360
+ {
361
+ title: "First Post",
362
+ content: "Hello World 1",
363
+ authorId: user.id,
364
+ },
365
+ {
366
+ title: "Second Post",
367
+ content: "Hello World 2",
368
+ authorId: user.id,
369
+ },
370
+ ],
371
+ returning: ["id", "title", "authorId"],
372
+ });
373
+ expect(posts).toHaveLength(2);
374
+ posts.forEach((post) => {
375
+ expect(post.authorId).toBe(user.id);
376
+ expect(post).toHaveProperty("title");
377
+ expect(post).toHaveProperty("id");
378
+ });
379
+ // Verify the relationship works
380
+ const userWithPosts = await db.findOne("user", {
381
+ select: ["id"],
382
+ include: {
383
+ posts: {
384
+ select: ["id", "title"],
385
+ },
386
+ },
387
+ where: { id: user.id },
388
+ });
389
+ expect(userWithPosts.posts).toHaveLength(2);
390
+ }, { rollback: true });
391
+ });
392
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ import { afterAll, beforeAll, beforeEach, describe, expect, test, vi, } 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.createOne: middleware", () => {
6
+ const logger = mockLogger();
7
+ let db;
8
+ beforeEach(() => {
9
+ logger.clear();
10
+ });
11
+ beforeAll(async () => {
12
+ db = orm({ ...config, logger });
13
+ await db.connect();
14
+ });
15
+ afterAll(async () => {
16
+ await db.close();
17
+ });
18
+ describe("createOne middleware", () => {
19
+ test("it allows overriding the orm's createOne method", async () => {
20
+ await db.transact(async (db) => {
21
+ const stub = vi.fn();
22
+ const dbWithMiddleware = db.middleware([
23
+ {
24
+ createOne: (db, table, query) => {
25
+ stub("called stub in middleware 1");
26
+ return db.createOne(table, query);
27
+ },
28
+ },
29
+ {
30
+ createOne: (db, table, query) => {
31
+ stub("called stub in middleware 2");
32
+ return db.createOne(table, query);
33
+ },
34
+ },
35
+ ]);
36
+ const result = await dbWithMiddleware.createOne("user", {
37
+ values: {
38
+ name: "Test User",
39
+ email: "test@example.com",
40
+ role: "user",
41
+ },
42
+ returning: ["id", "name"],
43
+ });
44
+ expect(result).toMatchObject({
45
+ name: "Test User",
46
+ });
47
+ expect(stub.mock.calls).toEqual([
48
+ ["called stub in middleware 1"],
49
+ ["called stub in middleware 2"],
50
+ ]);
51
+ }, { rollback: true });
52
+ });
53
+ });
54
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
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("createOne types", () => {
6
+ test("values is required", () => {
7
+ assertType(db.createOne("post",
8
+ // @ts-expect-error - values is required
9
+ {}));
10
+ });
11
+ test("values must match model fields", () => {
12
+ assertType(db.createOne("post", {
13
+ values: {
14
+ // @ts-expect-error - wrong is not a column
15
+ wrong: "value",
16
+ },
17
+ }));
18
+ });
19
+ test("returning fields must exist on model", () => {
20
+ assertType(db.createOne("post", {
21
+ values: {
22
+ title: "test",
23
+ content: "content",
24
+ authorId: 123,
25
+ },
26
+ returning: [
27
+ // @ts-expect-error - wrong is not a column
28
+ "wrong",
29
+ ],
30
+ }));
31
+ });
32
+ test("missing required fields", () => {
33
+ assertType(db.createOne("post", {
34
+ // @ts-expect-error - missing required fields
35
+ values: {
36
+ title: "test",
37
+ },
38
+ }));
39
+ });
40
+ test("valid create params with returning clause", async () => {
41
+ expectTypeOf(await db.createOne("post", {
42
+ values: {
43
+ title: "test",
44
+ content: "content",
45
+ authorId: 123,
46
+ },
47
+ returning: ["id", "title"],
48
+ onConflict: {
49
+ do: "nothing",
50
+ },
51
+ })).toEqualTypeOf();
52
+ });
53
+ test("valid create params without returning clause", async () => {
54
+ expectTypeOf(await db.createOne("user", {
55
+ values: {
56
+ name: "test",
57
+ email: "test@example.com",
58
+ role: "user",
59
+ },
60
+ onConflict: {
61
+ do: "nothing",
62
+ },
63
+ })).toEqualTypeOf();
64
+ });
65
+ test("works with enum fields", async () => {
66
+ expectTypeOf(await db.createOne("user", {
67
+ values: {
68
+ name: "test",
69
+ email: "test@example.com",
70
+ role: "user",
71
+ },
72
+ returning: ["id"],
73
+ })).toEqualTypeOf();
74
+ });
75
+ test("enum fields are returned as enum types", async () => {
76
+ expectTypeOf(await db.createOne("user", {
77
+ values: {
78
+ name: "test",
79
+ email: "test@example.com",
80
+ role: "user",
81
+ },
82
+ returning: ["id", "role", "deletedAt"],
83
+ })).toEqualTypeOf();
84
+ });
85
+ test("handles array fields", async () => {
86
+ expectTypeOf(await db.createOne("post", {
87
+ values: {
88
+ title: "test",
89
+ content: "test content",
90
+ authorId: 123,
91
+ tags: ["test", "example"],
92
+ },
93
+ returning: ["id", "tags"],
94
+ })).toEqualTypeOf();
95
+ });
96
+ test("handles json fields", async () => {
97
+ expectTypeOf(await db.createOne("post", {
98
+ values: {
99
+ title: "test",
100
+ content: "test content",
101
+ authorId: 123,
102
+ metadata: {
103
+ foo: "b",
104
+ bar: [
105
+ { baz: "good", quux: true },
106
+ { baz: "bad", quux: false },
107
+ ],
108
+ },
109
+ },
110
+ returning: ["id", "metadata"],
111
+ })).toEqualTypeOf();
112
+ });
113
+ });
@@ -0,0 +1 @@
1
+ export {};