@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,10 @@
1
+ import { config } from "@casekit/orm2-fixtures";
2
+ import { makeFactory } from "@casekit/orm2-testing";
3
+ import { orm } from "#orm.js";
4
+ import { mockLogger } from "./logger.js";
5
+ export const createTestDB = (overrides) => {
6
+ const logger = mockLogger();
7
+ const db = orm({ ...config, logger, ...overrides });
8
+ const factory = makeFactory(db.config);
9
+ return { db, logger, factory };
10
+ };
@@ -0,0 +1,19 @@
1
+ import { Logger } from "@casekit/orm2-schema";
2
+ interface LogEntry {
3
+ message: unknown;
4
+ args: unknown[];
5
+ }
6
+ interface LogEntries {
7
+ debug: LogEntry[];
8
+ info: LogEntry[];
9
+ warn: LogEntry[];
10
+ error: LogEntry[];
11
+ }
12
+ export interface MockLogger extends Logger {
13
+ get logs(): LogEntries;
14
+ clear(): void;
15
+ }
16
+ export declare function mockLogger({ silence }?: {
17
+ silence: boolean;
18
+ }): MockLogger;
19
+ export {};
@@ -0,0 +1,40 @@
1
+ /* v8 ignore start */
2
+ export function mockLogger({ silence } = { silence: true }) {
3
+ const entries = { debug: [], info: [], warn: [], error: [] };
4
+ return {
5
+ get logs() {
6
+ return entries;
7
+ },
8
+ clear() {
9
+ entries.debug.length = 0;
10
+ entries.info.length = 0;
11
+ entries.warn.length = 0;
12
+ entries.error.length = 0;
13
+ },
14
+ debug(message, ...args) {
15
+ if (!silence) {
16
+ console.debug(message, ...args);
17
+ }
18
+ entries.debug.push({ message, args });
19
+ },
20
+ info(message, ...args) {
21
+ if (!silence) {
22
+ console.info(message, ...args);
23
+ }
24
+ entries.info.push({ message, args });
25
+ },
26
+ warn(message, ...args) {
27
+ if (!silence) {
28
+ console.warn(message, ...args);
29
+ }
30
+ entries.warn.push({ message, args });
31
+ },
32
+ error(message, ...args) {
33
+ if (!silence) {
34
+ console.error(message, ...args);
35
+ }
36
+ entries.error.push({ message, args });
37
+ },
38
+ };
39
+ }
40
+ /* v8 ignore stop */
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import { ModelDefinition, ModelDefinitions, ModelName, OperatorDefinitions, RelationDefinitions } from "@casekit/orm2-schema";
2
+ import { WhereClause } from "./WhereClause.js";
3
+ export type IncludeCountClause<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>, Model extends ModelDefinition = Models[M], Relations extends RelationDefinitions = Model["relations"] extends undefined ? Record<string, never> : NonNullable<Model["relations"]>> = keyof {
4
+ [R in keyof Relations as Relations[R] extends {
5
+ type: "N:1";
6
+ } ? R : never]: true;
7
+ } extends never ? never : {
8
+ [R in keyof Relations as Relations[R] extends {
9
+ type: "N:1";
10
+ } ? R : never]?: CountParams<Models, Operators, Extract<Relations[R]["model"], string>>;
11
+ };
12
+ export interface CountParams<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>> {
13
+ include?: IncludeCountClause<Models, Operators, M>;
14
+ where?: WhereClause<Models, Operators, M>;
15
+ for?: "update" | "no key update" | "share" | "key share";
16
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import { describe, test } from "vitest";
2
+ import { $eq } from "#operators.js";
3
+ describe("CountParams", () => {
4
+ test("empty params", () => {
5
+ const _ = {};
6
+ });
7
+ test("with where clause", () => {
8
+ const _ = {
9
+ where: { id: { [$eq]: 1 } },
10
+ };
11
+ });
12
+ test("with include clause", () => {
13
+ const _ = {
14
+ include: { author: {} },
15
+ };
16
+ });
17
+ test("with nested include and where", () => {
18
+ const _ = {
19
+ include: {
20
+ author: {
21
+ where: { id: { [$eq]: 1 } },
22
+ },
23
+ },
24
+ where: { title: { [$eq]: "test" } },
25
+ };
26
+ });
27
+ test("invalid relation in include", () => {
28
+ const _ = {
29
+ include: {
30
+ // @ts-expect-error invalid relation
31
+ invalidRelation: {
32
+ where: { id: { [$eq]: 1 } },
33
+ },
34
+ },
35
+ };
36
+ });
37
+ test("invalid field in where clause", () => {
38
+ const _ = {
39
+ where: {
40
+ // @ts-expect-error invalid field
41
+ invalidField: { [$eq]: 1 },
42
+ },
43
+ };
44
+ });
45
+ test("include when model has no relations", () => {
46
+ const _ = {
47
+ where: { hex: { [$eq]: "#fff" } },
48
+ // @ts-expect-error color has no relations
49
+ include: {
50
+ foo: {},
51
+ },
52
+ };
53
+ });
54
+ test("include when model has relations, but no N:1 relations", () => {
55
+ const _ = {
56
+ // @ts-expect-error models with no N:1 relations
57
+ include: {
58
+ friends: {
59
+ where: { id: { [$eq]: 1 } },
60
+ },
61
+ },
62
+ };
63
+ });
64
+ test("non-N:1 relations are not allowed in include", () => {
65
+ const _ = {
66
+ include: {
67
+ // @ts-expect-error N:1 relations are not allowed
68
+ likes: {
69
+ where: { id: { [$eq]: 1 } },
70
+ },
71
+ },
72
+ };
73
+ });
74
+ test("models with no N:1 relations don't allow include clauses", () => {
75
+ const _ = {
76
+ // @ts-expect-error N:N relations are not allowed
77
+ include: {
78
+ friends: {
79
+ where: { id: { [$eq]: 1 } },
80
+ },
81
+ },
82
+ };
83
+ });
84
+ test("allows counting with a for update clause", () => {
85
+ const _ = {
86
+ for: "update",
87
+ };
88
+ });
89
+ });
@@ -0,0 +1,11 @@
1
+ import { DeepReadonly } from "ts-essentials";
2
+ import { ModelDefinitions, ModelName } from "@casekit/orm2-schema";
3
+ import { CreateValues } from "./CreateValues.js";
4
+ import { ReturningClause } from "./ReturningClause.js";
5
+ export type CreateManyParams<Models extends ModelDefinitions, M extends ModelName<ModelDefinitions>> = {
6
+ values: DeepReadonly<CreateValues<Models[M]>[]>;
7
+ returning?: ReturningClause<Models[M]>;
8
+ onConflict?: {
9
+ do: "nothing";
10
+ };
11
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,83 @@
1
+ import { describe, test } from "vitest";
2
+ describe("CreateManyParams", () => {
3
+ test("creating a single value", () => {
4
+ const _ = {
5
+ values: [
6
+ {
7
+ title: "Hello world!",
8
+ content: "My first post",
9
+ authorId: 1,
10
+ },
11
+ ],
12
+ returning: ["id"],
13
+ };
14
+ });
15
+ test("creating multiple values", () => {
16
+ const _ = {
17
+ values: [
18
+ {
19
+ title: "Hello world!",
20
+ content: "My first post",
21
+ authorId: 1,
22
+ },
23
+ {
24
+ title: "Hello world!",
25
+ content: "My first post",
26
+ authorId: 1,
27
+ },
28
+ ],
29
+ returning: ["id"],
30
+ };
31
+ });
32
+ test("without a returning clause", () => {
33
+ const _ = {
34
+ values: [
35
+ {
36
+ title: "Hello world!",
37
+ content: "My first post",
38
+ authorId: 1,
39
+ },
40
+ ],
41
+ };
42
+ });
43
+ test("with on conflict behaviour specified", () => {
44
+ const _ = {
45
+ values: [
46
+ {
47
+ title: "Hello world!",
48
+ content: "My first post",
49
+ authorId: 1,
50
+ },
51
+ ],
52
+ onConflict: { do: "nothing" },
53
+ };
54
+ });
55
+ test("invalid field in values", () => {
56
+ const _ = {
57
+ values: [
58
+ {
59
+ title: "Hello world!",
60
+ content: "My first post",
61
+ // @ts-expect-error invalid field
62
+ invalid: "wrong",
63
+ },
64
+ ],
65
+ };
66
+ });
67
+ test("invalid field in returning clause", () => {
68
+ const _ = {
69
+ values: [
70
+ {
71
+ title: "Hello world!",
72
+ content: "My first post",
73
+ authorId: 1,
74
+ },
75
+ ],
76
+ returning: [
77
+ "id",
78
+ // @ts-expect-error invalid field
79
+ "wrong",
80
+ ],
81
+ };
82
+ });
83
+ });
@@ -0,0 +1,5 @@
1
+ import { FieldType, ModelDefinitions, ModelName } from "@casekit/orm2-schema";
2
+ import { CreateManyParams } from "./CreateManyParams.js";
3
+ export type CreateManyResult<Models extends ModelDefinitions, M extends ModelName<Models>, Q extends CreateManyParams<Models, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
4
+ [C in Q["returning"][number]]: FieldType<Models[M], C>;
5
+ }[] : number;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { describe, expectTypeOf, test } from "vitest";
2
+ describe("CreateManyResult", () => {
3
+ test("returns array of objects when returning clause is specified", () => {
4
+ // Should return an array of objects with id (number), title (string), and createdAt (Date)
5
+ expectTypeOf().toEqualTypeOf();
6
+ });
7
+ test("returns number when no returning clause is specified", () => {
8
+ expectTypeOf().toEqualTypeOf();
9
+ });
10
+ test("handles nullable fields in returning clause", () => {
11
+ expectTypeOf().toEqualTypeOf();
12
+ });
13
+ test("handles complex field types from model definition", () => {
14
+ expectTypeOf().toEqualTypeOf();
15
+ });
16
+ test("returned object only includes fields specified in returning clause", () => {
17
+ // Should only include id, not title or content
18
+ expectTypeOf().toEqualTypeOf();
19
+ // @ts-expect-error - title is not included in returning clause
20
+ expectTypeOf().toEqualTypeOf();
21
+ });
22
+ });
@@ -0,0 +1,11 @@
1
+ import { DeepReadonly } from "ts-essentials";
2
+ import { ModelDefinitions, ModelName } from "@casekit/orm2-schema";
3
+ import { CreateValues } from "./CreateValues.js";
4
+ import { ReturningClause } from "./ReturningClause.js";
5
+ export type CreateOneParams<Models extends ModelDefinitions, M extends ModelName<ModelDefinitions>> = {
6
+ values: DeepReadonly<CreateValues<Models[M]>>;
7
+ returning?: ReturningClause<Models[M]>;
8
+ onConflict?: {
9
+ do: "nothing";
10
+ };
11
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { describe, test } from "vitest";
2
+ describe("CreateOneParams", () => {
3
+ test("creating a record", () => {
4
+ const _ = {
5
+ values: {
6
+ title: "Hello world!",
7
+ content: "My first post",
8
+ authorId: 1,
9
+ },
10
+ returning: ["id"],
11
+ };
12
+ });
13
+ test("without a returning clause", () => {
14
+ const _ = {
15
+ values: {
16
+ title: "Hello world!",
17
+ content: "My first post",
18
+ authorId: 1,
19
+ },
20
+ };
21
+ });
22
+ test("with on conflict behaviour specified", () => {
23
+ const _ = {
24
+ values: {
25
+ title: "Hello world!",
26
+ content: "My first post",
27
+ authorId: 1,
28
+ },
29
+ onConflict: { do: "nothing" },
30
+ };
31
+ });
32
+ test("invalid field in values", () => {
33
+ const _ = {
34
+ values: {
35
+ title: "Hello world!",
36
+ content: "My first post",
37
+ // @ts-expect-error invalid field
38
+ invalid: "wrong",
39
+ },
40
+ };
41
+ });
42
+ test("invalid field in returning clause", () => {
43
+ const _ = {
44
+ values: {
45
+ title: "Hello world!",
46
+ content: "My first post",
47
+ authorId: 1,
48
+ },
49
+ returning: [
50
+ "id",
51
+ // @ts-expect-error invalid field
52
+ "wrong",
53
+ ],
54
+ };
55
+ });
56
+ });
@@ -0,0 +1,5 @@
1
+ import { FieldType, ModelDefinitions, ModelName } from "@casekit/orm2-schema";
2
+ import { CreateOneParams } from "./CreateOneParams.js";
3
+ export type CreateOneResult<Models extends ModelDefinitions, M extends ModelName<Models>, Q extends CreateOneParams<Models, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
4
+ [C in Q["returning"][number]]: FieldType<Models[M], C>;
5
+ } | null : number;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { describe, expectTypeOf, test } from "vitest";
2
+ describe("CreateOneResult", () => {
3
+ test("returns object with fields when returning clause specified", () => {
4
+ expectTypeOf().toEqualTypeOf();
5
+ });
6
+ test("returns number when no returning clause specified", () => {
7
+ expectTypeOf().toEqualTypeOf();
8
+ });
9
+ test("handles nullable fields in returning clause", () => {
10
+ expectTypeOf().toEqualTypeOf();
11
+ });
12
+ test("handles array fields in returning clause", () => {
13
+ expectTypeOf().toEqualTypeOf();
14
+ });
15
+ test("handles json fields in returning clause", () => {
16
+ expectTypeOf().toEqualTypeOf();
17
+ });
18
+ test("returned object only includes fields specified in returning clause", () => {
19
+ expectTypeOf().toEqualTypeOf();
20
+ // @ts-expect-error - title is not included in returning clause
21
+ expectTypeOf().toEqualTypeOf();
22
+ });
23
+ });
@@ -0,0 +1,6 @@
1
+ import { DeepReadonly } from "ts-essentials";
2
+ import { ModelDefinition } from "@casekit/orm2-schema";
3
+ import { Simplify } from "@casekit/toolbox";
4
+ import { OptionalValues } from "./OptionalValues.js";
5
+ import { RequiredValues } from "./RequiredValues.js";
6
+ export type CreateValues<Model extends ModelDefinition> = DeepReadonly<Simplify<RequiredValues<Model> extends never ? OptionalValues<Model> : OptionalValues<Model> extends never ? RequiredValues<Model> : RequiredValues<Model> & OptionalValues<Model>>>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ import { describe, expectTypeOf, test } from "vitest";
2
+ describe("CreateValues", () => {
3
+ test("combines required and optional fields for post model", () => {
4
+ const _ = {
5
+ title: "Hello world",
6
+ content: "My first post",
7
+ tags: ["a", "b", "c"],
8
+ metadata: {
9
+ foo: "a",
10
+ bar: [
11
+ { baz: "good", quux: true },
12
+ { baz: "bad", quux: false },
13
+ ],
14
+ },
15
+ authorId: 1,
16
+ };
17
+ });
18
+ test("enforces required fields", () => {
19
+ // @ts-expect-error authorId is required
20
+ const _ = {
21
+ title: "Hello",
22
+ content: "World",
23
+ metadata: { foo: "a", bar: [{ baz: "good", quux: true }] },
24
+ };
25
+ });
26
+ test("allows omitting optional fields", () => {
27
+ const values = {
28
+ title: "Hello",
29
+ content: "World",
30
+ authorId: 1,
31
+ };
32
+ expectTypeOf(values).toEqualTypeOf();
33
+ });
34
+ test("handles model with only required fields", () => {
35
+ expectTypeOf().toEqualTypeOf();
36
+ });
37
+ test("handles model with only optional fields", () => {
38
+ expectTypeOf().toEqualTypeOf();
39
+ });
40
+ test("nullable fields are optional but typed correctly", () => {
41
+ const values = {
42
+ title: "Hello",
43
+ content: "World",
44
+ authorId: 1,
45
+ deletedAt: null,
46
+ };
47
+ expectTypeOf(values.deletedAt).toEqualTypeOf();
48
+ });
49
+ test("type error for invalid field value types", () => {
50
+ const _ = {
51
+ title: "Hello",
52
+ content: "World",
53
+ authorId: 1,
54
+ // @ts-expect-error tags must be string[]
55
+ tags: "not-an-array",
56
+ // @ts-expect-error publishedAt must be Date | null
57
+ deletedAt: "not-a-date",
58
+ };
59
+ });
60
+ });
@@ -0,0 +1,5 @@
1
+ import { FieldType, ModelDefinitions, ModelName, OperatorDefinitions } from "@casekit/orm2-schema";
2
+ import { DeleteParams } from "./DeleteParams.js";
3
+ export type DeleteManyResult<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>, Q extends DeleteParams<Models, Operators, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
4
+ [C in Q["returning"][number]]: FieldType<Models[M], C>;
5
+ }[] : number;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { describe, expectTypeOf, test } from "vitest";
2
+ describe("DeleteManyResult", () => {
3
+ test("returns array of objects when returning clause is specified", () => {
4
+ expectTypeOf().toEqualTypeOf();
5
+ });
6
+ test("returns number when no returning clause specified", () => {
7
+ expectTypeOf().toEqualTypeOf();
8
+ });
9
+ test("handles nullable fields in returning clause", () => {
10
+ expectTypeOf().toEqualTypeOf();
11
+ });
12
+ test("handles array fields in returning clause", () => {
13
+ expectTypeOf().toEqualTypeOf();
14
+ });
15
+ test("handles JSON fields in returning clause", () => {
16
+ expectTypeOf().toEqualTypeOf();
17
+ });
18
+ test("returned objects only include fields specified in returning clause", () => {
19
+ expectTypeOf().toEqualTypeOf();
20
+ // @ts-expect-error - title is not included in returning clause
21
+ expectTypeOf().toEqualTypeOf();
22
+ });
23
+ });
@@ -0,0 +1,5 @@
1
+ import { FieldType, ModelDefinitions, ModelName, OperatorDefinitions } from "@casekit/orm2-schema";
2
+ import { DeleteParams } from "./DeleteParams.js";
3
+ export type DeleteOneResult<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>, Q extends DeleteParams<Models, Operators, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
4
+ [C in Q["returning"][number]]: FieldType<Models[M], C>;
5
+ } : number;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { describe, expectTypeOf, test } from "vitest";
2
+ describe("DeleteOneResult types", () => {
3
+ test("returns single object when returning clause is specified", () => {
4
+ expectTypeOf().toEqualTypeOf();
5
+ });
6
+ test("returns number when no returning clause specified", () => {
7
+ expectTypeOf().toEqualTypeOf();
8
+ });
9
+ test("handles nullable fields in returning clause", () => {
10
+ expectTypeOf().toEqualTypeOf();
11
+ });
12
+ test("handles array fields in returning clause", () => {
13
+ expectTypeOf().toEqualTypeOf();
14
+ });
15
+ test("handles JSON fields in returning clause", () => {
16
+ expectTypeOf().toEqualTypeOf();
17
+ });
18
+ test("returned object only includes fields specified in returning clause", () => {
19
+ expectTypeOf().toEqualTypeOf();
20
+ // @ts-expect-error - title is not included in returning clause
21
+ expectTypeOf().toEqualTypeOf();
22
+ });
23
+ });
@@ -0,0 +1,7 @@
1
+ import { ModelDefinitions, ModelName, OperatorDefinitions } from "@casekit/orm2-schema";
2
+ import { ReturningClause } from "./ReturningClause.js";
3
+ import { WhereClause } from "./WhereClause.js";
4
+ export type DeleteParams<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>> = {
5
+ returning?: ReturningClause<Models[M]>;
6
+ where: WhereClause<Models, Operators, M>;
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,46 @@
1
+ import { describe, test } from "vitest";
2
+ import { $gt } from "#operators.js";
3
+ describe("DeleteParams", () => {
4
+ test("minimal valid params with just where clause", () => {
5
+ const _ = {
6
+ where: { id: 1 },
7
+ };
8
+ });
9
+ test("with returning clause", () => {
10
+ const _ = {
11
+ where: { id: 1 },
12
+ returning: ["id", "title"],
13
+ };
14
+ });
15
+ test("with complex where clause", () => {
16
+ const _ = {
17
+ where: { id: 1, title: "hello", publishedAt: null },
18
+ returning: ["id"],
19
+ };
20
+ });
21
+ test("invalid field in where clause", () => {
22
+ const _ = {
23
+ // @ts-expect-error invalid field
24
+ where: { invalidField: "wrong" },
25
+ };
26
+ });
27
+ test("invalid field in returning clause", () => {
28
+ const _ = {
29
+ where: { id: 1 },
30
+ // @ts-expect-error invalid field
31
+ returning: ["invalidField"],
32
+ };
33
+ });
34
+ test("where clause is required", () => {
35
+ // @ts-expect-error where clause is required
36
+ const _ = {
37
+ returning: ["id"],
38
+ };
39
+ });
40
+ test("handles operators in where clause", () => {
41
+ const _ = {
42
+ where: { title: { [$gt]: "hello" } },
43
+ returning: ["id"],
44
+ };
45
+ });
46
+ });