@casekit/orm2 0.0.0-20250322230249
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.
- package/build/builders/buildCount.d.ts +23 -0
- package/build/builders/buildCount.js +63 -0
- package/build/builders/buildCount.test.d.ts +1 -0
- package/build/builders/buildCount.test.js +144 -0
- package/build/builders/buildCreate.d.ts +5 -0
- package/build/builders/buildCreate.js +28 -0
- package/build/builders/buildCreate.test.d.ts +1 -0
- package/build/builders/buildCreate.test.js +47 -0
- package/build/builders/buildDelete.d.ts +5 -0
- package/build/builders/buildDelete.js +28 -0
- package/build/builders/buildDelete.test.d.ts +1 -0
- package/build/builders/buildDelete.test.js +108 -0
- package/build/builders/buildFind.d.ts +8 -0
- package/build/builders/buildFind.js +185 -0
- package/build/builders/buildFind.test.d.ts +1 -0
- package/build/builders/buildFind.test.js +263 -0
- package/build/builders/buildUpdate.d.ts +5 -0
- package/build/builders/buildUpdate.js +34 -0
- package/build/builders/buildUpdate.test.d.ts +1 -0
- package/build/builders/buildUpdate.test.js +130 -0
- package/build/builders/buildWhere.d.ts +6 -0
- package/build/builders/buildWhere.js +63 -0
- package/build/builders/buildWhere.test.d.ts +1 -0
- package/build/builders/buildWhere.test.js +154 -0
- package/build/builders/types.d.ts +87 -0
- package/build/builders/types.js +1 -0
- package/build/connection.d.ts +31 -0
- package/build/connection.js +206 -0
- package/build/index.d.ts +10 -0
- package/build/index.js +5 -0
- package/build/operators.d.ts +59 -0
- package/build/operators.js +44 -0
- package/build/orm.count.d.ts +14 -0
- package/build/orm.count.js +22 -0
- package/build/orm.createMany.d.ts +5 -0
- package/build/orm.createMany.js +26 -0
- package/build/orm.createOne.d.ts +5 -0
- package/build/orm.createOne.js +34 -0
- package/build/orm.d.ts +81 -0
- package/build/orm.deleteMany.d.ts +5 -0
- package/build/orm.deleteMany.js +26 -0
- package/build/orm.deleteOne.d.ts +5 -0
- package/build/orm.deleteOne.js +32 -0
- package/build/orm.findMany.d.ts +8 -0
- package/build/orm.findMany.js +64 -0
- package/build/orm.findOne.d.ts +5 -0
- package/build/orm.findOne.js +20 -0
- package/build/orm.js +243 -0
- package/build/orm.restrict.d.ts +6 -0
- package/build/orm.restrict.js +52 -0
- package/build/orm.updateMany.d.ts +5 -0
- package/build/orm.updateMany.js +29 -0
- package/build/orm.updateOne.d.ts +5 -0
- package/build/orm.updateOne.js +35 -0
- package/build/sql/countToSql.d.ts +3 -0
- package/build/sql/countToSql.js +11 -0
- package/build/sql/countToSql.test.d.ts +1 -0
- package/build/sql/countToSql.test.js +218 -0
- package/build/sql/createToSql.d.ts +3 -0
- package/build/sql/createToSql.js +27 -0
- package/build/sql/createToSql.test.d.ts +1 -0
- package/build/sql/createToSql.test.js +186 -0
- package/build/sql/deleteToSql.d.ts +3 -0
- package/build/sql/deleteToSql.js +15 -0
- package/build/sql/deleteToSql.test.d.ts +1 -0
- package/build/sql/deleteToSql.test.js +93 -0
- package/build/sql/findToSql.d.ts +3 -0
- package/build/sql/findToSql.js +33 -0
- package/build/sql/findToSql.test.d.ts +1 -0
- package/build/sql/findToSql.test.js +409 -0
- package/build/sql/updateToSql.d.ts +3 -0
- package/build/sql/updateToSql.js +16 -0
- package/build/sql/updateToSql.test.d.ts +1 -0
- package/build/sql/updateToSql.test.js +165 -0
- package/build/sql/util.d.ts +11 -0
- package/build/sql/util.js +36 -0
- package/build/sql/util.test.d.ts +1 -0
- package/build/sql/util.test.js +163 -0
- package/build/tests/connection.test.d.ts +1 -0
- package/build/tests/connection.test.js +304 -0
- package/build/tests/datatypes.test.d.ts +1 -0
- package/build/tests/datatypes.test.js +239 -0
- package/build/tests/operators.test.d.ts +1 -0
- package/build/tests/operators.test.js +125 -0
- package/build/tests/orm.count.middleware.test.d.ts +1 -0
- package/build/tests/orm.count.middleware.test.js +132 -0
- package/build/tests/orm.count.test-d.d.ts +1 -0
- package/build/tests/orm.count.test-d.js +60 -0
- package/build/tests/orm.count.test.d.ts +1 -0
- package/build/tests/orm.count.test.js +151 -0
- package/build/tests/orm.createMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.createMany.middleware.test.js +63 -0
- package/build/tests/orm.createMany.test-d.d.ts +1 -0
- package/build/tests/orm.createMany.test-d.js +131 -0
- package/build/tests/orm.createMany.test.d.ts +1 -0
- package/build/tests/orm.createMany.test.js +392 -0
- package/build/tests/orm.createOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.createOne.middleware.test.js +54 -0
- package/build/tests/orm.createOne.test-d.d.ts +1 -0
- package/build/tests/orm.createOne.test-d.js +113 -0
- package/build/tests/orm.createOne.test.d.ts +1 -0
- package/build/tests/orm.createOne.test.js +268 -0
- package/build/tests/orm.deleteMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.deleteMany.middleware.test.js +77 -0
- package/build/tests/orm.deleteMany.test-d.d.ts +1 -0
- package/build/tests/orm.deleteMany.test-d.js +179 -0
- package/build/tests/orm.deleteMany.test.d.ts +1 -0
- package/build/tests/orm.deleteMany.test.js +394 -0
- package/build/tests/orm.deleteOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.deleteOne.middleware.test.js +61 -0
- package/build/tests/orm.deleteOne.test-d.d.ts +1 -0
- package/build/tests/orm.deleteOne.test-d.js +179 -0
- package/build/tests/orm.deleteOne.test.d.ts +1 -0
- package/build/tests/orm.deleteOne.test.js +360 -0
- package/build/tests/orm.findMany.includeManyToMany.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeManyToMany.test.js +335 -0
- package/build/tests/orm.findMany.includeManyToOne.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeManyToOne.test.js +286 -0
- package/build/tests/orm.findMany.includeOneToMany.test.d.ts +1 -0
- package/build/tests/orm.findMany.includeOneToMany.test.js +530 -0
- package/build/tests/orm.findMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.findMany.middleware.test.js +66 -0
- package/build/tests/orm.findMany.offsetLimit.test.d.ts +1 -0
- package/build/tests/orm.findMany.offsetLimit.test.js +108 -0
- package/build/tests/orm.findMany.orderBy.test.d.ts +1 -0
- package/build/tests/orm.findMany.orderBy.test.js +304 -0
- package/build/tests/orm.findMany.select.test.d.ts +1 -0
- package/build/tests/orm.findMany.select.test.js +278 -0
- package/build/tests/orm.findMany.test-d.d.ts +1 -0
- package/build/tests/orm.findMany.test-d.js +374 -0
- package/build/tests/orm.findMany.where.test.d.ts +1 -0
- package/build/tests/orm.findMany.where.test.js +383 -0
- package/build/tests/orm.findOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.findOne.middleware.test.js +57 -0
- package/build/tests/orm.findOne.test-d.d.ts +1 -0
- package/build/tests/orm.findOne.test-d.js +377 -0
- package/build/tests/orm.findOne.test.d.ts +1 -0
- package/build/tests/orm.findOne.test.js +247 -0
- package/build/tests/orm.restrict.test-d.d.ts +1 -0
- package/build/tests/orm.restrict.test-d.js +105 -0
- package/build/tests/orm.restrict.test.d.ts +1 -0
- package/build/tests/orm.restrict.test.js +259 -0
- package/build/tests/orm.transact.test.d.ts +1 -0
- package/build/tests/orm.transact.test.js +48 -0
- package/build/tests/orm.updateMany.middleware.test.d.ts +1 -0
- package/build/tests/orm.updateMany.middleware.test.js +72 -0
- package/build/tests/orm.updateMany.test.d.ts +1 -0
- package/build/tests/orm.updateMany.test.js +210 -0
- package/build/tests/orm.updateOne.middleware.test.d.ts +1 -0
- package/build/tests/orm.updateOne.middleware.test.js +62 -0
- package/build/tests/orm.updateOne.test.d.ts +1 -0
- package/build/tests/orm.updateOne.test.js +209 -0
- package/build/tests/util/db.d.ts +1571 -0
- package/build/tests/util/db.js +10 -0
- package/build/tests/util/logger.d.ts +19 -0
- package/build/tests/util/logger.js +40 -0
- package/build/types/BaseFindParams.d.ts +1 -0
- package/build/types/BaseFindParams.js +1 -0
- package/build/types/CountParams.d.ts +16 -0
- package/build/types/CountParams.js +1 -0
- package/build/types/CountParams.test-d.d.ts +1 -0
- package/build/types/CountParams.test-d.js +89 -0
- package/build/types/CreateManyParams.d.ts +11 -0
- package/build/types/CreateManyParams.js +1 -0
- package/build/types/CreateManyParams.test-d.d.ts +1 -0
- package/build/types/CreateManyParams.test-d.js +83 -0
- package/build/types/CreateManyResult.d.ts +5 -0
- package/build/types/CreateManyResult.js +1 -0
- package/build/types/CreateManyResult.test-d.d.ts +1 -0
- package/build/types/CreateManyResult.test-d.js +22 -0
- package/build/types/CreateOneParams.d.ts +11 -0
- package/build/types/CreateOneParams.js +1 -0
- package/build/types/CreateOneParams.test-d.d.ts +1 -0
- package/build/types/CreateOneParams.test-d.js +56 -0
- package/build/types/CreateOneResult.d.ts +5 -0
- package/build/types/CreateOneResult.js +1 -0
- package/build/types/CreateOneResult.test-d.d.ts +1 -0
- package/build/types/CreateOneResult.test-d.js +23 -0
- package/build/types/CreateValues.d.ts +6 -0
- package/build/types/CreateValues.js +1 -0
- package/build/types/CreateValues.test-d.d.ts +1 -0
- package/build/types/CreateValues.test-d.js +60 -0
- package/build/types/DeleteManyResult.d.ts +5 -0
- package/build/types/DeleteManyResult.js +1 -0
- package/build/types/DeleteManyResult.test-d.d.ts +1 -0
- package/build/types/DeleteManyResult.test-d.js +23 -0
- package/build/types/DeleteOneResult.d.ts +5 -0
- package/build/types/DeleteOneResult.js +1 -0
- package/build/types/DeleteOneResult.test-d.d.ts +1 -0
- package/build/types/DeleteOneResult.test-d.js +23 -0
- package/build/types/DeleteParams.d.ts +7 -0
- package/build/types/DeleteParams.js +1 -0
- package/build/types/DeleteParams.test-d.d.ts +1 -0
- package/build/types/DeleteParams.test-d.js +46 -0
- package/build/types/FindParams.d.ts +22 -0
- package/build/types/FindParams.js +1 -0
- package/build/types/FindParams.test-d.d.ts +1 -0
- package/build/types/FindParams.test-d.js +107 -0
- package/build/types/FindResult.d.ts +13 -0
- package/build/types/FindResult.js +1 -0
- package/build/types/FindResult.test-d.d.ts +1 -0
- package/build/types/FindResult.test-d.js +30 -0
- package/build/types/IncludeClause.d.ts +5 -0
- package/build/types/IncludeClause.js +1 -0
- package/build/types/IncludeClause.test-d.d.ts +1 -0
- package/build/types/IncludeClause.test-d.js +69 -0
- package/build/types/Middleware.d.ts +51 -0
- package/build/types/Middleware.js +37 -0
- package/build/types/OptionalValues.d.ts +4 -0
- package/build/types/OptionalValues.js +1 -0
- package/build/types/OptionalValues.test-d.d.ts +1 -0
- package/build/types/OptionalValues.test-d.js +12 -0
- package/build/types/OrderByClause.d.ts +9 -0
- package/build/types/OrderByClause.js +1 -0
- package/build/types/OrderByClause.test-d.d.ts +1 -0
- package/build/types/OrderByClause.test-d.js +44 -0
- package/build/types/RequiredValues.d.ts +4 -0
- package/build/types/RequiredValues.js +1 -0
- package/build/types/RequiredValues.test-d.d.ts +1 -0
- package/build/types/RequiredValues.test-d.js +22 -0
- package/build/types/RestrictModels.d.ts +23 -0
- package/build/types/RestrictModels.js +1 -0
- package/build/types/RestrictModels.test-d.d.ts +1 -0
- package/build/types/RestrictModels.test-d.js +44 -0
- package/build/types/ReturningClause.d.ts +3 -0
- package/build/types/ReturningClause.js +1 -0
- package/build/types/ReturningClause.test-d.d.ts +1 -0
- package/build/types/ReturningClause.test-d.js +15 -0
- package/build/types/SelectClause.d.ts +3 -0
- package/build/types/SelectClause.js +1 -0
- package/build/types/SelectClause.test-d.d.ts +1 -0
- package/build/types/SelectClause.test-d.js +15 -0
- package/build/types/UpdateManyResult.d.ts +5 -0
- package/build/types/UpdateManyResult.js +1 -0
- package/build/types/UpdateManyResult.test-d.d.ts +1 -0
- package/build/types/UpdateManyResult.test-d.js +15 -0
- package/build/types/UpdateOneResult.d.ts +5 -0
- package/build/types/UpdateOneResult.js +1 -0
- package/build/types/UpdateOneResult.test-d.d.ts +1 -0
- package/build/types/UpdateOneResult.test-d.js +15 -0
- package/build/types/UpdateParams.d.ts +9 -0
- package/build/types/UpdateParams.js +1 -0
- package/build/types/UpdateParams.test-d.d.ts +1 -0
- package/build/types/UpdateParams.test-d.js +29 -0
- package/build/types/UpdateValues.d.ts +6 -0
- package/build/types/UpdateValues.js +1 -0
- package/build/types/UpdateValues.test-d.d.ts +1 -0
- package/build/types/UpdateValues.test-d.js +33 -0
- package/build/types/WhereClause.d.ts +29 -0
- package/build/types/WhereClause.js +1 -0
- package/build/types/WhereClause.test-d.d.ts +1 -0
- package/build/types/WhereClause.test-d.js +137 -0
- package/build/util/getIncludedToManySubqueries.d.ts +12 -0
- package/build/util/getIncludedToManySubqueries.js +63 -0
- package/build/util/getIncludedToManySubqueries.test.d.ts +1 -0
- package/build/util/getIncludedToManySubqueries.test.js +121 -0
- package/build/util/getLateralJoinValues.d.ts +4 -0
- package/build/util/getLateralJoinValues.js +30 -0
- package/build/util/getLateralJoinValues.test.d.ts +1 -0
- package/build/util/getLateralJoinValues.test.js +99 -0
- package/build/util/hasClauses.d.ts +1 -0
- package/build/util/hasClauses.js +9 -0
- package/build/util/hasClauses.test.d.ts +1 -0
- package/build/util/hasClauses.test.js +15 -0
- package/build/util/makeTableAlias.d.ts +1 -0
- package/build/util/makeTableAlias.js +10 -0
- package/build/util/makeTableAlias.test.d.ts +1 -0
- package/build/util/makeTableAlias.test.js +18 -0
- package/build/util/resultSchema.d.ts +10 -0
- package/build/util/resultSchema.js +42 -0
- package/build/util/rowToObject.d.ts +8 -0
- package/build/util/rowToObject.js +10 -0
- package/build/util/rowToObject.test.d.ts +1 -0
- package/build/util/rowToObject.test.js +68 -0
- package/package.json +67 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { assertType, describe, expectTypeOf, test } from "vitest";
|
|
2
|
+
import { models } from "@casekit/orm2-fixtures";
|
|
3
|
+
import { orm } from "../orm.js";
|
|
4
|
+
const db = orm({ models });
|
|
5
|
+
describe("restrict types", () => {
|
|
6
|
+
test("allows querying allowed models", () => {
|
|
7
|
+
const restricted = db.restrict(["user", "post"]);
|
|
8
|
+
// Should allow querying user model
|
|
9
|
+
assertType(restricted.findOne("user", {
|
|
10
|
+
select: ["id", "name"],
|
|
11
|
+
}));
|
|
12
|
+
// Should allow querying post model with relation to allowed model
|
|
13
|
+
assertType(restricted.findOne("post", {
|
|
14
|
+
select: ["id", "title"],
|
|
15
|
+
include: {
|
|
16
|
+
author: { select: ["id", "name"] },
|
|
17
|
+
},
|
|
18
|
+
}));
|
|
19
|
+
});
|
|
20
|
+
test("prevents querying disallowed models", () => {
|
|
21
|
+
const restricted = db.restrict(["user"]);
|
|
22
|
+
assertType(
|
|
23
|
+
// @ts-expect-error - post model is not allowed
|
|
24
|
+
restricted.findOne("post", {
|
|
25
|
+
select: ["id", "title"],
|
|
26
|
+
}));
|
|
27
|
+
});
|
|
28
|
+
test("prevents querying disallowed relations", () => {
|
|
29
|
+
const restricted = db.restrict(["user", "friendship"]);
|
|
30
|
+
assertType(restricted.findOne("user", {
|
|
31
|
+
select: ["id", "name"],
|
|
32
|
+
include: {
|
|
33
|
+
// @ts-expect-error post model is not allowed
|
|
34
|
+
posts: { select: ["id", "title"] },
|
|
35
|
+
},
|
|
36
|
+
}));
|
|
37
|
+
});
|
|
38
|
+
test("allowing through model also allows N:N relations", () => {
|
|
39
|
+
const restricted = db.restrict(["user", "friendship"]);
|
|
40
|
+
assertType(restricted.findOne("user", {
|
|
41
|
+
select: ["id", "name"],
|
|
42
|
+
include: {
|
|
43
|
+
friends: { select: ["id", "name"] },
|
|
44
|
+
},
|
|
45
|
+
}));
|
|
46
|
+
expectTypeOf(restricted.findOne("user", {
|
|
47
|
+
select: ["id", "name"],
|
|
48
|
+
include: {
|
|
49
|
+
friends: { select: ["id", "name"] },
|
|
50
|
+
},
|
|
51
|
+
})).resolves.toEqualTypeOf();
|
|
52
|
+
});
|
|
53
|
+
test("restricting a model such that it has no relations prevents any include clauses on that model", () => {
|
|
54
|
+
const restricted = db.restrict(["user"]);
|
|
55
|
+
assertType(restricted.findOne("user", {
|
|
56
|
+
select: ["id", "name"],
|
|
57
|
+
// @ts-expect-error user has no allowed relations
|
|
58
|
+
include: {
|
|
59
|
+
posts: { select: ["id", "title"] },
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
});
|
|
63
|
+
test("disallowing through model prevents N:N relations", () => {
|
|
64
|
+
const restricted = db.restrict(["user", "post"]);
|
|
65
|
+
assertType(restricted.findOne("user", {
|
|
66
|
+
select: ["id", "name"],
|
|
67
|
+
include: {
|
|
68
|
+
// @ts-expect-error friendship is not allowed
|
|
69
|
+
friends: { select: ["id", "name"] },
|
|
70
|
+
},
|
|
71
|
+
}));
|
|
72
|
+
});
|
|
73
|
+
test("respects return types of queries on restricted orm", () => {
|
|
74
|
+
const restricted = db.restrict(["user"]);
|
|
75
|
+
expectTypeOf(restricted.findOne("user", {
|
|
76
|
+
select: ["id", "name", "role"],
|
|
77
|
+
})).resolves.toEqualTypeOf();
|
|
78
|
+
});
|
|
79
|
+
test("restricting twice maintains most restrictive set", () => {
|
|
80
|
+
const restricted = db.restrict(["user", "post"]).restrict(["user"]);
|
|
81
|
+
// Should allow user queries
|
|
82
|
+
assertType(restricted.findOne("user", {
|
|
83
|
+
select: ["id", "name"],
|
|
84
|
+
}));
|
|
85
|
+
// Should prevent post queries
|
|
86
|
+
assertType(
|
|
87
|
+
// @ts-expect-error - post model is not allowed after second restriction
|
|
88
|
+
restricted.findOne("post", {
|
|
89
|
+
select: ["id", "title"],
|
|
90
|
+
}));
|
|
91
|
+
});
|
|
92
|
+
test("empty restriction set creates unusable orm", () => {
|
|
93
|
+
const restricted = db.restrict([]);
|
|
94
|
+
assertType(
|
|
95
|
+
// @ts-expect-error - no models are allowed
|
|
96
|
+
restricted.findOne("user", {
|
|
97
|
+
select: ["id", "name"],
|
|
98
|
+
}));
|
|
99
|
+
assertType(
|
|
100
|
+
// @ts-expect-error - no models are allowed
|
|
101
|
+
restricted.findOne("post", {
|
|
102
|
+
select: ["id", "title"],
|
|
103
|
+
}));
|
|
104
|
+
});
|
|
105
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, test } from "vitest";
|
|
2
|
+
import { config } from "@casekit/orm2-fixtures";
|
|
3
|
+
import { orm } from "../orm.js";
|
|
4
|
+
import { mockLogger } from "./util/logger.js";
|
|
5
|
+
describe("orm.restrict", () => {
|
|
6
|
+
const logger = mockLogger();
|
|
7
|
+
const db = orm({ ...config, logger });
|
|
8
|
+
beforeAll(async () => {
|
|
9
|
+
await db.connect();
|
|
10
|
+
});
|
|
11
|
+
afterAll(async () => {
|
|
12
|
+
await db.close();
|
|
13
|
+
});
|
|
14
|
+
test("foo", () => {
|
|
15
|
+
let x = {
|
|
16
|
+
foo: 2,
|
|
17
|
+
bar: 4,
|
|
18
|
+
};
|
|
19
|
+
expect(x.foo).toEqual(2);
|
|
20
|
+
x = {
|
|
21
|
+
...x,
|
|
22
|
+
get foo() {
|
|
23
|
+
throw new Error("haha");
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
expect(() => x.foo).toThrow();
|
|
27
|
+
});
|
|
28
|
+
// test("it allows querying permitted models", async () => {
|
|
29
|
+
// await db.restrict(["user", "post"]).transact(
|
|
30
|
+
// async (db) => {
|
|
31
|
+
// // Create a user
|
|
32
|
+
// const user = await db.createOne("user", {
|
|
33
|
+
// values: {
|
|
34
|
+
// name: "Test User",
|
|
35
|
+
// email: "test@example.com",
|
|
36
|
+
// role: "user",
|
|
37
|
+
// },
|
|
38
|
+
// returning: ["id", "name"],
|
|
39
|
+
// });
|
|
40
|
+
// // Create a post for that user
|
|
41
|
+
// await db.createOne("post", {
|
|
42
|
+
// values: {
|
|
43
|
+
// title: "Test Post",
|
|
44
|
+
// content: "Test Content",
|
|
45
|
+
// authorId: user.id,
|
|
46
|
+
// },
|
|
47
|
+
// });
|
|
48
|
+
// // Should be able to query both models
|
|
49
|
+
// const result = await db.findOne("user", {
|
|
50
|
+
// select: ["id", "name"],
|
|
51
|
+
// include: {
|
|
52
|
+
// posts: {
|
|
53
|
+
// select: ["id", "title"],
|
|
54
|
+
// },
|
|
55
|
+
// },
|
|
56
|
+
// where: { id: user.id },
|
|
57
|
+
// });
|
|
58
|
+
// expect(result.name).toBe("Test User");
|
|
59
|
+
// expect(result.posts).toHaveLength(1);
|
|
60
|
+
// expect(result.posts[0]!.title).toBe("Test Post");
|
|
61
|
+
// },
|
|
62
|
+
// { rollback: true },
|
|
63
|
+
// );
|
|
64
|
+
// });
|
|
65
|
+
// test("if an unpermitted model is queried despite the type error, it throws an exception", async () => {
|
|
66
|
+
// await expect(
|
|
67
|
+
// db.restrict(["user"]).transact(
|
|
68
|
+
// async (db) => {
|
|
69
|
+
// // @ts-expect-error - post model should not be accessible
|
|
70
|
+
// await db.findOne("post", {
|
|
71
|
+
// select: ["id"],
|
|
72
|
+
// });
|
|
73
|
+
// },
|
|
74
|
+
// { rollback: true },
|
|
75
|
+
// ),
|
|
76
|
+
// ).rejects.toThrow(
|
|
77
|
+
// 'Model "post" is not permitted in this restricted ORM instance',
|
|
78
|
+
// );
|
|
79
|
+
// });
|
|
80
|
+
// test("if an unpermitted relation is queried despite the type error, it throws an exception", async () => {
|
|
81
|
+
// await expect(
|
|
82
|
+
// db.restrict(["user", "post"]).transact(
|
|
83
|
+
// async (db) => {
|
|
84
|
+
// await db.findOne("user", {
|
|
85
|
+
// select: ["id"],
|
|
86
|
+
// include: {
|
|
87
|
+
// // @ts-expect-error - color relation should not be accessible
|
|
88
|
+
// backgroundColor: {
|
|
89
|
+
// select: ["hex"],
|
|
90
|
+
// },
|
|
91
|
+
// },
|
|
92
|
+
// });
|
|
93
|
+
// },
|
|
94
|
+
// { rollback: true },
|
|
95
|
+
// ),
|
|
96
|
+
// ).rejects.toThrow(
|
|
97
|
+
// 'Relation "backgroundColor" references model "color" which is not permitted in this restricted ORM instance',
|
|
98
|
+
// );
|
|
99
|
+
// });
|
|
100
|
+
// test("it throws if called inside a transaction", async () => {
|
|
101
|
+
// await expect(
|
|
102
|
+
// db.transact(
|
|
103
|
+
// async (db) => {
|
|
104
|
+
// const restrictedDb = db.restrict(["user"]);
|
|
105
|
+
// await restrictedDb.findOne("user", { select: ["id"] });
|
|
106
|
+
// },
|
|
107
|
+
// { rollback: true },
|
|
108
|
+
// ),
|
|
109
|
+
// ).rejects.toThrowError("Cannot create restricted ORM in a transaction");
|
|
110
|
+
// });
|
|
111
|
+
// test("allows querying through permitted N:1 relations", async () => {
|
|
112
|
+
// await db.restrict(["post", "user"]).transact(
|
|
113
|
+
// async (db) => {
|
|
114
|
+
// const user = await db.createOne("user", {
|
|
115
|
+
// values: {
|
|
116
|
+
// name: "Test User",
|
|
117
|
+
// email: "test@example.com",
|
|
118
|
+
// role: "user",
|
|
119
|
+
// },
|
|
120
|
+
// returning: ["id"],
|
|
121
|
+
// });
|
|
122
|
+
// await db.createOne("post", {
|
|
123
|
+
// values: {
|
|
124
|
+
// title: "Test Post",
|
|
125
|
+
// content: "Content",
|
|
126
|
+
// authorId: user.id,
|
|
127
|
+
// },
|
|
128
|
+
// });
|
|
129
|
+
// const result = await db.findOne("post", {
|
|
130
|
+
// select: ["id", "title"],
|
|
131
|
+
// include: {
|
|
132
|
+
// author: {
|
|
133
|
+
// select: ["name"],
|
|
134
|
+
// },
|
|
135
|
+
// },
|
|
136
|
+
// where: { authorId: user.id },
|
|
137
|
+
// });
|
|
138
|
+
// expect(result.author.name).toBe("Test User");
|
|
139
|
+
// },
|
|
140
|
+
// { rollback: true },
|
|
141
|
+
// );
|
|
142
|
+
// });
|
|
143
|
+
// test("allows querying through permitted 1:N relations", async () => {
|
|
144
|
+
// await db.restrict(["user", "post"]).transact(
|
|
145
|
+
// async (db) => {
|
|
146
|
+
// const user = await db.createOne("user", {
|
|
147
|
+
// values: {
|
|
148
|
+
// name: "Test User",
|
|
149
|
+
// email: "test@example.com",
|
|
150
|
+
// role: "user",
|
|
151
|
+
// },
|
|
152
|
+
// returning: ["id"],
|
|
153
|
+
// });
|
|
154
|
+
// await db.createOne("post", {
|
|
155
|
+
// values: {
|
|
156
|
+
// title: "Test Post",
|
|
157
|
+
// content: "Content",
|
|
158
|
+
// authorId: user.id,
|
|
159
|
+
// },
|
|
160
|
+
// });
|
|
161
|
+
// const result = await db.findOne("user", {
|
|
162
|
+
// select: ["id", "name"],
|
|
163
|
+
// include: {
|
|
164
|
+
// posts: {
|
|
165
|
+
// select: ["title"],
|
|
166
|
+
// },
|
|
167
|
+
// },
|
|
168
|
+
// where: { id: user.id },
|
|
169
|
+
// });
|
|
170
|
+
// expect(result.posts[0]!.title).toBe("Test Post");
|
|
171
|
+
// },
|
|
172
|
+
// { rollback: true },
|
|
173
|
+
// );
|
|
174
|
+
// });
|
|
175
|
+
// test("allows querying through permitted N:N relations", async () => {
|
|
176
|
+
// await db.restrict(["user", "post", "friendship"]).transact(
|
|
177
|
+
// async (db) => {
|
|
178
|
+
// const [stewart, lynne] = await db.createMany("user", {
|
|
179
|
+
// values: [
|
|
180
|
+
// {
|
|
181
|
+
// name: "Stewart Home",
|
|
182
|
+
// email: "stewarthome@example.com",
|
|
183
|
+
// role: "user",
|
|
184
|
+
// },
|
|
185
|
+
// {
|
|
186
|
+
// name: "Lynne Tillman",
|
|
187
|
+
// email: "lynnetillman@example.com",
|
|
188
|
+
// role: "admin",
|
|
189
|
+
// },
|
|
190
|
+
// ],
|
|
191
|
+
// returning: ["id", "name"],
|
|
192
|
+
// });
|
|
193
|
+
// await db.createMany("friendship", {
|
|
194
|
+
// values: [
|
|
195
|
+
// {
|
|
196
|
+
// userId: stewart!.id,
|
|
197
|
+
// friendId: lynne!.id,
|
|
198
|
+
// },
|
|
199
|
+
// ],
|
|
200
|
+
// });
|
|
201
|
+
// const result = await db.findOne("user", {
|
|
202
|
+
// select: ["id"],
|
|
203
|
+
// include: {
|
|
204
|
+
// friends: {
|
|
205
|
+
// select: ["id", "name"],
|
|
206
|
+
// },
|
|
207
|
+
// },
|
|
208
|
+
// where: { id: stewart!.id },
|
|
209
|
+
// });
|
|
210
|
+
// expect(result.friends[0]!.name).toBe("Lynne Tillman");
|
|
211
|
+
// },
|
|
212
|
+
// { rollback: true },
|
|
213
|
+
// );
|
|
214
|
+
// });
|
|
215
|
+
// test("restricting to no models results in an unusable ORM", async () => {
|
|
216
|
+
// const restrictedDb = db.restrict([]);
|
|
217
|
+
// // Should have no accessible models
|
|
218
|
+
// await expect(
|
|
219
|
+
// restrictedDb.transact(
|
|
220
|
+
// async (db) => {
|
|
221
|
+
// // @ts-expect-error - no models should be accessible
|
|
222
|
+
// await db.findOne("user", {
|
|
223
|
+
// select: ["id"],
|
|
224
|
+
// });
|
|
225
|
+
// },
|
|
226
|
+
// { rollback: true },
|
|
227
|
+
// ),
|
|
228
|
+
// ).rejects.toThrow(
|
|
229
|
+
// 'Model "user" is not permitted in this restricted ORM instance',
|
|
230
|
+
// );
|
|
231
|
+
// });
|
|
232
|
+
// test("restricting twice maintains the most restrictive set", async () => {
|
|
233
|
+
// await db
|
|
234
|
+
// .restrict(["user", "post", "friendship"])
|
|
235
|
+
// .restrict(["user", "friendship"])
|
|
236
|
+
// .transact(
|
|
237
|
+
// async (db) => {
|
|
238
|
+
// // Should be able to query user
|
|
239
|
+
// await db.findOne("user", {
|
|
240
|
+
// select: ["id"],
|
|
241
|
+
// });
|
|
242
|
+
// // Should not be able to query post or like
|
|
243
|
+
// await expect(
|
|
244
|
+
// // @ts-expect-error - post should not be accessible
|
|
245
|
+
// db.findOne("post", {
|
|
246
|
+
// select: ["id"],
|
|
247
|
+
// }),
|
|
248
|
+
// ).rejects.toThrow('Model "post" is not permitted');
|
|
249
|
+
// await expect(
|
|
250
|
+
// // @ts-expect-error - like should not be accessible
|
|
251
|
+
// db.findOne("like", {
|
|
252
|
+
// select: ["id"],
|
|
253
|
+
// }),
|
|
254
|
+
// ).rejects.toThrow('Model "like" is not permitted');
|
|
255
|
+
// },
|
|
256
|
+
// { rollback: true },
|
|
257
|
+
// );
|
|
258
|
+
// });
|
|
259
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as uuid from "uuid";
|
|
2
|
+
import { describe, expect, test } from "vitest";
|
|
3
|
+
import { sql } from "@casekit/sql";
|
|
4
|
+
import { orm } from "../orm.js";
|
|
5
|
+
describe("orm.transact()", () => {
|
|
6
|
+
test("rolling back a transaction on error", async () => {
|
|
7
|
+
// create a unique table name in case this test fails and
|
|
8
|
+
// the table is not dropped
|
|
9
|
+
const table = sql.ident(`test_${uuid.v4()}`);
|
|
10
|
+
const db = orm({ models: {} });
|
|
11
|
+
await db.connect();
|
|
12
|
+
try {
|
|
13
|
+
await db.query `CREATE TABLE ${table} (id SERIAL PRIMARY KEY)`;
|
|
14
|
+
await db.transact(async (db) => {
|
|
15
|
+
await db.query `INSERT INTO ${table} DEFAULT VALUES`;
|
|
16
|
+
throw new Error("rollback");
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
expect(e.message).toBe("rollback");
|
|
21
|
+
const result = await db.query `SELECT * FROM ${table}`;
|
|
22
|
+
expect(result).toEqual([]);
|
|
23
|
+
await db.query `DROP TABLE ${table}`;
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
await db.close();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
test("committing a transaction on successful completion of the callback", async () => {
|
|
30
|
+
// create a unique table name in case this test fails and
|
|
31
|
+
// the table is not dropped
|
|
32
|
+
const table = sql.ident(`test_${uuid.v4()}`);
|
|
33
|
+
const db = orm({ models: {} });
|
|
34
|
+
await db.connect();
|
|
35
|
+
try {
|
|
36
|
+
await db.query `CREATE TABLE ${table} (id SERIAL PRIMARY KEY)`;
|
|
37
|
+
await db.transact(async (db) => {
|
|
38
|
+
await db.query `INSERT INTO ${table} DEFAULT VALUES`;
|
|
39
|
+
});
|
|
40
|
+
const result = await db.query `SELECT * FROM ${table}`;
|
|
41
|
+
expect(result).toEqual([{ id: 1 }]);
|
|
42
|
+
await db.query `DROP TABLE ${table}`;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await db.close();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { afterAll, beforeAll, beforeEach, describe, expect, test, vi, } from "vitest";
|
|
2
|
+
import { config } from "@casekit/orm2-fixtures";
|
|
3
|
+
import { $in } from "../operators.js";
|
|
4
|
+
import { orm } from "../orm.js";
|
|
5
|
+
import { mockLogger } from "./util/logger.js";
|
|
6
|
+
describe("orm.updateMany: middleware", () => {
|
|
7
|
+
const logger = mockLogger();
|
|
8
|
+
let db;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
logger.clear();
|
|
11
|
+
});
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
db = orm({ ...config, logger });
|
|
14
|
+
await db.connect();
|
|
15
|
+
});
|
|
16
|
+
afterAll(async () => {
|
|
17
|
+
await db.close();
|
|
18
|
+
});
|
|
19
|
+
describe("updateMany middleware", () => {
|
|
20
|
+
test("it allows overriding the orm's updateMany method", async () => {
|
|
21
|
+
await db.transact(async (db) => {
|
|
22
|
+
// Create test users to update
|
|
23
|
+
await db.createMany("user", {
|
|
24
|
+
values: [
|
|
25
|
+
{
|
|
26
|
+
id: 1,
|
|
27
|
+
name: "Test User 1",
|
|
28
|
+
email: "test1@example.com",
|
|
29
|
+
role: "user",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 2,
|
|
33
|
+
name: "Test User 2",
|
|
34
|
+
email: "test2@example.com",
|
|
35
|
+
role: "user",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
returning: ["id"],
|
|
39
|
+
});
|
|
40
|
+
const stub = vi.fn();
|
|
41
|
+
const dbWithMiddleware = db.middleware([
|
|
42
|
+
{
|
|
43
|
+
updateMany: (db, table, query) => {
|
|
44
|
+
stub("called stub in middleware 1");
|
|
45
|
+
return db.updateMany(table, query);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
updateMany: (db, table, query) => {
|
|
50
|
+
stub("called stub in middleware 2");
|
|
51
|
+
return db.updateMany(table, query);
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
]);
|
|
55
|
+
const result = await dbWithMiddleware.updateMany("user", {
|
|
56
|
+
where: { id: { [$in]: [1, 2] } },
|
|
57
|
+
set: { role: "admin" },
|
|
58
|
+
returning: ["id", "name", "role"],
|
|
59
|
+
});
|
|
60
|
+
expect(result).toHaveLength(2);
|
|
61
|
+
expect(result).toEqual(expect.arrayContaining([
|
|
62
|
+
expect.objectContaining({ id: 1, role: "admin" }),
|
|
63
|
+
expect.objectContaining({ id: 2, role: "admin" }),
|
|
64
|
+
]));
|
|
65
|
+
expect(stub.mock.calls).toEqual([
|
|
66
|
+
["called stub in middleware 1"],
|
|
67
|
+
["called stub in middleware 2"],
|
|
68
|
+
]);
|
|
69
|
+
}, { rollback: true });
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|