@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,67 +0,0 @@
1
- import { uniq } from "lodash-es";
2
- import { BaseConfiguration } from "src/schema/types/base/BaseConfiguration";
3
-
4
- import { OrmError } from "../../errors";
5
- import { tableAlias } from "../util/tableAlias";
6
- import { BaseCreateManyParams } from "./types/BaseCreateManyParams";
7
-
8
- export type CreateBuilder = {
9
- tableIndex: number;
10
- table: { table: string; schema: string };
11
- params: { name: string; path: string; values: unknown[] }[];
12
- onConflict?: { do: "nothing" };
13
- returning: { name: string; path: string; alias: string }[];
14
- };
15
-
16
- export const buildCreate = (
17
- config: BaseConfiguration,
18
- m: string,
19
- params: BaseCreateManyParams,
20
- _tableIndex = 0,
21
- ): CreateBuilder => {
22
- const builder: CreateBuilder = {
23
- tableIndex: _tableIndex,
24
- table: {
25
- table: config.models[m].table,
26
- schema: config.models[m].schema,
27
- },
28
- params: [],
29
- returning: [],
30
- };
31
-
32
- const table = tableAlias(builder.tableIndex++);
33
- let colIndex = 0;
34
-
35
- const model = config.models[m];
36
- const values = params.values.map((v) =>
37
- config.middleware.create?.values
38
- ? config.middleware.create.values(v, { config, model: m })
39
- : v,
40
- );
41
-
42
- if (values.length === 0)
43
- throw new OrmError("No data provided for create operation", {
44
- data: { m, params },
45
- });
46
-
47
- const keys = uniq(values.flatMap((v) => Object.keys(v)));
48
- for (const k of keys) {
49
- builder.params.push({
50
- name: model.columns[k]["name"],
51
- path: k,
52
- values: values.map((v) => v[k]),
53
- });
54
- }
55
-
56
- for (const f of params.returning ?? []) {
57
- builder.returning.push({
58
- name: model.columns[f]["name"],
59
- path: f,
60
- alias: `${table}_${colIndex++}`,
61
- });
62
- }
63
-
64
- builder.onConflict = params.onConflict;
65
-
66
- return builder;
67
- };
@@ -1,24 +0,0 @@
1
- import { BaseConfiguration } from "src/schema/types/base/BaseConfiguration";
2
- import { ZodSchema, z } from "zod";
3
-
4
- import { BaseCreateManyParams } from "./types/BaseCreateManyParams";
5
- import { BaseCreateOneParams } from "./types/BaseCreateOneParams";
6
-
7
- export const createResultSchema = (
8
- config: BaseConfiguration,
9
- m: string,
10
- params: BaseCreateManyParams | BaseCreateOneParams,
11
- ) => {
12
- if (!params.returning) return z.number();
13
-
14
- const obj: Record<string, ZodSchema<unknown>> = {};
15
-
16
- params.returning?.forEach((s) => {
17
- const col = config.models[m].columns[s];
18
- obj[s] = col.nullable
19
- ? col.zodSchema.nullish().transform((x) => x ?? null)
20
- : col.zodSchema;
21
- });
22
-
23
- return z.object(obj);
24
- };
@@ -1,44 +0,0 @@
1
- import pgfmt from "pg-format";
2
-
3
- import { SQLStatement, sql } from "../../sql";
4
- import { CreateBuilder } from "./buildCreate";
5
-
6
- export const createToSql = (builder: CreateBuilder): SQLStatement => {
7
- const frag = new SQLStatement();
8
-
9
- const { table, params, returning } = builder;
10
-
11
- if (params.length === 0) {
12
- frag.push(
13
- pgfmt(
14
- "INSERT INTO %I.%I DEFAULT VALUES",
15
- table.schema,
16
- table.table,
17
- ),
18
- );
19
- } else {
20
- frag.push(pgfmt("INSERT INTO %I.%I (\n", table.schema, table.table));
21
- frag.push(params.map((p) => pgfmt(" %I", p.name)).join(",\n"));
22
- frag.push(") VALUES ");
23
- const values = params[0].values.map((_, index) => {
24
- return sql`\n(${sql.splat(params.map((p) => p.values[index]))})`;
25
- });
26
- frag.push(sql.splat(values));
27
- }
28
-
29
- if (builder.onConflict?.do === "nothing") {
30
- frag.push("\nON CONFLICT DO NOTHING");
31
- }
32
-
33
- if (returning.length > 0) {
34
- frag.push("\nRETURNING ");
35
- frag.push(
36
- returning
37
- .map((r) => pgfmt(` %I as %I`, r.name, r.alias))
38
- .join(",\n"),
39
- );
40
- }
41
- frag.push(";\n");
42
-
43
- return frag;
44
- };
@@ -1,28 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
3
- import { db } from "../../../test/db";
4
-
5
- describe("createMany", () => {
6
- test("it can handle varied combinations of optional keys in its values", async () => {
7
- await db.transact(
8
- async (db) => {
9
- const russell = await db.createOne("user", {
10
- values: { username: `Russell` },
11
- returning: ["id", "username"],
12
- });
13
- const others = await db.createMany("user", {
14
- values: [
15
- { username: "Fairooz" },
16
- { username: "Dan", invitedById: russell.id },
17
- ],
18
- returning: ["username", "invitedById"],
19
- });
20
- expect(others).toEqual([
21
- { username: "Fairooz", invitedById: null },
22
- { username: "Dan", invitedById: russell.id },
23
- ]);
24
- },
25
- { rollback: true },
26
- );
27
- });
28
- });
@@ -1,116 +0,0 @@
1
- import pg from "pg";
2
- import * as uuid from "uuid";
3
- import { assertType, describe, expectTypeOf, test } from "vitest";
4
- import { z } from "zod";
5
-
6
- import { ModelDefinition, orm } from "../../..";
7
- import { db } from "../../../test/db";
8
-
9
- describe("createOne", () => {
10
- test("only models that exist can be created", () => {
11
- assertType(
12
- db.createOne(
13
- // @ts-expect-error model does not exist
14
- "wrong",
15
- {},
16
- ),
17
- );
18
- });
19
-
20
- test("a data param must be included in the query", () => {
21
- assertType(
22
- db.createOne(
23
- "post",
24
- // @ts-expect-error data param is missing
25
- {},
26
- ),
27
- );
28
- });
29
-
30
- test("all required fields must be provided", () => {
31
- assertType(
32
- db.createOne("post", {
33
- // @ts-expect-error required fields not provided
34
- values: { title: "hello" },
35
- }),
36
- );
37
- });
38
-
39
- test("only existing fields can be included in the returning clause", () => {
40
- assertType(
41
- db.createOne("post", {
42
- values: {
43
- title: "hello",
44
- content: "it me",
45
- authorId: uuid.v4(),
46
- },
47
- returning: [
48
- "id",
49
- // @ts-expect-error non-existing fields can't be returned
50
- "x",
51
- ],
52
- }),
53
- );
54
- });
55
-
56
- test("without a returning clause, the return type is the number of rows created", async () => {
57
- expectTypeOf(
58
- await db.createOne("post", {
59
- values: {
60
- title: "hello",
61
- content: "it me",
62
- authorId: uuid.v4(),
63
- },
64
- }),
65
- ).toMatchTypeOf<number>();
66
- });
67
-
68
- test("with a returning clause, the return type is an object containing the specified fields", async () => {
69
- expectTypeOf(
70
- await db.createOne("post", {
71
- values: {
72
- title: "hello",
73
- content: "it me",
74
- authorId: uuid.v4(),
75
- },
76
- returning: ["id", "title"],
77
- }),
78
- ).toMatchTypeOf<{ id: string; title: string }>();
79
- });
80
-
81
- test("non-selected fields are not included in the result type", async () => {
82
- expectTypeOf(
83
- await db.createOne("post", {
84
- values: {
85
- title: "hello",
86
- content: "it me",
87
- authorId: uuid.v4(),
88
- },
89
- returning: ["id", "title"],
90
- }),
91
- ).not.toMatchTypeOf<{ id: string; title: string; content: string }>();
92
- });
93
-
94
- test("when there are no required params, typechecking still works", () => {
95
- const foo = {
96
- columns: { id: { type: "serial", zodSchema: z.coerce.number() } },
97
- } as const satisfies ModelDefinition;
98
- const db = orm({ models: { foo }, pool: new pg.Pool() });
99
- assertType(db.createOne("foo", { values: { id: 3 } }));
100
- });
101
-
102
- test("when all required fields are provided, excess property checking still works", async () => {
103
- assertType(
104
- await db.createOne("post", {
105
- values: {
106
- title: "hello",
107
- content: "it me",
108
- authorId: uuid.v4(),
109
- // @ts-expect-error non-existing properties can't be included
110
- wrong: 2,
111
- },
112
- returning: ["id", "title"],
113
- }),
114
- );
115
- });
116
- });
@@ -1,197 +0,0 @@
1
- import pg from "pg";
2
- import * as uuid from "uuid";
3
- import { describe, expect, test } from "vitest";
4
- import { z } from "zod";
5
-
6
- import { ModelDefinition, orm } from "../../..";
7
- import { createTableSql } from "../../../migrate/sql/createTableSql";
8
- import { sql } from "../../../sql";
9
- import { db } from "../../../test/db";
10
-
11
- describe("createOne", () => {
12
- test("it inserts records into the database", async () => {
13
- await db.transact(
14
- async (db) => {
15
- const userId = uuid.v4();
16
- const tenantId = uuid.v4();
17
- const postId = uuid.v4();
18
- await db.createOne("tenant", {
19
- values: {
20
- id: tenantId,
21
- name: "popovapark",
22
- },
23
- });
24
- await db.createOne("user", {
25
- values: {
26
- id: userId,
27
- username: "russell",
28
- },
29
- });
30
- const result = await db.createOne("post", {
31
- values: {
32
- id: postId,
33
- authorId: userId,
34
- tenantId: tenantId,
35
- title: "hello it me",
36
- content: "i'm writing a post",
37
- },
38
- });
39
-
40
- expect(result).toEqual(1);
41
-
42
- const rows = await db.findMany("post", {
43
- select: ["id", "title"],
44
- });
45
-
46
- expect(rows).toHaveLength(1);
47
- expect(rows[0]).toEqual(
48
- expect.objectContaining({
49
- id: postId,
50
- title: "hello it me",
51
- }),
52
- );
53
- },
54
- { rollback: true },
55
- );
56
- });
57
-
58
- test("columns of type serial do not need to be specified", async () => {
59
- const baz = {
60
- columns: {
61
- id: { type: "serial", zodSchema: z.coerce.number() },
62
- big: { type: "bigserial", zodSchema: z.coerce.number() },
63
- small: { type: "smallserial", zodSchema: z.coerce.number() },
64
- },
65
- } as const satisfies ModelDefinition;
66
- await orm({
67
- schema: "casekit",
68
- models: { baz },
69
- relations: { baz: {} },
70
- pool: new pg.Pool(),
71
- }).transact(
72
- async (db) => {
73
- await db.connection.query(createTableSql(db.models.baz));
74
-
75
- await db.createOne("baz", {
76
- values: {},
77
- });
78
-
79
- const rows = await db.findMany("baz", {
80
- select: ["id", "big", "small"],
81
- });
82
-
83
- expect(rows).toHaveLength(1);
84
- expect(rows[0].id).toBeTypeOf("number");
85
- expect(rows[0].big).toBeTypeOf("number");
86
- expect(rows[0].small).toBeTypeOf("number");
87
- },
88
- { rollback: true },
89
- );
90
- });
91
-
92
- test("columns with default values do not need to be specified", async () => {
93
- const baz = {
94
- columns: {
95
- id: {
96
- type: "uuid",
97
- zodSchema: z.string().uuid(),
98
- default: sql`uuid_generate_v4()`,
99
- },
100
- name: { type: "text", zodSchema: z.string() },
101
- },
102
- } as const satisfies ModelDefinition;
103
- await orm({
104
- schema: "casekit",
105
- models: { baz },
106
- relations: { baz: {} },
107
- pool: new pg.Pool(),
108
- }).transact(
109
- async (db) => {
110
- await db.connection.query(createTableSql(db.models.baz));
111
-
112
- await db.createOne("baz", {
113
- values: { name: "hello" },
114
- });
115
-
116
- const rows = await db.findMany("baz", {
117
- select: ["id", "name"],
118
- });
119
-
120
- expect(rows).toHaveLength(1);
121
- expect(rows[0].id).toBeTypeOf("string");
122
- expect(rows[0].name).toEqual("hello");
123
- },
124
- { rollback: true },
125
- );
126
- });
127
- test("columns that are provided by middleware do not need to be specified", async () => {
128
- const baz = {
129
- columns: {
130
- id: {
131
- type: "uuid",
132
- zodSchema: z.string().uuid(),
133
- provided: true,
134
- },
135
- name: { type: "text", zodSchema: z.string() },
136
- },
137
- } as const satisfies ModelDefinition;
138
-
139
- await orm({
140
- schema: "casekit",
141
- models: { baz },
142
- relations: { baz: {} },
143
- pool: new pg.Pool(),
144
- middleware: [
145
- {
146
- create: {
147
- values: (values) => ({ id: uuid.v4(), ...values }),
148
- },
149
- },
150
- ],
151
- }).transact(
152
- async (db) => {
153
- await db.connection.query(createTableSql(db.models.baz));
154
-
155
- await db.createOne("baz", {
156
- values: { name: "hello" },
157
- });
158
-
159
- const rows = await db.findMany("baz", {
160
- select: ["id", "name"],
161
- });
162
-
163
- expect(rows).toHaveLength(1);
164
- expect(rows[0].id).toBeTypeOf("string");
165
- expect(rows[0].name).toEqual("hello");
166
- },
167
- { rollback: true },
168
- );
169
- });
170
-
171
- test("conflicts can be ignored", async () => {
172
- await db.transact(
173
- async (db) => {
174
- await db.createOne("user", { values: { username: "russell" } });
175
-
176
- // creating a duplicate user should throw an error
177
- await expect(
178
- db.transact(async (db) => {
179
- return db.createOne("user", {
180
- values: { username: "russell" },
181
- });
182
- }),
183
- ).rejects.toThrow(
184
- 'duplicate key value violates unique constraint "user_username_idx"',
185
- );
186
-
187
- // but if we ignore the conflict, it should work
188
- const result = await db.createOne("user", {
189
- values: { username: "russell" },
190
- onConflict: { do: "nothing" },
191
- });
192
- expect(result).toEqual(0);
193
- },
194
- { rollback: true },
195
- );
196
- });
197
- });
@@ -1,7 +0,0 @@
1
- import { NonEmptyArray } from "../../../types/util/NonEmptyArray";
2
-
3
- export type BaseCreateManyParams = {
4
- values: Record<string, unknown | null>[];
5
- onConflict?: { do: "nothing" };
6
- returning?: NonEmptyArray<string>;
7
- };
@@ -1,7 +0,0 @@
1
- import { NonEmptyArray } from "../../../types/util/NonEmptyArray";
2
-
3
- export type BaseCreateOneParams = {
4
- values: Record<string, unknown | null>;
5
- onConflict?: { do: "nothing" };
6
- returning?: NonEmptyArray<string>;
7
- };
@@ -1,15 +0,0 @@
1
- import { ModelName } from "../../../schema/types/helpers/ModelName";
2
- import { LooseModelDefinitions } from "../../../schema/types/loose/LooseModelDefinitions";
3
- import { ReturningClause } from "../../clauses/ReturningClause";
4
- import { CreateValues } from "./CreateOneParams";
5
-
6
- export type CreateManyParams<
7
- Models extends LooseModelDefinitions,
8
- M extends ModelName<Models>,
9
- > = {
10
- values: CreateValues<Models, M>[];
11
- returning?: ReturningClause<Models[M]>;
12
- onConflict?: {
13
- do: "nothing";
14
- };
15
- };
@@ -1,17 +0,0 @@
1
- import { ColumnType } from "../../../schema/types/helpers/ColumnType";
2
- import { ModelName } from "../../../schema/types/helpers/ModelName";
3
- import { LooseModelDefinitions } from "../../../schema/types/loose/LooseModelDefinitions";
4
- import { ReturningClause } from "../../clauses/ReturningClause";
5
- import { CreateManyParams } from "./CreateManyParams";
6
- import { CreateOneParams } from "./CreateOneParams";
7
-
8
- export type CreateManyResult<
9
- Models extends LooseModelDefinitions,
10
- M extends ModelName<Models>,
11
- P extends CreateOneParams<Models, M> | CreateManyParams<Models, M>,
12
- > =
13
- P["returning"] extends ReturningClause<Models[M]>
14
- ? Readonly<{
15
- [C in P["returning"][number]]: ColumnType<Models, M, C>;
16
- }>[]
17
- : number;
@@ -1,22 +0,0 @@
1
- import { ModelName } from "../../../schema/types/helpers/ModelName";
2
- import { LooseModelDefinitions } from "../../../schema/types/loose/LooseModelDefinitions";
3
- import { Simplify } from "../../../types/util/Simplify";
4
- import { ReturningClause } from "../../clauses/ReturningClause";
5
- import { OptionalParams } from "../../clauses/helpers/OptionalParams";
6
- import { RequiredParams } from "../../clauses/helpers/RequiredParams";
7
-
8
- export type CreateValues<
9
- Models extends LooseModelDefinitions,
10
- M extends ModelName<Models>,
11
- > = Simplify<RequiredParams<Models, M> & OptionalParams<Models, M>>;
12
-
13
- export type CreateOneParams<
14
- Models extends LooseModelDefinitions,
15
- M extends ModelName<Models>,
16
- > = {
17
- values: CreateValues<Models, M>;
18
- returning?: ReturningClause<Models[M]>;
19
- onConflict?: {
20
- do: "nothing";
21
- };
22
- };
@@ -1,17 +0,0 @@
1
- import { ColumnType } from "../../../schema/types/helpers/ColumnType";
2
- import { ModelName } from "../../../schema/types/helpers/ModelName";
3
- import { LooseModelDefinitions } from "../../../schema/types/loose/LooseModelDefinitions";
4
- import { SelectClause } from "../../clauses/SelectClause";
5
- import { CreateManyParams } from "./CreateManyParams";
6
- import { CreateOneParams } from "./CreateOneParams";
7
-
8
- export type CreateOneResult<
9
- Models extends LooseModelDefinitions,
10
- M extends ModelName<Models>,
11
- P extends CreateOneParams<Models, M> | CreateManyParams<Models, M>,
12
- > =
13
- P["returning"] extends SelectClause<Models[M]>
14
- ? Readonly<{
15
- [C in P["returning"][number]]: ColumnType<Models, M, C>;
16
- }>
17
- : number;
@@ -1,38 +0,0 @@
1
- import { BaseConfiguration } from "src/schema/types/base/BaseConfiguration";
2
-
3
- import { Connection } from "../Connection";
4
- import { logger } from "../logger";
5
- import { buildCreate } from "./create/buildCreate";
6
- import { createToSql } from "./create/createToSql";
7
- import { BaseCreateManyParams } from "./create/types/BaseCreateManyParams";
8
- import { rowToObject } from "./util/rowToObject";
9
-
10
- export const createMany = async (
11
- conn: Connection,
12
- config: BaseConfiguration,
13
- m: string,
14
- params: BaseCreateManyParams,
15
- ) => {
16
- if (params.values.length === 0) {
17
- return params.returning ? [] : 0;
18
- }
19
-
20
- const builder = buildCreate(config, m, params);
21
- const statement = createToSql(builder);
22
-
23
- logger.info({
24
- message: "Executing create",
25
- sql: statement.text,
26
- values: statement.values,
27
- });
28
-
29
- if (process.env.ORM_VERBOSE_LOGGING) {
30
- console.log(statement.text);
31
- console.log(statement.values);
32
- }
33
-
34
- const result = await conn.query(statement);
35
- return params.returning
36
- ? result.rows.map(rowToObject(builder.returning))
37
- : result.rowCount;
38
- };
@@ -1,27 +0,0 @@
1
- import { BaseConfiguration } from "src/schema/types/base/BaseConfiguration";
2
-
3
- import { OrmError } from "..";
4
- import { Connection } from "../Connection";
5
- import { BaseCreateOneParams } from "./create/types/BaseCreateOneParams";
6
- import { createMany } from "./createMany";
7
-
8
- export const createOne = async (
9
- conn: Connection,
10
- config: BaseConfiguration,
11
- m: string,
12
- params: BaseCreateOneParams,
13
- ) => {
14
- if (params.onConflict?.do === "nothing" && params.returning) {
15
- throw new OrmError(
16
- "Cannot use 'returning' with 'onConflict' in createOne",
17
- {
18
- data: { m, params },
19
- },
20
- );
21
- }
22
- const result = await createMany(conn, config, m, {
23
- ...params,
24
- values: [params.values],
25
- });
26
- return Array.isArray(result) ? result[0] : result;
27
- };