@casekit/orm2-schema 0.0.0-20250331202540 → 0.0.0

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 (86) hide show
  1. package/package.json +15 -16
  2. package/{build/Config.d.ts → src/Config.ts} +9 -2
  3. package/{build/definition/FieldDefinition.d.ts → src/definition/FieldDefinition.ts} +19 -6
  4. package/{build/definition/ModelDefinition.d.ts → src/definition/ModelDefinition.ts} +7 -0
  5. package/{build/definition/ModelDefinitions.d.ts → src/definition/ModelDefinitions.ts} +1 -0
  6. package/{build/definition/OperatorDefinitions.d.ts → src/definition/OperatorDefinitions.ts} +1 -0
  7. package/{build/definition/PostgresDataTypes.d.ts → src/definition/PostgresDataTypes.ts} +3 -0
  8. package/{build/definition/RelationDefinition.d.ts → src/definition/RelationDefinition.ts} +7 -1
  9. package/{build/definition/RelationDefinitions.d.ts → src/definition/RelationDefinitions.ts} +1 -0
  10. package/{build/definition/UniqueConstraintDefinition.d.ts → src/definition/UniqueConstraintDefinition.ts} +1 -0
  11. package/src/definition/WhereOperator.ts +6 -0
  12. package/src/helper/DefaultFieldType.test-d.ts +60 -0
  13. package/src/helper/DefaultFieldType.ts +99 -0
  14. package/{build/helper/FieldName.test-d.js → src/helper/FieldName.test-d.ts} +9 -2
  15. package/{build/helper/FieldName.d.ts → src/helper/FieldName.ts} +1 -0
  16. package/src/helper/FieldType.test-d.ts +81 -0
  17. package/src/helper/FieldType.ts +16 -0
  18. package/{build/helper/FieldWithDefault.test-d.js → src/helper/FieldWithDefault.test-d.ts} +17 -6
  19. package/{build/helper/FieldWithDefault.d.ts → src/helper/FieldWithDefault.ts} +6 -1
  20. package/{build/helper/ModelName.test-d.js → src/helper/ModelName.test-d.ts} +9 -2
  21. package/{build/helper/ModelName.d.ts → src/helper/ModelName.ts} +5 -1
  22. package/{build/helper/ModelType.test-d.js → src/helper/ModelType.test-d.ts} +18 -3
  23. package/{build/helper/ModelType.d.ts → src/helper/ModelType.ts} +2 -0
  24. package/{build/helper/NullableField.test-d.js → src/helper/NullableField.test-d.ts} +17 -6
  25. package/{build/helper/NullableField.d.ts → src/helper/NullableField.ts} +4 -1
  26. package/{build/helper/OptionalField.test-d.js → src/helper/OptionalField.test-d.ts} +21 -6
  27. package/{build/helper/OptionalField.d.ts → src/helper/OptionalField.ts} +5 -1
  28. package/{build/helper/ProvidedField.test-d.js → src/helper/ProvidedField.test-d.ts} +17 -6
  29. package/{build/helper/ProvidedField.d.ts → src/helper/ProvidedField.ts} +4 -1
  30. package/{build/helper/RelationModel.test-d.js → src/helper/RelationModel.test-d.ts} +27 -6
  31. package/src/helper/RelationModel.ts +9 -0
  32. package/{build/helper/RelationName.test-d.js → src/helper/RelationName.test-d.ts} +14 -4
  33. package/src/helper/RelationName.ts +4 -0
  34. package/{build/helper/RequiredField.test-d.js → src/helper/RequiredField.test-d.ts} +19 -6
  35. package/{build/helper/RequiredField.d.ts → src/helper/RequiredField.ts} +8 -1
  36. package/{build/helper/SerialField.test-d.js → src/helper/SerialField.test-d.ts} +23 -8
  37. package/{build/helper/SerialField.d.ts → src/helper/SerialField.ts} +7 -1
  38. package/{build/index.d.ts → src/index.ts} +8 -1
  39. package/build/Config.js +0 -1
  40. package/build/Logger.js +0 -1
  41. package/build/definition/FieldDefinition.js +0 -1
  42. package/build/definition/ForeignKeyDefinition.js +0 -1
  43. package/build/definition/ModelDefinition.js +0 -1
  44. package/build/definition/ModelDefinitions.js +0 -1
  45. package/build/definition/OperatorDefinitions.js +0 -1
  46. package/build/definition/PostgresDataTypes.js +0 -1
  47. package/build/definition/RelationDefinition.js +0 -1
  48. package/build/definition/RelationDefinitions.js +0 -1
  49. package/build/definition/UniqueConstraintDefinition.js +0 -1
  50. package/build/definition/WhereOperator.d.ts +0 -5
  51. package/build/definition/WhereOperator.js +0 -1
  52. package/build/helper/DefaultFieldType.d.ts +0 -7
  53. package/build/helper/DefaultFieldType.js +0 -1
  54. package/build/helper/DefaultFieldType.test-d.d.ts +0 -1
  55. package/build/helper/DefaultFieldType.test-d.js +0 -57
  56. package/build/helper/FieldName.js +0 -1
  57. package/build/helper/FieldName.test-d.d.ts +0 -1
  58. package/build/helper/FieldType.d.ts +0 -5
  59. package/build/helper/FieldType.js +0 -1
  60. package/build/helper/FieldType.test-d.d.ts +0 -1
  61. package/build/helper/FieldType.test-d.js +0 -45
  62. package/build/helper/FieldWithDefault.js +0 -1
  63. package/build/helper/FieldWithDefault.test-d.d.ts +0 -1
  64. package/build/helper/ModelName.js +0 -1
  65. package/build/helper/ModelName.test-d.d.ts +0 -1
  66. package/build/helper/ModelType.js +0 -1
  67. package/build/helper/ModelType.test-d.d.ts +0 -1
  68. package/build/helper/NullableField.js +0 -1
  69. package/build/helper/NullableField.test-d.d.ts +0 -1
  70. package/build/helper/OptionalField.js +0 -1
  71. package/build/helper/OptionalField.test-d.d.ts +0 -1
  72. package/build/helper/ProvidedField.js +0 -1
  73. package/build/helper/ProvidedField.test-d.d.ts +0 -1
  74. package/build/helper/RelationModel.d.ts +0 -4
  75. package/build/helper/RelationModel.js +0 -1
  76. package/build/helper/RelationModel.test-d.d.ts +0 -1
  77. package/build/helper/RelationName.d.ts +0 -2
  78. package/build/helper/RelationName.js +0 -1
  79. package/build/helper/RelationName.test-d.d.ts +0 -1
  80. package/build/helper/RequiredField.js +0 -1
  81. package/build/helper/RequiredField.test-d.d.ts +0 -1
  82. package/build/helper/SerialField.js +0 -1
  83. package/build/helper/SerialField.test-d.d.ts +0 -1
  84. package/build/index.js +0 -1
  85. /package/{build/Logger.d.ts → src/Logger.ts} +0 -0
  86. /package/{build/definition/ForeignKeyDefinition.d.ts → src/definition/ForeignKeyDefinition.ts} +0 -0
@@ -1,2 +1,6 @@
1
1
  import { ModelDefinitions } from "#definition/ModelDefinitions.js";
2
- export type ModelName<Models extends ModelDefinitions> = Extract<keyof Models, string>;
2
+
3
+ export type ModelName<Models extends ModelDefinitions> = Extract<
4
+ keyof Models,
5
+ string
6
+ >;
@@ -1,10 +1,14 @@
1
1
  import { describe, expectTypeOf } from "vitest";
2
2
  import { z } from "zod";
3
+
4
+ import type { ModelDefinition } from "#definition/ModelDefinition.js";
5
+ import { ModelType } from "./ModelType.js";
6
+
3
7
  const user = {
4
8
  fields: {
5
9
  email: {
6
10
  type: "text",
7
- zodSchema: z.string().email(),
11
+ zodSchema: z.email(),
8
12
  },
9
13
  id: {
10
14
  type: "serial",
@@ -29,9 +33,20 @@ const user = {
29
33
  zodSchema: z.date().nullable(),
30
34
  },
31
35
  },
32
- };
36
+ } as const satisfies ModelDefinition;
37
+
33
38
  describe("ModelType", () => {
34
39
  describe("Evaluate to a type containing all the fields of the", () => {
35
- expectTypeOf().toEqualTypeOf();
40
+ expectTypeOf<ModelType<typeof user>>().toEqualTypeOf<
41
+ Readonly<{
42
+ email: string;
43
+ id: number;
44
+ age: number;
45
+ tags: string[];
46
+ status: "active" | "inactive" | "pending";
47
+ createdAt: Date;
48
+ deletedAt: Date | null;
49
+ }>
50
+ >();
36
51
  });
37
52
  });
@@ -1,6 +1,8 @@
1
1
  import { Simplify } from "@casekit/toolbox";
2
+
2
3
  import { ModelDefinition } from "#definition/ModelDefinition.js";
3
4
  import { FieldType } from "./FieldType.js";
5
+
4
6
  export type ModelType<Model extends ModelDefinition> = Simplify<{
5
7
  [C in keyof Model["fields"]]: FieldType<Model, C>;
6
8
  }>;
@@ -1,4 +1,8 @@
1
1
  import { describe, expectTypeOf, test } from "vitest";
2
+
3
+ import type { ModelDefinition } from "../definition/ModelDefinition.js";
4
+ import type { NullableField } from "./NullableField.js";
5
+
2
6
  describe("NullableField", () => {
3
7
  test("extracts just the nullable fields from the model", () => {
4
8
  const user = {
@@ -8,9 +12,13 @@ describe("NullableField", () => {
8
12
  email: { type: "text", nullable: true },
9
13
  age: { type: "integer", nullable: false },
10
14
  },
11
- };
12
- expectTypeOf().toEqualTypeOf();
15
+ } as const satisfies ModelDefinition;
16
+
17
+ expectTypeOf<NullableField<typeof user>>().toEqualTypeOf<
18
+ "name" | "email"
19
+ >();
13
20
  });
21
+
14
22
  test("returns never if there are no nullable fields", () => {
15
23
  const user = {
16
24
  fields: {
@@ -18,9 +26,11 @@ describe("NullableField", () => {
18
26
  name: { type: "text", nullable: false },
19
27
  age: { type: "integer", nullable: false },
20
28
  },
21
- };
22
- expectTypeOf().toEqualTypeOf();
29
+ } as const satisfies ModelDefinition;
30
+
31
+ expectTypeOf<NullableField<typeof user>>().toEqualTypeOf<never>();
23
32
  });
33
+
24
34
  test("treats fields without nullable property as non-nullable", () => {
25
35
  const user = {
26
36
  fields: {
@@ -28,7 +38,8 @@ describe("NullableField", () => {
28
38
  name: { type: "text", nullable: true },
29
39
  age: { type: "integer" },
30
40
  },
31
- };
32
- expectTypeOf().toEqualTypeOf();
41
+ } as const satisfies ModelDefinition;
42
+
43
+ expectTypeOf<NullableField<typeof user>>().toEqualTypeOf<"name">();
33
44
  });
34
45
  });
@@ -1,4 +1,7 @@
1
1
  import { ModelDefinition } from "../definition/ModelDefinition.js";
2
+
2
3
  export type NullableField<Model extends ModelDefinition> = {
3
- [K in keyof Model["fields"]]: Model["fields"][K]["nullable"] extends true ? K : never;
4
+ [K in keyof Model["fields"]]: Model["fields"][K]["nullable"] extends true
5
+ ? K
6
+ : never;
4
7
  }[keyof Model["fields"]];
@@ -1,4 +1,8 @@
1
1
  import { describe, expectTypeOf, test } from "vitest";
2
+
3
+ import type { ModelDefinition } from "../definition/ModelDefinition.js";
4
+ import type { OptionalField } from "./OptionalField.js";
5
+
2
6
  describe("OptionalField", () => {
3
7
  test("extracts fields that are optional for insert", () => {
4
8
  const user = {
@@ -9,9 +13,13 @@ describe("OptionalField", () => {
9
13
  age: { type: "integer", nullable: false, default: 18 },
10
14
  role: { type: "text", nullable: false, provided: true },
11
15
  },
12
- };
13
- expectTypeOf().toEqualTypeOf();
16
+ } as const satisfies ModelDefinition;
17
+
18
+ expectTypeOf<OptionalField<typeof user>>().toEqualTypeOf<
19
+ "id" | "age" | "role"
20
+ >();
14
21
  });
22
+
15
23
  test("returns all fields if none are required", () => {
16
24
  const user = {
17
25
  fields: {
@@ -20,9 +28,13 @@ describe("OptionalField", () => {
20
28
  age: { type: "integer", default: 18 },
21
29
  role: { type: "text", provided: true },
22
30
  },
23
- };
24
- expectTypeOf().toEqualTypeOf();
31
+ } as const satisfies ModelDefinition;
32
+
33
+ expectTypeOf<OptionalField<typeof user>>().toEqualTypeOf<
34
+ "id" | "name" | "age" | "role"
35
+ >();
25
36
  });
37
+
26
38
  test("includes fields with defaults, serial fields, nullable fields and provided fields", () => {
27
39
  const user = {
28
40
  fields: {
@@ -33,7 +45,10 @@ describe("OptionalField", () => {
33
45
  role: { type: "text", provided: true },
34
46
  score: { type: "integer", nullable: false },
35
47
  },
36
- };
37
- expectTypeOf().toEqualTypeOf();
48
+ } as const satisfies ModelDefinition;
49
+
50
+ expectTypeOf<OptionalField<typeof user>>().toEqualTypeOf<
51
+ "id" | "email" | "age" | "role"
52
+ >();
38
53
  });
39
54
  });
@@ -1,4 +1,8 @@
1
1
  import { ModelDefinition } from "#definition/ModelDefinition.js";
2
2
  import { FieldName } from "./FieldName.js";
3
3
  import { RequiredField } from "./RequiredField.js";
4
- export type OptionalField<Model extends ModelDefinition> = Exclude<FieldName<Model>, RequiredField<Model>>;
4
+
5
+ export type OptionalField<Model extends ModelDefinition> = Exclude<
6
+ FieldName<Model>,
7
+ RequiredField<Model>
8
+ >;
@@ -1,4 +1,8 @@
1
1
  import { describe, expectTypeOf, test } from "vitest";
2
+
3
+ import type { ModelDefinition } from "../definition/ModelDefinition.js";
4
+ import type { ProvidedField } from "./ProvidedField.js";
5
+
2
6
  describe("ProvidedField", () => {
3
7
  test("extracts just the provided fields from the model", () => {
4
8
  const user = {
@@ -8,9 +12,13 @@ describe("ProvidedField", () => {
8
12
  updatedAt: { type: "timestamp", provided: true },
9
13
  name: { type: "text", provided: false },
10
14
  },
11
- };
12
- expectTypeOf().toEqualTypeOf();
15
+ } as const satisfies ModelDefinition;
16
+
17
+ expectTypeOf<ProvidedField<typeof user>>().toEqualTypeOf<
18
+ "createdAt" | "updatedAt"
19
+ >();
13
20
  });
21
+
14
22
  test("returns never if there are no provided fields", () => {
15
23
  const user = {
16
24
  fields: {
@@ -18,9 +26,11 @@ describe("ProvidedField", () => {
18
26
  name: { type: "text", provided: false },
19
27
  age: { type: "integer", provided: false },
20
28
  },
21
- };
22
- expectTypeOf().toEqualTypeOf();
29
+ } as const satisfies ModelDefinition;
30
+
31
+ expectTypeOf<ProvidedField<typeof user>>().toEqualTypeOf<never>();
23
32
  });
33
+
24
34
  test("treats fields without provided property as non-provided", () => {
25
35
  const user = {
26
36
  fields: {
@@ -28,7 +38,8 @@ describe("ProvidedField", () => {
28
38
  createdAt: { type: "timestamp", provided: true },
29
39
  name: { type: "text" },
30
40
  },
31
- };
32
- expectTypeOf().toEqualTypeOf();
41
+ } as const satisfies ModelDefinition;
42
+
43
+ expectTypeOf<ProvidedField<typeof user>>().toEqualTypeOf<"createdAt">();
33
44
  });
34
45
  });
@@ -1,4 +1,7 @@
1
1
  import { ModelDefinition } from "../definition/ModelDefinition.js";
2
+
2
3
  export type ProvidedField<Model extends ModelDefinition> = {
3
- [K in keyof Model["fields"]]: Model["fields"][K]["provided"] extends true ? K : never;
4
+ [K in keyof Model["fields"]]: Model["fields"][K]["provided"] extends true
5
+ ? K
6
+ : never;
4
7
  }[keyof Model["fields"]];
@@ -1,4 +1,8 @@
1
1
  import { describe, expectTypeOf, test } from "vitest";
2
+
3
+ import { ModelDefinitions } from "../definition/ModelDefinitions.js";
4
+ import { RelationModel } from "./RelationModel.js";
5
+
2
6
  describe("RelationModel", () => {
3
7
  const models = {
4
8
  user: {
@@ -39,22 +43,39 @@ describe("RelationModel", () => {
39
43
  },
40
44
  },
41
45
  like: { fields: {} },
42
- };
46
+ } as const satisfies ModelDefinitions;
47
+
43
48
  test("looks up the correct relation model in the schema for N:1 relations", () => {
44
- expectTypeOf().toExtend();
49
+ expectTypeOf<RelationModel<typeof models, "post", "author">>().toExtend<
50
+ typeof models.user
51
+ >();
45
52
  });
53
+
46
54
  test("looks up the correct relation model in the schema for 1:N relations", () => {
47
- expectTypeOf().toExtend();
55
+ expectTypeOf<RelationModel<typeof models, "post", "likes">>().toExtend<
56
+ typeof models.like
57
+ >();
48
58
  });
59
+
49
60
  test("looks up the correct relation model in the schema for N:N relations", () => {
50
- expectTypeOf().toExtend();
61
+ expectTypeOf<
62
+ RelationModel<typeof models, "user", "likedPosts">
63
+ >().toExtend<typeof models.post>();
51
64
  });
65
+
52
66
  describe("errors", () => {
53
67
  test("looking up a non-existing relation causes an error", () => {
54
- expectTypeOf().not.toExtend();
68
+ expectTypeOf<
69
+ // @ts-expect-error relation does not exist
70
+ RelationModel<typeof models, "post", "posts">
71
+ >().not.toExtend<typeof models.post>();
55
72
  });
73
+
56
74
  test("looking up a relation for a model that doesn't exist causes an error", () => {
57
- expectTypeOf().not.toExtend();
75
+ expectTypeOf<
76
+ // @ts-expect-error model does not exist
77
+ RelationModel<typeof models, "postx", "posts">
78
+ >().not.toExtend<typeof models.post>();
58
79
  });
59
80
  });
60
81
  });
@@ -0,0 +1,9 @@
1
+ import { ModelDefinitions } from "#definition/ModelDefinitions.js";
2
+ import { ModelName } from "./ModelName.js";
3
+ import { RelationName } from "./RelationName.js";
4
+
5
+ export type RelationModel<
6
+ Models extends ModelDefinitions,
7
+ M extends ModelName<Models>,
8
+ R extends RelationName<Models[M]>,
9
+ > = Models[NonNullable<Models[M]["relations"]>[R]["model"]];
@@ -1,4 +1,8 @@
1
1
  import { describe, expectTypeOf, test } from "vitest";
2
+
3
+ import { ModelDefinition } from "../definition/ModelDefinition.js";
4
+ import { RelationName } from "./RelationName.js";
5
+
2
6
  describe("RelationName", () => {
3
7
  test("it evaluates to a string union of the names of the model's relations", () => {
4
8
  const user = {
@@ -20,8 +24,12 @@ describe("RelationName", () => {
20
24
  },
21
25
  },
22
26
  },
23
- };
24
- expectTypeOf().toEqualTypeOf();
27
+ } as const satisfies ModelDefinition;
28
+
29
+ expectTypeOf<RelationName<typeof user>>().toEqualTypeOf<
30
+ "posts" | "friends"
31
+ >();
32
+
25
33
  const post = {
26
34
  fields: { id: { type: "serial" } },
27
35
  relations: {
@@ -38,7 +46,9 @@ describe("RelationName", () => {
38
46
  toField: "postId",
39
47
  },
40
48
  },
41
- };
42
- expectTypeOf().toEqualTypeOf();
49
+ } as const satisfies ModelDefinition;
50
+ expectTypeOf<RelationName<typeof post>>().toEqualTypeOf<
51
+ "author" | "likes"
52
+ >();
43
53
  });
44
54
  });
@@ -0,0 +1,4 @@
1
+ import { ModelDefinition } from "#definition/ModelDefinition.js";
2
+
3
+ export type RelationName<Model extends ModelDefinition> =
4
+ keyof Model["relations"];
@@ -1,4 +1,8 @@
1
1
  import { describe, expectTypeOf, test } from "vitest";
2
+
3
+ import type { ModelDefinition } from "../definition/ModelDefinition.js";
4
+ import type { RequiredField } from "./RequiredField.js";
5
+
2
6
  describe("RequiredField", () => {
3
7
  test("extracts fields that are required for insert", () => {
4
8
  const user = {
@@ -9,9 +13,13 @@ describe("RequiredField", () => {
9
13
  age: { type: "integer", nullable: false, default: 18 },
10
14
  role: { type: "text", nullable: false, provided: true },
11
15
  },
12
- };
13
- expectTypeOf().toEqualTypeOf();
16
+ } as const satisfies ModelDefinition;
17
+
18
+ expectTypeOf<RequiredField<typeof user>>().toEqualTypeOf<
19
+ "name" | "email"
20
+ >();
14
21
  });
22
+
15
23
  test("returns never if all fields are optional", () => {
16
24
  const user = {
17
25
  fields: {
@@ -20,9 +28,11 @@ describe("RequiredField", () => {
20
28
  age: { type: "integer", default: 18 },
21
29
  role: { type: "text", provided: true },
22
30
  },
23
- };
24
- expectTypeOf().toEqualTypeOf();
31
+ } as const satisfies ModelDefinition;
32
+
33
+ expectTypeOf<RequiredField<typeof user>>().toEqualTypeOf<never>();
25
34
  });
35
+
26
36
  test("excludes fields with defaults, serial fields, nullable fields and provided fields", () => {
27
37
  const user = {
28
38
  fields: {
@@ -33,7 +43,10 @@ describe("RequiredField", () => {
33
43
  role: { type: "text", provided: true },
34
44
  score: { type: "integer", nullable: false },
35
45
  },
36
- };
37
- expectTypeOf().toEqualTypeOf();
46
+ } as const satisfies ModelDefinition;
47
+
48
+ expectTypeOf<RequiredField<typeof user>>().toEqualTypeOf<
49
+ "name" | "score"
50
+ >();
38
51
  });
39
52
  });
@@ -4,4 +4,11 @@ import { FieldWithDefault } from "./FieldWithDefault.js";
4
4
  import { NullableField } from "./NullableField.js";
5
5
  import { ProvidedField } from "./ProvidedField.js";
6
6
  import { SerialField } from "./SerialField.js";
7
- export type RequiredField<Model extends ModelDefinition> = Exclude<FieldName<Model>, NullableField<Model> | FieldWithDefault<Model> | SerialField<Model> | ProvidedField<Model>>;
7
+
8
+ export type RequiredField<Model extends ModelDefinition> = Exclude<
9
+ FieldName<Model>,
10
+ | NullableField<Model>
11
+ | FieldWithDefault<Model>
12
+ | SerialField<Model>
13
+ | ProvidedField<Model>
14
+ >;
@@ -1,4 +1,8 @@
1
1
  import { describe, expectTypeOf, test } from "vitest";
2
+
3
+ import type { ModelDefinition } from "../definition/ModelDefinition.js";
4
+ import type { SerialField } from "./SerialField.js";
5
+
2
6
  describe("SerialField", () => {
3
7
  test("extracts just the fields with a SERIAL datatype from the model", () => {
4
8
  const user = {
@@ -9,9 +13,13 @@ describe("SerialField", () => {
9
13
  name: { type: "text" },
10
14
  age: { type: "integer" },
11
15
  },
12
- };
13
- expectTypeOf().toEqualTypeOf();
16
+ } as const satisfies ModelDefinition;
17
+
18
+ expectTypeOf<SerialField<typeof user>>().toEqualTypeOf<
19
+ "id" | "smallId" | "bigId"
20
+ >();
14
21
  });
22
+
15
23
  test("works for both lower and uppercase field types", () => {
16
24
  const user = {
17
25
  fields: {
@@ -21,18 +29,24 @@ describe("SerialField", () => {
21
29
  name: { type: "TEXT" },
22
30
  age: { type: "INTEGER" },
23
31
  },
24
- };
25
- expectTypeOf().toEqualTypeOf();
32
+ } as const satisfies ModelDefinition;
33
+
34
+ expectTypeOf<SerialField<typeof user>>().toEqualTypeOf<
35
+ "id" | "smallId" | "bigId"
36
+ >();
26
37
  });
38
+
27
39
  test("returns never if there are no SERIAL fields", () => {
28
40
  const user = {
29
41
  fields: {
30
42
  name: { type: "text" },
31
43
  age: { type: "integer" },
32
44
  },
33
- };
34
- expectTypeOf().toEqualTypeOf();
45
+ } as const satisfies ModelDefinition;
46
+
47
+ expectTypeOf<SerialField<typeof user>>().toEqualTypeOf<never>();
35
48
  });
49
+
36
50
  test("does not include fields with a type that end with serial but isn't a serial type", () => {
37
51
  const user = {
38
52
  fields: {
@@ -40,7 +54,8 @@ describe("SerialField", () => {
40
54
  name: { type: "text" },
41
55
  age: { type: "integer" },
42
56
  },
43
- };
44
- expectTypeOf().toEqualTypeOf();
57
+ } as const satisfies ModelDefinition;
58
+
59
+ expectTypeOf<SerialField<typeof user>>().toEqualTypeOf<"id">();
45
60
  });
46
61
  });
@@ -1,4 +1,10 @@
1
1
  import { ModelDefinition } from "../definition/ModelDefinition.js";
2
+
2
3
  export type SerialField<Model extends ModelDefinition> = {
3
- [K in keyof Model["fields"]]: Uppercase<Model["fields"][K]["type"]> extends "SMALLSERIAL" | "SERIAL" | "BIGSERIAL" ? K : never;
4
+ [K in keyof Model["fields"]]: Uppercase<Model["fields"][K]["type"]> extends
5
+ | "SMALLSERIAL"
6
+ | "SERIAL"
7
+ | "BIGSERIAL"
8
+ ? K
9
+ : never;
4
10
  }[keyof Model["fields"]];
@@ -4,10 +4,16 @@ export type { ModelDefinition } from "./definition/ModelDefinition.js";
4
4
  export type { ModelDefinitions } from "./definition/ModelDefinitions.js";
5
5
  export type { OperatorDefinitions } from "./definition/OperatorDefinitions.js";
6
6
  export type { PostgresDataTypes } from "./definition/PostgresDataTypes.js";
7
- export type { ManyToManyRelationDefinition, ManyToOneRelationDefinition, OneToManyRelationDefinition, RelationDefinition, } from "./definition/RelationDefinition.js";
7
+ export type {
8
+ ManyToManyRelationDefinition,
9
+ ManyToOneRelationDefinition,
10
+ OneToManyRelationDefinition,
11
+ RelationDefinition,
12
+ } from "./definition/RelationDefinition.js";
8
13
  export type { RelationDefinitions } from "./definition/RelationDefinitions.js";
9
14
  export type { UniqueConstraintDefinition } from "./definition/UniqueConstraintDefinition.js";
10
15
  export type { WhereOperatorDefinition as OperatorDefinition } from "./definition/WhereOperator.js";
16
+
11
17
  export type { DefaultFieldType } from "./helper/DefaultFieldType.js";
12
18
  export type { FieldName } from "./helper/FieldName.js";
13
19
  export type { FieldType } from "./helper/FieldType.js";
@@ -21,5 +27,6 @@ export type { RelationModel } from "./helper/RelationModel.js";
21
27
  export type { RelationName } from "./helper/RelationName.js";
22
28
  export type { RequiredField } from "./helper/RequiredField.js";
23
29
  export type { SerialField } from "./helper/SerialField.js";
30
+
24
31
  export type { Config } from "./Config.js";
25
32
  export type { Logger } from "./Logger.js";
package/build/Config.js DELETED
@@ -1 +0,0 @@
1
- export {};
package/build/Logger.js DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,5 +0,0 @@
1
- import { SQLStatement } from "@casekit/sql";
2
- export type WhereOperatorDefinition = (meta: {
3
- table: SQLStatement;
4
- column: SQLStatement;
5
- }, value: unknown) => SQLStatement;
@@ -1 +0,0 @@
1
- export {};
@@ -1,7 +0,0 @@
1
- /**
2
- * WARNING!!! The types in this file must be kept in sync
3
- * with the zod schemas in packages/orm/src/config/defaultZodSchema.ts.
4
- * If you make a change here, make sure to update the
5
- * corresponding zod schema.
6
- */
7
- export type DefaultFieldType<DataType extends string> = DataType extends `${infer T extends string}[]` ? DefaultFieldType<T>[] : Uppercase<DataType> extends "BIGINT" | "BIGSERIAL" ? bigint : Uppercase<DataType> extends "DOUBLE PRECISION" | "INTEGER" | "OID" | "REAL" | "SMALLINT" | "SMALLSERIAL" | "SERIAL" ? number : Uppercase<DataType> extends "BPCHAR" | "BIT" | "BOX" | "CIDR" | "CHAR" | "DATERANGE" | "DECIMAL" | "INET" | "INT4RANGE" | "INT8RANGE" | "INT2VECTOR" | "PG_LSN" | "REGCLASS" | "REGCONFIG" | "REGDICTIONARY" | "REGNAMESPACE" | "REGOPER" | "REGOPERATOR" | "REGPROC" | "REGPROCEDURE" | "REGROLE" | "REGTYPE" | "TID" | "XID" | "NUMRANGE" | "TSRANGE" | "TSTZRANGE" | "LINE" | "LSEG" | "MACADDR" | "MACADDR8" | "MONEY" | "PATH" | "POLYGON" | "TEXT" | "TIME" | "TIMETZ" | "TSQUERY" | "TSVECTOR" | "TXID_SNAPSHOT" | "XML" | `BIT${string}` | `CHARACTER${string}` | `NUMERIC${string}` | `TIME ${string}` | `TIME(${string})` | `VARCHAR` | `VARCHAR ${string}` ? string : Uppercase<DataType> extends "BYTEA" ? Buffer : Uppercase<DataType> extends "JSON" | "JSONB" ? unknown : Uppercase<DataType> extends "UUID" ? string : Uppercase<DataType> extends "BOOLEAN" ? boolean : Uppercase<DataType> extends "DATE" | "TIMESTAMP" | "TIMESTAMPTZ" | `TIMESTAMP${string}` ? Date : unknown;
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,57 +0,0 @@
1
- import { expectTypeOf, test } from "vitest";
2
- test("DefaultFieldType", () => {
3
- expectTypeOf().toBeBigInt();
4
- expectTypeOf().toBeNumber();
5
- expectTypeOf().toBeNumber();
6
- expectTypeOf().toBeNumber();
7
- expectTypeOf().toBeNumber();
8
- expectTypeOf().toBeNumber();
9
- expectTypeOf().toBeNumber();
10
- expectTypeOf().toBeNumber();
11
- expectTypeOf().toBeString();
12
- expectTypeOf().toBeString();
13
- expectTypeOf().toEqualTypeOf();
14
- // expectTypeOf<DefaultFieldType<"circle">>().toEqualTypeOf<{
15
- // x: number;
16
- // y: number;
17
- // radius: number;
18
- // }>();
19
- // expectTypeOf<DefaultFieldType<"point">>().toEqualTypeOf<{
20
- // x: number;
21
- // y: number;
22
- // }>();
23
- expectTypeOf().toBeUnknown();
24
- expectTypeOf().toBeUnknown();
25
- expectTypeOf().toBeBoolean();
26
- expectTypeOf().toEqualTypeOf();
27
- expectTypeOf().toEqualTypeOf();
28
- // expectTypeOf<DefaultFieldType<"interval">>().toEqualTypeOf<{
29
- // years?: number;
30
- // months?: number;
31
- // days?: number;
32
- // hours?: number;
33
- // minutes?: number;
34
- // seconds?: number;
35
- // milliseconds?: number;
36
- // }>();
37
- expectTypeOf().toEqualTypeOf();
38
- expectTypeOf().toEqualTypeOf();
39
- expectTypeOf().toEqualTypeOf();
40
- expectTypeOf().toBeString();
41
- expectTypeOf().toBeString();
42
- expectTypeOf().toBeString();
43
- expectTypeOf().toBeString();
44
- expectTypeOf().toBeString();
45
- expectTypeOf().toBeString();
46
- expectTypeOf().toBeString();
47
- expectTypeOf().toBeString();
48
- expectTypeOf().toBeString();
49
- expectTypeOf().toBeString();
50
- expectTypeOf().toBeString();
51
- expectTypeOf().toBeString();
52
- expectTypeOf().toBeString();
53
- expectTypeOf().toBeString();
54
- expectTypeOf().toBeString();
55
- expectTypeOf().toBeString();
56
- expectTypeOf().toBeString();
57
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};