@juadz/knex 0.5.0 → 0.5.1
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/basic.d.ts +2 -2
- package/build/basic.js +12 -41
- package/build/list.js +5 -4
- package/build/list.test.js +1 -1
- package/package.json +5 -5
- package/src/basic.ts +21 -24
- package/src/list.test.ts +7 -1
- package/src/list.ts +21 -23
package/build/basic.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { IDataRecord, IDataRepositoryProvider } from "@juadz/core";
|
|
1
|
+
import { IDataRecord, IDataRepositoryProvider, Schema } from "@juadz/core";
|
|
2
2
|
import { Knex } from "knex";
|
|
3
|
-
export declare function KnexProvider<T extends IDataRecord>(connection: Knex, dataTableName?: string): IDataRepositoryProvider<T>;
|
|
3
|
+
export declare function KnexProvider<T extends IDataRecord>(schema: Schema<T>, connection: Knex, dataTableName?: string): IDataRepositoryProvider<T>;
|
package/build/basic.js
CHANGED
|
@@ -58,47 +58,18 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
58
58
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
59
59
|
exports.KnexProvider = KnexProvider;
|
|
60
60
|
var list_1 = require("./list");
|
|
61
|
-
function KnexProvider(connection, dataTableName) {
|
|
61
|
+
function KnexProvider(schema, connection, dataTableName) {
|
|
62
62
|
var _this = this;
|
|
63
|
-
var tableName = dataTableName ||
|
|
64
|
-
var searchableFields =
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
var
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.filter(function (_a) {
|
|
74
|
-
var _ = _a[0], v = _a[1];
|
|
75
|
-
return v.$search == true;
|
|
76
|
-
})
|
|
77
|
-
.map(function (_a) {
|
|
78
|
-
var k = _a[0], _ = _a[1];
|
|
79
|
-
return k;
|
|
80
|
-
});
|
|
81
|
-
filterableFields = Object.entries(sch.flags)
|
|
82
|
-
.filter(function (_a) {
|
|
83
|
-
var _ = _a[0], v = _a[1];
|
|
84
|
-
return v.$filter == true;
|
|
85
|
-
})
|
|
86
|
-
.map(function (_a) {
|
|
87
|
-
var k = _a[0], _ = _a[1];
|
|
88
|
-
return k;
|
|
89
|
-
});
|
|
90
|
-
sortableFields = Object.entries(sch.flags)
|
|
91
|
-
.filter(function (_a) {
|
|
92
|
-
var _ = _a[0], v = _a[1];
|
|
93
|
-
return v.$sort == true;
|
|
94
|
-
})
|
|
95
|
-
.map(function (_a) {
|
|
96
|
-
var k = _a[0], _ = _a[1];
|
|
97
|
-
return k;
|
|
98
|
-
});
|
|
99
|
-
return [2 /*return*/];
|
|
100
|
-
});
|
|
101
|
-
}); };
|
|
63
|
+
var tableName = dataTableName || schema.name;
|
|
64
|
+
var searchableFields = Object.entries(schema.flags)
|
|
65
|
+
.filter(function (v) { return v[1].$search == true; })
|
|
66
|
+
.map(function (k) { return k[0]; });
|
|
67
|
+
var filterableFields = Object.entries(schema.flags)
|
|
68
|
+
.filter(function (v) { return v[1].$filter == true; })
|
|
69
|
+
.map(function (k) { return k[0]; });
|
|
70
|
+
var sortableFields = Object.entries(schema.flags)
|
|
71
|
+
.filter(function (v) { return v[1].$sort == true; })
|
|
72
|
+
.map(function (k) { return k[0]; });
|
|
102
73
|
var get = function (id) { return __awaiter(_this, void 0, void 0, function () {
|
|
103
74
|
var c;
|
|
104
75
|
return __generator(this, function (_a) {
|
|
@@ -189,7 +160,7 @@ function KnexProvider(connection, dataTableName) {
|
|
|
189
160
|
}); };
|
|
190
161
|
var list = (0, list_1.KnexQueryList)(connection, tableName, searchableFields, filterableFields, sortableFields);
|
|
191
162
|
return {
|
|
192
|
-
|
|
163
|
+
schema: schema,
|
|
193
164
|
get: get,
|
|
194
165
|
replace: replace,
|
|
195
166
|
update: update,
|
package/build/list.js
CHANGED
|
@@ -67,10 +67,10 @@ function KnexQueryList(knex, tableName, searchableFields, filterableFields, sort
|
|
|
67
67
|
query.where(function (query) {
|
|
68
68
|
params.filter.forEach(function (f) {
|
|
69
69
|
var field = f.field, op = f.op, value = f.value;
|
|
70
|
-
if (
|
|
70
|
+
if (field === "_search" && op === "=") {
|
|
71
71
|
query.andWhere(function (query) {
|
|
72
72
|
(searchableFields || []).forEach(function (k) {
|
|
73
|
-
query.orWhere(k,
|
|
73
|
+
query.orWhere(k, "LIKE", "%".concat("".concat(value).replace(/(["'$%]+)/g, ""), "%"));
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
76
|
return;
|
|
@@ -144,13 +144,14 @@ function KnexQueryList(knex, tableName, searchableFields, filterableFields, sort
|
|
|
144
144
|
debug("No filters applied");
|
|
145
145
|
}
|
|
146
146
|
sql = null;
|
|
147
|
-
sorter = params.sort
|
|
147
|
+
sorter = params.sort
|
|
148
|
+
.filter(function (s) {
|
|
148
149
|
var pass = sortableFields.includes(s.field);
|
|
149
150
|
if (!pass) {
|
|
150
151
|
debug("Field \"".concat(s.field, "\" is not sortable"));
|
|
151
152
|
}
|
|
152
153
|
return pass;
|
|
153
|
-
})
|
|
154
|
+
})
|
|
154
155
|
.map(function (s) { return ({
|
|
155
156
|
column: s.field,
|
|
156
157
|
order: s.direction,
|
package/build/list.test.js
CHANGED
|
@@ -84,7 +84,7 @@ test("KnexQueryList", function () { return __awaiter(void 0, void 0, void 0, fun
|
|
|
84
84
|
return __generator(this, function (_a) {
|
|
85
85
|
switch (_a.label) {
|
|
86
86
|
case 0:
|
|
87
|
-
func = (0, list_1.KnexQueryList)(knex, "users", [
|
|
87
|
+
func = (0, list_1.KnexQueryList)(knex, "users", ["name", "lastname"], ["age", "tool"], ["age"]);
|
|
88
88
|
return [4 /*yield*/, func({
|
|
89
89
|
resource: "users",
|
|
90
90
|
range: { offset: 0, limit: 10 },
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juadz/knex",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Juadz: Rapid restful API development",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"@babel/core": "^7.26.7",
|
|
28
28
|
"@babel/preset-env": "^7.26.7",
|
|
29
29
|
"@babel/preset-typescript": "^7.26.0",
|
|
30
|
+
"@juadz/core": "^0.5.0",
|
|
30
31
|
"@types/debug": "^4.1.12",
|
|
31
32
|
"@types/jest": "^29.5.14",
|
|
32
33
|
"@types/node": "^22.7.5",
|
|
@@ -44,13 +45,12 @@
|
|
|
44
45
|
"sqlite": "^5.1.1",
|
|
45
46
|
"tsc": "^2.0.4",
|
|
46
47
|
"typescript": "^5.6.3",
|
|
47
|
-
"zod": "^4"
|
|
48
|
-
"@juadz/core": "^0.5.0"
|
|
48
|
+
"zod": "^4"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
+
"@juadz/core": "^0.5.0",
|
|
51
52
|
"debug": "^4.4.0",
|
|
52
|
-
"zod": "^4"
|
|
53
|
-
"@juadz/core": "^0.5.0"
|
|
53
|
+
"zod": "^4"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {}
|
|
56
56
|
}
|
package/src/basic.ts
CHANGED
|
@@ -3,30 +3,21 @@ import { Knex } from "knex";
|
|
|
3
3
|
import { KnexQueryList } from "./list";
|
|
4
4
|
|
|
5
5
|
export function KnexProvider<T extends IDataRecord>(
|
|
6
|
+
schema: Schema<T>,
|
|
6
7
|
connection: Knex,
|
|
7
8
|
dataTableName?: string,
|
|
8
9
|
): IDataRepositoryProvider<T> {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
searchableFields = Object.entries(sch.flags)
|
|
21
|
-
.filter(([_, v]) => v.$search == true)
|
|
22
|
-
.map(([k, _]) => k);
|
|
23
|
-
filterableFields = Object.entries(sch.flags)
|
|
24
|
-
.filter(([_, v]) => v.$filter == true)
|
|
25
|
-
.map(([k, _]) => k);
|
|
26
|
-
sortableFields = Object.entries(sch.flags)
|
|
27
|
-
.filter(([_, v]) => v.$sort == true)
|
|
28
|
-
.map(([k, _]) => k);
|
|
29
|
-
}
|
|
10
|
+
const tableName = dataTableName || schema.name;
|
|
11
|
+
|
|
12
|
+
const searchableFields = Object.entries(schema.flags)
|
|
13
|
+
.filter((v) => v[1].$search == true)
|
|
14
|
+
.map((k) => k[0]);
|
|
15
|
+
const filterableFields = Object.entries(schema.flags)
|
|
16
|
+
.filter((v) => v[1].$filter == true)
|
|
17
|
+
.map((k) => k[0]);
|
|
18
|
+
const sortableFields = Object.entries(schema.flags)
|
|
19
|
+
.filter((v) => v[1].$sort == true)
|
|
20
|
+
.map((k) => k[0]);
|
|
30
21
|
|
|
31
22
|
const get = async (id: string | number) => {
|
|
32
23
|
const c = await connection(tableName)
|
|
@@ -59,7 +50,7 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
59
50
|
});
|
|
60
51
|
|
|
61
52
|
insertedId = (inserted[0] as unknown as { id: string | number }).id;
|
|
62
|
-
|
|
53
|
+
} else {
|
|
63
54
|
// For other SQL clients that support `.returning('id')`
|
|
64
55
|
const inserted = await connection(tableName)
|
|
65
56
|
.returning("id")
|
|
@@ -106,10 +97,16 @@ export function KnexProvider<T extends IDataRecord>(
|
|
|
106
97
|
return result;
|
|
107
98
|
};
|
|
108
99
|
|
|
109
|
-
const list = KnexQueryList(
|
|
100
|
+
const list = KnexQueryList(
|
|
101
|
+
connection,
|
|
102
|
+
tableName,
|
|
103
|
+
searchableFields,
|
|
104
|
+
filterableFields,
|
|
105
|
+
sortableFields,
|
|
106
|
+
);
|
|
110
107
|
|
|
111
108
|
return {
|
|
112
|
-
|
|
109
|
+
schema,
|
|
113
110
|
get,
|
|
114
111
|
replace,
|
|
115
112
|
update,
|
package/src/list.test.ts
CHANGED
|
@@ -39,7 +39,13 @@ afterAll(() => {
|
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
test("KnexQueryList", async () => {
|
|
42
|
-
const func = KnexQueryList(
|
|
42
|
+
const func = KnexQueryList(
|
|
43
|
+
knex,
|
|
44
|
+
"users",
|
|
45
|
+
["name", "lastname"],
|
|
46
|
+
["age", "tool"],
|
|
47
|
+
["age"],
|
|
48
|
+
);
|
|
43
49
|
|
|
44
50
|
const result: QueryListResults<unknown> = await func({
|
|
45
51
|
resource: "users",
|
package/src/list.ts
CHANGED
|
@@ -18,7 +18,7 @@ export function KnexQueryList<T>(
|
|
|
18
18
|
knex: Knex,
|
|
19
19
|
tableName: string,
|
|
20
20
|
searchableFields: string[],
|
|
21
|
-
filterableFields: string[],
|
|
21
|
+
filterableFields: string[],
|
|
22
22
|
sortableFields: string[],
|
|
23
23
|
): QueryListFunction<T> {
|
|
24
24
|
return async (params: QueryListParam) => {
|
|
@@ -29,16 +29,15 @@ export function KnexQueryList<T>(
|
|
|
29
29
|
query.where((query: Knex) => {
|
|
30
30
|
params.filter.forEach((f: QueryFilter) => {
|
|
31
31
|
const { field, op, value } = f;
|
|
32
|
-
if (
|
|
32
|
+
if (field === "_search" && op === "=") {
|
|
33
33
|
query.andWhere((query: Knex) => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
);
|
|
41
|
-
});
|
|
34
|
+
(searchableFields || []).forEach((k) => {
|
|
35
|
+
query.orWhere(
|
|
36
|
+
k as string,
|
|
37
|
+
"LIKE",
|
|
38
|
+
`%${`${value}`.replace(/(["'$%]+)/g, "")}%`,
|
|
39
|
+
);
|
|
40
|
+
});
|
|
42
41
|
});
|
|
43
42
|
return;
|
|
44
43
|
}
|
|
@@ -119,18 +118,18 @@ export function KnexQueryList<T>(
|
|
|
119
118
|
|
|
120
119
|
let sql = null;
|
|
121
120
|
|
|
122
|
-
const sorter = params.sort
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
121
|
+
const sorter = params.sort
|
|
122
|
+
.filter((s) => {
|
|
123
|
+
const pass = sortableFields.includes(s.field);
|
|
124
|
+
if (!pass) {
|
|
125
|
+
debug(`Field "${s.field}" is not sortable`);
|
|
126
|
+
}
|
|
127
|
+
return pass;
|
|
128
|
+
})
|
|
129
|
+
.map((s) => ({
|
|
130
|
+
column: s.field,
|
|
131
|
+
order: s.direction,
|
|
132
|
+
}));
|
|
134
133
|
|
|
135
134
|
if (process.env.NODE_ENV !== "production") {
|
|
136
135
|
sql = query
|
|
@@ -142,7 +141,6 @@ export function KnexQueryList<T>(
|
|
|
142
141
|
debug("SQL Query:", sql);
|
|
143
142
|
}
|
|
144
143
|
|
|
145
|
-
|
|
146
144
|
const data = await query
|
|
147
145
|
.clone()
|
|
148
146
|
.offset(params.range.offset)
|