Skip to content

Commit effebac

Browse files
committed
Enhance readme and repository tests by introducing TypeScript generics for domain models, improving type safety in query builders and repository methods. Update usage examples to reflect these changes and add pagination example for user repository.
1 parent 812a235 commit effebac

File tree

2 files changed

+131
-75
lines changed

2 files changed

+131
-75
lines changed

__tests__/repository/find-rows.test.ts

Lines changed: 85 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,26 @@
1-
import {Repository} from "../../src/repository/repository";
2-
import {between, eq, gt, gte, ilike, iregexp, isNotNull, isNull, like, lt, lte, neq, regexp,} from "../../src";
3-
import {cleanupTestData, DomainUser, executor, setupTestTables,} from "../../test-setup";
4-
import {faker} from "@faker-js/faker";
1+
import { faker } from "@faker-js/faker";
2+
import {
3+
between,
4+
eq,
5+
gt,
6+
gte,
7+
ilike,
8+
iregexp,
9+
isNotNull,
10+
isNull,
11+
like,
12+
lt,
13+
lte,
14+
neq,
15+
regexp,
16+
} from "../../src";
17+
import { Repository } from "../../src/repository/repository";
18+
import {
19+
cleanupTestData,
20+
DomainUser,
21+
executor,
22+
setupTestTables,
23+
} from "../../test-setup";
524

625
describe("Repository findRows", () => {
726
let repository: Repository<DomainUser>;
@@ -68,7 +87,7 @@ describe("Repository findRows", () => {
6887

6988
expect(result).toHaveLength(4);
7089
expect(result.every((user) => user.email !== targetUser.email)).toBe(
71-
true
90+
true
7291
);
7392
});
7493

@@ -125,7 +144,7 @@ describe("Repository findRows", () => {
125144
});
126145

127146
expect(
128-
result.every((user) => user.name.toLowerCase().includes(searchTerm))
147+
result.every((user) => user.name.toLowerCase().includes(searchTerm))
129148
).toBe(true);
130149
});
131150

@@ -138,9 +157,9 @@ describe("Repository findRows", () => {
138157
});
139158

140159
expect(
141-
result.every((user) =>
142-
user.name.toLowerCase().includes(searchTerm.toLowerCase())
143-
)
160+
result.every((user) =>
161+
user.name.toLowerCase().includes(searchTerm.toLowerCase())
162+
)
144163
).toBe(true);
145164
});
146165

@@ -177,7 +196,7 @@ describe("Repository findRows", () => {
177196
});
178197

179198
expect(
180-
result.every((user) => user.age! >= minAge && user.age! <= maxAge)
199+
result.every((user) => user.age! >= minAge && user.age! <= maxAge)
181200
).toBe(true);
182201
});
183202

@@ -205,62 +224,62 @@ describe("Repository findRows", () => {
205224
});
206225

207226
describe("Logical Operators", () => {
208-
// it("should find rows with and operator", async () => {
209-
// const users = await createTestUsers(3);
210-
// const minAge = 25;
211-
// const role = "admin";
212-
//
213-
// const result = await repository.findRows({
214-
// where: and(gt("age", minAge), eq("role", role)),
215-
// });
216-
//
217-
// expect(
218-
// result.every((user) => user.age! > minAge && user.role === role)
219-
// ).toBe(true);
220-
// });
221-
//
222-
// it("should find rows with or operator", async () => {
223-
// const users = await createTestUsers(3);
224-
// const minAge = 30;
225-
// const role = "admin";
226-
//
227-
// const result = await repository.findRows({
228-
// where: or(gt("age", minAge), eq("role", role)),
229-
// });
230-
//
231-
// expect(
232-
// result.some((user) => user.age! > minAge || user.role === role)
233-
// ).toBe(true);
234-
// });
235-
//
236-
// it("should find rows with not operator", async () => {
237-
// const users = await createTestUsers(3);
238-
// const role = "admin";
239-
//
240-
// const result = await repository.findRows({
241-
// where: not(eq("role", role)),
242-
// });
243-
//
244-
// expect(result.every((user) => user.role !== role)).toBe(true);
245-
// });
246-
//
247-
// it("should find rows with xor operator", async () => {
248-
// const users = await createTestUsers(3);
249-
// const minAge = 30;
250-
// const role = "admin";
251-
//
252-
// const result = await repository.findRows({
253-
// where: xor(gt("age", minAge), eq("role", role)),
254-
// });
255-
//
256-
// expect(
257-
// result.every(
258-
// (user) =>
259-
// (user.age! > minAge && user.role !== role) ||
260-
// (user.age! <= minAge && user.role === role)
261-
// )
262-
// ).toBe(true);
263-
// });
227+
// it("should find rows with and operator", async () => {
228+
// const users = await createTestUsers(3);
229+
// const minAge = 25;
230+
// const role = "admin";
231+
//
232+
// const result = await repository.findRows({
233+
// where: and(gt("age", minAge), eq("role", role)),
234+
// });
235+
//
236+
// expect(
237+
// result.every((user) => user.age! > minAge && user.role === role)
238+
// ).toBe(true);
239+
// });
240+
//
241+
// it("should find rows with or operator", async () => {
242+
// const users = await createTestUsers(3);
243+
// const minAge = 30;
244+
// const role = "admin";
245+
//
246+
// const result = await repository.findRows({
247+
// where: or(gt("age", minAge), eq("role", role)),
248+
// });
249+
//
250+
// expect(
251+
// result.some((user) => user.age! > minAge || user.role === role)
252+
// ).toBe(true);
253+
// });
254+
//
255+
// it("should find rows with not operator", async () => {
256+
// const users = await createTestUsers(3);
257+
// const role = "admin";
258+
//
259+
// const result = await repository.findRows({
260+
// where: not(eq("role", role)),
261+
// });
262+
//
263+
// expect(result.every((user) => user.role !== role)).toBe(true);
264+
// });
265+
//
266+
// it("should find rows with xor operator", async () => {
267+
// const users = await createTestUsers(3);
268+
// const minAge = 30;
269+
// const role = "admin";
270+
//
271+
// const result = await repository.findRows({
272+
// where: xor(gt("age", minAge), eq("role", role)),
273+
// });
274+
//
275+
// expect(
276+
// result.every(
277+
// (user) =>
278+
// (user.age! > minAge && user.role !== role) ||
279+
// (user.age! <= minAge && user.role === role)
280+
// )
281+
// ).toBe(true);
282+
// });
264283
});
265284
//
266285
// describe("Sorting Operators", () => {

readme.md

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,28 @@ npm install sqlkit
1212

1313
## 🚀 Usage Examples
1414

15+
Define Your Domain Model
16+
17+
```ts
18+
interface User {
19+
id: string;
20+
name: string;
21+
email: string;
22+
age?: number;
23+
}
24+
```
25+
1526
### 1. Query Builder (Build Mode)
1627

1728
```ts
1829
import { SelectQueryBuilder } from "sqlkit";
1930

20-
const builder = new SelectQueryBuilder("users");
31+
const builder = new SelectQueryBuilder<User>("users");
2132

2233
const { sql, values } = builder
2334
.select(["id", "name"])
2435
.where({ key: "age", operator: ">", value: 18 })
36+
// OR .where(eq("age", 18))
2537
.build();
2638

2739
console.log(sql);
@@ -40,11 +52,12 @@ const pool = new Pool({
4052
});
4153
const executor = new PostgresAdapter(pool);
4254

43-
const builder = new SelectQueryBuilder("users", executor);
55+
const builder = new SelectQueryBuilder<User>("users", executor);
4456

4557
const users = await builder
4658
.select(["id", "name"])
4759
.where({ key: "age", operator: ">", value: 18 })
60+
// OR .where(eq("age", 18))
4861
.commit();
4962

5063
console.log(users);
@@ -62,30 +75,54 @@ const pool = new Pool({
6275
/* your config */
6376
});
6477
const executor = new PostgresAdapter(pool);
65-
const userRepo = new Repository("users", executor);
78+
const userRepo = new Repository<User>("users", executor);
6679

6780
// Find many
68-
const users = await userRepo.findRows({
81+
const users = await userRepo.findRows<User>({
6982
where: and(gt("age", 25), like("name", "%Doe%")),
7083
});
7184

85+
// Paginate
86+
const result = await userRepo.paginate({
87+
page: 1,
88+
limit: 10,
89+
offset: 2,
90+
where: gt("age", 18),
91+
columns: ["age", "email"],
92+
orderBy: [asc("age")],
93+
});
94+
95+
console.log(result.nodes); // array of users
96+
console.log(result.meta);
97+
/*
98+
{
99+
totalCount: 100,
100+
currentPage: 2,
101+
totalPages: 10,
102+
hasNextPage: true
103+
}
104+
*/
105+
72106
// Find one
73-
const user = await userRepo.findRow(like("email", "%@example.com"));
107+
const user = await userRepo.findRow<User>(like("email", "%@example.com"));
74108

75109
// Count
76-
const count = await userRepo.count(gt("age", 30));
110+
const count = await userRepo.count<User>(gt("age", 30));
77111

78112
// Insert
79-
const newUser = await userRepo.insertOne({
113+
const newUser = await userRepo.insertOne<User>({
80114
name: "Rayhan",
81115
82116
});
83117

84118
// Update
85-
const updated = await userRepo.update({ name: "Ray" }, like("email", "%ray%"));
119+
const updated = await userRepo.update<User>(
120+
{ name: "Ray" },
121+
like("email", "%ray%")
122+
);
86123

87124
// Delete
88-
const deleted = await userRepo.delete(like("name", "Ray%"));
125+
const deleted = await userRepo.delete<User>(like("name", "Ray%"));
89126
```
90127

91128
### 🔍 Supported Operators

0 commit comments

Comments
 (0)