@casekit/orm2 0.0.0-20250331181319 → 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 (94) hide show
  1. package/build/builders/buildCount.d.ts +2 -1
  2. package/build/builders/buildCount.js +5 -8
  3. package/build/builders/buildCount.test.js +5 -5
  4. package/build/builders/buildCreate.d.ts +2 -1
  5. package/build/builders/buildCreate.js +6 -3
  6. package/build/builders/buildCreate.test.js +4 -4
  7. package/build/builders/buildDelete.d.ts +2 -1
  8. package/build/builders/buildDelete.js +2 -2
  9. package/build/builders/buildDelete.test.js +8 -8
  10. package/build/builders/buildFind.d.ts +2 -1
  11. package/build/builders/buildFind.js +5 -8
  12. package/build/builders/buildFind.test.js +4 -4
  13. package/build/builders/buildUpdate.d.ts +2 -1
  14. package/build/builders/buildUpdate.js +6 -3
  15. package/build/builders/buildUpdate.test.js +8 -8
  16. package/build/builders/buildWhere.d.ts +2 -1
  17. package/build/builders/buildWhere.js +30 -8
  18. package/build/builders/buildWhere.test.js +39 -24
  19. package/build/connection.d.ts +2 -2
  20. package/build/index.d.ts +1 -1
  21. package/build/index.js +1 -1
  22. package/build/orm.count.d.ts +2 -10
  23. package/build/orm.count.js +2 -11
  24. package/build/orm.createMany.d.ts +2 -1
  25. package/build/orm.createMany.js +2 -2
  26. package/build/orm.createOne.d.ts +2 -1
  27. package/build/orm.createOne.js +2 -2
  28. package/build/orm.d.ts +2 -2
  29. package/build/orm.deleteMany.d.ts +2 -1
  30. package/build/orm.deleteMany.js +2 -2
  31. package/build/orm.deleteOne.d.ts +2 -1
  32. package/build/orm.deleteOne.js +2 -2
  33. package/build/orm.findMany.d.ts +2 -1
  34. package/build/orm.findMany.js +3 -3
  35. package/build/orm.findOne.d.ts +2 -1
  36. package/build/orm.findOne.js +11 -19
  37. package/build/orm.js +13 -13
  38. package/build/orm.restrict.d.ts +2 -1
  39. package/build/orm.restrict.js +2 -2
  40. package/build/orm.updateMany.d.ts +2 -1
  41. package/build/orm.updateMany.js +3 -3
  42. package/build/orm.updateOne.d.ts +2 -1
  43. package/build/orm.updateOne.js +2 -2
  44. package/build/tests/orm.findMany.includeManyToOne.test.js +21 -5
  45. package/build/tests/orm.findOne.includeManyToMany.test.js +270 -0
  46. package/build/tests/orm.findOne.includeManyToOne.test.js +280 -0
  47. package/build/tests/orm.findOne.includeOneToMany.test.js +454 -0
  48. package/build/tests/orm.findOne.select.test.js +205 -0
  49. package/build/tests/orm.findOne.where.test.js +471 -0
  50. package/build/tests/orm.middleware.findOne.test.d.ts +1 -0
  51. package/build/tests/orm.middleware.set.test.d.ts +1 -0
  52. package/build/tests/orm.middleware.set.test.js +100 -0
  53. package/build/tests/orm.middleware.updateMany.test.d.ts +1 -0
  54. package/build/tests/orm.middleware.updateOne.test.d.ts +1 -0
  55. package/build/tests/orm.middleware.values.test.d.ts +1 -0
  56. package/build/tests/orm.middleware.values.test.js +126 -0
  57. package/build/tests/orm.middleware.where.test.d.ts +1 -0
  58. package/build/tests/orm.middleware.where.test.js +1054 -0
  59. package/build/tests/util/db.d.ts +52 -70
  60. package/build/types/CreateOneResult.d.ts +6 -2
  61. package/build/types/CreateOneResult.test-d.js +3 -0
  62. package/build/types/Middleware.d.ts +14 -0
  63. package/build/types/Middleware.js +37 -1
  64. package/build/types/WhereClause.d.ts +8 -8
  65. package/build/util/applySetMiddleware.d.ts +5 -0
  66. package/build/util/applySetMiddleware.js +7 -0
  67. package/build/util/applyValuesMiddleware.d.ts +5 -0
  68. package/build/util/applyValuesMiddleware.js +7 -0
  69. package/build/util/applyWhereMiddleware.d.ts +5 -0
  70. package/build/util/applyWhereMiddleware.js +7 -0
  71. package/build/util/applyWhereMiddleware.test.d.ts +1 -0
  72. package/build/util/applyWhereMiddleware.test.js +88 -0
  73. package/build/util/resultSchema.d.ts +6 -6
  74. package/package.json +23 -24
  75. /package/build/tests/{orm.count.middleware.test.d.ts → orm.findOne.includeManyToMany.test.d.ts} +0 -0
  76. /package/build/tests/{orm.createMany.middleware.test.d.ts → orm.findOne.includeManyToOne.test.d.ts} +0 -0
  77. /package/build/tests/{orm.createOne.middleware.test.d.ts → orm.findOne.includeOneToMany.test.d.ts} +0 -0
  78. /package/build/tests/{orm.deleteMany.middleware.test.d.ts → orm.findOne.select.test.d.ts} +0 -0
  79. /package/build/tests/{orm.deleteOne.middleware.test.d.ts → orm.findOne.where.test.d.ts} +0 -0
  80. /package/build/tests/{orm.findMany.middleware.test.d.ts → orm.middleware.count.test.d.ts} +0 -0
  81. /package/build/tests/{orm.count.middleware.test.js → orm.middleware.count.test.js} +0 -0
  82. /package/build/tests/{orm.findOne.middleware.test.d.ts → orm.middleware.createMany.test.d.ts} +0 -0
  83. /package/build/tests/{orm.createMany.middleware.test.js → orm.middleware.createMany.test.js} +0 -0
  84. /package/build/tests/{orm.updateMany.middleware.test.d.ts → orm.middleware.createOne.test.d.ts} +0 -0
  85. /package/build/tests/{orm.createOne.middleware.test.js → orm.middleware.createOne.test.js} +0 -0
  86. /package/build/tests/{orm.updateOne.middleware.test.d.ts → orm.middleware.deleteMany.test.d.ts} +0 -0
  87. /package/build/tests/{orm.deleteMany.middleware.test.js → orm.middleware.deleteMany.test.js} +0 -0
  88. /package/build/{types/BaseFindParams.d.ts → tests/orm.middleware.deleteOne.test.d.ts} +0 -0
  89. /package/build/tests/{orm.deleteOne.middleware.test.js → orm.middleware.deleteOne.test.js} +0 -0
  90. /package/build/{types/BaseFindParams.js → tests/orm.middleware.findMany.test.d.ts} +0 -0
  91. /package/build/tests/{orm.findMany.middleware.test.js → orm.middleware.findMany.test.js} +0 -0
  92. /package/build/tests/{orm.findOne.middleware.test.js → orm.middleware.findOne.test.js} +0 -0
  93. /package/build/tests/{orm.updateMany.middleware.test.js → orm.middleware.updateMany.test.js} +0 -0
  94. /package/build/tests/{orm.updateOne.middleware.test.js → orm.middleware.updateOne.test.js} +0 -0
@@ -4,7 +4,7 @@ export declare const createTestDB: (overrides?: Partial<Omit<Config, "models">>)
4
4
  schema: string;
5
5
  readonly operators?: import("@casekit/orm2-schema").OperatorDefinitions;
6
6
  extensions: readonly string[];
7
- readonly connection?: import("pg").ConnectionConfig | import("pg").PoolConfig | import("pg").PoolOptions | null;
7
+ readonly connection?: import("pg").default.ConnectionConfig | import("pg").default.PoolConfig | import("pg").default.PoolOptions | null;
8
8
  pool: boolean;
9
9
  logger: import("@casekit/orm2-schema").Logger;
10
10
  naming: {
@@ -46,10 +46,14 @@ export declare const createTestDB: (overrides?: Partial<Omit<Config, "models">>)
46
46
  };
47
47
  readonly email: {
48
48
  readonly type: "text";
49
+ readonly zodSchema: import("zod").ZodEmail;
49
50
  };
50
51
  readonly role: {
51
52
  readonly type: "text";
52
- readonly zodSchema: import("zod").ZodEnum<["user", "admin"]>;
53
+ readonly zodSchema: import("zod").ZodEnum<{
54
+ user: "user";
55
+ admin: "admin";
56
+ }>;
53
57
  };
54
58
  readonly preferences: {
55
59
  readonly type: "jsonb";
@@ -128,30 +132,20 @@ export declare const createTestDB: (overrides?: Partial<Omit<Config, "models">>)
128
132
  readonly type: "jsonb";
129
133
  readonly default: "{}";
130
134
  readonly zodSchema: import("zod").ZodObject<{
131
- foo: import("zod").ZodEnum<["a", "b", "c"]>;
135
+ foo: import("zod").ZodEnum<{
136
+ a: "a";
137
+ b: "b";
138
+ c: "c";
139
+ }>;
132
140
  bar: import("zod").ZodArray<import("zod").ZodObject<{
133
- baz: import("zod").ZodEnum<["good", "bad", "indifferent"]>;
141
+ baz: import("zod").ZodEnum<{
142
+ good: "good";
143
+ bad: "bad";
144
+ indifferent: "indifferent";
145
+ }>;
134
146
  quux: import("zod").ZodBoolean;
135
- }, "strip", import("zod").ZodTypeAny, {
136
- baz: "good" | "bad" | "indifferent";
137
- quux: boolean;
138
- }, {
139
- baz: "good" | "bad" | "indifferent";
140
- quux: boolean;
141
- }>, "many">;
142
- }, "strip", import("zod").ZodTypeAny, {
143
- foo: "b" | "a" | "c";
144
- bar: {
145
- baz: "good" | "bad" | "indifferent";
146
- quux: boolean;
147
- }[];
148
- }, {
149
- foo: "b" | "a" | "c";
150
- bar: {
151
- baz: "good" | "bad" | "indifferent";
152
- quux: boolean;
153
- }[];
154
- }>;
147
+ }, import("zod/v4/core").$strip>>;
148
+ }, import("zod/v4/core").$strip>;
155
149
  };
156
150
  readonly createdAt: {
157
151
  readonly type: "timestamp";
@@ -564,10 +558,14 @@ export declare const createTestDB: (overrides?: Partial<Omit<Config, "models">>)
564
558
  };
565
559
  readonly email: {
566
560
  readonly type: "text";
561
+ readonly zodSchema: import("zod").ZodEmail;
567
562
  };
568
563
  readonly role: {
569
564
  readonly type: "text";
570
- readonly zodSchema: import("zod").ZodEnum<["user", "admin"]>;
565
+ readonly zodSchema: import("zod").ZodEnum<{
566
+ user: "user";
567
+ admin: "admin";
568
+ }>;
571
569
  };
572
570
  readonly preferences: {
573
571
  readonly type: "jsonb";
@@ -646,30 +644,20 @@ export declare const createTestDB: (overrides?: Partial<Omit<Config, "models">>)
646
644
  readonly type: "jsonb";
647
645
  readonly default: "{}";
648
646
  readonly zodSchema: import("zod").ZodObject<{
649
- foo: import("zod").ZodEnum<["a", "b", "c"]>;
647
+ foo: import("zod").ZodEnum<{
648
+ a: "a";
649
+ b: "b";
650
+ c: "c";
651
+ }>;
650
652
  bar: import("zod").ZodArray<import("zod").ZodObject<{
651
- baz: import("zod").ZodEnum<["good", "bad", "indifferent"]>;
653
+ baz: import("zod").ZodEnum<{
654
+ good: "good";
655
+ bad: "bad";
656
+ indifferent: "indifferent";
657
+ }>;
652
658
  quux: import("zod").ZodBoolean;
653
- }, "strip", import("zod").ZodTypeAny, {
654
- baz: "good" | "bad" | "indifferent";
655
- quux: boolean;
656
- }, {
657
- baz: "good" | "bad" | "indifferent";
658
- quux: boolean;
659
- }>, "many">;
660
- }, "strip", import("zod").ZodTypeAny, {
661
- foo: "b" | "a" | "c";
662
- bar: {
663
- baz: "good" | "bad" | "indifferent";
664
- quux: boolean;
665
- }[];
666
- }, {
667
- foo: "b" | "a" | "c";
668
- bar: {
669
- baz: "good" | "bad" | "indifferent";
670
- quux: boolean;
671
- }[];
672
- }>;
659
+ }, import("zod/v4/core").$strip>>;
660
+ }, import("zod/v4/core").$strip>;
673
661
  };
674
662
  readonly createdAt: {
675
663
  readonly type: "timestamp";
@@ -1085,10 +1073,14 @@ export declare const createTestDB: (overrides?: Partial<Omit<Config, "models">>)
1085
1073
  };
1086
1074
  readonly email: {
1087
1075
  readonly type: "text";
1076
+ readonly zodSchema: import("zod").ZodEmail;
1088
1077
  };
1089
1078
  readonly role: {
1090
1079
  readonly type: "text";
1091
- readonly zodSchema: import("zod").ZodEnum<["user", "admin"]>;
1080
+ readonly zodSchema: import("zod").ZodEnum<{
1081
+ user: "user";
1082
+ admin: "admin";
1083
+ }>;
1092
1084
  };
1093
1085
  readonly preferences: {
1094
1086
  readonly type: "jsonb";
@@ -1167,30 +1159,20 @@ export declare const createTestDB: (overrides?: Partial<Omit<Config, "models">>)
1167
1159
  readonly type: "jsonb";
1168
1160
  readonly default: "{}";
1169
1161
  readonly zodSchema: import("zod").ZodObject<{
1170
- foo: import("zod").ZodEnum<["a", "b", "c"]>;
1162
+ foo: import("zod").ZodEnum<{
1163
+ a: "a";
1164
+ b: "b";
1165
+ c: "c";
1166
+ }>;
1171
1167
  bar: import("zod").ZodArray<import("zod").ZodObject<{
1172
- baz: import("zod").ZodEnum<["good", "bad", "indifferent"]>;
1168
+ baz: import("zod").ZodEnum<{
1169
+ good: "good";
1170
+ bad: "bad";
1171
+ indifferent: "indifferent";
1172
+ }>;
1173
1173
  quux: import("zod").ZodBoolean;
1174
- }, "strip", import("zod").ZodTypeAny, {
1175
- baz: "good" | "bad" | "indifferent";
1176
- quux: boolean;
1177
- }, {
1178
- baz: "good" | "bad" | "indifferent";
1179
- quux: boolean;
1180
- }>, "many">;
1181
- }, "strip", import("zod").ZodTypeAny, {
1182
- foo: "b" | "a" | "c";
1183
- bar: {
1184
- baz: "good" | "bad" | "indifferent";
1185
- quux: boolean;
1186
- }[];
1187
- }, {
1188
- foo: "b" | "a" | "c";
1189
- bar: {
1190
- baz: "good" | "bad" | "indifferent";
1191
- quux: boolean;
1192
- }[];
1193
- }>;
1174
+ }, import("zod/v4/core").$strip>>;
1175
+ }, import("zod/v4/core").$strip>;
1194
1176
  };
1195
1177
  readonly createdAt: {
1196
1178
  readonly type: "timestamp";
@@ -1,5 +1,9 @@
1
1
  import { FieldType, ModelDefinitions, ModelName } from "@casekit/orm2-schema";
2
2
  import { CreateOneParams } from "./CreateOneParams.js";
3
- export type CreateOneResult<Models extends ModelDefinitions, M extends ModelName<Models>, Q extends CreateOneParams<Models, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? {
3
+ export type CreateOneResult<Models extends ModelDefinitions, M extends ModelName<Models>, Q extends CreateOneParams<Models, M>> = Q["returning"] extends NonNullable<Q["returning"]> ? Q["onConflict"] extends {
4
+ do: "nothing";
5
+ } ? {
4
6
  [C in Q["returning"][number]]: FieldType<Models[M], C>;
5
- } | null : number;
7
+ } | null : {
8
+ [C in Q["returning"][number]]: FieldType<Models[M], C>;
9
+ } : number;
@@ -20,4 +20,7 @@ describe("CreateOneResult", () => {
20
20
  // @ts-expect-error - title is not included in returning clause
21
21
  expectTypeOf().toEqualTypeOf();
22
22
  });
23
+ test("is nullable if onConflict is set to do nothing", () => {
24
+ expectTypeOf().toEqualTypeOf();
25
+ });
23
26
  });
@@ -23,6 +23,7 @@ export type CreateManyMiddleware = (db: Orm, modelName: string, query: CreateMan
23
23
  export type UpdateOneMiddleware = (db: Orm, modelName: string, query: UpdateParams<ModelDefinitions, OperatorDefinitions, string>) => Promise<Record<string, unknown> | number | null>;
24
24
  export type UpdateManyMiddleware = (db: Orm, modelName: string, query: UpdateParams<ModelDefinitions, OperatorDefinitions, string>) => Promise<Record<string, unknown>[] | number | null>;
25
25
  export type Middleware = {
26
+ name?: string;
26
27
  where?: WhereMiddleware;
27
28
  set?: SetMiddleware;
28
29
  values?: ValuesMiddleware;
@@ -36,3 +37,16 @@ export type Middleware = {
36
37
  deleteOne?: DeleteOneMiddleware;
37
38
  deleteMany?: DeleteManyMiddleware;
38
39
  };
40
+ type Organisation = {
41
+ id: string;
42
+ };
43
+ type User = {
44
+ id: string;
45
+ };
46
+ export declare const tenancy: ({ org }: {
47
+ org: Organisation;
48
+ }) => Middleware;
49
+ export declare const userstamps: ({ user }: {
50
+ user: User;
51
+ }) => Middleware;
52
+ export {};
@@ -1 +1,37 @@
1
- export {};
1
+ import { getModel } from "@casekit/orm2-config";
2
+ export const tenancy = ({ org }) => ({
3
+ where: (config, modelName, where) => {
4
+ if ("organisationId" in getModel(config.models, modelName).fields) {
5
+ return { ...where, organisaitonId: org.id };
6
+ }
7
+ else {
8
+ return where;
9
+ }
10
+ },
11
+ values: (config, modelName, values) => {
12
+ if ("organisationId" in getModel(config.models, modelName).fields) {
13
+ return { ...values, organisationId: org.id };
14
+ }
15
+ else {
16
+ return values;
17
+ }
18
+ },
19
+ });
20
+ export const userstamps = ({ user }) => ({
21
+ values: (config, modelName, values) => {
22
+ if ("createdById" in getModel(config.models, modelName).fields) {
23
+ return { ...values, updatedById: values["createdById"] ?? user.id };
24
+ }
25
+ else {
26
+ return values;
27
+ }
28
+ },
29
+ set: (config, modelName, set) => {
30
+ if ("updatedById" in getModel(config.models, modelName).fields) {
31
+ return { ...set, updatedById: set["updatedById"] ?? user.id };
32
+ }
33
+ else {
34
+ return set;
35
+ }
36
+ },
37
+ });
@@ -2,22 +2,22 @@ import { DeepReadonly } from "ts-essentials";
2
2
  import { FieldName, FieldType, ModelDefinition, ModelDefinitions, ModelName, OperatorDefinitions } from "@casekit/orm2-schema";
3
3
  import { $and, $eq, $gt, $gte, $ilike, $in, $is, $like, $lt, $lte, $ne, $not, $or } from "#operators.js";
4
4
  export interface DefaultOperators<T> {
5
- [$eq]?: T;
6
- [$ne]?: T;
5
+ [$eq]?: DeepReadonly<T>;
6
+ [$ne]?: DeepReadonly<T>;
7
7
  [$not]?: null | true | false;
8
8
  [$is]?: null | true | false;
9
- [$gt]?: T;
10
- [$gte]?: T;
11
- [$lt]?: T;
12
- [$lte]?: T;
13
- [$in]?: T[];
9
+ [$gt]?: DeepReadonly<T>;
10
+ [$gte]?: DeepReadonly<T>;
11
+ [$lt]?: DeepReadonly<T>;
12
+ [$lte]?: DeepReadonly<T>;
13
+ [$in]?: DeepReadonly<T[]>;
14
14
  [$like]?: string;
15
15
  [$ilike]?: string;
16
16
  }
17
17
  export type ReadonlyArrays<T> = T extends (infer E)[] ? readonly E[] : T extends Date ? Date : T extends object ? {
18
18
  readonly [K in keyof T]: ReadonlyArrays<T[K]>;
19
19
  } : T;
20
- export type WhereClauseValue<Model extends ModelDefinition, Operators extends OperatorDefinitions, C extends FieldName<Model>, T = DeepReadonly<FieldType<Model, C>>> = T | null | DefaultOperators<T> | (Operators["where"] extends never ? never : {
20
+ export type WhereClauseValue<Model extends ModelDefinition, Operators extends OperatorDefinitions, C extends FieldName<Model>, T = DeepReadonly<FieldType<Model, C>>> = DeepReadonly<T> | null | DefaultOperators<T> | (Operators["where"] extends never ? never : {
21
21
  [K in Extract<keyof Operators["where"], symbol>]?: Parameters<NonNullable<Operators["where"]>[K]>[1];
22
22
  });
23
23
  export type WhereClause<Models extends ModelDefinitions, Operators extends OperatorDefinitions, M extends ModelName<Models>, _Model extends ModelDefinition = Models[M]> = {
@@ -0,0 +1,5 @@
1
+ import { NormalizedConfig } from "@casekit/orm2-config";
2
+ import { ModelDefinition } from "@casekit/orm2-schema";
3
+ import { Middleware } from "../types/Middleware.js";
4
+ import { UpdateValues } from "../types/UpdateValues.js";
5
+ export declare const applySetMiddleware: (config: NormalizedConfig, middleware: Middleware[], modelName: string, set: UpdateValues<ModelDefinition>) => UpdateValues<ModelDefinition>;
@@ -0,0 +1,7 @@
1
+ export const applySetMiddleware = (config, middleware, modelName, set) => {
2
+ return middleware
3
+ .filter((m) => !!m.set)
4
+ .reduce((acc, m) => {
5
+ return m.set(config, modelName, acc);
6
+ }, set);
7
+ };
@@ -0,0 +1,5 @@
1
+ import { NormalizedConfig } from "@casekit/orm2-config";
2
+ import { ModelDefinition } from "@casekit/orm2-schema";
3
+ import { CreateValues } from "../types/CreateValues.js";
4
+ import { Middleware } from "../types/Middleware.js";
5
+ export declare const applyValuesMiddleware: (config: NormalizedConfig, middleware: Middleware[], modelName: string, values: CreateValues<ModelDefinition>) => CreateValues<ModelDefinition>;
@@ -0,0 +1,7 @@
1
+ export const applyValuesMiddleware = (config, middleware, modelName, values) => {
2
+ return middleware
3
+ .filter((m) => !!m.values)
4
+ .reduce((acc, m) => {
5
+ return m.values(config, modelName, acc);
6
+ }, values);
7
+ };
@@ -0,0 +1,5 @@
1
+ import { NormalizedConfig } from "@casekit/orm2-config";
2
+ import { ModelDefinitions, OperatorDefinitions } from "@casekit/orm2-schema";
3
+ import { Middleware } from "../types/Middleware.js";
4
+ import { WhereClause } from "../types/WhereClause.js";
5
+ export declare const applyWhereMiddleware: (config: NormalizedConfig, middleware: Middleware[], modelName: string, where: WhereClause<ModelDefinitions, OperatorDefinitions, string> | undefined) => WhereClause<ModelDefinitions, OperatorDefinitions, string> | undefined;
@@ -0,0 +1,7 @@
1
+ export const applyWhereMiddleware = (config, middleware, modelName, where) => {
2
+ return middleware
3
+ .filter((m) => !!m.where)
4
+ .reduce((acc, m) => {
5
+ return m.where(config, modelName, acc);
6
+ }, where ?? {});
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,88 @@
1
+ import { beforeEach, describe, expect, test, vi } from "vitest";
2
+ import { $eq } from "#operators.js";
3
+ import { createTestDB } from "../tests/util/db.js";
4
+ import { mockLogger } from "../tests/util/logger.js";
5
+ import { applyWhereMiddleware } from "./applyWhereMiddleware.js";
6
+ describe("applyWhereMiddleware", () => {
7
+ const logger = mockLogger();
8
+ let config;
9
+ beforeEach(() => {
10
+ logger.clear();
11
+ const { db } = createTestDB();
12
+ config = db.config;
13
+ });
14
+ test("returns original where clause when no middleware exists", () => {
15
+ const middleware = [];
16
+ const modelName = "user";
17
+ const whereClause = { id: 1 };
18
+ const result = applyWhereMiddleware(config, middleware, modelName, whereClause);
19
+ expect(result).toBe(whereClause);
20
+ });
21
+ test("returns original where clause when middleware has no where function", () => {
22
+ const middleware = [{}];
23
+ const modelName = "user";
24
+ const whereClause = { id: 1 };
25
+ const result = applyWhereMiddleware(config, middleware, modelName, whereClause);
26
+ expect(result).toBe(whereClause);
27
+ });
28
+ test("applies a single middleware to the where clause", () => {
29
+ const modelName = "user";
30
+ const modifiedWhere = { id: 2 };
31
+ const whereMiddlewareFn = vi.fn().mockReturnValue(modifiedWhere);
32
+ const middleware = [
33
+ {
34
+ where: whereMiddlewareFn,
35
+ },
36
+ ];
37
+ const originalWhere = { id: 1 };
38
+ const result = applyWhereMiddleware(config, middleware, modelName, originalWhere);
39
+ expect(whereMiddlewareFn).toHaveBeenCalledWith(config, modelName, originalWhere);
40
+ expect(result).toBe(modifiedWhere);
41
+ });
42
+ test("applies multiple middleware to the where clause in order", () => {
43
+ const modelName = "user";
44
+ const middleware1Result = { id: 2 };
45
+ const middleware2Result = { id: 3 };
46
+ const whereMiddlewareFn1 = vi.fn().mockReturnValue(middleware1Result);
47
+ const whereMiddlewareFn2 = vi.fn().mockReturnValue(middleware2Result);
48
+ const middleware = [
49
+ {
50
+ where: whereMiddlewareFn1,
51
+ },
52
+ {
53
+ where: whereMiddlewareFn2,
54
+ },
55
+ ];
56
+ const originalWhere = { id: 1 };
57
+ const result = applyWhereMiddleware(config, middleware, modelName, originalWhere);
58
+ expect(whereMiddlewareFn1).toHaveBeenCalledWith(config, modelName, originalWhere);
59
+ expect(whereMiddlewareFn2).toHaveBeenCalledWith(config, modelName, middleware1Result);
60
+ expect(result).toBe(middleware2Result);
61
+ });
62
+ test("applies complex where clause with operators", () => {
63
+ const modelName = "user";
64
+ const originalWhere = {
65
+ name: { [$eq]: "John" },
66
+ };
67
+ const modifiedWhere = {
68
+ name: { [$eq]: "John" },
69
+ active: true,
70
+ };
71
+ const whereMiddlewareFn = vi
72
+ .fn()
73
+ .mockImplementation((config, model, where) => {
74
+ return {
75
+ ...where,
76
+ active: true,
77
+ };
78
+ });
79
+ const middleware = [
80
+ {
81
+ where: whereMiddlewareFn,
82
+ },
83
+ ];
84
+ const result = applyWhereMiddleware(config, middleware, modelName, originalWhere);
85
+ expect(whereMiddlewareFn).toHaveBeenCalledWith(config, modelName, originalWhere);
86
+ expect(result).toEqual(modifiedWhere);
87
+ });
88
+ });
@@ -1,10 +1,10 @@
1
- import { ZodSchema } from "zod";
1
+ import { ZodType } from "zod";
2
2
  import { NormalizedConfig, NormalizedModelDefinition } from "@casekit/orm2-config";
3
3
  import { ModelDefinition, OperatorDefinitions } from "@casekit/orm2-schema";
4
4
  import { FindParams } from "../types/FindParams.js";
5
5
  import { ReturningClause } from "../types/ReturningClause.js";
6
- export declare const resultFields: (model: NormalizedModelDefinition, fields: string[]) => Record<string, ZodSchema<unknown>>;
7
- export declare const findOneResultSchema: (config: NormalizedConfig, m: string, query: FindParams<Record<string, Required<ModelDefinition>>, OperatorDefinitions, string>) => ZodSchema<unknown>;
8
- export declare const findManyResultSchema: (config: NormalizedConfig, m: string, query: FindParams<Record<string, Required<ModelDefinition>>, OperatorDefinitions, string>) => ZodSchema<unknown>;
9
- export declare const returningOneResultSchema: (model: NormalizedModelDefinition, fields?: string[]) => ZodSchema<unknown>;
10
- export declare const returningManyResultSchema: (model: NormalizedModelDefinition, returning?: ReturningClause<ModelDefinition>) => ZodSchema<unknown>;
6
+ export declare const resultFields: (model: NormalizedModelDefinition, fields: string[]) => Record<string, ZodType>;
7
+ export declare const findOneResultSchema: (config: NormalizedConfig, m: string, query: FindParams<Record<string, Required<ModelDefinition>>, OperatorDefinitions, string>) => ZodType;
8
+ export declare const findManyResultSchema: (config: NormalizedConfig, m: string, query: FindParams<Record<string, Required<ModelDefinition>>, OperatorDefinitions, string>) => ZodType;
9
+ export declare const returningOneResultSchema: (model: NormalizedModelDefinition, fields?: string[]) => ZodType;
10
+ export declare const returningManyResultSchema: (model: NormalizedModelDefinition, returning?: ReturningClause<ModelDefinition>) => ZodType;
package/package.json CHANGED
@@ -1,40 +1,40 @@
1
1
  {
2
2
  "name": "@casekit/orm2",
3
3
  "description": "",
4
- "version": "0.0.0-20250331181319",
4
+ "version": "0.0.0",
5
5
  "author": "",
6
6
  "dependencies": {
7
- "es-toolkit": "^1.33.0",
7
+ "es-toolkit": "^1.39.3",
8
8
  "object-hash": "^3.0.0",
9
- "pino": "^9.6.0",
9
+ "pino": "^9.7.0",
10
10
  "uuid": "^11.1.0",
11
- "@casekit/orm2-config": "0.0.0-20250331181319",
12
- "@casekit/sql": "0.0.0-20250331181319",
13
- "@casekit/orm2-schema": "0.0.0-20250331181319",
14
- "@casekit/toolbox": "0.0.0-20250331181319"
11
+ "@casekit/sql": "0.0.0",
12
+ "@casekit/orm2-config": "0.0.0",
13
+ "@casekit/orm2-schema": "0.0.0",
14
+ "@casekit/toolbox": "0.0.0"
15
15
  },
16
16
  "devDependencies": {
17
17
  "@casekit/unindent": "^1.0.5",
18
- "@eslint/js": "^9.23.0",
19
- "@faker-js/faker": "^9.6.0",
18
+ "@eslint/js": "^9.29.0",
19
+ "@faker-js/faker": "^9.8.0",
20
20
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
21
- "@types/node": "^22.13.13",
21
+ "@types/node": "^24.0.3",
22
22
  "@types/object-hash": "^3.0.6",
23
- "@types/pg": "^8.11.11",
23
+ "@types/pg": "^8.15.4",
24
24
  "@types/uuid": "^10.0.0",
25
- "@vitest/coverage-v8": "^3.0.9",
26
- "dotenv": "^16.4.7",
25
+ "@vitest/coverage-v8": "^3.2.4",
26
+ "dotenv": "^16.5.0",
27
27
  "prettier": "^3.5.3",
28
- "prettier-plugin-svelte": "^3.3.3",
29
- "ts-essentials": "^10.0.4",
30
- "typescript": "^5.8.2",
31
- "typescript-eslint": "^8.28.0",
28
+ "prettier-plugin-svelte": "^3.4.0",
29
+ "ts-essentials": "^10.1.1",
30
+ "typescript": "^5.8.3",
31
+ "typescript-eslint": "^8.34.1",
32
32
  "vite-tsconfig-paths": "^5.1.4",
33
- "vitest": "^3.0.9",
34
- "@casekit/orm2-fixtures": "0.0.0-20250331181319",
35
- "@casekit/orm2-testing": "0.0.0-20250331181319",
36
- "@casekit/prettier-config": "0.0.0-20250331181319",
37
- "@casekit/tsconfig": "0.0.0-20250331181319"
33
+ "vitest": "^3.2.4",
34
+ "@casekit/orm2-fixtures": "0.0.0",
35
+ "@casekit/orm2-testing": "0.0.0",
36
+ "@casekit/tsconfig": "0.0.0",
37
+ "@casekit/prettier-config": "0.0.0"
38
38
  },
39
39
  "exports": {
40
40
  ".": "./build/index.js"
@@ -47,10 +47,9 @@
47
47
  },
48
48
  "keywords": [],
49
49
  "license": "ISC",
50
- "main": "index.js",
51
50
  "peerDependencies": {
52
51
  "pg": "^8.13.1",
53
- "zod": "^3.24.2"
52
+ "zod": "^4.0.17"
54
53
  },
55
54
  "prettier": "@casekit/prettier-config",
56
55
  "type": "module",