@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,141 +0,0 @@
1
- import pgfmt from "pg-format";
2
-
3
- import { OrmError } from "../../errors";
4
- import { BaseConfiguration } from "../../schema/types/base/BaseConfiguration";
5
- import { SQLStatement, sql } from "../../sql";
6
- import { interleave } from "../../util/interleave";
7
- import { buildWhereClauses } from "../clauses/where/buildWhereClauses";
8
- import { hasConditions } from "../util/hasConditions";
9
- import { FindBuilder } from "./types/FindBuilder";
10
-
11
- export const findToSql = (
12
- config: BaseConfiguration,
13
- builder: FindBuilder,
14
- ): SQLStatement => {
15
- const frag = new SQLStatement();
16
- const table = builder.table;
17
-
18
- if (builder.lateralBy) {
19
- const { columns, groupTable, itemTable } = builder.lateralBy;
20
- frag.push(pgfmt(`SELECT %I.* FROM (\nSELECT `, itemTable));
21
- columns.forEach((c, index) => {
22
- frag.push(pgfmt(`UNNEST(ARRAY[`));
23
-
24
- frag.push(
25
- ...interleave(
26
- c.values.map((v) => sql`${v}`),
27
- sql`, `,
28
- ),
29
- );
30
-
31
- frag.push(pgfmt(`]::%I[]) AS %I`, c.type, c.column));
32
-
33
- if (index !== columns.length - 1) {
34
- frag.push(pgfmt(", "));
35
- }
36
- });
37
- frag.push(pgfmt(`) %I\nJOIN LATERAL (\n`, groupTable));
38
- }
39
-
40
- frag.push(
41
- pgfmt(
42
- `SELECT\n${builder.columns.map((c) => pgfmt(` %I.%I AS %I`, c.table, c.name, c.alias)).join(",\n")}`,
43
- ),
44
- );
45
-
46
- frag.push(pgfmt(`\nFROM %I.%I %I`, table.schema, table.table, table.alias));
47
-
48
- for (const join of table.joins ?? []) {
49
- if (join.from.columns.length !== join.to.columns.length) {
50
- throw new OrmError(
51
- "Number of foreign keys doesn't match number of primary keys in join",
52
- { data: builder },
53
- );
54
- }
55
-
56
- frag.push(join.type === "left" ? "\nLEFT JOIN" : "\nJOIN");
57
- frag.push(
58
- pgfmt(
59
- " %I.%I %I\n ON ",
60
- join.to.schema,
61
- join.to.table,
62
- join.to.alias,
63
- ),
64
- );
65
- frag.push(
66
- join.from.columns
67
- .map((from, i) =>
68
- pgfmt(
69
- "%I.%I = %I.%I",
70
- join.from.alias,
71
- from,
72
- join.to.alias,
73
- join.to.columns[i],
74
- ),
75
- )
76
- .join(" AND "),
77
- );
78
- if (hasConditions(join.where)) {
79
- frag.push(
80
- sql`\n AND ${buildWhereClauses(config, join.to, join.where)}`,
81
- );
82
- }
83
- }
84
-
85
- frag.push(sql`\nWHERE 1 = 1`);
86
-
87
- if (hasConditions(table.where)) {
88
- frag.push(
89
- sql`\n AND ${buildWhereClauses(config, table, table.where)}`,
90
- );
91
- }
92
-
93
- if (builder.lateralBy) {
94
- const { groupTable, columns } = builder.lateralBy;
95
- columns.forEach((c) => {
96
- frag.push(
97
- pgfmt(
98
- `\n AND %I.%I = %I.%I`,
99
- table.alias,
100
- c.column,
101
- groupTable,
102
- c.column,
103
- ),
104
- );
105
- });
106
- }
107
-
108
- if (builder.orderBy.length > 0) {
109
- frag.push(pgfmt(`\nORDER BY `));
110
- frag.push(
111
- builder.orderBy
112
- .map(({ table, column, direction }) =>
113
- pgfmt(
114
- `%I.%I ${direction === "asc" ? "ASC" : "DESC"}`,
115
- table,
116
- column,
117
- ),
118
- )
119
- .join(", "),
120
- );
121
- }
122
-
123
- if (builder.limit !== undefined) {
124
- frag.push(sql`\nLIMIT ${builder.limit}`);
125
- }
126
-
127
- if (builder.offset !== undefined) {
128
- frag.push(sql`\nOFFSET ${builder.offset}`);
129
- }
130
-
131
- if (builder.for) {
132
- frag.push(pgfmt(`\nFOR ${builder.for.toUpperCase()}`));
133
- }
134
-
135
- if (builder.lateralBy) {
136
- const { itemTable } = builder.lateralBy;
137
- frag.push(pgfmt(`\n) %I ON TRUE`, itemTable));
138
- }
139
-
140
- return frag;
141
- };
@@ -1,49 +0,0 @@
1
- import { BaseConfiguration } from "../../schema/types/base/BaseConfiguration";
2
- import { BaseFindParams } from "./types/BaseFindParams";
3
-
4
- export type ManyToManySubQuery = {
5
- model: string;
6
- name: string;
7
- relation: {
8
- model: string;
9
- type: "N:N";
10
- foreignKey: string | string[];
11
- otherKey: string | string[];
12
- through: string;
13
- };
14
- query: BaseFindParams;
15
- path: string[];
16
- };
17
-
18
- export const getIncludedManyToManyRelations = (
19
- config: BaseConfiguration,
20
- m: string,
21
- query: BaseFindParams,
22
- path: string[] = [],
23
- ) => {
24
- const rels = config.relations[m];
25
- const includedManyToManyRelations: ManyToManySubQuery[] = Object.entries(
26
- query.include ?? {},
27
- )
28
- .filter(([r, _]) => rels[r].type === "N:N")
29
- .map(([r, q]) => ({
30
- model: m,
31
- name: r,
32
- relation: rels[r] as ManyToManySubQuery["relation"],
33
- query: q!,
34
- path: [...path, r],
35
- }));
36
-
37
- const joinedManyToManyRelations: ManyToManySubQuery[] = Object.entries(
38
- query.include ?? {},
39
- )
40
- .filter(([r, _]) => rels[r].type === "N:1")
41
- .flatMap(([r, q]) =>
42
- getIncludedManyToManyRelations(config, rels[r].model, q!, [
43
- ...path,
44
- r,
45
- ]),
46
- );
47
-
48
- return [...includedManyToManyRelations, ...joinedManyToManyRelations];
49
- };
@@ -1,44 +0,0 @@
1
- import { BaseConfiguration } from "../../schema/types/base/BaseConfiguration";
2
- import { BaseRelation } from "../../schema/types/base/BaseRelation";
3
- import { BaseFindParams } from "./types/BaseFindParams";
4
-
5
- export type OneToManySubQuery = {
6
- model: string;
7
- name: string;
8
- relation: BaseRelation;
9
- query: BaseFindParams;
10
- path: string[];
11
- };
12
-
13
- export const getIncludedOneToManyRelations = (
14
- config: BaseConfiguration,
15
- m: string,
16
- query: BaseFindParams,
17
- path: string[] = [],
18
- ) => {
19
- const rels = config.relations[m];
20
- const includedOneToManyRelations: OneToManySubQuery[] = Object.entries(
21
- query.include ?? {},
22
- )
23
- .filter(([r, _]) => rels[r].type === "1:N")
24
- .map(([r, q]) => ({
25
- model: m,
26
- name: r,
27
- relation: rels[r],
28
- query: q!,
29
- path: [...path, r],
30
- }));
31
-
32
- const joinedOneToManyRelations: OneToManySubQuery[] = Object.entries(
33
- query.include ?? {},
34
- )
35
- .filter(([r, _]) => rels[r].type === "N:1")
36
- .flatMap(([r, q]) =>
37
- getIncludedOneToManyRelations(config, rels[r].model, q!, [
38
- ...path,
39
- r,
40
- ]),
41
- );
42
-
43
- return [...includedOneToManyRelations, ...joinedOneToManyRelations];
44
- };
@@ -1,107 +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 include N:1 -> 1:N relations", 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
- author: {
33
- select: ["id", "username"],
34
- include: {
35
- posts: { select: ["id", "title"] },
36
- },
37
- },
38
- },
39
- limit: 2,
40
- });
41
-
42
- expect(
43
- results.map((p) => [
44
- p.author.username,
45
- p.author.posts.map((p) => p.title),
46
- ]),
47
- ).toEqual([
48
- ["Russell", ["Post a"]],
49
- ["Dan", ["Post b", "Post c"]],
50
- ]);
51
- },
52
- { rollback: true },
53
- );
54
- });
55
-
56
- test("it can include N:1 -> N:N relations", async () => {
57
- await db.transact(
58
- async (db) => {
59
- await seed(db, {
60
- users: [
61
- {
62
- username: "Russell",
63
- tenants: [
64
- { name: "WFMA", posts: 1 },
65
- { name: "Popova Park", posts: 0 },
66
- ],
67
- },
68
- {
69
- username: "Dan",
70
- tenants: [{ name: "WFMA", posts: 2 }],
71
- },
72
- {
73
- username: "Fairooz",
74
- tenants: [{ name: "WFMA", posts: 0 }],
75
- },
76
- ],
77
- });
78
- const results = await db.findMany("post", {
79
- select: ["id", "title"],
80
- include: {
81
- author: {
82
- select: ["id", "username"],
83
- include: {
84
- tenants: {
85
- select: ["id", "name"],
86
- orderBy: ["name"],
87
- },
88
- },
89
- },
90
- },
91
- limit: 2,
92
- });
93
-
94
- expect(
95
- results.map((p) => [
96
- p.author.username,
97
- p.author.tenants.map((t) => t.name),
98
- ]),
99
- ).toEqual([
100
- ["Russell", ["Popova Park", "WFMA"]],
101
- ["Dan", ["WFMA"]],
102
- ]);
103
- },
104
- { rollback: true },
105
- );
106
- });
107
- });
@@ -1,75 +0,0 @@
1
- import { assertType, describe, test } from "vitest";
2
-
3
- import { db } from "../../../test/db";
4
-
5
- describe("findMany", () => {
6
- test("queries can have limits and offsets applied", () => {
7
- assertType(
8
- db.findMany("post", {
9
- select: ["id", "content"],
10
- limit: 2,
11
- offset: 5,
12
- }),
13
- );
14
- });
15
-
16
- test("included N:1 relations cannot have limits applied", () => {
17
- assertType(
18
- db.findMany("post", {
19
- select: ["id", "content"],
20
- include: {
21
- author: {
22
- select: ["username"],
23
- // @ts-expect-error N:1 relations cannot have limits applied
24
- limit: 1,
25
- },
26
- },
27
- }),
28
- );
29
- });
30
-
31
- test("included N:1 relations cannot have offsets applied", () => {
32
- assertType(
33
- db.findMany("post", {
34
- select: ["id", "content"],
35
- include: {
36
- author: {
37
- select: ["username"],
38
- // @ts-expect-error N:1 relations cannot have offsets applied
39
- offset: 1,
40
- },
41
- },
42
- }),
43
- );
44
- });
45
-
46
- test("included 1:N relations can have limits and offsets applied", () => {
47
- assertType(
48
- db.findMany("user", {
49
- select: ["id", "username"],
50
- include: {
51
- posts: {
52
- select: ["title"],
53
- offset: 1,
54
- limit: 2,
55
- },
56
- },
57
- }),
58
- );
59
- });
60
-
61
- test("included N:N relations can have offsets and limits applied", () => {
62
- assertType(
63
- db.findMany("user", {
64
- select: ["id", "username"],
65
- include: {
66
- tenants: {
67
- select: ["name"],
68
- offset: 1,
69
- limit: 2,
70
- },
71
- },
72
- }),
73
- );
74
- });
75
- });
@@ -1,176 +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 limit the number of rows returned", 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
- limit: 2,
30
- });
31
-
32
- expect(results.map((r) => r.username)).toEqual([
33
- "Dan",
34
- "Fairooz",
35
- ]);
36
- },
37
- { rollback: true },
38
- );
39
- });
40
-
41
- test("offsets can be applied", 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"],
63
- limit: 1,
64
- offset: 2,
65
- });
66
-
67
- expect(results.map((r) => r.username)).toEqual(["Russell"]);
68
- },
69
- { rollback: true },
70
- );
71
- });
72
-
73
- test("1:N relations can have limits and offsets applied", async () => {
74
- await db.transact(
75
- async (db) => {
76
- await seed(db, {
77
- users: [
78
- {
79
- username: "Russell",
80
- tenants: [{ name: "WFMA", posts: 3 }],
81
- },
82
- {
83
- username: "Dan",
84
- tenants: [{ name: "WFMA", posts: 5 }],
85
- },
86
- {
87
- username: "Fairooz",
88
- tenants: [{ name: "WFMA", posts: 2 }],
89
- },
90
- ],
91
- });
92
- const results = await db.findMany("user", {
93
- select: ["id", "username"],
94
- orderBy: ["username"],
95
- include: {
96
- posts: {
97
- select: ["title"],
98
- orderBy: ["title"],
99
- limit: 2,
100
- offset: 1,
101
- },
102
- },
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 f"]],
112
- ["Fairooz", ["Post j"]],
113
- ["Russell", ["Post b", "Post c"]],
114
- ]);
115
- },
116
- { rollback: true },
117
- );
118
- });
119
-
120
- test("N:N relations can have limits and offsets applied", async () => {
121
- await db.transact(
122
- async (db) => {
123
- await seed(db, {
124
- users: [
125
- {
126
- username: "Russell",
127
- tenants: [
128
- { name: "WFMA", posts: 0 },
129
- { name: "Popova Park", posts: 0 },
130
- { name: "LRF", posts: 0 },
131
- ],
132
- },
133
- {
134
- username: "Dan",
135
- tenants: [
136
- { name: "Popova Park", posts: 0 },
137
- { name: "LRF", posts: 0 },
138
- ],
139
- },
140
- {
141
- username: "Fairooz",
142
- tenants: [
143
- { name: "WFMA", posts: 0 },
144
- { name: "LRF", posts: 0 },
145
- ],
146
- },
147
- ],
148
- });
149
- const results = await db.findMany("user", {
150
- select: ["id", "username"],
151
- orderBy: ["username"],
152
- include: {
153
- tenants: {
154
- select: ["name"],
155
- orderBy: ["name"],
156
- limit: 2,
157
- offset: 1,
158
- },
159
- },
160
- });
161
-
162
- expect(
163
- results.map((r) => [
164
- r.username,
165
- r.tenants.map((p) => p.name),
166
- ]),
167
- ).toEqual([
168
- ["Dan", ["Popova Park"]],
169
- ["Fairooz", ["WFMA"]],
170
- ["Russell", ["Popova Park", "WFMA"]],
171
- ]);
172
- },
173
- { rollback: true },
174
- );
175
- });
176
- });