@casekit/orm 0.0.1-alpha.12 → 0.0.1-alpha.13

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 (227) hide show
  1. package/package.json +13 -3
  2. package/.env +0 -2
  3. package/.eslintrc.cjs +0 -69
  4. package/.github/actions/ci-setup/action.yml +0 -19
  5. package/.github/dependabot.yml +0 -12
  6. package/.github/workflows/ci.yml +0 -119
  7. package/.github/workflows/dependabot.yml +0 -26
  8. package/.github/workflows/semgrep.yml +0 -24
  9. package/.prettierrc.cjs +0 -11
  10. package/.vscode/tasks.json +0 -28
  11. package/codecov.yml +0 -7
  12. package/lib/orm.query.test.d.ts +0 -2
  13. package/lib/orm.query.test.d.ts.map +0 -1
  14. package/lib/orm.query.test.js +0 -22
  15. package/lib/orm.query.test.js.map +0 -1
  16. package/src/Connection.ts +0 -65
  17. package/src/errors.ts +0 -18
  18. package/src/index.ts +0 -16
  19. package/src/logger.ts +0 -3
  20. package/src/migrate/commands/implode.ts +0 -46
  21. package/src/migrate/index.ts +0 -1
  22. package/src/migrate/migrator.ts +0 -24
  23. package/src/migrate/sql/createExtensionsSql.test.ts +0 -26
  24. package/src/migrate/sql/createExtensionsSql.ts +0 -16
  25. package/src/migrate/sql/createForeignKeyConstraintSql.test.ts +0 -50
  26. package/src/migrate/sql/createForeignKeyConstraintSql.ts +0 -44
  27. package/src/migrate/sql/createSchemasSql.test.ts +0 -81
  28. package/src/migrate/sql/createSchemasSql.ts +0 -15
  29. package/src/migrate/sql/createTableSql.properties.ts +0 -38
  30. package/src/migrate/sql/createTableSql.test.ts +0 -74
  31. package/src/migrate/sql/createTableSql.ts +0 -53
  32. package/src/migrate/sql/createUniqueConstraintSql.ts +0 -27
  33. package/src/migrate/sql/dropSchemasSql.ts +0 -15
  34. package/src/migrate/sql/dropTableSql.ts +0 -13
  35. package/src/orm.query.test.ts +0 -28
  36. package/src/orm.ts +0 -370
  37. package/src/pull/index.ts +0 -1
  38. package/src/pull/introspect/getForeignKeys.ts +0 -64
  39. package/src/pull/introspect/getPrimaryKeys.ts +0 -26
  40. package/src/pull/introspect/getTables.ts +0 -51
  41. package/src/pull/introspect/getUniqueConstraints.ts +0 -39
  42. package/src/pull/parse/parseCreateUniqueIndexStatement.test.ts +0 -14
  43. package/src/pull/parse/parseCreateUniqueIndexStatement.ts +0 -19
  44. package/src/pull/pull.ts +0 -78
  45. package/src/pull/render/renderModel.test.ts +0 -144
  46. package/src/pull/render/renderModel.ts +0 -141
  47. package/src/pull/render/renderModelsIndex.ts +0 -24
  48. package/src/pull/render/renderRelations.ts +0 -77
  49. package/src/pull/render/renderRelationsIndex.ts +0 -24
  50. package/src/pull/types/ColumnMeta.ts +0 -10
  51. package/src/pull/types/ForeignKey.ts +0 -6
  52. package/src/pull/types/PrimaryKey.ts +0 -6
  53. package/src/pull/types/UniqueConstraint.ts +0 -8
  54. package/src/pull/util/format.ts +0 -17
  55. package/src/pull/util/quote.ts +0 -7
  56. package/src/pull/util/unquote.ts +0 -9
  57. package/src/queries/clauses/IncludeClause.ts +0 -39
  58. package/src/queries/clauses/LateralByClause.ts +0 -4
  59. package/src/queries/clauses/ReturningClause.ts +0 -7
  60. package/src/queries/clauses/SelectClause.ts +0 -7
  61. package/src/queries/clauses/WhereClause.ts +0 -16
  62. package/src/queries/clauses/helpers/OptionalColumn.ts +0 -18
  63. package/src/queries/clauses/helpers/OptionalParams.ts +0 -14
  64. package/src/queries/clauses/helpers/RequiredColumn.ts +0 -8
  65. package/src/queries/clauses/helpers/RequiredParams.ts +0 -14
  66. package/src/queries/clauses/include/IncludedRelationModel.ts +0 -13
  67. package/src/queries/clauses/include/IncludedRelationName.ts +0 -11
  68. package/src/queries/clauses/include/IncludedRelationQuery.ts +0 -20
  69. package/src/queries/clauses/where/buildWhereClause.ts +0 -121
  70. package/src/queries/clauses/where/buildWhereClauses.test.ts +0 -145
  71. package/src/queries/clauses/where/buildWhereClauses.ts +0 -45
  72. package/src/queries/clauses/where/operators.ts +0 -13
  73. package/src/queries/clauses/where/types/WhereClauseValue.ts +0 -39
  74. package/src/queries/count/buildCount.ts +0 -77
  75. package/src/queries/count/countToSql.ts +0 -66
  76. package/src/queries/count/tests/count.test.ts +0 -35
  77. package/src/queries/count/types/BaseCountParams.ts +0 -11
  78. package/src/queries/count/types/CountBuilder.ts +0 -45
  79. package/src/queries/count/types/CountParams.ts +0 -27
  80. package/src/queries/count.ts +0 -33
  81. package/src/queries/create/buildCreate.ts +0 -67
  82. package/src/queries/create/createResultSchema.ts +0 -24
  83. package/src/queries/create/createToSql.ts +0 -44
  84. package/src/queries/create/tests/createMany.varied-keys.test.ts +0 -28
  85. package/src/queries/create/tests/createOne.test-d.ts +0 -116
  86. package/src/queries/create/tests/createOne.test.ts +0 -197
  87. package/src/queries/create/types/BaseCreateManyParams.ts +0 -7
  88. package/src/queries/create/types/BaseCreateOneParams.ts +0 -7
  89. package/src/queries/create/types/CreateManyParams.ts +0 -15
  90. package/src/queries/create/types/CreateManyResult.ts +0 -17
  91. package/src/queries/create/types/CreateOneParams.ts +0 -22
  92. package/src/queries/create/types/CreateOneResult.ts +0 -17
  93. package/src/queries/createMany.ts +0 -38
  94. package/src/queries/createOne.ts +0 -27
  95. package/src/queries/delete/buildDelete.ts +0 -56
  96. package/src/queries/delete/deleteResultSchema.ts +0 -23
  97. package/src/queries/delete/deleteToSql.ts +0 -48
  98. package/src/queries/delete/tests/deleteOne.test.ts +0 -108
  99. package/src/queries/delete/types/BaseDeleteParams.ts +0 -9
  100. package/src/queries/delete/types/DeleteManyResult.ts +0 -16
  101. package/src/queries/delete/types/DeleteOneResult.ts +0 -16
  102. package/src/queries/delete/types/DeleteParams.ts +0 -12
  103. package/src/queries/deleteMany.ts +0 -33
  104. package/src/queries/deleteOne.ts +0 -32
  105. package/src/queries/find/buildFind.ts +0 -138
  106. package/src/queries/find/findResultSchema.ts +0 -32
  107. package/src/queries/find/findToSql.test.ts +0 -123
  108. package/src/queries/find/findToSql.ts +0 -141
  109. package/src/queries/find/getIncludedManyToManyRelations.ts +0 -49
  110. package/src/queries/find/getIncludedOneToManyRelations.ts +0 -44
  111. package/src/queries/find/tests/findMany.include.test.ts +0 -107
  112. package/src/queries/find/tests/findMany.limit.test-d.ts +0 -75
  113. package/src/queries/find/tests/findMany.limit.test.ts +0 -176
  114. package/src/queries/find/tests/findMany.nullable-relations.test.ts +0 -127
  115. package/src/queries/find/tests/findMany.orderBy.test-d.ts +0 -84
  116. package/src/queries/find/tests/findMany.orderBy.test.ts +0 -184
  117. package/src/queries/find/tests/findMany.select.test-d.ts +0 -117
  118. package/src/queries/find/tests/findMany.select.test.ts +0 -188
  119. package/src/queries/find/tests/findMany.too-deep.test-d.ts +0 -154
  120. package/src/queries/find/tests/findMany.where.test-d.ts +0 -85
  121. package/src/queries/find/tests/findMany.where.test.ts +0 -76
  122. package/src/queries/find/tests/middleware.find.where.test.ts +0 -467
  123. package/src/queries/find/types/BaseFindParams.ts +0 -18
  124. package/src/queries/find/types/FindBuilder.ts +0 -73
  125. package/src/queries/find/types/FindManyParams.ts +0 -24
  126. package/src/queries/find/types/FindManyResult.ts +0 -13
  127. package/src/queries/find/types/FindOneParams.ts +0 -17
  128. package/src/queries/find/types/FindOneResult.ts +0 -50
  129. package/src/queries/findMany.ts +0 -134
  130. package/src/queries/findOne.ts +0 -30
  131. package/src/queries/middleware/Middleware.ts +0 -53
  132. package/src/queries/middleware/ValuesMiddleware.ts +0 -9
  133. package/src/queries/middleware/WhereMiddleware.ts +0 -16
  134. package/src/queries/update/buildUpdate.ts +0 -76
  135. package/src/queries/update/tests/updateOne.test.ts +0 -118
  136. package/src/queries/update/types/BaseUpdateParams.ts +0 -10
  137. package/src/queries/update/types/UpdateManyResult.ts +0 -16
  138. package/src/queries/update/types/UpdateOneResult.ts +0 -16
  139. package/src/queries/update/types/UpdateParams.ts +0 -14
  140. package/src/queries/update/types/UpdateValues.ts +0 -12
  141. package/src/queries/update/updateResultSchema.ts +0 -23
  142. package/src/queries/update/updateToSql.ts +0 -43
  143. package/src/queries/updateMany.ts +0 -33
  144. package/src/queries/updateOne.ts +0 -33
  145. package/src/queries/util/hasConditions.test.ts +0 -36
  146. package/src/queries/util/hasConditions.ts +0 -14
  147. package/src/queries/util/rowToObject.test.ts +0 -76
  148. package/src/queries/util/rowToObject.ts +0 -13
  149. package/src/queries/util/tableAlias.test.ts +0 -20
  150. package/src/queries/util/tableAlias.ts +0 -10
  151. package/src/schema/populate/composeMiddleware.ts +0 -51
  152. package/src/schema/populate/populateConfiguration.ts +0 -48
  153. package/src/schema/populate/populateModel.ts +0 -98
  154. package/src/schema/populate/suggestedColumnSchema.ts +0 -62
  155. package/src/schema/types/base/BaseColumn.ts +0 -10
  156. package/src/schema/types/base/BaseConfiguration.ts +0 -14
  157. package/src/schema/types/base/BaseModel.ts +0 -12
  158. package/src/schema/types/base/BaseModels.ts +0 -3
  159. package/src/schema/types/base/BaseOrm.ts +0 -8
  160. package/src/schema/types/base/BaseRelation.ts +0 -19
  161. package/src/schema/types/base/BaseRelations.ts +0 -3
  162. package/src/schema/types/constraints/ForeignKey.ts +0 -13
  163. package/src/schema/types/constraints/UniqueConstraint.ts +0 -9
  164. package/src/schema/types/helpers/ColumnName.ts +0 -6
  165. package/src/schema/types/helpers/ColumnType.ts +0 -23
  166. package/src/schema/types/helpers/Columns.ts +0 -3
  167. package/src/schema/types/helpers/HasDefault.ts +0 -11
  168. package/src/schema/types/helpers/IsNullable.ts +0 -7
  169. package/src/schema/types/helpers/IsProvided.ts +0 -8
  170. package/src/schema/types/helpers/IsSerial.ts +0 -10
  171. package/src/schema/types/helpers/ModelName.ts +0 -6
  172. package/src/schema/types/loose/LooseColumnDefinition.ts +0 -80
  173. package/src/schema/types/loose/LooseModelDefinition.ts +0 -47
  174. package/src/schema/types/loose/LooseModelDefinitions.ts +0 -3
  175. package/src/schema/types/loose/LooseRelationDefinition.ts +0 -10
  176. package/src/schema/types/loose/LooseRelationsDefinition.ts +0 -8
  177. package/src/schema/types/loose/LooseRelationsDefinitions.ts +0 -7
  178. package/src/schema/types/postgres/DataType.ts +0 -65
  179. package/src/schema/types/relations/ManyToManyRelation.ts +0 -15
  180. package/src/schema/types/relations/ManyToOneRelation.ts +0 -14
  181. package/src/schema/types/relations/OneToManyRelation.ts +0 -12
  182. package/src/schema/types/strict/ColumnDefinition.ts +0 -81
  183. package/src/schema/types/strict/ModelDefinition.ts +0 -47
  184. package/src/schema/types/strict/ModelDefinitions.ts +0 -3
  185. package/src/schema/types/strict/RelationDefinition.ts +0 -13
  186. package/src/schema/types/strict/RelationsDefinition.ts +0 -8
  187. package/src/schema/types/strict/RelationsDefinitions.ts +0 -7
  188. package/src/schema/validate/validateConfiguration.ts +0 -9
  189. package/src/schema/validate/validateModel.ts +0 -32
  190. package/src/sql/SQLStatement.test.ts +0 -112
  191. package/src/sql/SQLStatement.ts +0 -86
  192. package/src/sql/index.ts +0 -2
  193. package/src/sql/sql.ts +0 -47
  194. package/src/test/db/index.ts +0 -27
  195. package/src/test/db/models/foo.model.ts +0 -24
  196. package/src/test/db/models/foo.relations.ts +0 -4
  197. package/src/test/db/models/post.model.ts +0 -34
  198. package/src/test/db/models/post.relations.ts +0 -21
  199. package/src/test/db/models/tenant.model.ts +0 -14
  200. package/src/test/db/models/tenant.relations.ts +0 -22
  201. package/src/test/db/models/tenantUser.model.ts +0 -23
  202. package/src/test/db/models/tenantUser.relations.ts +0 -15
  203. package/src/test/db/models/user.model.ts +0 -29
  204. package/src/test/db/models/user.relations.ts +0 -38
  205. package/src/test/db/models.ts +0 -15
  206. package/src/test/db/relations.ts +0 -13
  207. package/src/test/gen/column.ts +0 -39
  208. package/src/test/gen/index.ts +0 -2
  209. package/src/test/gen/model.ts +0 -58
  210. package/src/test/gen/sqldate.ts +0 -8
  211. package/src/test/globalSetup.ts +0 -6
  212. package/src/test/seed/index.ts +0 -75
  213. package/src/test/util/withRollback.ts +0 -18
  214. package/src/test/util/withTransaction.ts +0 -19
  215. package/src/types/ColumnName.ts +0 -6
  216. package/src/types/ColumnType.ts +0 -20
  217. package/src/types/Configuration.ts +0 -21
  218. package/src/types/ModelType.ts +0 -20
  219. package/src/types/util/DeepRequired.ts +0 -7
  220. package/src/types/util/DisallowExtraKeys.ts +0 -5
  221. package/src/types/util/NonEmptyArray.ts +0 -1
  222. package/src/types/util/Simplify.ts +0 -8
  223. package/src/util/ensureArray.ts +0 -4
  224. package/src/util/interleave.test.ts +0 -35
  225. package/src/util/interleave.ts +0 -8
  226. package/tsconfig.json +0 -18
  227. package/vitest.config.ts +0 -15
@@ -1,127 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
3
- import { db } from "../../../test/db";
4
- import { seed } from "../../../test/seed";
5
-
6
- describe("findMany", () => {
7
- test("optional N:1 relations don't prevent records being returned", async () => {
8
- await db.transact(
9
- async (db) => {
10
- await seed(db, {
11
- users: [
12
- {
13
- username: "Russell",
14
- tenants: [
15
- { name: "WFMA", posts: 1 },
16
- { name: "Popova Park", posts: 0 },
17
- ],
18
- },
19
- {
20
- username: "Dan",
21
- tenants: [{ name: "WFMA", posts: 2 }],
22
- },
23
- {
24
- username: "Fairooz",
25
- tenants: [{ name: "WFMA", posts: 0 }],
26
- },
27
- ],
28
- });
29
- const results = await db.findMany("post", {
30
- select: ["id", "title"],
31
- include: {
32
- reviewedBy: {
33
- select: ["id", "username"],
34
- include: {
35
- posts: { select: ["id", "title"] },
36
- invitedBy: { select: ["id", "username"] },
37
- },
38
- },
39
- },
40
- orderBy: ["title"],
41
- limit: 2,
42
- });
43
-
44
- expect(results.map((p) => [p.title, p.reviewedBy])).toEqual([
45
- ["Post a", null],
46
- ["Post b", null],
47
- ]);
48
- },
49
- { rollback: true },
50
- );
51
- });
52
-
53
- test("optional N:1 relations are returned if they exist", async () => {
54
- await db.transact(
55
- async (db) => {
56
- const { users } = await seed(db, {
57
- users: [
58
- {
59
- username: "Russell",
60
- tenants: [
61
- { name: "WFMA", posts: 1 },
62
- { name: "Popova Park", posts: 0 },
63
- ],
64
- },
65
- {
66
- username: "Dan",
67
- tenants: [{ name: "WFMA", posts: 2 }],
68
- },
69
- {
70
- username: "Fairooz",
71
- tenants: [{ name: "WFMA", posts: 0 }],
72
- },
73
- ],
74
- });
75
- await db.updateOne("user", {
76
- where: { id: users["Dan"].id },
77
- set: {
78
- invitedById: users["Russell"].id,
79
- },
80
- });
81
- const results = await db.findMany("user", {
82
- select: ["username"],
83
- include: {
84
- invitedBy: {
85
- select: ["username"],
86
- },
87
- tenants: {
88
- select: ["name"],
89
- orderBy: ["name"],
90
- },
91
- reviewedPosts: {
92
- select: ["title"],
93
- },
94
- invitedUsers: {
95
- select: ["username"],
96
- },
97
- },
98
- orderBy: ["username"],
99
- });
100
- expect(results).toEqual([
101
- {
102
- username: "Dan",
103
- invitedBy: { username: "Russell" },
104
- tenants: [{ name: "WFMA" }],
105
- reviewedPosts: [],
106
- invitedUsers: [],
107
- },
108
- {
109
- username: "Fairooz",
110
- invitedBy: null,
111
- tenants: [{ name: "WFMA" }],
112
- reviewedPosts: [],
113
- invitedUsers: [],
114
- },
115
- {
116
- username: "Russell",
117
- invitedBy: null,
118
- tenants: [{ name: "Popova Park" }, { name: "WFMA" }],
119
- reviewedPosts: [],
120
- invitedUsers: [{ username: "Dan" }],
121
- },
122
- ]);
123
- },
124
- { rollback: true },
125
- );
126
- });
127
- });
@@ -1,84 +0,0 @@
1
- import { assertType, describe, test } from "vitest";
2
-
3
- import { db } from "../../../test/db";
4
-
5
- describe("findMany", () => {
6
- test("queries can only be ordered by columns that exist", () => {
7
- assertType(
8
- db.findMany("post", {
9
- select: ["id", "content"],
10
- orderBy: [
11
- "title",
12
- // @ts-expect-error "wrong" is not a column on the post model
13
- "wrong",
14
- ],
15
- }),
16
- );
17
- });
18
-
19
- test("queries can be ordered by columns ascending, descending, or implicitly ascending", () => {
20
- assertType(
21
- db.findMany("post", {
22
- select: ["id", "content"],
23
- orderBy: ["title", ["content", "asc"], ["id", "desc"]],
24
- }),
25
- );
26
- });
27
-
28
- test("anything other than asc or desc as a sort order gives a type error", () => {
29
- assertType(
30
- db.findMany("post", {
31
- select: ["id", "content"],
32
- orderBy: [
33
- "title",
34
- ["content", "asc"],
35
- // @ts-expect-error "wrong" is not a valid sort order
36
- ["id", "wrong"],
37
- ],
38
- }),
39
- );
40
- });
41
-
42
- test("included N:1 relations cannot be ordered", () => {
43
- assertType(
44
- db.findMany("post", {
45
- select: ["id", "content"],
46
- include: {
47
- author: {
48
- select: ["username"],
49
- // @ts-expect-error N:1 relations cannot be ordered
50
- orderBy: ["username"],
51
- },
52
- },
53
- }),
54
- );
55
- });
56
-
57
- test("included 1:N relations can be ordered", () => {
58
- assertType(
59
- db.findMany("user", {
60
- select: ["id", "username"],
61
- include: {
62
- posts: {
63
- select: ["title"],
64
- orderBy: ["title"],
65
- },
66
- },
67
- }),
68
- );
69
- });
70
-
71
- test("included N:N relations can be ordered", () => {
72
- assertType(
73
- db.findMany("user", {
74
- select: ["id", "username"],
75
- include: {
76
- tenants: {
77
- select: ["name"],
78
- orderBy: ["name"],
79
- },
80
- },
81
- }),
82
- );
83
- });
84
- });
@@ -1,184 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
3
- import { db } from "../../../test/db";
4
- import { seed } from "../../../test/seed";
5
-
6
- describe("findMany", () => {
7
- test("it can return data in the specified order", async () => {
8
- await db.transact(
9
- async (db) => {
10
- await seed(db, {
11
- users: [
12
- {
13
- username: "Russell",
14
- tenants: [{ name: "WFMA", posts: 0 }],
15
- },
16
- {
17
- username: "Dan",
18
- tenants: [{ name: "WFMA", posts: 0 }],
19
- },
20
- {
21
- username: "Fairooz",
22
- tenants: [{ name: "WFMA", posts: 0 }],
23
- },
24
- ],
25
- });
26
- const results = await db.findMany("user", {
27
- select: ["id", "username"],
28
- orderBy: ["username"],
29
- });
30
-
31
- expect(results.map((r) => r.username)).toEqual([
32
- "Dan",
33
- "Fairooz",
34
- "Russell",
35
- ]);
36
- },
37
- { rollback: true },
38
- );
39
- });
40
-
41
- test("it can return data in the reverse order", async () => {
42
- await db.transact(
43
- async (db) => {
44
- await seed(db, {
45
- users: [
46
- {
47
- username: "Russell",
48
- tenants: [{ name: "WFMA", posts: 0 }],
49
- },
50
- {
51
- username: "Dan",
52
- tenants: [{ name: "WFMA", posts: 0 }],
53
- },
54
- {
55
- username: "Fairooz",
56
- tenants: [{ name: "WFMA", posts: 0 }],
57
- },
58
- ],
59
- });
60
- const results = await db.findMany("user", {
61
- select: ["id", "username"],
62
- orderBy: [["username", "desc"]],
63
- });
64
-
65
- expect(results.map((r) => r.username)).toEqual([
66
- "Russell",
67
- "Fairooz",
68
- "Dan",
69
- ]);
70
- },
71
- { rollback: true },
72
- );
73
- });
74
-
75
- test("it can return 1:N relations in order", async () => {
76
- await db.transact(
77
- async (db) => {
78
- await seed(db, {
79
- users: [
80
- {
81
- username: "Russell",
82
- tenants: [{ name: "WFMA", posts: 3 }],
83
- },
84
- {
85
- username: "Dan",
86
- tenants: [{ name: "WFMA", posts: 2 }],
87
- },
88
- {
89
- username: "Fairooz",
90
- tenants: [{ name: "WFMA", posts: 6 }],
91
- },
92
- ],
93
- });
94
- const results = await db.findMany("user", {
95
- select: ["id", "username"],
96
- include: {
97
- posts: {
98
- select: ["id", "title"],
99
- orderBy: [["title", "desc"]],
100
- },
101
- },
102
- orderBy: ["username"],
103
- });
104
-
105
- expect(
106
- results.map((r) => [
107
- r.username,
108
- r.posts.map((p) => p.title),
109
- ]),
110
- ).toEqual([
111
- ["Dan", ["Post e", "Post d"]],
112
- [
113
- "Fairooz",
114
- [
115
- "Post k",
116
- "Post j",
117
- "Post i",
118
- "Post h",
119
- "Post g",
120
- "Post f",
121
- ],
122
- ],
123
- ["Russell", ["Post c", "Post b", "Post a"]],
124
- ]);
125
- },
126
- { rollback: true },
127
- );
128
- });
129
-
130
- test("it can return N:N relations in order", async () => {
131
- await db.transact(
132
- async (db) => {
133
- await seed(db, {
134
- users: [
135
- {
136
- username: "Russell",
137
- tenants: [
138
- { name: "WFMA", posts: 0 },
139
- { name: "Popova Park", posts: 0 },
140
- { name: "LRF", posts: 0 },
141
- ],
142
- },
143
- {
144
- username: "Dan",
145
- tenants: [
146
- { name: "Popova Park", posts: 0 },
147
- { name: "LRF", posts: 0 },
148
- ],
149
- },
150
- {
151
- username: "Fairooz",
152
- tenants: [
153
- { name: "WFMA", posts: 0 },
154
- { name: "LRF", posts: 0 },
155
- ],
156
- },
157
- ],
158
- });
159
- const results = await db.findMany("user", {
160
- select: ["id", "username"],
161
- include: {
162
- tenants: {
163
- select: ["id", "name"],
164
- orderBy: ["name"],
165
- },
166
- },
167
- orderBy: [["username", "desc"]],
168
- });
169
-
170
- expect(
171
- results.map((r) => [
172
- r.username,
173
- r.tenants.map((t) => t.name),
174
- ]),
175
- ).toEqual([
176
- ["Russell", ["LRF", "Popova Park", "WFMA"]],
177
- ["Fairooz", ["LRF", "WFMA"]],
178
- ["Dan", ["LRF", "Popova Park"]],
179
- ]);
180
- },
181
- { rollback: true },
182
- );
183
- });
184
- });
@@ -1,117 +0,0 @@
1
- import { assertType, describe, expectTypeOf, test } from "vitest";
2
-
3
- import { db } from "../../../test/db";
4
-
5
- describe("findMany", () => {
6
- test("only models that exist can be queried", () => {
7
- assertType(
8
- db.findMany(
9
- // @ts-expect-error model does not exist
10
- "wrong",
11
- {},
12
- ),
13
- );
14
- });
15
-
16
- test("a select clause must be included in the query", () => {
17
- assertType(
18
- db.findMany(
19
- "post",
20
- // @ts-expect-error query is empty
21
- {},
22
- ),
23
- );
24
- });
25
-
26
- test("at least one field must be selected", () => {
27
- assertType(
28
- db.findMany("post", {
29
- // @ts-expect-error select clause is empty
30
- select: [],
31
- }),
32
- );
33
- });
34
-
35
- test("only fields on the model can be selected", () => {
36
- assertType(
37
- db.findMany("post", {
38
- // @ts-expect-error name is not a field on the post model
39
- select: ["id", "name", "content"],
40
- }),
41
- );
42
- });
43
-
44
- test("the return type is an array of objects including the selected fields", async () => {
45
- expectTypeOf(
46
- await db.findMany("post", {
47
- select: ["id", "title", "content", "publishedAt"],
48
- }),
49
- ).toMatchTypeOf<
50
- {
51
- id: string;
52
- title: string;
53
- content: string;
54
- publishedAt: Date | null;
55
- }[]
56
- >();
57
- });
58
-
59
- test("non-selected fields are not included in the result type", async () => {
60
- expectTypeOf(
61
- await db.findMany("post", {
62
- select: ["id", "title"],
63
- }),
64
- ).not.toMatchTypeOf<{ id: number; title: string; content: string }[]>();
65
- });
66
-
67
- test("a model's relations can be included", async () => {
68
- expectTypeOf(
69
- await db.findMany("post", {
70
- select: ["id", "title", "content"],
71
- include: {
72
- author: {
73
- select: ["id", "username", "joinedAt"],
74
- include: {
75
- tenants: {
76
- select: ["id", "name"],
77
- },
78
- },
79
- },
80
- },
81
- }),
82
- ).toMatchTypeOf<
83
- Readonly<
84
- {
85
- id: string;
86
- title: string;
87
- content: string;
88
- author: {
89
- id: string;
90
- username: string;
91
- joinedAt: Date | null;
92
- tenants: { id: string; name: string }[];
93
- };
94
- }[]
95
- >
96
- >();
97
- });
98
-
99
- test("only fields that exist can be selected from included models", async () => {
100
- assertType(
101
- await db.findMany("post", {
102
- select: ["id", "title", "content"],
103
- include: {
104
- author: {
105
- // @ts-expect-error wrong is not a field on the user model
106
- select: ["id", "username", "joinedAt", "wrong"],
107
- include: {
108
- tenants: {
109
- select: ["id", "name"],
110
- },
111
- },
112
- },
113
- },
114
- }),
115
- );
116
- });
117
- });
@@ -1,188 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
3
- import { db } from "../../../test/db";
4
- import { seed } from "../../../test/seed";
5
-
6
- describe("findMany", () => {
7
- test("it can select fields from the model", async () => {
8
- await db.transact(
9
- async (db) => {
10
- const { posts } = await seed(db, {
11
- users: [
12
- {
13
- username: "Russell",
14
- tenants: [{ name: "WFMA", posts: 1 }],
15
- },
16
- ],
17
- });
18
- const results = await db.findMany("post", {
19
- select: ["id", "title"],
20
- });
21
-
22
- expect(results.find((r) => r.id === posts[0].id)).toEqual({
23
- id: posts[0].id,
24
- title: posts[0].title,
25
- });
26
- },
27
- { rollback: true },
28
- );
29
- });
30
-
31
- test("it can select fields from N:1 relations", async () => {
32
- await db.transact(
33
- async (db) => {
34
- const { posts, users } = await seed(db, {
35
- users: [
36
- {
37
- username: "Russell",
38
- tenants: [{ name: "WFMA", posts: 1 }],
39
- },
40
- ],
41
- });
42
- const results = await db.findMany("post", {
43
- select: ["id", "title"],
44
- include: { author: { select: ["id", "username"] } },
45
- });
46
-
47
- expect(results.find((r) => r.id === posts[0].id)).toEqual({
48
- id: posts[0].id,
49
- title: posts[0].title,
50
- author: {
51
- id: users["Russell"].id,
52
- username: users["Russell"].username,
53
- },
54
- });
55
- },
56
- { rollback: true },
57
- );
58
- });
59
-
60
- test("it can select fields from 1:N relations", async () => {
61
- await db.transact(
62
- async (db) => {
63
- const { posts, users } = await seed(db, {
64
- users: [
65
- {
66
- username: "Russell",
67
- tenants: [
68
- { name: "WFMA", posts: 1 },
69
- { name: "Popova Park", posts: 1 },
70
- ],
71
- },
72
- ],
73
- });
74
- const user = users["Russell"];
75
-
76
- const results = await db.findMany("user", {
77
- select: ["id", "username"],
78
- include: {
79
- posts: {
80
- select: ["id", "title", "content"],
81
- orderBy: ["title"],
82
- },
83
- },
84
- });
85
-
86
- expect(results.find((r) => r.id === user.id)).toEqual({
87
- id: user.id,
88
- username: user.username,
89
- posts: [
90
- {
91
- id: posts[0].id,
92
- title: posts[0].title,
93
- content: posts[0].content,
94
- },
95
- {
96
- id: posts[1].id,
97
- title: posts[1].title,
98
- content: posts[1].content,
99
- },
100
- ],
101
- });
102
- },
103
- { rollback: true },
104
- );
105
- });
106
-
107
- test("it can select fields from N:N relations", async () => {
108
- await db.transact(
109
- async (db) => {
110
- const { tenants, users } = await seed(db, {
111
- users: [
112
- {
113
- username: "Russell",
114
- tenants: [
115
- { name: "Popova Park", posts: 0 },
116
- { name: "WFMA", posts: 0 },
117
- ],
118
- },
119
- ],
120
- });
121
- const user = users["Russell"];
122
- const result = await db.findMany("user", {
123
- select: ["id", "username"],
124
- include: {
125
- tenants: { select: ["id", "name"], orderBy: ["name"] },
126
- },
127
- });
128
-
129
- expect(result).toEqual([
130
- {
131
- id: user.id,
132
- username: user.username,
133
- tenants: [
134
- {
135
- id: tenants["Popova Park"].id,
136
- name: tenants["Popova Park"].name,
137
- },
138
- {
139
- id: tenants["WFMA"].id,
140
- name: tenants["WFMA"].name,
141
- },
142
- ],
143
- },
144
- ]);
145
- },
146
- { rollback: true },
147
- );
148
- });
149
-
150
- test("primary keys are not returned unless specified in the select clause", async () => {
151
- await db.transact(
152
- async (db) => {
153
- const { tenants, users } = await seed(db, {
154
- users: [
155
- {
156
- username: "Russell",
157
- tenants: [
158
- { name: "Popova Park", posts: 0 },
159
- { name: "WFMA", posts: 0 },
160
- ],
161
- },
162
- ],
163
- });
164
- const user = users["Russell"];
165
- const wfma = tenants["WFMA"];
166
- const popovapark = tenants["Popova Park"];
167
-
168
- const result = await db.findMany("user", {
169
- select: ["username"],
170
- include: {
171
- tenants: { select: ["name"], orderBy: ["name"] },
172
- },
173
- });
174
-
175
- expect(result).toEqual([
176
- {
177
- username: user.username,
178
- tenants: [
179
- { name: popovapark.name },
180
- { name: wfma.name },
181
- ],
182
- },
183
- ]);
184
- },
185
- { rollback: true },
186
- );
187
- });
188
- });