@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,36 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
3
- import { hasConditions } from "./hasConditions";
4
-
5
- describe("hasConditions", () => {
6
- test("should return true for non-empty clause", () => {
7
- const clause = { field: "name", operator: "equals", value: "John" };
8
- expect(hasConditions(clause)).toBe(true);
9
- });
10
-
11
- test("should return false for null clause", () => {
12
- const clause = null;
13
- expect(hasConditions(clause)).toBe(false);
14
- });
15
-
16
- test("should return false for undefined clause", () => {
17
- const clause = undefined;
18
- expect(hasConditions(clause)).toBe(false);
19
- });
20
-
21
- test("should return false for empty object clause", () => {
22
- const clause = {};
23
- expect(hasConditions(clause)).toBe(false);
24
- });
25
-
26
- test("should return true for an object clause that contains only symbol keys", () => {
27
- const sym = Symbol("test");
28
- const clause = { [sym]: 2 };
29
- expect(hasConditions(clause)).toBe(true);
30
- });
31
-
32
- test("should return false for empty array clause", () => {
33
- const clause: string[] = [];
34
- expect(hasConditions(clause)).toBe(false);
35
- });
36
- });
@@ -1,14 +0,0 @@
1
- export const hasConditions = <T>(clause: T): clause is NonNullable<T> => {
2
- if (clause === null || clause === undefined) return false;
3
- switch (typeof clause) {
4
- case "object": {
5
- const keys = [
6
- ...Object.keys(clause),
7
- ...Object.getOwnPropertySymbols(clause),
8
- ];
9
- return keys.length > 0;
10
- }
11
- default:
12
- return false;
13
- }
14
- };
@@ -1,76 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
3
- import { FindBuilder } from "../find/types/FindBuilder";
4
- import { rowToObject } from "./rowToObject";
5
-
6
- const builder: Pick<FindBuilder, "columns"> = {
7
- columns: [
8
- {
9
- alias: "a_0",
10
- name: "id",
11
- path: ["id"],
12
- table: "a",
13
- },
14
- {
15
- alias: "a_1",
16
- name: "title",
17
- path: ["title"],
18
- table: "a",
19
- },
20
- {
21
- alias: "a_2",
22
- name: "content",
23
- path: ["content"],
24
- table: "a",
25
- },
26
- {
27
- alias: "b_0",
28
- name: "id",
29
- path: ["author", "id"],
30
- table: "b",
31
- },
32
- {
33
- alias: "b_1",
34
- name: "name",
35
- path: ["author", "name"],
36
- table: "b",
37
- },
38
- {
39
- alias: "c_0",
40
- name: "id",
41
- path: ["author", "bio", "id"],
42
- table: "c",
43
- },
44
- {
45
- alias: "c_1",
46
- name: "content",
47
- path: ["author", "bio", "content"],
48
- table: "c",
49
- },
50
- ],
51
- };
52
-
53
- describe("rowToObject", () => {
54
- test("it converts a flat row with column aliases into a nested object with original field names", () => {
55
- expect(
56
- rowToObject(builder.columns)({
57
- a_0: 3,
58
- a_1: "hello it me",
59
- a_2: "a very long blog post",
60
- b_0: 2,
61
- b_1: "russell",
62
- c_0: 5,
63
- c_1: "i'm russell",
64
- }),
65
- ).toEqual({
66
- id: 3,
67
- title: "hello it me",
68
- content: "a very long blog post",
69
- author: {
70
- id: 2,
71
- name: "russell",
72
- bio: { id: 5, content: "i'm russell" },
73
- },
74
- });
75
- });
76
- });
@@ -1,13 +0,0 @@
1
- import { set } from "lodash-es";
2
-
3
- export type ColumnMapping = { path: string | string[]; alias: string };
4
-
5
- export const rowToObject =
6
- (columns: ColumnMapping[]) =>
7
- (row: Record<string, unknown>): Record<string, unknown> => {
8
- return columns.reduce(
9
- (acc, c) =>
10
- row[c.alias] !== null ? set(acc, c.path, row[c.alias]) : acc,
11
- {},
12
- );
13
- };
@@ -1,20 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
3
- import { tableAlias } from "./tableAlias";
4
-
5
- describe("tableAlias", () => {
6
- test.each([
7
- [0, "a"],
8
- [1, "b"],
9
- [26, "aa"],
10
- [27, "ab"],
11
- [51, "az"],
12
- [52, "ba"],
13
- [104, "da"],
14
- [105, "db"],
15
- [42000, "bjck"],
16
- [42001, "bjcl"],
17
- ])("tableAlias(%s) => %s", (index, expected) => {
18
- expect(tableAlias(index)).toEqual(expected);
19
- });
20
- });
@@ -1,10 +0,0 @@
1
- export const tableAlias = (index: number): string => {
2
- let result = "";
3
- let curr = index;
4
- do {
5
- const remainder = curr % 26;
6
- result = String.fromCharCode("a".charCodeAt(0) + remainder) + result;
7
- curr = (curr - remainder) / 26 - 1;
8
- } while (curr >= 0);
9
- return result;
10
- };
@@ -1,51 +0,0 @@
1
- import { last } from "lodash-es";
2
-
3
- import { Middleware } from "../../queries/middleware/Middleware";
4
-
5
- const compose = <V, Meta>(
6
- ...middleware: (((v: V, meta: Meta) => V) | undefined)[]
7
- ): ((v: V, meta: Meta) => V) => {
8
- return middleware
9
- .filter((fn): fn is NonNullable<typeof fn> => fn !== undefined)
10
- .reduce(
11
- (acc, fn) => (v, meta) => fn(acc(v, meta), meta),
12
- (v, _meta) => v,
13
- );
14
- };
15
-
16
- export const composeMiddleware = (middleware: Middleware[]): Middleware => {
17
- const where = compose(...middleware.map((m) => m.where));
18
- const values = compose(...middleware.map((m) => m.values));
19
- return {
20
- find: {
21
- where: compose(...middleware.map((m) => m.find?.where), where),
22
- },
23
- count: {
24
- where: compose(...middleware.map((m) => m.count?.where), where),
25
- },
26
- create: {
27
- values: compose(...middleware.map((m) => m.create?.values), values),
28
- },
29
- update: {
30
- set: compose(...middleware.map((m) => m.update?.set), values),
31
- where: compose(...middleware.map((m) => m.update?.where), where),
32
- },
33
- delete: {
34
- where: compose(...middleware.map((m) => m.delete?.where), where),
35
- deleteOne: last(
36
- middleware
37
- .map((m) => m.delete?.deleteOne)
38
- .filter(
39
- (fn): fn is NonNullable<typeof fn> => fn !== undefined,
40
- ),
41
- ),
42
- deleteMany: last(
43
- middleware
44
- .map((m) => m.delete?.deleteMany)
45
- .filter(
46
- (fn): fn is NonNullable<typeof fn> => fn !== undefined,
47
- ),
48
- ),
49
- },
50
- };
51
- };
@@ -1,48 +0,0 @@
1
- import { identity, mapValues } from "lodash-es";
2
- import { BaseConfiguration } from "src/schema/types/base/BaseConfiguration";
3
-
4
- import { Connection } from "../../Connection";
5
- import { Configuration } from "../../types/Configuration";
6
- import { LooseModelDefinitions } from "../types/loose/LooseModelDefinitions";
7
- import { LooseRelationsDefinitions } from "../types/loose/LooseRelationsDefinitions";
8
- import { composeMiddleware } from "./composeMiddleware";
9
- import { populateModel } from "./populateModel";
10
-
11
- export const populateConfiguration = <
12
- Models extends LooseModelDefinitions,
13
- Relations extends LooseRelationsDefinitions<Models>,
14
- >(
15
- config: Configuration<Models, Relations>,
16
- ): BaseConfiguration => {
17
- const schema = config.schema ?? "public";
18
-
19
- const naming = {
20
- ...config.naming,
21
- table: config.naming?.table ?? identity,
22
- column: config.naming?.column ?? identity,
23
- };
24
-
25
- const models = mapValues(config.models, (model, name) => {
26
- return populateModel({ naming, schema }, name, model);
27
- });
28
-
29
- const relations = mapValues(models, (_, name) => {
30
- return config.relations?.[name] ?? {};
31
- });
32
-
33
- const connection = new Connection(config.pool);
34
-
35
- const extensions = config.extensions ?? [];
36
-
37
- const middleware = composeMiddleware(config.middleware ?? []);
38
-
39
- return {
40
- naming,
41
- schema,
42
- models,
43
- relations,
44
- extensions,
45
- connection,
46
- middleware,
47
- };
48
- };
@@ -1,98 +0,0 @@
1
- import { mapValues } from "lodash-es";
2
- import { BaseModel } from "src/schema/types/base/BaseModel";
3
-
4
- import { BaseConfiguration } from "../types/base/BaseConfiguration";
5
- import { ForeignKey } from "../types/constraints/ForeignKey";
6
- import { UniqueConstraint } from "../types/constraints/UniqueConstraint";
7
- import { LooseModelDefinition } from "../types/loose/LooseModelDefinition";
8
- import { suggestedColumnSchema } from "./suggestedColumnSchema";
9
-
10
- export const populateModel = (
11
- config: Pick<BaseConfiguration, "naming" | "schema">,
12
- name: string,
13
- model: LooseModelDefinition,
14
- ): BaseModel => {
15
- const columns = mapValues(model.columns, (column, name) => ({
16
- name: column.name ?? config.naming.column(name),
17
- type: column.type,
18
- zodSchema: column.zodSchema ?? suggestedColumnSchema(column.type),
19
- nullable: column.nullable ?? false,
20
- default: column.default ?? null,
21
- provided: column.provided ?? false,
22
- }));
23
-
24
- const primaryKey =
25
- model.primaryKey ??
26
- Object.entries(model.columns)
27
- .filter(([, c]) => c.primaryKey)
28
- .map(([name, c]) => c.name ?? config.naming.column(name));
29
-
30
- const uniqueConstraints = [
31
- ...(model.uniqueConstraints ?? []),
32
- ...Object.entries(model.columns)
33
- .filter(([, c]) => c.unique)
34
- .map(([name, c]) => {
35
- if (c.unique === true) {
36
- return { columns: [name] };
37
- } else if (c.unique === false) {
38
- throw new Error(
39
- "can't happen but let's make typescript happy",
40
- );
41
- } else {
42
- return {
43
- columns: [name ?? config.naming.column(name)],
44
- where: c.unique?.where,
45
- nullsNotDistinct: c.unique?.nullsNotDistinct,
46
- };
47
- }
48
- }),
49
- ] as UniqueConstraint[];
50
-
51
- const foreignKeys = [
52
- ...(model.foreignKeys ?? []).map((fk) => ({
53
- ...fk,
54
- references: {
55
- ...fk.references,
56
- schema:
57
- fk.references.schema ??
58
- model.schema ??
59
- config.schema ??
60
- "public",
61
- },
62
- })),
63
- ...Object.entries(model.columns)
64
- .filter(([, c]) => c.references)
65
- .map(([name, c]) => {
66
- if (!c.references) {
67
- throw new Error(
68
- "can't happen but let's make typescript happy",
69
- );
70
- } else {
71
- return {
72
- columns: [c.name ?? config.naming.column(name)],
73
- references: {
74
- schema:
75
- c.references.schema ??
76
- model.schema ??
77
- config.schema ??
78
- "public",
79
- table: c.references.table,
80
- columns: [c.references.column],
81
- },
82
- onUpdate: c.references.onUpdate,
83
- onDelete: c.references.onDelete,
84
- };
85
- }
86
- }),
87
- ] as ForeignKey[];
88
-
89
- return {
90
- ...model,
91
- table: model.table ?? config.naming.table(name),
92
- schema: model.schema ?? config.schema ?? "public",
93
- columns,
94
- primaryKey,
95
- uniqueConstraints,
96
- foreignKeys,
97
- };
98
- };
@@ -1,62 +0,0 @@
1
- import { z } from "zod";
2
-
3
- /**
4
- * This must be kept in sync with suggestedColumnSchema
5
- * below, so when a zod schema is not provided we can
6
- * still infer the expected type of a field.
7
- */
8
- export type SuggestedColumnType<DataType> = DataType extends
9
- | "bigint"
10
- | "bigserial"
11
- | "double precision"
12
- | "integer"
13
- | "real"
14
- | "smallint"
15
- | "smallserial"
16
- | "serial"
17
- ? number
18
- : DataType extends "inet" | "json" | "jsonb" | "money" | "text" | "uuid"
19
- ? string
20
- : DataType extends "boolean"
21
- ? boolean
22
- : DataType extends `timestamp${string}`
23
- ? Date
24
- : unknown;
25
-
26
- /**
27
- * TODO figure out if these are reasonable or if there are better
28
- * alternatives - and what the values should be for the other datatypes
29
- */
30
- export const suggestedColumnSchema = (type: string) => {
31
- if (type.startsWith("character")) return z.string();
32
- if (type.startsWith("numeric")) return z.number();
33
- if (type.startsWith("timestamp")) return z.date();
34
-
35
- switch (type) {
36
- case "bigint":
37
- case "bigserial":
38
- case "double precision":
39
- case "integer":
40
- case "real":
41
- case "smallint":
42
- case "smallserial":
43
- case "serial":
44
- // sometimes (bigints) are returned as strings,
45
- // so we coerce them here. if your application
46
- // needs to deal with bigints larger than javascript's
47
- // max int, you can specify your own schema instead
48
- return z.coerce.number();
49
- case "inet":
50
- case "json":
51
- case "jsonb":
52
- case "money":
53
- case "text":
54
- return z.string();
55
- case "uuid":
56
- return z.string().uuid();
57
- case "boolean":
58
- return z.boolean();
59
- default:
60
- return z.unknown();
61
- }
62
- };
@@ -1,10 +0,0 @@
1
- import { z } from "zod";
2
-
3
- export type BaseColumn = {
4
- name: string;
5
- type: string;
6
- zodSchema: z.ZodType<unknown>;
7
- nullable: boolean;
8
- default?: unknown;
9
- provided: boolean;
10
- };
@@ -1,14 +0,0 @@
1
- import { Connection } from "../../../Connection";
2
- import { Middleware } from "../../../queries/middleware/Middleware";
3
- import { BaseModels } from "./BaseModels";
4
- import { BaseRelations } from "./BaseRelations";
5
-
6
- export type BaseConfiguration = {
7
- models: BaseModels;
8
- relations: BaseRelations;
9
- extensions: string[];
10
- naming: { column: (s: string) => string; table: (s: string) => string };
11
- schema: string;
12
- connection: Connection;
13
- middleware: Middleware;
14
- };
@@ -1,12 +0,0 @@
1
- import { ForeignKey } from "../constraints/ForeignKey";
2
- import { UniqueConstraint } from "../constraints/UniqueConstraint";
3
- import { BaseColumn } from "./BaseColumn";
4
-
5
- export type BaseModel = {
6
- table: string;
7
- schema: string;
8
- primaryKey: string[];
9
- uniqueConstraints: UniqueConstraint[];
10
- foreignKeys: ForeignKey[];
11
- columns: Record<string, BaseColumn>;
12
- };
@@ -1,3 +0,0 @@
1
- import { BaseModel } from "./BaseModel";
2
-
3
- export type BaseModels = Record<string, BaseModel>;
@@ -1,8 +0,0 @@
1
- import { Orm } from "../../../orm";
2
- import { LooseModelDefinitions } from "../loose/LooseModelDefinitions";
3
- import { LooseRelationsDefinitions } from "../loose/LooseRelationsDefinitions";
4
-
5
- export type BaseOrm = Orm<
6
- LooseModelDefinitions,
7
- LooseRelationsDefinitions<LooseModelDefinitions>
8
- >;
@@ -1,19 +0,0 @@
1
- export type BaseRelation =
2
- | {
3
- model: string;
4
- type: "N:N";
5
- foreignKey: string | string[];
6
- otherKey: string | string[];
7
- through: string;
8
- }
9
- | {
10
- model: string;
11
- type: "N:1";
12
- foreignKey: string | string[];
13
- optional?: boolean;
14
- }
15
- | {
16
- model: string;
17
- type: "1:N";
18
- foreignKey: string | string[];
19
- };
@@ -1,3 +0,0 @@
1
- import { BaseRelation } from "./BaseRelation";
2
-
3
- export type BaseRelations = Record<string, Record<string, BaseRelation>>;
@@ -1,13 +0,0 @@
1
- import { SQLStatement } from "../../..";
2
- import { NonEmptyArray } from "../../../types/util/NonEmptyArray";
3
-
4
- export type ForeignKey = {
5
- columns: NonEmptyArray<string>;
6
- references: {
7
- schema?: string;
8
- table: string;
9
- columns: NonEmptyArray<string>;
10
- };
11
- onUpdate?: SQLStatement;
12
- onDelete?: SQLStatement;
13
- };
@@ -1,9 +0,0 @@
1
- import { SQLStatement } from "../../..";
2
- import { NonEmptyArray } from "../../../types/util/NonEmptyArray";
3
-
4
- export type UniqueConstraint = {
5
- name?: string;
6
- columns: NonEmptyArray<string>;
7
- where?: SQLStatement;
8
- nullsNotDistinct?: boolean;
9
- };
@@ -1,6 +0,0 @@
1
- import { LooseModelDefinition } from "../loose/LooseModelDefinition";
2
-
3
- export type ColumnName<Model extends LooseModelDefinition> = Extract<
4
- keyof Model["columns"],
5
- string
6
- >;
@@ -1,23 +0,0 @@
1
- import { z } from "zod";
2
-
3
- import { SuggestedColumnType } from "../../populate/suggestedColumnSchema";
4
- import { LooseModelDefinitions } from "../loose/LooseModelDefinitions";
5
- import { ColumnName } from "./ColumnName";
6
- import { ModelName } from "./ModelName";
7
-
8
- type NonNullableColumnType<
9
- Models extends LooseModelDefinitions,
10
- M extends ModelName<Models>,
11
- C extends ColumnName<Models[M]>,
12
- > =
13
- Models[M]["columns"][C]["zodSchema"] extends z.ZodType<unknown>
14
- ? z.infer<Models[M]["columns"][C]["zodSchema"]>
15
- : SuggestedColumnType<Models[M]["columns"][C]["type"]>;
16
-
17
- export type ColumnType<
18
- Models extends LooseModelDefinitions,
19
- M extends ModelName<Models>,
20
- C extends ColumnName<Models[M]>,
21
- > = Models[M]["columns"][C]["nullable"] extends true
22
- ? NonNullableColumnType<Models, M, C> | null
23
- : NonNullableColumnType<Models, M, C>;
@@ -1,3 +0,0 @@
1
- import { LooseModelDefinition } from "../loose/LooseModelDefinition";
2
-
3
- export type Columns<Model extends LooseModelDefinition> = Model["columns"];
@@ -1,11 +0,0 @@
1
- import { LooseModelDefinition } from "../loose/LooseModelDefinition";
2
- import { Columns } from "./Columns";
3
-
4
- export type HasDefault<
5
- Model extends LooseModelDefinition,
6
- C extends keyof Columns<Model>,
7
- > = null extends Columns<Model>[C]["default"]
8
- ? false
9
- : undefined extends Columns<Model>[C]["default"]
10
- ? false
11
- : true;
@@ -1,7 +0,0 @@
1
- import { LooseModelDefinition } from "../loose/LooseModelDefinition";
2
- import { Columns } from "./Columns";
3
-
4
- export type IsNullable<
5
- Model extends LooseModelDefinition,
6
- C extends keyof Columns<Model>,
7
- > = Columns<Model>[C]["nullable"] extends true ? true : false;
@@ -1,8 +0,0 @@
1
- import { LooseModelDefinition } from "../loose/LooseModelDefinition";
2
- import { ColumnName } from "./ColumnName";
3
- import { Columns } from "./Columns";
4
-
5
- export type IsProvided<
6
- Model extends LooseModelDefinition,
7
- C extends ColumnName<Model>,
8
- > = Columns<Model>[C]["provided"];
@@ -1,10 +0,0 @@
1
- import { LooseModelDefinition } from "../loose/LooseModelDefinition";
2
- import { ColumnName } from "./ColumnName";
3
- import { Columns } from "./Columns";
4
-
5
- export type IsSerial<
6
- Model extends LooseModelDefinition,
7
- C extends ColumnName<Model>,
8
- > = Columns<Model>[C]["type"] extends "serial" | "bigserial" | "smallserial"
9
- ? true
10
- : false;
@@ -1,6 +0,0 @@
1
- import { LooseModelDefinitions } from "../loose/LooseModelDefinitions";
2
-
3
- export type ModelName<Models extends LooseModelDefinitions> = Extract<
4
- keyof Models,
5
- string
6
- >;